{"id":18489,"date":"2026-03-18T14:30:56","date_gmt":"2026-03-18T06:30:56","guid":{"rendered":"https:\/\/www.lansitec.com\/?p=18489"},"modified":"2026-03-18T14:30:58","modified_gmt":"2026-03-18T06:30:58","slug":"fota-at-scale-how-to-keep-1000-devices-on-the-same-firmware-without-site-visits","status":"publish","type":"post","link":"https:\/\/www.lansitec.com\/es\/blogs\/fota-a-gran-escala-como-mantener-1000-dispositivos-con-el-mismo-firmware-sin-visitas-al-sitio\/","title":{"rendered":"FOTA a gran escala: C\u00f3mo mantener m\u00e1s de 1000 dispositivos con el mismo firmware sin necesidad de visitas al sitio."},"content":{"rendered":"\n<p>Keeping a fleet aligned sounds easy until you hit device #317. Someone\u2019s battery is low. Someone\u2019s in a dead zone. Someone\u2019s \u201cupdated\u201d but keeps rebooting. And suddenly your tidy firmware spreadsheet turns into a crime scene.<\/p>\n\n\n\n<p>We\u2019ve seen this in real deployments: the update file is rarely the hard part, rather how-to-push-this-fast is. Firmware drift doesn\u2019t happen because your engineers forgot how to build binaries. It happens because rollout is an operations problem. When you hit 1000+ <a href=\"https:\/\/www.lansitec.com\/ar\/\u0628\u0648\u0627\u0628\u0627\u062a\/\">gateways<\/a>, <a href=\"https:\/\/www.lansitec.com\/ar\/\u0627\u0644\u0645\u062a\u062a\u0628\u0639\u0648\u0646\/\">trackers<\/a>, badges, <a href=\"https:\/\/www.lansitec.com\/ar\/\u0623\u062c\u0647\u0632\u0629-\u0627\u0644\u0627\u0633\u062a\u0634\u0639\u0627\u0631\/\">sensors<\/a>, or mixed fleets, the hard parts become painfully consistent:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How do you roll out safely without bricking a site?<\/li>\n\n\n\n<li>How do you stop a bad build <em>fast<\/em>?<\/li>\n\n\n\n<li>How do you prove exactly who got updated (and who didn\u2019t)?<\/li>\n\n\n\n<li>How do you update offline-ish devices without sending humans?<\/li>\n<\/ul>\n\n\n\n<p>This playbook is for the unglamorous, real-world version of Firmware Over-The-Air (FOTA): rollout waves, rollback strategy, and clean \u201cwho got updated\u201d reporting. Plus, why Bluetooth-based FOTA is quietly one of the best tools you\u2019ve got for <a href=\"https:\/\/www.lansitec.com\/ar\/\u0628\u0648\u0627\u0628\u0627\u062a\/\">gateways<\/a> and <a href=\"https:\/\/www.lansitec.com\/ar\/\u0627\u0644\u0645\u062a\u062a\u0628\u0639\u0648\u0646\/\">trackers<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why FOTA at Scale Requires a Deployment Strategy<\/h2>\n\n\n\n<p>At 1,000+ devices, you\u2019re not doing firmware updates anymore. You\u2019re running a production change-management system.<\/p>\n\n\n\n<p>Three failure modes show up again and again:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Partial adoption<\/strong>: the update starts strong, then stalls at 73% because the remaining devices are the hardest ones.<\/li>\n\n\n\n<li><strong>Silent divergence<\/strong>: devices report a version, but some are running a different build variant or a half-applied image.<\/li>\n\n\n\n<li><strong>Rollback chaos<\/strong>: a bad build goes out, and you realize too late that rollback isn\u2019t a button\u2026 it\u2019s an engineering decision you had to make months ago.<\/li>\n<\/ul>\n\n\n\n<p>The problem is not rising from the over-the-air aspect but from the at-scale.<\/p>\n\n\n\n<p>A good fleet update system treats firmware like a release pipeline: signed artifacts, staged rollout, measurable outcomes, and verifiable device-side state. The IETF SUIT architecture formalizes this mindset by separating what should be installed (a protected manifest) from how it gets delivered (transport-agnostic). That\u2019s exactly what you want when your fleet uses a mix of <a href=\"https:\/\/www.lansitec.com\/ar\/\u0644\u0648\u0631\u0627\u0648\u0627\u0646\/\">LoRaWAN<\/a>, cellular, and Bluetooth transports. <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(1)<\/a><\/sup><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4 Core Components of a Reliable FOTA at Scale System<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Layer<\/th><th>What it answers<\/th><th>What \u201cgood\u201d looks like<\/th><\/tr><\/thead><tbody><tr><td>1) <strong>Packaging<\/strong><\/td><td>What exactly are we installing?<\/td><td>Signed artifact, clear versioning, hardware compatibility gates<\/td><\/tr><tr><td>2) <strong>Orchestration<\/strong><\/td><td>Who should update, and when?<\/td><td>Cohorts, rollout rate control, maintenance windows, abort rules<\/td><\/tr><tr><td>3) <strong>Installation &amp; rollback<\/strong><\/td><td>What if it boots but behaves badly?<\/td><td>A\/B or test-then-confirm, health checks before \u201ccommit\u201d<\/td><\/tr><tr><td>4) <strong>Telemetry &amp; reporting<\/strong><\/td><td>Who got updated? Who failed? Why?<\/td><td>Per-device status, timestamps, reasons, exportable audit trail<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How to Roll Out Firmware Updates Safely Across IoT Fleets<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: How to Group IoT Devices for Firmware Rollouts<\/h3>\n\n\n\n<p>Before you build waves, define what \u201csimilar devices\u201d means. A clean rollout unit usually includes device cohort keys (pick 3-6):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hardware revision (or BOM variant)<\/li>\n\n\n\n<li>Region\/bandplan (EU868 vs US915, LTE bands, etc.)<\/li>\n\n\n\n<li>Power profile (battery vs mains)<\/li>\n\n\n\n<li>Role (gateway vs tracker)<\/li>\n\n\n\n<li>Customer site or tenant<\/li>\n\n\n\n<li>Current firmware major.minor<\/li>\n<\/ul>\n\n\n\n<p>This matters because rollback behavior, battery hit, and RF settings often differ by cohort.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Firmware Rollout Waves Explained (Canary \u2192 Production)<\/h3>\n\n\n\n<p>Don\u2019t do 10%, 50%, or 100% blindly. Use operational boundaries:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Canary<\/strong>: a handful of internal devices + 1-2 friendly customer sites<\/li>\n\n\n\n<li><strong>Pilot region\/site type<\/strong>: one geography, one network type, one hardware rev<\/li>\n\n\n\n<li><strong>Production waves<\/strong>: grouped by time zone, connectivity type, or customer tier<\/li>\n\n\n\n<li><strong>Long-tail cleanup<\/strong>: devices that are offline, power-cycled rarely, or behind firewalls<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: How to Control Firmware Rollout Speed in Large Fleets<\/h3>\n\n\n\n<p>A proper orchestrator lets you control how quickly devices are notified, and it should support staged rollouts and the ability to cancel when failures cross a threshold. AWS IoT Jobs, for example, supports constant and exponential rollout rates plus abort configurations tied to failure criteria. <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(2)<\/a><\/sup><\/p>\n\n\n\n<p>Why exponential matters: you can start slow, then accelerate only after success signals pile up.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Best Time Windows for IoT Firmware Updates<\/h3>\n\n\n\n<p>If <a href=\"https:\/\/www.lansitec.com\/ar\/\u0628\u0648\u0627\u0628\u0627\u062a\/\">gateways<\/a> reboot during business hours, someone will call you.<\/p>\n\n\n\n<p>Use maintenance windows so updates only install\/reboot inside approved time bands. AWS IoT Jobs supports scheduled jobs and recurring maintenance windows for rollouts.<sup> <a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(2)<\/a><\/sup><\/p>\n\n\n\n<p><strong>A wave plan template you can use:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wave<\/th><th>Target group<\/th><th>Rollout rate<\/th><th>Install window<\/th><th>\u201cPass\u201d gate<\/th><th>Auto-abort gate<\/th><\/tr><\/thead><tbody><tr><td>Canary<\/td><td>20 devices<\/td><td>5\/min<\/td><td>anytime<\/td><td>24h stable + KPIs OK<\/td><td>&gt;5% failures<\/td><\/tr><tr><td>Pilot<\/td><td>1 site type<\/td><td>25\/min<\/td><td>02:00\u201305:00 local<\/td><td>48h stable<\/td><td>&gt;3% failures<\/td><\/tr><tr><td>Prod A<\/td><td>Region 1<\/td><td>exponential<\/td><td>01:00\u201304:00<\/td><td>72h stable<\/td><td>&gt;2% failures<\/td><\/tr><tr><td>Prod B<\/td><td>Region 2<\/td><td>exponential<\/td><td>01:00\u201304:00<\/td><td>72h stable<\/td><td>&gt;2% failures<\/td><\/tr><tr><td>Cleanup<\/td><td>stragglers<\/td><td>constant low<\/td><td>weekend<\/td><td>n\/a<\/td><td>n\/a<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Two practical rules we stick to:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Never promote on \u201cime passed alone. Promote on observed health.<\/li>\n\n\n\n<li>Stop conditions must be automatic. Humans are slow at 2 a.m.<\/li>\n<\/ol>\n\n\n\n<p><strong><strong>Key Metrics to Measure Firmware Update Success<\/strong><\/strong><\/p>\n\n\n\n<p>Keep it boring. Define a small acceptance contract:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install success rate \u2265 98% (per cohort)<\/li>\n\n\n\n<li>Post-update reboot loop \u2264 0.2%<\/li>\n\n\n\n<li>Battery impact within expected envelope (for battery units)<\/li>\n\n\n\n<li>Connectivity regression not statistically worse than baseline<\/li>\n<\/ul>\n\n\n\n<p>If you don\u2019t baseline those metrics before rollout, you can\u2019t prove anything after.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Abort fast: design your \u201cstop button\u201d before you need it<\/h3>\n\n\n\n<p>A mature rollout has predefined abort criteria:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>too many devices fail the download\/install<\/li>\n\n\n\n<li>too many devices time out mid-execution<\/li>\n\n\n\n<li>too many devices reject the update (incompatible hardware, low battery, etc.)<\/li>\n<\/ul>\n\n\n\n<p>AWS IoT Jobs explicitly supports aborting a job when a threshold percentage of devices meet criteria like FAILED, TIMED_OUT, or REJECTED, and it also supports retry and timeout settings to control stuck executions. (2)<\/p>\n\n\n\n<p><strong>Practical tip:<\/strong> abort both about safety and cost. Retries across a fleet can snowball into real money and real time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6: How Firmware Rollback Works in IoT Devices<\/h3>\n\n\n\n<p>If your rollback plan is \u201cship v1.2.4 quickly,\u201d you don\u2019t have a rollback plan.<\/p>\n\n\n\n<p><strong>The cleanest pattern: test \u2192 health check \u2192 confirm<\/strong><\/p>\n\n\n\n<p>Bootloaders that support a test upgrade let you boot the new image once, then revert automatically on next reset unless the firmware explicitly confirms itself as good.<\/p>\n\n\n\n<p>MCUboot (via Zephyr\u2019s image control API) supports exactly this concept: it can perform test upgrades, and the system reverts unless the new image is <strong>confirmed<\/strong> by the running firmware. <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(3)<\/a><\/sup><\/p>\n\n\n\n<p><strong>A simple confirm gate (works shockingly well), c<\/strong>onfirm only after all of these are true:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>device boots and stays up for N minutes<\/li>\n\n\n\n<li>it reports telemetry successfully (MQTT\/HTTP uplink)<\/li>\n\n\n\n<li>critical peripherals init (radio, storage, <a href=\"https:\/\/www.lansitec.com\/ar\/\u0623\u062c\u0647\u0632\u0629-\u0627\u0644\u0627\u0633\u062a\u0634\u0639\u0627\u0631\/\">sensors<\/a>)<\/li>\n\n\n\n<li>watchdog stays calm<\/li>\n\n\n\n<li>optional: it completes a small self-test workload<\/li>\n<\/ul>\n\n\n\n<p>Then your app calls the confirm routine (so the bootloader stops treating the image as trial). <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(3)<\/a><\/sup><\/p>\n\n\n\n<p><strong>Two rollback types you want:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automatic rollback (boot failure \/ trial not confirmed)<\/li>\n\n\n\n<li>Operational rollback (you decide to revert based on KPI regression)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Step 7: Who got updated? reporting that survives audits and angry customers<\/h3>\n\n\n\n<p><strong>At scale, you need two versions of truth:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Desired state (what you want running)<\/li>\n\n\n\n<li>Reported state (what the device says it\u2019s running)<\/li>\n<\/ol>\n\n\n\n<p>And you need execution metadata: when it tried, what happened, why it stopped.<\/p>\n\n\n\n<p><strong>What to store per device (minimum viable truth)<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Why it matters<\/th><\/tr><\/thead><tbody><tr><td>device_id<\/td><td>join key for everything<\/td><\/tr><tr><td>hardware_rev \/ model<\/td><td>compatibility gates<\/td><\/tr><tr><td>desired_firmware<\/td><td>campaign intent<\/td><\/tr><tr><td>reported_firmware<\/td><td>reality<\/td><\/tr><tr><td>update_job_id<\/td><td>traceability<\/td><\/tr><tr><td>status<\/td><td>IN_PROGRESS \/ SUCCEEDED \/ FAILED \/ TIMED_OUT \/ REJECTED style outcomes<\/td><\/tr><tr><td>last_attempt_ts<\/td><td>recency<\/td><\/tr><tr><td>failure_reason_code<\/td><td>actionable triage<\/td><\/tr><tr><td>last_seen_ts<\/td><td>offline detection<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>AWS IoT Jobs tracks the progress of a job across targets and exposes job execution state concepts (job execution as the per-device instance you monitor). <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(2)<\/a><\/sup><\/p>\n\n\n\n<p>If you self-host or want a backend built specifically around rollouts, <strong>Eclipse hawkBit<\/strong> is a device-agnostic update server designed to roll out updates to constrained edge devices and <a href=\"https:\/\/www.lansitec.com\/ar\/\u0628\u0648\u0627\u0628\u0627\u062a\/\">gateways<\/a>, with an HTTP\/JSON \u201cDirect Device Integration\u201d API model. <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(4)<\/a><\/sup><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Bluetooth-based FOTA is underrated, especially for gateways and trackers<\/h2>\n\n\n\n<p><strong>A lot of tracking deployments look like this:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.lansitec.com\/ar\/\u0628\u0648\u0627\u0628\u0627\u062a\/\">Gateways<\/a> have power + backhaul (Ethernet\/Wi-Fi\/LTE)<\/li>\n\n\n\n<li>Trackers\/sensors have tight power budgets and weak uplink economics<\/li>\n\n\n\n<li>You still need to keep everything aligned on firmware for fleet reliability<\/li>\n<\/ul>\n\n\n\n<p>So instead of making every tracker pull megabytes over expensive or flaky links, you can flip the model.<\/p>\n\n\n\n<p><strong><strong>Using <a href=\"https:\/\/www.lansitec.com\/ar\/\u0628\u0648\u0627\u0628\u0627\u062a\/\">Gateways<\/a> to Distribute Firmware Updates via Bluetooth<\/strong><\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Cloud delivers the firmware artifact to the gateway (once).<\/li>\n\n\n\n<li>Gateway stages it locally.<\/li>\n\n\n\n<li>Gateway updates nearby <a href=\"https:\/\/www.lansitec.com\/ar\/\u0627\u0644\u0645\u062a\u062a\u0628\u0639\u0648\u0646\/\">trackers<\/a> over <strong>Bluetooth<\/strong> in scheduled windows.<\/li>\n<\/ol>\n\n\n\n<p>That turns \u201c1,000 devices downloading 1,000 times\u201d into \u201cdownload once per site, distribute locally.\u201d<\/p>\n\n\n\n<p><strong>But BLE is slow! It isn\u2019t, when configured well.<\/strong><\/p>\n\n\n\n<p>Modern BLE can move real data. Silicon Labs\u2019 Bluetooth LE stack documentation lists up to ~700 kbps over 1M PHY and ~1300 kbps over 2M PHY, with Link Layer packet size up to 251 B (and ATT up to 250 B)\u2014exactly the kind of knobs that make firmware transfer practical. <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(6)<\/a><\/sup><\/p>\n\n\n\n<p>Silicon Labs\u2019 OTA guidance lays out two important realities:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OTA often involves <strong>storing the incoming image in flash<\/strong> and then rebooting to install.<\/li>\n\n\n\n<li>Flash erase can take seconds\u2014if you\u2019re downloading over Bluetooth, your <strong>supervision timeout<\/strong> must handle that (or erase ahead of time \/ page-by-page).<\/li>\n<\/ul>\n\n\n\n<p>It also distinguishes approaches that overwrite immediately vs. approaches that stage the image first, and it calls out security tradeoffs (for example, application-based OTA enables better security\/customizability and can support encrypted connections). <sup><a href=\"#references\" data-type=\"internal\" data-id=\"#references\">(5)<\/a><\/sup><\/p>\n\n\n<div\n\tclass=\"betterdocs-faq-wrapper layout-modern icon-after betterdocs-faq-layout-1 betterdocs-faq-60bnce3 betterdocs-shortcode\">\n\t<h2 class=\"betterdocs-faq-layout-1 betterdocs-faq-60bnce3 betterdocs-faq-section-title\">Frequently Asked Questions<\/h2>\n\t<div class=\"betterdocs-faq-inner-wrapper\">\n\t\t<div class=\"betterdocs-faq-title\">\n\t<h3 class=\"betterdocs-faq-title-tag\">About FOTA at Scale<\/h3><\/div>\n<ul class=\"betterdocs-faq-list\"><li><div class=\"betterdocs-faq-group\"><div class=\"betterdocs-faq-post\">\n\t\t<p class=\"betterdocs-faq-post-name\">\n\t\tHow do I pick wave sizes?\t<\/p>\n\t<svg class=\"betterdocs-faq-iconminus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"stroke-width=\"2\"><g fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-linejoin=\"round\"><path d=\"M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><svg class=\"betterdocs-faq-iconplus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><g stroke-width=\"2\" fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"square\" stroke-miterlimit=\"10\"><path d=\"M12 7v10M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><\/div>\n<div class=\"betterdocs-faq-main-content\" >\n\t<p><span style=\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\">Start with a canary you can physically reach if needed, then expand via exponential rollout only after success metrics hold. Systems like AWS IoT Jobs support staged rollout controls and abort rules that map well to this pattern. (2)<\/span><\/p>\n<\/div>\n<\/div><\/li><li><div class=\"betterdocs-faq-group\"><div class=\"betterdocs-faq-post\">\n\t\t<p class=\"betterdocs-faq-post-name\">\n\t\tWhat\u2019s the safest rollback model for embedded devices?\t<\/p>\n\t<svg class=\"betterdocs-faq-iconminus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"stroke-width=\"2\"><g fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-linejoin=\"round\"><path d=\"M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><svg class=\"betterdocs-faq-iconplus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><g stroke-width=\"2\" fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"square\" stroke-miterlimit=\"10\"><path d=\"M12 7v10M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><\/div>\n<div class=\"betterdocs-faq-main-content\" >\n\t<p><span style=\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\">Use trial boot + confirm. MCUboot supports \u201ctest upgrades\u201d that revert unless your firmware explicitly confirms itself. (3)<\/span><\/p>\n<\/div>\n<\/div><\/li><li><div class=\"betterdocs-faq-group\"><div class=\"betterdocs-faq-post\">\n\t\t<p class=\"betterdocs-faq-post-name\">\n\t\tHow long does a BLE firmware transfer take?\t<\/p>\n\t<svg class=\"betterdocs-faq-iconminus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"stroke-width=\"2\"><g fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-linejoin=\"round\"><path d=\"M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><svg class=\"betterdocs-faq-iconplus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><g stroke-width=\"2\" fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"square\" stroke-miterlimit=\"10\"><path d=\"M12 7v10M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><\/div>\n<div class=\"betterdocs-faq-main-content\" >\n\t<p><span style=\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\">Roughly: time \u2248 image_size_bits \/ throughput. With ~700 kbps (1M PHY) to ~1300 kbps (2M PHY) class throughput, even multi-MB images can be feasible in controlled windows. (6)<\/span><\/p>\n<\/div>\n<\/div><\/li><li><div class=\"betterdocs-faq-group\"><div class=\"betterdocs-faq-post\">\n\t\t<p class=\"betterdocs-faq-post-name\">\n\t\tWhy not just do everything over cellular\/Wi-Fi directly?\t<\/p>\n\t<svg class=\"betterdocs-faq-iconminus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"stroke-width=\"2\"><g fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-linejoin=\"round\"><path d=\"M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><svg class=\"betterdocs-faq-iconplus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><g stroke-width=\"2\" fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"square\" stroke-miterlimit=\"10\"><path d=\"M12 7v10M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><\/div>\n<div class=\"betterdocs-faq-main-content\" >\n\t<p><span style=\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\">You can, but it scales cost and failure probability. BLE distribution shines when many devices share a site and only the gateway has reliable backhaul.<\/span><\/p>\n<\/div>\n<\/div><\/li><li><div class=\"betterdocs-faq-group\"><div class=\"betterdocs-faq-post\">\n\t\t<p class=\"betterdocs-faq-post-name\">\n\t\tHow do I avoid Bluetooth link drops during OTA?\t<\/p>\n\t<svg class=\"betterdocs-faq-iconminus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"stroke-width=\"2\"><g fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-linejoin=\"round\"><path d=\"M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><svg class=\"betterdocs-faq-iconplus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><g stroke-width=\"2\" fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"square\" stroke-miterlimit=\"10\"><path d=\"M12 7v10M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><\/div>\n<div class=\"betterdocs-faq-main-content\" >\n\t<p><span style=\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\">Account for flash erase\/write pauses. <a href=\"https:\/\/www.lansitec.com\/ar\/blogs\/\u0643\u064a\u0641\u064a\u0629-\u0627\u0644\u062d\u0641\u0627\u0638-\u0639\u0644\u0649-1000-\u062c\u0647\u0627\u0632-\u0628\u0646\u0641\u0633-\u0627\u0644\u0628\u0631\u0627\u0645\u062c-\u0627\u0644\/\">OTA<\/a> implementations may require longer supervision timeouts or pre-erase strategies to prevent disconnections during multi-second erase operations. (5)<\/span><\/p>\n<\/div>\n<\/div><\/li><li><div class=\"betterdocs-faq-group\"><div class=\"betterdocs-faq-post\">\n\t\t<p class=\"betterdocs-faq-post-name\">\n\t\tHow do I avoid Bluetooth link drops during OTA?\t<\/p>\n\t<svg class=\"betterdocs-faq-iconminus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"stroke-width=\"2\"><g fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-linejoin=\"round\"><path d=\"M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><svg class=\"betterdocs-faq-iconplus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><g stroke-width=\"2\" fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"square\" stroke-miterlimit=\"10\"><path d=\"M12 7v10M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><\/div>\n<div class=\"betterdocs-faq-main-content\" >\n\t<p><span style=\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\">Account for flash erase\/write pauses. <a href=\"https:\/\/www.lansitec.com\/ar\/blogs\/\u0643\u064a\u0641\u064a\u0629-\u0627\u0644\u062d\u0641\u0627\u0638-\u0639\u0644\u0649-1000-\u062c\u0647\u0627\u0632-\u0628\u0646\u0641\u0633-\u0627\u0644\u0628\u0631\u0627\u0645\u062c-\u0627\u0644\/\">OTA<\/a> implementations may require longer supervision timeouts or pre-erase strategies to prevent disconnections during multi-second erase operations. (5)<\/span><\/p>\n<\/div>\n<\/div><\/li><li><div class=\"betterdocs-faq-group\"><div class=\"betterdocs-faq-post\">\n\t\t<p class=\"betterdocs-faq-post-name\">\n\t\tWhat should I use for rollout management if I don\u2019t want a cloud vendor lock-in?\t<\/p>\n\t<svg class=\"betterdocs-faq-iconminus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"stroke-width=\"2\"><g fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-linejoin=\"round\"><path d=\"M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><svg class=\"betterdocs-faq-iconplus\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><g stroke-width=\"2\" fill=\"none\" stroke=\"#528ffe\" stroke-linecap=\"square\" stroke-miterlimit=\"10\"><path d=\"M12 7v10M17 12H7\"><\/path><circle cx=\"12\" cy=\"12\" r=\"11\"><\/circle><\/g><\/svg><\/div>\n<div class=\"betterdocs-faq-main-content\" >\n\t<p><span style=\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\">An update server like Eclipse hawkBit is built for rolling out updates to constrained devices and <a href=\"https:\/\/www.lansitec.com\/ar\/\u0628\u0648\u0627\u0628\u0627\u062a\/\">gateways<\/a> and exposes an HTTP\/JSON device integration API model. (4)<\/span><\/p>\n<\/div>\n<\/div><\/li><\/ul><script type=\"application\/ld+json\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"How do I pick wave sizes?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\\\">Start with a canary you can physically reach if needed, then expand via exponential rollout only after success metrics hold. Systems like AWS IoT Jobs support staged rollout controls and abort rules that map well to this pattern. (2)<\\\/span><\\\/p>\\n\"}},{\"@type\":\"Question\",\"name\":\"What\\u2019s the safest rollback model for embedded devices?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\\\">Use trial boot + confirm. MCUboot supports \\u201ctest upgrades\\u201d that revert unless your firmware explicitly confirms itself. (3)<\\\/span><\\\/p>\\n\"}},{\"@type\":\"Question\",\"name\":\"How long does a BLE firmware transfer take?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\\\">Roughly: time \\u2248 image_size_bits \\\/ throughput. With ~700 kbps (1M PHY) to ~1300 kbps (2M PHY) class throughput, even multi-MB images can be feasible in controlled windows. (6)<\\\/span><\\\/p>\\n\"}},{\"@type\":\"Question\",\"name\":\"Why not just do everything over cellular\\\/Wi-Fi directly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\\\">You can, but it scales cost and failure probability. BLE distribution shines when many devices share a site and only the gateway has reliable backhaul.<\\\/span><\\\/p>\\n\"}},{\"@type\":\"Question\",\"name\":\"How do I avoid Bluetooth link drops during OTA?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\\\">Account for flash erase\\\/write pauses. OTA implementations may require longer supervision timeouts or pre-erase strategies to prevent disconnections during multi-second erase operations. (5)<\\\/span><\\\/p>\\n\"}},{\"@type\":\"Question\",\"name\":\"How do I avoid Bluetooth link drops during OTA?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\\\">Account for flash erase\\\/write pauses. OTA implementations may require longer supervision timeouts or pre-erase strategies to prevent disconnections during multi-second erase operations. (5)<\\\/span><\\\/p>\\n\"}},{\"@type\":\"Question\",\"name\":\"What should I use for rollout management if I don\\u2019t want a cloud vendor lock-in?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"color: rgb(0,0,0);background-color: transparent;font-size: 11pt;font-family: Calibri, sans-serif;\\\">An update server like Eclipse hawkBit is built for rolling out updates to constrained devices and gateways and exposes an HTTP\\\/JSON device integration API model. (4)<\\\/span><\\\/p>\\n\"}}]}<\/script>\t<\/div>\n<\/div>\n\n\n\n<p id=\"references\"><\/p>\n\n\n\n<p data-wp-context---core-fit-text=\"core\/fit-text::{&quot;fontSize&quot;:&quot;&quot;}\" data-wp-init---core-fit-text=\"core\/fit-text::callbacks.init\" data-wp-interactive data-wp-style--font-size=\"core\/fit-text::context.fontSize\" class=\"has-fit-text\">References and further reading:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/datatracker.ietf.org\/doc\/rfc9019\/\" rel=\"nofollow noopener\" target=\"_blank\">IETF, RFC 9019: A Firmware Update Architecture for Internet of Things<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.aws.amazon.com\/iot\/latest\/developerguide\/jobs-configurations-details.html\" rel=\"nofollow noopener\" target=\"_blank\">AWS IoT Core Developer Guide: How job configurations work<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.zephyrproject.org\/latest\/doxygen\/html\/group__mcuboot__api.html\" rel=\"nofollow noopener\" target=\"_blank\">Zephyr Project Documentation: MCUboot image control API<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/eclipse-hawkbit\/hawkbit\" rel=\"nofollow noopener\" target=\"_blank\">Eclipse hawkBit GitHub: update server for rolling out software updates to edge devices\/gateways; HTTP\/JSON device integration API<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.silabs.com\/bluetooth\/10.1.2\/using-gecko-bootloader-with-bluetooth-apps\/03-bluetooth-ota-upgrade\" rel=\"nofollow noopener\" target=\"_blank\">Silicon Labs Docs: Bluetooth OTA Upgrade<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.silabs.com\/bluetooth\/latest\/bluetooth-stack-overview\/\" rel=\"nofollow noopener\" target=\"_blank\">Silicon Labs Docs: Bluetooth Stack Overview<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Keeping a fleet aligned sounds easy until you hit device #317. Someone\u2019s battery is low. Someone\u2019s in a dead zone. Someone\u2019s \u201cupdated\u201d but keeps rebooting. And suddenly your tidy firmware spreadsheet turns into a crime scene. We\u2019ve seen this in real deployments: the update file is rarely the hard part, rather how-to-push-this-fast is. Firmware drift&hellip;&nbsp;<a href=\"https:\/\/www.lansitec.com\/es\/blogs\/fota-a-gran-escala-como-mantener-1000-dispositivos-con-el-mismo-firmware-sin-visitas-al-sitio\/\" rel=\"bookmark\">Leer m\u00e1s \u00bb<span class=\"screen-reader-text\">FOTA a gran escala: C\u00f3mo mantener m\u00e1s de 1000 dispositivos con el mismo firmware sin necesidad de visitas al sitio.<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":18507,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[19],"tags":[],"class_list":["post-18489","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"_links":{"self":[{"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/posts\/18489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/comments?post=18489"}],"version-history":[{"count":5,"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/posts\/18489\/revisions"}],"predecessor-version":[{"id":18514,"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/posts\/18489\/revisions\/18514"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/media\/18507"}],"wp:attachment":[{"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/media?parent=18489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/categories?post=18489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lansitec.com\/es\/wp-json\/wp\/v2\/tags?post=18489"}],"curies":[{"name":"gracias","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}