<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: manthink</title>
    <description>The latest articles on DEV Community by manthink (@manthink).</description>
    <link>https://dev.to/manthink</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3586413%2F58ca9d10-ab31-4aa2-8a1b-c9a0653ee339.png</url>
      <title>DEV Community: manthink</title>
      <link>https://dev.to/manthink</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manthink"/>
    <language>en</language>
    <item>
      <title>The Five-Layer Funnel for LoRaWAN Troubleshooting: From "No Data in the Cloud" to "The Numbers Are Wrong"</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Mon, 02 Nov 2026 07:59:41 +0000</pubDate>
      <link>https://dev.to/manthink/the-five-layer-funnel-for-lorawan-troubleshooting-from-no-data-in-the-cloud-to-the-numbers-are-p58</link>
      <guid>https://dev.to/manthink/the-five-layer-funnel-for-lorawan-troubleshooting-from-no-data-in-the-cloud-to-the-numbers-are-p58</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F842a8x68p4e3v8hqprit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F842a8x68p4e3v8hqprit.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Currency note: figures in this article are converted at the October 2026 reference rate of 1 USD ≈ 6.71 CNY and 1 EUR ≈ 7.88 CNY. Original quote currencies are preserved; CNY amounts are conversions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The most expensive thing in a troubleshooting session is not a missing tool. It is guessing.&lt;/p&gt;

&lt;p&gt;The symptom is one sentence: "The device is offline." That sentence can mean five completely different things. The gateway lost power. The gateway is online but hears no radio frames. Frames arrive but decryption fails. Decryption succeeds but the parser errors out. Parsing succeeds but the data never reaches storage or the outbound channel.&lt;/p&gt;

&lt;p&gt;These five causes live in five different layers. They require different tools, different screens, and different evidence. Without an order, troubleshooting degenerates into refreshing every page once and then changing whichever setting looks most suspicious — then finding it did not help, then trying the next one.&lt;/p&gt;

&lt;p&gt;The funnel replaces guessing with elimination. Each layer answers exactly one question. Yes moves you down; no stops you there. Five layers in, the fault is pinned to a single cell. No luck required.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The funnel at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Question to answer&lt;/th&gt;
&lt;th&gt;Where to look&lt;/th&gt;
&lt;th&gt;Key criterion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Is the gateway online&lt;/td&gt;
&lt;td&gt;Operations → Gateway Management&lt;/td&gt;
&lt;td&gt;Whether online status, heartbeat time, and total online time agree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Did the gateway hand frames to the NS&lt;/td&gt;
&lt;td&gt;Network Data → NS Data&lt;/td&gt;
&lt;td&gt;Whether records can be found by DevEUI or DevAddr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Did the NS decrypt successfully&lt;/td&gt;
&lt;td&gt;Network Data → AS Data&lt;/td&gt;
&lt;td&gt;Whether an application-layer packet exists at the same moment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Did the thing model parse it&lt;/td&gt;
&lt;td&gt;Application Data → Realtime Data / Device → Telemetry&lt;/td&gt;
&lt;td&gt;Whether values and timestamps are advancing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Where did the parsed data go&lt;/td&gt;
&lt;td&gt;Forward whitelist, raw retention switch, subscriber&lt;/td&gt;
&lt;td&gt;Dropped, filtered, or never subscribed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The third column of each row is more important than it looks: &lt;strong&gt;what a false conclusion at this layer costs you.&lt;/strong&gt; Most troubleshooting disasters are not caused by missing a symptom. They are caused by seeing a symptom, attributing it to the wrong layer, and breaking a configuration that was fine. The classic version: turning off ADR to "make data come up faster," and blowing the power budget of a battery device in the process.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Layer 1: Is the gateway online
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Operations → Gateway Management&lt;/strong&gt;. Each row shows location, type, online status, enabled status, hardware version, firmware version, LoRa standard, &lt;strong&gt;total online time, heartbeat time, and update time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most people read the online status column only. That is the most deceptive column on the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read the three time fields together
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Heartbeat time&lt;/strong&gt;: when the gateway last reported a heartbeat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total online time&lt;/strong&gt;: cumulative time online&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update time&lt;/strong&gt;: when this record was last modified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A gateway can show "online" while its heartbeat time stopped forty minutes ago. The default heartbeat period is 60 seconds. Forty minutes without a heartbeat means it has done nothing for forty minutes — the platform simply has not met the condition to mark it offline yet. Being marked offline requires a time condition to be satisfied; it is not a "last message received" flag.&lt;/p&gt;

&lt;p&gt;Conversely, a very short total online time with an advancing heartbeat time means the gateway is repeatedly dropping and reconnecting. That is the signature of a power or network problem, not a radio problem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Criterion: the gap between heartbeat time and now should be smaller than twice the heartbeat period. If the gap is larger while the status still reads online, stop trusting that column and read the heartbeat time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Three definitions of "online," not interchangeable
&lt;/h3&gt;

&lt;p&gt;This has to be settled before anything else. ThinkLink exposes at least three different online signals with different algorithms and different boundaries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Algorithm and boundary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API &lt;code&gt;online&lt;/code&gt; field&lt;/td&gt;
&lt;td&gt;Treated as online when heartbeat is empty; when non-empty, computed from activity time and twice the heartbeat, missing activity time counts as offline, and an exactly-equal deadline no longer counts as online&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server_attrs._online&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Numeric 1 online, 0 offline; with an empty heartbeat and the feature enabled it stays 1 with no timeout task; with a non-empty heartbeat it only goes offline when the current time &lt;strong&gt;strictly exceeds&lt;/strong&gt; &lt;code&gt;active_time + 2 × heart_period&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MQTT &lt;code&gt;data.online&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A boolean &lt;strong&gt;state-change notification&lt;/strong&gt;; asynchronous propagation has latency; it is neither a full state snapshot nor an alarm event&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each path gets used somewhere: dashboard display, statistics, automation. Mixing them produces a very concrete failure. Your dashboard reads &lt;code&gt;server_attrs._online&lt;/code&gt;, your alarm rule reads API &lt;code&gt;online&lt;/code&gt;, the two disagree, and you conclude the data is wrong — when in fact only the definitions differ.&lt;/p&gt;

&lt;p&gt;One more trap: &lt;strong&gt;after offline notification is disabled, &lt;code&gt;_online&lt;/code&gt; retains its last value.&lt;/strong&gt; A leftover 0 or 1 is not evidence of the current state. Reading 1 and concluding the device is alive is wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  If the gateway is offline, separate "no power" from "no network"
&lt;/h3&gt;

&lt;p&gt;Three platform-side checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ping&lt;/strong&gt;: one of the dedicated operations for ManThink-type gateways, confirming reachability of the platform-to-gateway path&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit → IP address&lt;/strong&gt;: the gateway reports its current IP when it comes online; this field lets you confirm its real network address and detect a changed IP or a move to another subnet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status trend&lt;/strong&gt;: shows the online/offline curve over a chosen range so you can locate when the drop started. Its value is separating "always dropping" from "started dropping at time X" — the latter lines up directly with construction work, power cuts, lightning, or hardware swaps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If Ping fails and the IP is stale or empty, the problem is on the gateway side or on the path to the server, not in the platform. Adjusting platform settings at this point is wasted effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Layer 2: Did the gateway hand frames to the NS
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;Network Data → NS Data&lt;/strong&gt;. You are looking at raw LoRaWAN frames together with frequency, RSSI, SNR, and data rate.&lt;/p&gt;

&lt;p&gt;The decisive detail is &lt;strong&gt;which identifier you search with&lt;/strong&gt;. Get this wrong and you will conclude "the NS received nothing" when it received plenty:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Search field&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device has never joined, or was just reset&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DevEUI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Join Request / Join Accept frames are identified by DevEUI; no DevAddr exists yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device has joined and reports normally&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DevAddr&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;After joining, all data frames use a dynamically assigned DevAddr, never the DevEUI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A factory-fresh device returns nothing for its DevEUI and nothing for its DevAddr — it has no DevAddr yet. A healthy running device returns nothing for its DevEUI on ordinary uplinks, because those frames carry the DevAddr. Neither empty result is a fault. Both are a search on the wrong key.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Criterion: &lt;strong&gt;NS has data → the problem is above the NS (start at layer 3). NS has no data → the problem is radio or backhaul, not the platform.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When NS has no data, the directions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the device even transmitting (device-side log via serial or vendor tool)&lt;/li&gt;
&lt;li&gt;Are the frequencies right (device channel plan versus gateway regional standard)&lt;/li&gt;
&lt;li&gt;Distance and obstruction (RSSI and SNR — but only meaningful once at least one frame arrives; with zero frames there is no signal to read)&lt;/li&gt;
&lt;li&gt;Is the gateway backhaul working (whether UDP 1700 is open — covered separately below, it is the single most common trap)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Layer 3: Did the NS decrypt successfully
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;Network Data → AS Data&lt;/strong&gt;. AS data is what the NS emits after &lt;strong&gt;decrypting and deframing&lt;/strong&gt; the LoRaWAN frame: LoRaWAN encryption is gone, but &lt;code&gt;userdata.payload&lt;/code&gt; is still the Base64-encoded application payload, not yet parsed by the thing model.&lt;/p&gt;

&lt;p&gt;This layer carries the most diagnostic information of the five. An AS uplink looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;{ "if": "loraWAN", "type": "data", "moteeui": "6353012af1090498", "version": "3.0", "gwrx": [ { "eui": "5a53012501030056", "chan": 0, "lsnr": 14.2, "rfch": 0, "rssi": -21, "time": "2025-09-24T07:07:03.807677Z", "tmst": 1152383989 } ], "moteTx": { "codr": "4/5", "datr": "SF7BW125", "freq": 470.9, "modu": "LORA" }, "userdata": { "port": 11, "class": "ClassA", "seqno": 27464, "payload": "IQcDDG4BAADaBB0C538J", "confirmed": false } }&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every field has a specific diagnostic job:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Diagnostic use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;moteeui&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Confirms which device sent it, ruling out a mistyped EUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gwrx[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every gateway that heard the frame, with per-gateway RSSI / LSNR. With multiple receivers, take the best RSSI as the link-quality reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gwrx[].chan&lt;/code&gt; / &lt;code&gt;rfch&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Channel number and RF chain. Misconfigured frequencies surface here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gwrx[].lsnr&lt;/code&gt; / &lt;code&gt;rssi&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;SNR and signal strength. SNR is the real LoRa margin metric; RSSI is only a reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;moteTx.datr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Data rate, e.g. &lt;code&gt;SF7BW125&lt;/code&gt;. If ADR is broken, this sticks at the lowest rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;moteTx.freq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uplink frequency. A mismatch with the gateway channel plan is a frequency problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userdata.port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FPort, distinguishing business channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userdata.seqno&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Device frame counter. &lt;strong&gt;This is how you diagnose retransmission and loss&lt;/strong&gt; — contiguous counters with uneven spacing mean retries; gaps mean real loss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userdata.payload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base64 application payload; exactly what the thing-model script consumes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  NS has data, AS is empty: only three possibilities
&lt;/h3&gt;

&lt;p&gt;The official decision table is refreshingly blunt:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NS has data, AS empty&lt;/td&gt;
&lt;td&gt;LoRaWAN key mismatch (AppKey / AppSKey / NwkSKey)&lt;/td&gt;
&lt;td&gt;Verify the keys in the profile against what is burned into the device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NS has data, AS empty&lt;/td&gt;
&lt;td&gt;No device profile, or &lt;code&gt;enable&lt;/code&gt; is false&lt;/td&gt;
&lt;td&gt;Create the profile and confirm &lt;code&gt;enable&lt;/code&gt; is on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AS has data&lt;/td&gt;
&lt;td&gt;Decryption succeeded; go to layer 4&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "&lt;code&gt;enable&lt;/code&gt; is false" case is especially sneaky. It raises no error. The NS simply does not respond, which from the outside is indistinguishable from a wrong key. And it is a &lt;strong&gt;silent switch&lt;/strong&gt;: the profile exists, the keys exist, nothing takes effect.&lt;/p&gt;

&lt;p&gt;One more easily missed constraint: &lt;strong&gt;a given device profile should be enabled on exactly one platform (Cloud / TKG / TKE) at a time&lt;/strong&gt;, otherwise join conflicts follow. A profile left enabled in the cloud while the device is also commissioned into an edge server means two NS instances competing for the same DevAddr. The symptom is "works, then does not, then works" — far harder to chase than a clean failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  FPort is more than a business category
&lt;/h3&gt;

&lt;p&gt;Several FPorts are conventional on the platform:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;FPort&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;Pass-through: raw bytes forwarded as-is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;Firmware OTA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;209&lt;/td&gt;
&lt;td&gt;Heartbeat, used to confirm device liveness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;214&lt;/td&gt;
&lt;td&gt;Parameter configuration and readback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A packet on port 209 is a heartbeat, not business data — its payload contains none of your measurement points. A thing-model script without a per-port branch will happily parse a heartbeat as sensor data and emit nonsense. This is a common source of "one field occasionally turns into a weird number."&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Layer 4: Did the thing model parse it
&lt;/h2&gt;

&lt;p&gt;Two entry points: &lt;strong&gt;Application Data → Realtime Data&lt;/strong&gt;, and &lt;strong&gt;Device detail → Telemetry tab&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Telemetry in the device detail is grouped by thing model and shows every field from the most recent parse together with a timestamp. It updates by MQTT push, so no manual refresh is needed. That makes it a good liveness probe: stare at it for three minutes. If neither values nor timestamps move, parsing has stopped. If the timestamp advances but a specific field is empty, that field is simply never assigned by the script.&lt;/p&gt;

&lt;h3&gt;
  
  
  AS has data, realtime data is empty: only two causes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AS has data, realtime empty&lt;/td&gt;
&lt;td&gt;No thing model bound to the device&lt;/td&gt;
&lt;td&gt;Bind one in model management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AS has data, realtime empty&lt;/td&gt;
&lt;td&gt;Parser script error&lt;/td&gt;
&lt;td&gt;Open the editor and &lt;strong&gt;feed the AS payload in manually&lt;/strong&gt; to debug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AS has data, some fields empty&lt;/td&gt;
&lt;td&gt;Script does not cover that FPort or field&lt;/td&gt;
&lt;td&gt;Inspect the branch for that port&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That middle row — manually feeding the payload — is the highest-leverage action in the entire troubleshooting system. Script errors, a &lt;code&gt;null&lt;/code&gt; return, a wrongly shaped object: in the overwhelming majority of cases you can reproduce them by pasting a Base64 string. No site visit, no restart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three fixed traps in the script layer
&lt;/h3&gt;

&lt;p&gt;Three things reliably produce "it will not parse":&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, the only output channel is the return value.&lt;/strong&gt; Scripts run in a restricted sandbox: no &lt;code&gt;console.log&lt;/code&gt;, no &lt;code&gt;async&lt;/code&gt;, and a 1000 ms execution ceiling. Every result, every diagnostic, must come out through &lt;code&gt;return&lt;/code&gt;. Anyone expecting print-based debugging sees "nothing was output" and wrongly concludes "the script never ran."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, the payload comes from &lt;code&gt;msg.userdata.payload&lt;/code&gt; and it is Base64.&lt;/strong&gt; Treat it as a string and you get mojibake instead of bytes. Decode it first, then read by byte offset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, a script existing does not mean the mapping is done.&lt;/strong&gt; Written, saved, no error — none of that proves the field reached telemetry. The only proof is a value visible in the Telemetry tab. These are separate states on the platform, and conflating them produces endless loops between "but I wrote it" and "but there is no data."&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Layer 5: Where did the data go
&lt;/h2&gt;

&lt;p&gt;At this point AS has packets and telemetry has values, yet downstream still says it received nothing. The problem is no longer acquisition. It is the &lt;strong&gt;data egress&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Egress 1: the raw retention switch
&lt;/h3&gt;

&lt;p&gt;One easily misread symptom: &lt;strong&gt;the AS Data page is empty while telemetry is perfectly fine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not a contradiction. Raw packet retention must be enabled separately via the device's &lt;code&gt;real_time_storage&lt;/code&gt; switch. When it is off, the NS still receives, decrypts, runs the thing model, and writes telemetry — the whole chain works — it simply keeps no raw copy at that layer.&lt;/p&gt;

&lt;p&gt;So "nothing on the AS page" has two entirely different meanings: no signal came in, or signal came in but was not archived. The discriminator is trivial — check whether telemetry has values. Values present means retention is off. No values means a link problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Egress 2: the forward whitelist
&lt;/h3&gt;

&lt;p&gt;Since 2.00.066, server attributes and shared attributes are &lt;strong&gt;not forwarded by default&lt;/strong&gt;; only fields explicitly checked for forwarding are sent. The intent is to keep irrelevant fields from flooding MQTT, but the side effect is: you add a server attribute, see a value in the UI, and the MQTT side never receives it — because it was never checked.&lt;/p&gt;

&lt;p&gt;Similarly, when the target broker disconnects there is &lt;strong&gt;no buffering and no replay&lt;/strong&gt;, and no exactly-once guarantee. A forwarder is not a message queue; it is a realtime channel. Data produced during those few minutes while the subscriber restarts is simply gone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Egress 3: the subscriber's own problems
&lt;/h3&gt;

&lt;p&gt;The most common sentence on the MQTT side is "I subscribed but there is no data." Three fixed causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;{tenant}&lt;/code&gt; was never replaced with the organization account.&lt;/strong&gt; Topics look like &lt;code&gt;/v32/{tenant}/as/up/data/#&lt;/code&gt;, where &lt;code&gt;{tenant}&lt;/code&gt; is a placeholder, not a literal. Copy it verbatim and you connect fine, subscribe fine, and receive nothing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscribed to the parsed topic while the device has no forwarding configured.&lt;/strong&gt; &lt;code&gt;tkl/up/telemetry/#&lt;/code&gt; is parsed; &lt;code&gt;as/up/data/#&lt;/code&gt; is raw. They draw from different sources, and data on one says nothing about the other&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Received, then dropped by a script.&lt;/strong&gt; A forwarding script that returns &lt;code&gt;null&lt;/code&gt; discards the message. That is the correct way to filter, and also the most common invisible failure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One version note worth remembering: &lt;strong&gt;registering a subscription is not the same as subscribing successfully&lt;/strong&gt; — only a SUBACK counts. Since 2.00.070 this semantics is explicit, yet in the field many still treat "shown as configured in the UI" as "receiving data."&lt;/p&gt;

&lt;h3&gt;
  
  
  False empties introduced by paginated loading
&lt;/h3&gt;

&lt;p&gt;Since 2.00.075, configuration, attributes, and telemetry load separately on demand. After switching tabs, wait for a successful load before editing and saving — &lt;strong&gt;unloaded fields must not be treated as empty values&lt;/strong&gt;. MQTT messages may likewise carry only a subset of whitelisted attributes; receivers should merge by field rather than overwrite whole groups.&lt;/p&gt;

&lt;p&gt;Together these two facts produce an awkward class of failure: a save writes an empty value into a field that had simply not loaded, or a receiver overwrites complete state with a partial message. The visible symptom is "a setting reverted itself," and it is hard to reproduce.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The on-site trio: diagnosing without the platform
&lt;/h2&gt;

&lt;p&gt;The platform answers "which layer is broken." The field answers "why is that layer broken." Three things are enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  One: the gateway's local web console
&lt;/h3&gt;

&lt;p&gt;GD6 series gateways use the gwTool6 web console. Key entry points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ethernet defaults to DHCP&lt;/strong&gt;; on the same subnet, browse straight to the gateway IP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Wi-Fi AP SSID is &lt;code&gt;GD6-&amp;lt;Gateway EUI&amp;gt;&lt;/code&gt;&lt;/strong&gt;, falling back to &lt;code&gt;LGW-Config&lt;/code&gt; only when no valid EUI exists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Factory AP password and web password are both &lt;code&gt;wifi!0804&lt;/code&gt;&lt;/strong&gt;, managed independently; change them on first login&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With no network on site, joining that hotspot from a phone is the fastest route into the console. Note the condition: the hotspot must actually appear and accept connections to count — "shown as enabled in the UI" does not.&lt;/p&gt;

&lt;p&gt;The Radio page frequencies, the NS page server address and ports, and the "save and restart to apply" confirmation all live here. One operational detail deserves writing down: &lt;strong&gt;the "submit" button at the bottom of the page is what saves Radio, whereas the NS page uses "save and restart," and after the service recovers you must reload to verify.&lt;/strong&gt; Skip the reload and you are reading the form's old values, not the device's current ones.&lt;/p&gt;

&lt;p&gt;While on the subject, one boundary specific to GD62: &lt;strong&gt;it has no external REC button.&lt;/strong&gt; Any "hold REC for about two seconds" recovery procedure does not apply to that unit. Factory reset goes through the support procedure; afterwards the web password returns to &lt;code&gt;wifi!0804&lt;/code&gt; while &lt;strong&gt;a previously written Gateway EUI is retained.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Two: an MQTT client
&lt;/h3&gt;

&lt;p&gt;Whether mosquitto_sub, MQTTX, or your own script, subscribing once to &lt;code&gt;/v32/{tenant}/as/up/data/#&lt;/code&gt; shows you every device's raw uplink directly. It is the fastest way to answer "is anything actually flowing," much faster than paging through the UI.&lt;/p&gt;

&lt;p&gt;Watch three things: whether packets appear at all, whether &lt;code&gt;moteeui&lt;/code&gt; is the device you care about, and whether &lt;code&gt;userdata.seqno&lt;/code&gt; advances contiguously. That last one instantly separates "the device never sent" from "the device sent and it never arrived."&lt;/p&gt;

&lt;h3&gt;
  
  
  Three: a site visit you can actually price
&lt;/h3&gt;

&lt;p&gt;Troubleshooting time has a quantifiable cost. A single site visit (labour plus travel) runs roughly 300–800 CNY in a tier-one Chinese city, and roughly 150–400 USD (≈ 1,000–2,700 CNY) overseas at published service rates. The point is not precision. The point is that it puts a price on "can this be solved remotely": if a problem can be walked through all five layers remotely and pinned to one layer, the site visit becomes "go replace that part" instead of "go see what is wrong." The difference in elapsed time is typically half a day versus three days.&lt;/p&gt;

&lt;p&gt;The more expensive failure is misattribution. Disabling ADR to "make data come up faster" will blow a battery device's power budget within a week. Nothing shows on site. Three months later it surfaces as "the batteries do not last," and by then it is very hard to trace back to which setting changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Seven traps from real integration work
&lt;/h2&gt;

&lt;p&gt;These seven come from actual integration records, not theory. Their common shape: &lt;strong&gt;the symptom appears in the platform, the root cause sits outside it.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Root cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No gateway UDP arrives at all&lt;/td&gt;
&lt;td&gt;Security group allows TCP only; UDP 1700 not opened&lt;/td&gt;
&lt;td&gt;Add an inbound rule for UDP 1700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway packets rejected (illegal / single byte)&lt;/td&gt;
&lt;td&gt;Not using Semtech UDP, or a proprietary protocol&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;nsProtocol&lt;/code&gt; to &lt;code&gt;pkt_fwd&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packets received but nothing goes uplink&lt;/td&gt;
&lt;td&gt;Leading space in &lt;code&gt;nsAddress&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Remove the space and restart the service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway connects but frames are dropped&lt;/td&gt;
&lt;td&gt;Bridge prefix (region) does not match the device band&lt;/td&gt;
&lt;td&gt;Point the topic template at the correct sub-band&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events on a third-party platform, no telemetry in ThinkLink&lt;/td&gt;
&lt;td&gt;Forwarder MQTT subscription silently dies after restart&lt;/td&gt;
&lt;td&gt;Re-save the forwarder to force a resubscribe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uplink jitter and frequent retransmission&lt;/td&gt;
&lt;td&gt;Profile wrongly set to Class C + ADR + DevStatusReq, sending surplus downlinks to a battery-powered Class A device&lt;/td&gt;
&lt;td&gt;Set the profile to Class A, disable ADR and DevStatusReq&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AS Data page empty but telemetry normal&lt;/td&gt;
&lt;td&gt;Raw retention switch not enabled&lt;/td&gt;
&lt;td&gt;Enable &lt;code&gt;real_time_storage&lt;/code&gt; on the device&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first one deserves its own paragraph. UDP 1700 is the highest-frequency trap in all of LoRaWAN troubleshooting, and the easiest place to fail at "I am sure I configured it" — because local testing usually has no security group at all, and the problem only appears after moving to cloud. The same logic appeared in issue 24 on BACnet: the Docker inbound port list does not include 47808 or 502, and the installer neither maps nor allows them, producing "the platform says the service is running, the other side cannot even scan it." &lt;strong&gt;Always audit the port list separately. Never trust installer defaults.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fifth trap belongs to the same family: the connection is up, the process is alive, the configuration is correct, and no data arrives. There is no error to read; the only test is "re-save it and see whether it recovers." It is a reminder that &lt;strong&gt;running and working are two different states.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Compressing the funnel into 20 minutes
&lt;/h2&gt;

&lt;p&gt;A real session does not require visiting every page. Work in time boxes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0–3 min: confirm the gateway.&lt;/strong&gt; Compare heartbeat time against now; check whether total online time has grown steadily over a long period. Ping once. If the gateway is offline, layers 2–5 are irrelevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3–8 min: confirm frames arrive.&lt;/strong&gt; On NS Data, search with the right key: DevEUI before join, DevAddr after. Finding it means radio and backhaul both work and the problem is above; not finding it sends you straight to frequencies and ports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8–13 min: confirm decryption.&lt;/strong&gt; Search AS Data with the same identifier. Frames but no packets means the key or the profile's &lt;code&gt;enable&lt;/code&gt; flag — those are the only two options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13–17 min: confirm parsing.&lt;/strong&gt; Read Realtime Data and the device Telemetry tab together. An advancing timestamp means it is alive; if not, paste the AS payload into the script editor and run it by hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17–20 min: confirm egress.&lt;/strong&gt; Telemetry has values but downstream does not: check &lt;code&gt;real_time_storage&lt;/code&gt;, whether the forward whitelist boxes are ticked, and whether &lt;code&gt;{tenant}&lt;/code&gt; was substituted in the subscriber's topic.&lt;/p&gt;

&lt;p&gt;Twenty minutes, and the fault lands on a specific criterion. What remains is fixing, not finding.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. What this method actually solves
&lt;/h2&gt;

&lt;p&gt;The tools are unremarkable: five screens, one MQTT client, one gateway web console.&lt;/p&gt;

&lt;p&gt;What is not unremarkable is &lt;strong&gt;the order&lt;/strong&gt;. The same five screens read in the right order are elimination. Read in the wrong order they are sampling. Sampling conclusions depend on luck, and luck is never sufficient on a fault site.&lt;/p&gt;

&lt;p&gt;There is a secondary benefit. When you know exactly what proves each layer, you also know &lt;strong&gt;which observations cannot serve as conclusions&lt;/strong&gt;. "Online" does not prove working. "Configured" does not prove running. "The script exists" does not prove the mapping is done. "There is a value on the page" does not prove the data was sent. Each of those four sentences maps to a specific trap described above.&lt;/p&gt;

&lt;p&gt;The ceiling on troubleshooting skill is rarely about how many tools you know. It is about knowing which evidence does not count as evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Issue 21, &lt;em&gt;ThinkLink Thing-Model Decoder Scripts in Practice: From Binary Payload to Readable Data&lt;/em&gt; — the deep dive for layer 4&lt;/li&gt;
&lt;li&gt;Issue 22, &lt;em&gt;ThinkLink Triggers and Alarm Rules in Practice&lt;/em&gt; — what happens after layer 5: turning data into notification&lt;/li&gt;
&lt;li&gt;Issue 26, &lt;em&gt;LoRaWAN Gateway Antenna Selection and Installation Guide&lt;/em&gt; — when layer 2 fails for lack of signal, start from the link budget&lt;/li&gt;
&lt;li&gt;Issue 27, &lt;em&gt;A/B Partitioning for LoRaWAN Gateway Firmware Updates&lt;/em&gt; — availability design on the gateway side&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Official documentation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gateway Management: &lt;a href="https://www.think-link.net/docs/en/Maintenance/GatewayManagement.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Maintenance/GatewayManagement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Device Management: &lt;a href="https://www.think-link.net/docs/en/Maintenance/DeviceManagement.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Maintenance/DeviceManagement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;NS Data: &lt;a href="https://www.think-link.net/docs/en/Data/NetworkData/NSData.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Data/NetworkData/NSData.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AS Data: &lt;a href="https://www.think-link.net/docs/en/Data/NetworkData/ASData.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Data/NetworkData/ASData.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ThinkLink Protocol: &lt;a href="https://www.think-link.net/docs/en/Protocol/ThinkLinkProtocol.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Protocol/ThinkLinkProtocol.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>debugging</category>
      <category>iot</category>
      <category>networking</category>
    </item>
    <item>
      <title>LoRaWAN Gateway Antenna Selection and Installation Guide: Why 3 dBi Sometimes Beats 8 dBi</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Wed, 28 Oct 2026 09:37:38 +0000</pubDate>
      <link>https://dev.to/manthink/lorawan-gateway-antenna-selection-and-installation-guide-why-3-dbi-sometimes-beats-8-dbi-bkc</link>
      <guid>https://dev.to/manthink/lorawan-gateway-antenna-selection-and-installation-guide-why-3-dbi-sometimes-beats-8-dbi-bkc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkcbi6qj84luto36c84ix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkcbi6qj84luto36c84ix.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Currency note&lt;/strong&gt;: USD figures are quoted as originally published. Reference conversion for October 2026: 1 USD ≈ 6.71 CNY. Prices marked "reference price" are subject to the manufacturer's current quotation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two LoRaWAN projects, less than three kilometres apart, using the same gateway model, the same batch of meters and the same ThinkLink tenant. One reaches a basement water meter 2.4 km away with -118 dBm and -12 dB still in hand. The other starts dropping packets 300 m away inside a single building — and went back to site three times.&lt;/p&gt;

&lt;p&gt;The difference was not the gateway and it was not the platform. One project put the antenna on a ten-metre mast on the roof with the stock 3 dBi omnidirectional whip. The other bought a "higher gain" 8 dBi antenna and screwed it onto a server cabinet — a metal cabinet, with the base of the antenna buried in a cable tray.&lt;/p&gt;

&lt;p&gt;The antenna is the part of a LoRaWAN deployment most often treated as an accessory, and it is the one variable in the link budget that routinely moves it by 10 dB. Gateway transmit power is fixed: GD73 is rated at a maximum of 27 dBm for the &lt;code&gt;-1&lt;/code&gt; suffix and 22 dBm for the &lt;code&gt;-2&lt;/code&gt; suffix (±2 dBm deviation); GD61x and GD62 are 22 dBm maximum for the &lt;code&gt;-2&lt;/code&gt; suffix. Receiver sensitivity is fixed too: these gateways are all specified at &lt;strong&gt;-141 dBm (SF12, BW 125 kHz)&lt;/strong&gt;. If both ends of the budget are given, where do the remaining decibels come from?&lt;/p&gt;

&lt;p&gt;From the antenna, and from where you put it. This article works through the numbers.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Start with the band: the wrong antenna is the first line on the trouble ticket
&lt;/h2&gt;

&lt;p&gt;Official frequency ranges for ManThink gateways:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Region&lt;/th&gt;
&lt;th&gt;Frequency range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CN470&lt;/td&gt;
&lt;td&gt;470–510 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EU433&lt;/td&gt;
&lt;td&gt;433–434 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EU868&lt;/td&gt;
&lt;td&gt;863–870 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AS923&lt;/td&gt;
&lt;td&gt;920–928 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US902 / US915&lt;/td&gt;
&lt;td&gt;902–928 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AU915&lt;/td&gt;
&lt;td&gt;915–928 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The documentation states three hard constraints about antennas, and the wording is worth quoting verbatim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GD61x user guide, step 4: &lt;strong&gt;"Confirm the antenna frequency band matches the gateway's regional version."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Note under the GD62 (IP67) specification table: &lt;strong&gt;"The RF region must be consistent with the hardware, antenna and end-device configuration."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;GD62 pre-installation notes: &lt;strong&gt;"Connect the LoRa antenna before powering on. Do not start LoRa transmission with no antenna connected."&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These cover three different things.&lt;/p&gt;

&lt;p&gt;The first is that the antenna's own frequency range must cover the region the gateway operates in. A whip marked 433 MHz connected to a CN470 gateway is off resonance by roughly 40 MHz, and the VSWR collapses accordingly.&lt;/p&gt;

&lt;p&gt;The second is system-level consistency: the gateway's RF hardware version, the antenna and the end devices must all sit in the same region. The mistake usually happens in procurement — a project specified for CN470 ships with an EU868 unit, and nobody notices until nothing joins. The symptom looks exactly like a broken antenna.&lt;/p&gt;

&lt;p&gt;The third is a safety constraint, and it is the one installers skip most often: &lt;strong&gt;never transmit with no antenna connected.&lt;/strong&gt; Almost all of the front-end output power reflects back into the power amplifier, and the output stage of a concentrator like the SX1301/SX1302 is not designed to absorb it. "Gateway powered up and never demodulated another packet again" traces back to exactly this — mains plugged in before the antenna was tightened.&lt;/p&gt;

&lt;p&gt;So step one is not comparing parameters. Step one is &lt;strong&gt;checking&lt;/strong&gt;: the RF region on the rating plate, the frequency range printed on the antenna label, and the regional configuration on the end devices. All three must agree before anything else happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Three things that matter more than the gain number
&lt;/h2&gt;

&lt;p&gt;An off-the-shelf LoRa antenna label usually shows gain, VSWR, polarization and connector type. Buyers look at the first line. The other three decide whether the deployment works.&lt;/p&gt;

&lt;h3&gt;
  
  
  The unit trap: dBi vs dBd
&lt;/h3&gt;

&lt;p&gt;Antenna gain uses one of two reference bases: dBi references an ideal isotropic radiator, dBd references a half-wave dipole. The conversion is fixed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;0 dBd = 2.15 dBi&lt;br&gt;
dBi value = dBd value + 2.15&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The same physical antenna labelled 5 dBi or 2.85 dBd is the same antenna. Compare two products without normalising units and you invent 2.15 dB out of nothing — which, by the worked example in section 4, is roughly 18% of coverage radius appearing and then disappearing again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gain is not amplification, it is redistribution
&lt;/h3&gt;

&lt;p&gt;This has to be understood before any selection is made. A passive antenna generates no energy; gain comes from concentrating radiation into preferred directions at the expense of others. For an omnidirectional antenna, that means &lt;strong&gt;flattening the vertical lobe&lt;/strong&gt;, paid for with nulls directly above and below the antenna.&lt;/p&gt;

&lt;p&gt;A 2 dBi omnidirectional antenna typically has a vertical half-power beamwidth of 60–80 degrees. Push it to 6–8 dBi and that may drop to 15–25 degrees. This is the physical reason behind "high-gain antenna on the roof, nothing works on the floor below" — the antenna is doing exactly what it was designed to do, which is send energy to the horizon.&lt;/p&gt;

&lt;p&gt;Indoor scenarios are worse. A gateway antenna flush-mounted to the ceiling of a 3 m machine room, with end devices spread from basement to third floor, will favour the middle floor with a high-gain whip while the top and bottom get weaker than they would with a 2 dBi one.&lt;/p&gt;

&lt;h3&gt;
  
  
  VSWR measures how much energy never leaves
&lt;/h3&gt;

&lt;p&gt;VSWR describes the impedance match between antenna and feeder. Ideal is 1.0. The usual engineering reading is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;VSWR&lt;/th&gt;
&lt;th&gt;Reading&lt;/th&gt;
&lt;th&gt;Return loss&lt;/th&gt;
&lt;th&gt;Mismatch loss&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;≤ 1.5&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;≥ 14 dB&lt;/td&gt;
&lt;td&gt;≤ 0.18 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5 – 2.0&lt;/td&gt;
&lt;td&gt;Acceptable&lt;/td&gt;
&lt;td&gt;9.5 – 14 dB&lt;/td&gt;
&lt;td&gt;0.18 – 0.51 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0 – 3.0&lt;/td&gt;
&lt;td&gt;Investigate&lt;/td&gt;
&lt;td&gt;6 – 9.5 dB&lt;/td&gt;
&lt;td&gt;0.51 – 1.25 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; 3.0&lt;/td&gt;
&lt;td&gt;Fail&lt;/td&gt;
&lt;td&gt;&amp;lt; 6 dB&lt;/td&gt;
&lt;td&gt;&amp;gt; 1.25 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note the last column: even at a VSWR as poor as 3.0, the power actually wasted is only 1.25 dB. &lt;strong&gt;The mismatch loss itself is rarely what kills you.&lt;/strong&gt; What kills you is what a high VSWR reveals — the antenna is not resonant anywhere near the band you are using. That is where the missing fifteen decibels went.&lt;/p&gt;

&lt;p&gt;Antennas for low bands such as 470 MHz are physically large, and many products are electrically shortened to fit, which narrows bandwidth and reduces efficiency. This is why you select by regional band rather than buying a generic "LoRa antenna".&lt;/p&gt;

&lt;h3&gt;
  
  
  Polarization: twenty dB or more, silently
&lt;/h3&gt;

&lt;p&gt;LoRaWAN end devices and gateways normally use linear polarization, installed vertically by default. If a device antenna is laid sideways inside an enclosure, or a meter is mounted on its side in a pit, the polarization plane rotates.&lt;/p&gt;

&lt;p&gt;Polarization mismatch loss follows a cosine-squared relationship: roughly 3 dB at 45 degrees, about 10 dB at 70 degrees, and approaching full loss at 90 degrees — in practice a 20 dB-plus drop. It is notoriously hard to diagnose, because "the device loses packets ten metres directly below the gateway" appears to make no sense at all until you stand the device upright and it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The link budget: account for every decibel
&lt;/h2&gt;

&lt;p&gt;Selection by feel is a gamble. This is arithmetic. The power balance for an uplink is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Received power = device Tx power + device antenna gain − path loss − obstruction loss − feeder loss − connector loss + gateway antenna gain&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Solving the inequality gives the maximum allowable path loss:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Allowable path loss = device Tx power + device antenna gain + gateway antenna gain − gateway sensitivity − feeder loss − connector loss − obstruction loss − design margin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every term is measurable or documented. Fill them in one by one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Free-space path loss
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;FSPL (dB) = 32.44 + 20·log₁₀(distance in km) + 20·log₁₀(frequency in MHz)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Free-space loss at three common LoRaWAN bands:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distance&lt;/th&gt;
&lt;th&gt;470 MHz&lt;/th&gt;
&lt;th&gt;868 MHz&lt;/th&gt;
&lt;th&gt;915 MHz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 km&lt;/td&gt;
&lt;td&gt;85.9 dB&lt;/td&gt;
&lt;td&gt;91.2 dB&lt;/td&gt;
&lt;td&gt;91.7 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 km&lt;/td&gt;
&lt;td&gt;91.9 dB&lt;/td&gt;
&lt;td&gt;97.2 dB&lt;/td&gt;
&lt;td&gt;97.7 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 km&lt;/td&gt;
&lt;td&gt;99.9 dB&lt;/td&gt;
&lt;td&gt;105.2 dB&lt;/td&gt;
&lt;td&gt;105.7 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 km&lt;/td&gt;
&lt;td&gt;105.9 dB&lt;/td&gt;
&lt;td&gt;111.2 dB&lt;/td&gt;
&lt;td&gt;111.7 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note the frequency term: at the same distance, 470 MHz loses &lt;strong&gt;5.8 dB less&lt;/strong&gt; than 915 MHz. That is the natural advantage of the lower Sub-GHz band, and the reason CN470 deployments often show better coverage than US915 ones at equal power — not better hardware, just physics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real environments replace n
&lt;/h3&gt;

&lt;p&gt;Free space assumes a path loss exponent of n = 2. Practical values:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Environment&lt;/th&gt;
&lt;th&gt;Path loss exponent n&lt;/th&gt;
&lt;th&gt;Loss per doubling of distance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free space / clean line of sight&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;6 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suburban / open campus&lt;/td&gt;
&lt;td&gt;2.5 – 3.0&lt;/td&gt;
&lt;td&gt;7.5 – 9 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-up urban&lt;/td&gt;
&lt;td&gt;3.0 – 3.5&lt;/td&gt;
&lt;td&gt;9 – 10.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dense indoor&lt;/td&gt;
&lt;td&gt;3.5 – 4.5&lt;/td&gt;
&lt;td&gt;10.5 – 13.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Applied on top of the 1 km reference:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PL (dB) = FSPL(1 km) + 10·n·log₁₀(distance in km) + obstruction loss&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  A worked example
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: CN470, an open campus with mostly outdoor installations. A GD73 (&lt;code&gt;-2&lt;/code&gt; suffix, 22 dBm) with a 3 dBi omnidirectional antenna at the top of a ten-metre mast. Gateway side: 1.5 m of LMR-400 plus two connectors. End device: a KC11 DTU transmitting at 14 dBm with a 0 dBi stub, inside an outdoor meter box. Target SF12, BW 125 kHz, gateway sensitivity -141 dBm.&lt;/p&gt;

&lt;p&gt;Gateway-side losses line by line:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feeder, LMR-400 @ 470 MHz, 1.5 m&lt;/td&gt;
&lt;td&gt;0.13 dB&lt;/td&gt;
&lt;td&gt;≈ 0.09 dB/m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two connectors&lt;/td&gt;
&lt;td&gt;0.40 dB&lt;/td&gt;
&lt;td&gt;≈ 0.2 dB each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway-side total&lt;/td&gt;
&lt;td&gt;0.53 dB&lt;/td&gt;
&lt;td&gt;count as 0.6 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Maximum allowable path loss:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;14 dBm (device Tx) + 0 dBi (device antenna) + 3 dBi (gateway antenna) − (−141 dBm) (gateway sensitivity) − 0.6 dB (feeder and connectors) − 20 dB (box penetration and clutter) − 10 dB (design margin)&lt;br&gt;
= 127.4 dB&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back-solving distance at n = 3.0:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;85.9 + 30·log₁₀(d) ≤ 127.4&lt;br&gt;
log₁₀(d) ≤ 1.383&lt;br&gt;
d ≤ 24 km&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which is obviously larger than any real campus deployment. Section 5 explains why. The point here is this: &lt;strong&gt;the power budget is inherently generous, which means the real constraint on LoRaWAN coverage is almost never transmit power — it is antenna placement and environment.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Feeder cable: the easiest 3 dB to throw away
&lt;/h2&gt;

&lt;p&gt;In the example above the feeder accounted for only 0.6 dB, because it was LMR-400 and only 1.5 m long. Change one of those two things and the picture changes quickly.&lt;/p&gt;

&lt;p&gt;Typical coaxial cable attenuation in the Sub-GHz range:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cable type&lt;/th&gt;
&lt;th&gt;@ 470 MHz&lt;/th&gt;
&lt;th&gt;@ 900 MHz&lt;/th&gt;
&lt;th&gt;Total over 3 m @ 470 MHz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RG-58&lt;/td&gt;
&lt;td&gt;≈ 0.35 dB/m&lt;/td&gt;
&lt;td&gt;≈ 0.57 dB/m&lt;/td&gt;
&lt;td&gt;≈ 1.05 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RG-213&lt;/td&gt;
&lt;td&gt;≈ 0.20 dB/m&lt;/td&gt;
&lt;td&gt;≈ 0.32 dB/m&lt;/td&gt;
&lt;td&gt;≈ 0.60 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LMR-400&lt;/td&gt;
&lt;td&gt;≈ 0.09 dB/m&lt;/td&gt;
&lt;td&gt;≈ 0.13 dB/m&lt;/td&gt;
&lt;td&gt;≈ 0.27 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1/2" corrugated copper feeder&lt;/td&gt;
&lt;td&gt;≈ 0.02 dB/m&lt;/td&gt;
&lt;td&gt;≈ 0.03 dB/m&lt;/td&gt;
&lt;td&gt;≈ 0.06 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Add connectors at roughly 0.1–0.3 dB each in this range, counting an adapter (N-type to SMA, say) as two.&lt;/p&gt;

&lt;p&gt;All small numbers. Two observations follow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, feeder loss applies in both directions.&lt;/strong&gt; Ten metres of RG-58 costs 3.5 dB on receive and another 3.5 dB on transmit. That is why "keep the gateway in the rack and run a long feeder up to the roof" is a bad plan — you lose 3.5 dB at each end, roughly 55% of the power in each direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, remember what 3 dB is.&lt;/strong&gt; It is half the power. A cheap ten-metre run can take a 22 dBm radio down to well under half its effective radiated output. &lt;strong&gt;The care you put into choosing antenna gain is easily wiped out by the cable you saved money on.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is only one correct engineering answer: &lt;strong&gt;move the gateway closer to the antenna, not the feeder closer to the antenna.&lt;/strong&gt; A device like the GD62 (IP67), rated for -25 °C to 60 °C with IP67 protection, was designed to be mounted on a pole. Put the antenna on the chassis connector with a short jumper, and run Ethernet/PoE back to the rack — 100 m of Ethernet costs nothing in RF terms, 10 m of feeder costs decibels.&lt;/p&gt;

&lt;p&gt;Where a long feeder is genuinely required for lightning protection or routing, spend the money on the cable instead: 1/2" feeder loses about 0.02 dB/m at 470 MHz, so 20 m costs only 0.4 dB. It needs adapters and demands better workmanship, but it is money well spent.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Antenna height matters more than antenna gain
&lt;/h2&gt;

&lt;p&gt;Back to that absurd 24 km. Where did it come from?&lt;/p&gt;

&lt;p&gt;Height. LoRa in the Sub-GHz bands is substantially quasi-line-of-sight, and the real limiter is often the radio horizon. With standard atmospheric refraction (4/3 Earth radius):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Radio horizon (km) ≈ 4.12 × (√h₁(m) + √h₂(m))&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;where h₁ is gateway antenna height and h₂ is device antenna height. Taking the device at 1.5 m:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gateway antenna height&lt;/th&gt;
&lt;th&gt;Radio horizon&lt;/th&gt;
&lt;th&gt;vs 2 m&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2 m (top of a cabinet, within arm's reach)&lt;/td&gt;
&lt;td&gt;≈ 10.6 km&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 m (second floor, external wall)&lt;/td&gt;
&lt;td&gt;≈ 12.5 km&lt;/td&gt;
&lt;td&gt;+18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 m (roof mast)&lt;/td&gt;
&lt;td&gt;≈ 14.6 km&lt;/td&gt;
&lt;td&gt;+38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 m (tower)&lt;/td&gt;
&lt;td&gt;≈ 17.9 km&lt;/td&gt;
&lt;td&gt;+69%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Compare that with changing antennas. Going from 3 dBi to 8 dBi buys 5 dB, which at n = 3 improves coverage radius by a factor of about &lt;strong&gt;1.47 (+47%)&lt;/strong&gt;. Raising the antenna from 2 m to 10 m extends the horizon by about &lt;strong&gt;38%&lt;/strong&gt;.Comparable numbers, but there is one essential difference:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Height costs you nothing. Gain costs you vertical coverage nearby.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And in urban environments you never reach the horizon anyway; obstruction dominates. That is where height wins outright: ten metres up usually means the antenna has cleared the building edge and moved away from every reflective surface on a metal roof. No amount of gain goes through a building.&lt;/p&gt;

&lt;p&gt;So the selection order should be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Win the height first&lt;/strong&gt; — find the highest compliant mounting position.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then pick the right gain&lt;/strong&gt;, not the highest gain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose cable and connectors last&lt;/strong&gt; — although this is where the cheapest decibels usually are.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6. Verify uplink and downlink separately
&lt;/h2&gt;

&lt;p&gt;This is a very common trap. During commissioning the uplinks look rock solid and everyone signs off on coverage. A week later ADR is not taking effect, Join Accepts are missing, and downlink commands need three retries.&lt;/p&gt;

&lt;p&gt;The reason is that the two directions do not balance. Four points:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, gateway sensitivity is usually better than device sensitivity.&lt;/strong&gt; ManThink gateways are specified at -141 dBm (SF12, BW 125 kHz). Common device radios such as the SX1262 sit around -137 dBm — roughly 4 dB worse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, gateway transmit power is usually higher.&lt;/strong&gt; GD73 delivers up to 27 dBm (&lt;code&gt;-1&lt;/code&gt;) or 22 dBm (&lt;code&gt;-2&lt;/code&gt;); a typical LoRaWAN device transmits at 14 dBm. Another 8–13 dB in the gateway's favour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, many regions impose a separate limit on gateway downlink EIRP.&lt;/strong&gt; Under the ERC 70-03 framework commonly applied to EU868, most sub-bands cap EIRP at 25 mW (14 dBm), with 500 mW permitted in 869.4–869.65 MHz subject to duty-cycle conditions. That pulls gateway downlink EIRP down to roughly the device's level, leaving the 4 dB sensitivity advantage as the only compensation — so &lt;strong&gt;the downlink breaks first, inevitably.&lt;/strong&gt; Always confirm current limits against the local spectrum authority's regulations and the equipment's type approval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth, feeder loss is bidirectional.&lt;/strong&gt; Those 3 dB on the gateway side hurt both links, and in most self-built deployments only the gateway has a feeder at all.&lt;/p&gt;

&lt;p&gt;Conclusion: &lt;strong&gt;always run two budgets.&lt;/strong&gt; The uplink budget decides whether you receive data. The downlink budget decides whether joins, ADR and downlink commands work at all. Many two-way applications — valve control, remote verification, configuration pushes, FUOTA — fail on the downlink, not the uplink.&lt;/p&gt;

&lt;p&gt;The simplest field test: once installed, perform a join with a real device at the furthest point. A join is inherently bidirectional — the device sends a Join Request and must receive the Join Accept for the join to succeed. A missing 3 dB in either direction shows up there first.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Selecting by scenario: five typical combinations
&lt;/h2&gt;

&lt;p&gt;Applying the above to concrete hardware, using documented specifications:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gateway&lt;/th&gt;
&lt;th&gt;Form factor and key specs&lt;/th&gt;
&lt;th&gt;Antenna and installation approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GD61x / GD62 (IP67)&lt;/td&gt;
&lt;td&gt;ESP32-S3 + SX1301/SX1302; GD62 is IP67, -25 to 60 °C, 164 × 124 × 50 mm, wall or pole mount, gwTool6 configuration, web OTA with A/B dual firmware partitions&lt;/td&gt;
&lt;td&gt;Compact and pole-mountable; connect the antenna with a short jumper. Suited to dense, low-cost single-point coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDI51&lt;/td&gt;
&lt;td&gt;Ubuntu gateway with ThinkLink built in (LS1012A); 8 frequency points / 16 demodulators / 65 logical channels; sensitivity -141 dBm; PoE or Type-C&lt;/td&gt;
&lt;td&gt;Indoor coverage for smart buildings. Prefer a 2–3 dBi antenna designed for floor-to-floor coverage rather than high gain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GD73&lt;/td&gt;
&lt;td&gt;SX1302; type A 8 frequency points / type D 16; &lt;code&gt;-1&lt;/code&gt; up to 27 dBm, &lt;code&gt;-2&lt;/code&gt; up to 22 dBm; sensitivity -141 dBm&lt;/td&gt;
&lt;td&gt;Projects requiring at least 25 dBm must specify the &lt;code&gt;-1&lt;/code&gt; version. Suited to campus-scale distance, with a proper mast and low-loss feeder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDO51&lt;/td&gt;
&lt;td&gt;Outdoor IP67; up to 16 frequency points / 32 demodulators / 130 logical channels; sensitivity -141 dBm; PoE / 4G / Wi-Fi / Ethernet / GPS; external SIM slot and debug port; published reference price USD 345 (about ¥2,315, subject to current quotation)&lt;/td&gt;
&lt;td&gt;Outdoor and demanding sites. Full outdoor waterproofing is mandatory; connect LTE, GPS and Wi-Fi antennas to their matching labelled ports&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One variable is still routinely forgotten: &lt;strong&gt;the gateway and the end devices must be in the same regional band.&lt;/strong&gt; Worth restating because export projects get this wrong more than anything else — CN470 is 470–510 MHz and EU433 is 433–434 MHz. One character differs on the purchase order; the antennas are entirely different.&lt;/p&gt;

&lt;p&gt;And a note on product positioning. The GD6 series is an entry-level, edge-side form factor suited to single-point coverage and functional validation. Building-scale and industrial deployments generally need devices with more channels, more demodulators and higher reliability designs — GDI51, GD73 or GDO51. Do not expect an edge-class device to carry a building-scale network's capacity just because you changed the antenna.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Ten installation steps, straight from the manuals
&lt;/h2&gt;

&lt;p&gt;Merging the installation requirements from the GD61x, GD62 (IP67) and GD72 manuals gives ten steps. The first three are done with the power disconnected:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Step 1.&lt;/strong&gt; Confirm &lt;strong&gt;the device is powered off&lt;/strong&gt; and that the LoRa antenna matches the gateway band.&lt;br&gt;
&lt;strong&gt;Step 2.&lt;/strong&gt; Connect the LoRa antenna to the &lt;code&gt;LoRa&lt;/code&gt; / &lt;code&gt;RF&lt;/code&gt; port and &lt;strong&gt;tighten it&lt;/strong&gt;, letting the connector seat naturally — do not force-twist the connector body.&lt;br&gt;
&lt;strong&gt;Step 3.&lt;/strong&gt; If external Wi-Fi or 4G antennas are supplied, fit them to the matching labelled ports — LTE, GPS/BDS and Wi-Fi each have their own.&lt;br&gt;
&lt;strong&gt;Step 4.&lt;/strong&gt; For cellular backhaul, insert the SIM card, then fit the waterproof cover.&lt;br&gt;
&lt;strong&gt;Step 5.&lt;/strong&gt; For wall mounting, mark out to the bracket hole pattern and use fixings appropriate to the wall material. For pole mounting, check the pole diameter first — the GD72 manual gives a range of &lt;strong&gt;30–52 mm&lt;/strong&gt; — fit the clamp and tighten evenly.&lt;br&gt;
&lt;strong&gt;Step 6.&lt;/strong&gt; Keep the correct orientation per the supplied installation drawing; the GD72 manual explicitly requires "keep the gateway facing upwards".&lt;br&gt;
&lt;strong&gt;Step 7.&lt;/strong&gt; Leave room for the antenna, connectors and cable bending radius. Never let the cable's weight pull directly on a connector.&lt;br&gt;
&lt;strong&gt;Step 8.&lt;/strong&gt; Route the Ethernet cable through the supplied waterproof gland in assembly order (the seal must match the cable outside diameter), seat the RJ45, then tighten.&lt;br&gt;
&lt;strong&gt;Step 9.&lt;/strong&gt; Complete the waterproofing check, then apply power.&lt;br&gt;
&lt;strong&gt;Step 10.&lt;/strong&gt; Watch the status: the GD61x normal operating indication is an LED &lt;strong&gt;slow flash, 1 s on / 1 s off&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Four points on waterproofing
&lt;/h3&gt;

&lt;p&gt;The GD72 manual provides a checkable list. Verify against it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every outdoor antenna connector&lt;/strong&gt; is sealed according to site practice — insulating tape, self-amalgamating tape or dedicated waterproofing material suitable for outdoor use, applied so that it fully covers the joint and forms a &lt;strong&gt;continuous seal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority areas&lt;/strong&gt;: cable entries, antenna ports, SIM card cover, power and network ports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drip loop&lt;/strong&gt;: always leave one, so rain cannot track along the cable into a connector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unused ports&lt;/strong&gt; stay sealed with their original plugs, fitted and tightened.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two more points on outdoor power: PoE adapters and any supply not rated for outdoor use must sit in a dry location or a suitable enclosure, and the GD72 manual adds that the adapter should be mounted vertically with its ports facing down.&lt;/p&gt;

&lt;p&gt;And one point that is easy to forget because it lives on a different timescale:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Inspect sealing material periodically and replace it promptly if aged, cracked or loose.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Where to mount it — and where not to
&lt;/h3&gt;

&lt;p&gt;Drawing on the GD62 (IP67) "Before Use" section and the propagation analysis above:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid&lt;/strong&gt;: standing water, heat sources, inside metal roofs or cable trays, electrical risers containing high-power equipment, anywhere permanently shadowed by heavy machinery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefer&lt;/strong&gt;: high points, open aspects, and positions a maintenance technician can reach safely.&lt;/p&gt;

&lt;p&gt;Mind the stated environmental limit too: the actual ambient temperature at the mounting position must stay within &lt;strong&gt;-25 °C to 60 °C&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Six things you must not do
&lt;/h2&gt;

&lt;p&gt;These are the prohibitions written into the documentation. Ignore them and no warranty applies:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prohibition&lt;/th&gt;
&lt;th&gt;Official wording&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transmitting with no antenna&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Connect the LoRa antenna before powering on. Do not start LoRa transmission with no antenna connected."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mismatched band and accessories&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"The RF region must be consistent with the hardware, antenna and end-device configuration." / "Confirm the antenna frequency band matches the gateway's regional version."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Choosing a supply by port name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Before connecting PoE, check the supply standard, voltage and wiring requirements. Do not select a power source based on the port name alone."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multiple supplies at once&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Do not connect multiple power sources simultaneously unless expressly permitted in the delivery documentation."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overvoltage on Type-C / wrong terminals&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Do not apply more than 5 V to the Type-C port. Do not connect a supply to the A+ / B- terminals."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Opening the enclosure or modifying seals&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Do not open the enclosure or modify the sealing structure without authorisation."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two protection limits from the GD72 manual:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IP67 does not mean submersible&lt;/strong&gt;: the IP67 rating applies with the enclosure intact and seals and connectors correctly assembled. The unit is not intended for prolonged immersion, and interfaces must not be washed with a high-pressure jet.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;These six prohibitions and two limits are the complete set of installation-related restrictions stated in the manuals.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And one operational sequence, from the GD61x manual:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not disconnect power during a firmware upgrade, configuration write or factory reset.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  10. Commissioning: how to read RSSI and SNR
&lt;/h2&gt;

&lt;p&gt;Finishing the installation is not the end of acceptance testing; it is the start. Two values need recording: RSSI (received signal strength) and SNR (signal-to-noise ratio). They mean quite different things, and reading them together without understanding both leads to wrong conclusions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SNR decides whether demodulation is possible at all.&lt;/strong&gt; LoRa is a spread-spectrum modulation, and demodulation depends on the signal exceeding the demodulation threshold for that spreading factor. Typical values from Semtech transceiver datasheets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spreading factor&lt;/th&gt;
&lt;th&gt;Typical SNR demodulation threshold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SF7&lt;/td&gt;
&lt;td&gt;≈ −7.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF8&lt;/td&gt;
&lt;td&gt;≈ −10 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF9&lt;/td&gt;
&lt;td&gt;≈ −12.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF10&lt;/td&gt;
&lt;td&gt;≈ −15 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF11&lt;/td&gt;
&lt;td&gt;≈ −17.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF12&lt;/td&gt;
&lt;td&gt;≈ −20 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key point: &lt;strong&gt;a negative SNR is normal.&lt;/strong&gt; Demodulating below the noise floor is the whole point of spread spectrum. An SNR of -12 dB is perfectly healthy at SF10.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RSSI tells you how much margin is left.&lt;/strong&gt; Its absolute value means little on its own — a gateway with -141 dBm sensitivity receiving -115 dBm still has 26 dB of margin, while the same signal at a device with -137 dBm sensitivity leaves only 22 dB. Always read RSSI against the receiver's sensitivity.&lt;/p&gt;

&lt;p&gt;Practical acceptance bands:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SNR and RSSI&lt;/th&gt;
&lt;th&gt;Reading&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SNR ≥ −5 dB, RSSI ≥ −100 dBm&lt;/td&gt;
&lt;td&gt;Plenty of margin&lt;/td&gt;
&lt;td&gt;Let ADR reduce the data rate and save device power and channel occupancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNR −10 to −5 dB, RSSI −110 to −100 dBm&lt;/td&gt;
&lt;td&gt;Healthy&lt;/td&gt;
&lt;td&gt;Normal operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNR close to the SF threshold (margin &amp;lt; 5 dB)&lt;/td&gt;
&lt;td&gt;Marginal&lt;/td&gt;
&lt;td&gt;Record and re-measure; weather and clutter changes will drop it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNR below threshold, or RSSI &amp;lt; −125 dBm&lt;/td&gt;
&lt;td&gt;Unusable&lt;/td&gt;
&lt;td&gt;Check antenna, placement and feeder. Do not paper over it by raising the SF further&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Record three things per point&lt;/strong&gt;: RSSI, SNR, and the SF in use at the time. The same RSSI means completely different margins at SF7 and SF12, and future capacity planning is impossible without the third number.&lt;/p&gt;

&lt;p&gt;Also plan for at least two measurement rounds: a baseline at installation, and a re-measurement one to two months later. Antennas and connectors degrade gradually, and a poorly sealed connector commonly shows a 5–10 dB RSSI drop within two months.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. One page for the field team
&lt;/h2&gt;

&lt;p&gt;A checklist to hand out at project kick-off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Selection&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the RF region for the gateway suffix; the antenna's frequency range must cover the corresponding band (CN470: 470–510 MHz).&lt;/li&gt;
&lt;li&gt;Normalise dBi and dBd before comparing gain. Prefer 2–3 dBi for indoor and dense short-range deployments; consider 5–8 dBi for open line-of-sight.&lt;/li&gt;
&lt;li&gt;Confirm VSWR ≤ 2.0 across the operating band (prefer ≤ 1.5). Ask suppliers for a measured sweep across the band, not a single-spot figure.&lt;/li&gt;
&lt;li&gt;Decide between the &lt;code&gt;-1&lt;/code&gt; (27 dBm) and &lt;code&gt;-2&lt;/code&gt; (22 dBm) versions, and check local EIRP limits for the band.&lt;/li&gt;
&lt;li&gt;Look feeder losses up against the actual band. Beyond three metres, use LMR-400 or better, and keep the connector count down.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Work de-energised. Antenna on before power.&lt;/li&gt;
&lt;li&gt;Match LTE / GPS / Wi-Fi antennas to their labelled ports; never swap them.&lt;/li&gt;
&lt;li&gt;Win the height: clear the building-obstruction zone at minimum, ten metres or more where possible.&lt;/li&gt;
&lt;li&gt;Waterproof completely: self-amalgamating tape, continuous seal, drip loop, original plugs on unused ports.&lt;/li&gt;
&lt;li&gt;Keep the PoE adapter dry, mounted vertically with ports facing down, and not sharing duty with another supply.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Acceptance&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Perform a real join at the furthest point to confirm the downlink works.&lt;/li&gt;
&lt;li&gt;Record RSSI / SNR / SF for every point as the baseline.&lt;/li&gt;
&lt;li&gt;Re-measure after one to two months and compare.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;LoRaWAN link budgets usually look like this: twenty or thirty dB of theoretical headroom, and an actual outage caused by an unloved antenna sitting on top of a rack.&lt;/p&gt;

&lt;p&gt;The real cause is rarely that the power budget does not add up. It is almost always one of three small things: the antenna is not resonant in the band you are using, the feeder silently ate 3 dB, or the antenna was never taken somewhere it can see the target.&lt;/p&gt;

&lt;p&gt;None of the three is expensive, and none appears on the gateway's price list. They show up in the budget under a different heading: the second visit. And the third.&lt;/p&gt;

&lt;p&gt;Which is why selection and installation belong in the design phase, not at the tail end of construction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.manthink.cn/en/resources/thinklink-thing-model-decoder-script/" rel="noopener noreferrer"&gt;ThinkLink Thing Model Decoder Scripts in Practice: Turning 15 Bytes into a Readable Table&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manthink.cn/en/resources/thinklink-trigger-rules-alerting/" rel="noopener noreferrer"&gt;ThinkLink Trigger Rules and Alerting in Practice: On Time, Without Noise, To the Right Person&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manthink.cn/en/resources/thinklink-edge-on-premises-deployment/" rel="noopener noreferrer"&gt;ThinkLink Edge (TKE) On-Premises Deployment in Practice: Keeping Data on Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manthink.cn/en/resources/thinklink-bacnet-ip-modbus-tcp-integration/" rel="noopener noreferrer"&gt;Connecting ThinkLink to BACnet/IP and Modbus TCP: From Field Mapping to YABE Verification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Official manuals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.think-link.net/docs/en/Device/LoRaWANGateway/gd61x-user-guide.html" rel="noopener noreferrer"&gt;GD61x Indoor LoRaWAN Gateway Specification and User Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.think-link.net/docs/en/Device/LoRaWANGateway/gd6-ip67.html" rel="noopener noreferrer"&gt;GD62 IP67 Outdoor LoRaWAN Gateway User Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.think-link.net/docs/en/Device/LoRaWANGateway/gd72.html" rel="noopener noreferrer"&gt;GD72 Outdoor LoRaWAN Gateway User Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.think-link.net/docs/en/Device/LoRaWANGateway/gd73.html" rel="noopener noreferrer"&gt;GD73 Indoor LoRaWAN Gateway Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.think-link.net/docs/en/Device/LoRaWANGateway/gdi51.html" rel="noopener noreferrer"&gt;GDI51 Indoor Gateway Product Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.think-link.net/docs/en/Device/LoRaWANGateway/gdo51.html" rel="noopener noreferrer"&gt;GDO51 Outdoor Gateway User Manual&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hardware</category>
      <category>howto</category>
      <category>iot</category>
      <category>networking</category>
    </item>
    <item>
      <title>Connecting ThinkLink to Home Assistant and Node-RED: One MQTT Forwarder Does the Whole Job</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:47:49 +0000</pubDate>
      <link>https://dev.to/manthink/connecting-thinklink-to-home-assistant-and-node-red-one-mqtt-forwarder-does-the-whole-job-4bd6</link>
      <guid>https://dev.to/manthink/connecting-thinklink-to-home-assistant-and-node-red-one-mqtt-forwarder-does-the-whole-job-4bd6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a57yflwwykn6v2lzocg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a57yflwwykn6v2lzocg.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A LoRaWAN project reaches a familiar point: the data is already flowing into ThinkLink, but the interface the customer actually wants to look at is somewhere else — a Home Assistant dashboard, or a flow they have wired up in Node-RED.&lt;/p&gt;

&lt;p&gt;That is a reasonable request. Home Assistant dashboards and automation rules are genuinely good, and Node-RED is genuinely handy for stitching systems together. But one fact has to be settled first: &lt;strong&gt;neither platform speaks LoRaWAN.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Home Assistant supports MQTT, Zigbee, Z-Wave and HTTP. LoRaWAN is not on that list. It cannot talk to a gateway and it does not parse LoRaWAN frames. Node-RED is in the same position — it is a flow engine, and what it consumes depends entirely on what input node you give it.&lt;/p&gt;

&lt;p&gt;So something has to sit in the middle and turn radio frames into structured data. That is what ThinkLink does: the gateway receives the frame, the network server decrypts it, the thing model decoder turns bytes into named fields, and only then does the data become "temperature 24.6" — something an application can actually use.&lt;/p&gt;

&lt;p&gt;Which leaves exactly one question: &lt;strong&gt;how do you hand that parsed data to Home Assistant or Node-RED?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Start with a version change: the built-in HA integration is gone
&lt;/h2&gt;

&lt;p&gt;This belongs at the top, because it determines the whole approach.&lt;/p&gt;

&lt;p&gt;Older manuals describe configuring Home Assistant fields in the thing model, or entering an HA address under server configuration. The official 2.00.066 notes are explicit: &lt;strong&gt;that release removed the built-in ThingsBoard / Home Assistant integrations and their related fields&lt;/strong&gt;, and the older HA / ThingsBoard instructions "apply only to older versions and must not be used as operating steps for 2.00.066." The same passage adds that &lt;strong&gt;BACnet / Modbus are retained.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From 2.00.066 onwards, there is no "type in an HA address and let the platform push entities" path. What replaced it is a general capability: &lt;strong&gt;the MQTT forwarder (Broker + Forwarder)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is not a regression. A built-in integration hard-codes a single integration shape: the platform pushes in its own format and the other side has to adapt. With a forwarder, topic rewriting, payload restructuring and filtering all live in one JavaScript function, and the mechanism is identical no matter what you are connecting to. Home Assistant, Node-RED, ThingsBoard, a custom service: from ThinkLink's side the only difference is the contents of that script.&lt;/p&gt;

&lt;p&gt;One more distinction worth making. Product comparison material mentions that ThinkLink edge deployments (TKG, gateway-embedded) come with Home Assistant OS and ThingsBoard CE as preloaded components. That is &lt;strong&gt;a separate HA instance running on the same hardware&lt;/strong&gt; — it is not "ThinkLink pushing data into Home Assistant." This article is about the latter: getting data out of ThinkLink and into an HA or Node-RED instance you already run.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Three possible paths — pick the right one before you start
&lt;/h2&gt;

&lt;p&gt;There is a choice to make first. The documentation describes three push mechanisms, and they are not equally current.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Use it?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device-side "third-party forward" switch + server-side ThirdParty config&lt;/td&gt;
&lt;td&gt;legacy direct push&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;legacy config, deactivated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server configuration → ThirdParty MQTT&lt;/td&gt;
&lt;td&gt;one Broker address configured platform-side&lt;/td&gt;
&lt;td&gt;documentation conflict, see below&lt;/td&gt;
&lt;td&gt;confirm against your version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced → Broker + Forwarder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;subscribe to an internal topic, forward to a target broker&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;the current supported method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One documentation conflict has to be reported honestly. The &lt;strong&gt;MQTT forwarder page&lt;/strong&gt; states plainly: there is no need to enable any "third-party forward" switch on the device, and no need to configure any third-party platform under server configuration — "both of those settings from older versions are deactivated." Meanwhile the &lt;strong&gt;server configuration page&lt;/strong&gt; still documents a ThirdParty section (Protocol / Host / Port / Telemetry Topic / Username / Password) plus an instruction to enable a ThirdParty switch on the device detail page.&lt;/p&gt;

&lt;p&gt;The two pages are describing different things, or at least different versions. The practical resolution is simple: &lt;strong&gt;go by what your platform version actually exposes.&lt;/strong&gt; If the interface has "Advanced → Broker / Forwarder", use the forwarder. That is the main path on current versions and it is what the rest of this article covers.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The forwarder: two steps, five fields
&lt;/h2&gt;

&lt;p&gt;The data flow looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ThinkLink internal broker (AS or ThinkLink)&lt;br&gt;
        ↓  Source Broker / Subscription Topic&lt;br&gt;
Forwarder rule (optional JavaScript transform)&lt;br&gt;
        ↓  Target Broker&lt;br&gt;
Third-party MQTT broker (Customize)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 1: create two broker connections
&lt;/h3&gt;

&lt;p&gt;Go to &lt;strong&gt;Advanced → Broker&lt;/strong&gt;. One forwarder rule needs one source connection and one target connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source broker&lt;/strong&gt; — two internal types, and the choice determines what shape of data you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ThinkLink&lt;/code&gt;: &lt;strong&gt;telemetry after thing-model decoding&lt;/strong&gt;. Fields already have names and units.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AS&lt;/code&gt;: &lt;strong&gt;raw uplink after LoRaWAN decryption&lt;/strong&gt;, before the thing model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick &lt;code&gt;ThinkLink&lt;/code&gt; for almost everything. There is only one good reason to choose &lt;code&gt;AS&lt;/code&gt;: you want to do your own parsing downstream, or you need RF-side values like RSSI and SNR for network quality analysis. If the goal is "show a temperature in Home Assistant," choosing &lt;code&gt;AS&lt;/code&gt; means redoing work the platform has already done.&lt;/p&gt;

&lt;p&gt;Addresses and tenant credentials for the internal brokers are filled in by the platform; you do not need to fetch them from server configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target broker&lt;/strong&gt; — add a &lt;code&gt;Customize&lt;/code&gt; entry with the other side's details:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Name and enabled state&lt;br&gt;
MQTT URL, e.g. mqtt://192.168.1.50:1883 or mqtts://host:8883&lt;br&gt;
Username and password (when required)&lt;br&gt;
CA certificate, client certificate and other TLS material (when required)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If Home Assistant and Node-RED run on the same host — the common case — the target is the Mosquitto instance on that host, or the Mosquitto broker add-on inside HA.&lt;/p&gt;

&lt;p&gt;After saving and enabling, check the broker list state first: &lt;code&gt;RUNNING&lt;/code&gt; is healthy; &lt;code&gt;ERROR&lt;/code&gt; means read &lt;code&gt;ErrMsg&lt;/code&gt; and work through URL, port, credentials, certificates, and network reachability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: create the forwarder rule
&lt;/h3&gt;

&lt;p&gt;Go to &lt;strong&gt;Advanced → Forwarder → Add&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Rule name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;td&gt;The rule only subscribes and forwards when this is on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source Broker&lt;/td&gt;
&lt;td&gt;Broker to subscribe to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target Broker&lt;/td&gt;
&lt;td&gt;Broker to publish to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subscription Topic&lt;/td&gt;
&lt;td&gt;Topic on the source broker; supports MQTT &lt;code&gt;+&lt;/code&gt; and &lt;code&gt;#&lt;/code&gt; wildcards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Script&lt;/td&gt;
&lt;td&gt;Optional; rewrites topic, message body or retain flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remark / commit note&lt;/td&gt;
&lt;td&gt;Optional; documents the rule and version changes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One hard constraint: &lt;strong&gt;Source Broker and Target Broker may not both be internal types (&lt;code&gt;AS&lt;/code&gt; / &lt;code&gt;ThinkLink&lt;/code&gt;)&lt;/strong&gt;, to avoid a pointless internal loop. The normal third-party combination is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Source Broker = AS or ThinkLink&lt;br&gt;
Target Broker = Customize&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How to fill in Subscription Topic
&lt;/h3&gt;

&lt;p&gt;This is the field most often got wrong, because there is no default and the placeholder must be replaced.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Broker&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Subscription Topic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ThinkLink&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;telemetry after thing-model decoding&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v32/{tenant}/tkl/up/telemetry/#&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;raw uplink after LoRaWAN decryption&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v32/{tenant}/as/up/data/#&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;complete uplink after multi-gateway collection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v32/{tenant}/as/up/dataAll/#&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;{tenant}&lt;/code&gt; must be replaced with your actual organisation account, visible in your profile — &lt;strong&gt;do not leave the placeholder in place&lt;/strong&gt;. &lt;code&gt;#&lt;/code&gt; covers every device in the organisation; to forward a single device, replace &lt;code&gt;#&lt;/code&gt; with that device's DevEUI.&lt;/p&gt;

&lt;p&gt;Concretely: organisation account &lt;code&gt;mtfac&lt;/code&gt;, forwarding decoded telemetry for all devices, gives &lt;code&gt;/v32/mtfac/tkl/up/telemetry/#&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The transform script: translating ThinkLink into HA's vocabulary
&lt;/h2&gt;

&lt;p&gt;With no script configured, the forwarder passes topic and payload straight through. That is a good starting point: &lt;strong&gt;let messages flow unchanged, capture one real message in Home Assistant or Node-RED, look at the actual field structure, and only then decide whether you need a script.&lt;/strong&gt; Scripts written from imagination rarely work the first time.&lt;/p&gt;

&lt;p&gt;When you do need to reshape the payload, there is exactly one entry function:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;function forwardScript({ topic, msg, org_params }) {&lt;br&gt;
  if (!msg?.telemetry_data) return null&lt;/p&gt;

&lt;p&gt;return {&lt;br&gt;
    topic: &lt;code&gt;${org_params.target_topic_prefix}/${msg.device_id}&lt;/code&gt;,&lt;br&gt;
    option: {&lt;br&gt;
      retain: false&lt;br&gt;
    },&lt;br&gt;
    msg: {&lt;br&gt;
      temperature: msg.telemetry_data.T,&lt;br&gt;
      humidity: msg.telemetry_data.H&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three inputs: &lt;code&gt;topic&lt;/code&gt; is the original topic the message arrived on, &lt;code&gt;msg&lt;/code&gt; is the parsed message body, and &lt;code&gt;org_params&lt;/code&gt; is read-only organisation parameters.&lt;/p&gt;

&lt;p&gt;The returned object supports three fields: &lt;code&gt;topic&lt;/code&gt; (the topic to publish on the target broker), &lt;code&gt;msg&lt;/code&gt; (the body to publish), and &lt;code&gt;option&lt;/code&gt; (MQTT publish options such as &lt;code&gt;{ retain: true }&lt;/code&gt;). &lt;strong&gt;Returning &lt;code&gt;null&lt;/code&gt;, or returning nothing, discards the message&lt;/strong&gt; — which is the intended way to filter, for example forwarding only certain devices or only when a value crosses a threshold.&lt;/p&gt;

&lt;p&gt;The official example uses &lt;code&gt;msg.device_id&lt;/code&gt; and &lt;code&gt;msg.telemetry_data&lt;/code&gt;; the keys under &lt;code&gt;telemetry_data&lt;/code&gt; (shown as &lt;code&gt;T&lt;/code&gt; and &lt;code&gt;H&lt;/code&gt;) are whatever your thing model defines. &lt;strong&gt;Do not guess field names — capture a real message and confirm.&lt;/strong&gt; Article 21 covered thing model decoders: the keys defined there are the keys available here.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;org_params&lt;/code&gt; deserves a note of its own. It is an &lt;strong&gt;organisation-level set of environment variables&lt;/strong&gt;, maintained as key/value pairs under &lt;strong&gt;System Management → Server Configuration → Org Params&lt;/strong&gt;, shared across the whole tenant and injected automatically when the platform runs a script. The point is to move addresses, prefixes and business identifiers out of scripts — change environments or topic prefixes in one place instead of editing every script. Values take effect &lt;strong&gt;immediately, with no service restart&lt;/strong&gt;, and only organisation administrators can see them.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Home Assistant: two ways in
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: the Home Assistant configuration below is &lt;strong&gt;general Home Assistant knowledge&lt;/strong&gt;, not ThinkLink official documentation. HA moves quickly — check field names against the version you run.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once data reaches the broker HA uses, HA has to turn it into entities. Two routes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First: hand-written MQTT sensors.&lt;/strong&gt; Declare sensors in &lt;code&gt;configuration.yaml&lt;/code&gt;, point &lt;code&gt;state_topic&lt;/code&gt; at whatever topic the forwarder publishes to, and pull the value out of the JSON with &lt;code&gt;value_template&lt;/code&gt;. This is the most robust option and you control every field; the cost is a block of config per measurement per device. Well suited to a small, fixed set of devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second: emit MQTT discovery messages yourself.&lt;/strong&gt; Home Assistant's MQTT integration supports discovery: publish a message carrying device metadata to the agreed discovery topic (prefix &lt;code&gt;homeassistant/&lt;/code&gt; by default) and HA creates the entity automatically. ThinkLink does not emit that format natively, but you can &lt;strong&gt;build it inside the forwarder script&lt;/strong&gt; — both &lt;code&gt;topic&lt;/code&gt; and &lt;code&gt;msg&lt;/code&gt; in the return value are yours to define, so the first uplink can trigger a discovery message.&lt;/p&gt;

&lt;p&gt;That route wins when devices are numerous or change often: adding one requires no HA config edits. The cost is script complexity and one round of debugging.&lt;/p&gt;

&lt;p&gt;One structural point worth planning for: ThinkLink sends &lt;strong&gt;one message per device containing multiple fields&lt;/strong&gt;, while an HA entity holds &lt;strong&gt;one value&lt;/strong&gt;. Either split it on the HA side with &lt;code&gt;value_template&lt;/code&gt;, or split it in the forwarder script and publish one topic per field. Deciding which layer does the splitting up front saves a lot of rework.&lt;/p&gt;

&lt;p&gt;And a practical warning: an entity showing "unknown" or "unavailable" in the HA dashboard is often not an HA problem — the data never reached the broker. Subscribe from the command line and confirm the message actually arrives before touching HA configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Node-RED: three nodes and you are running
&lt;/h2&gt;

&lt;p&gt;Node-RED is more straightforward than HA, because it imposes no entity model — it processes whatever arrives.&lt;/p&gt;

&lt;p&gt;The minimal flow is three nodes: &lt;strong&gt;mqtt in&lt;/strong&gt; (subscribe to the topic on the target broker) → &lt;strong&gt;json&lt;/strong&gt; (parse the string into an object) → &lt;strong&gt;debug or a dashboard node&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The topic in &lt;code&gt;mqtt in&lt;/code&gt; is whatever the forwarder published, i.e. the &lt;code&gt;topic&lt;/code&gt; returned by &lt;code&gt;forwardScript&lt;/code&gt;. If you left it pass-through with no script, that is the original &lt;code&gt;/v32/mtfac/tkl/up/telemetry/{eui}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Where Node-RED beats HA is the middle of the flow: you can drop in &lt;code&gt;function&lt;/code&gt; nodes for arbitrary logic — unit conversion, thresholds, cross-device correlation, database writes, third-party API calls. For something like "when temperature and humidity exceed limits, check another sensor in the same zone and only alert if both are over," Node-RED reads more clearly than a platform-side trigger script and is more flexible than an HA automation.&lt;/p&gt;

&lt;p&gt;Reverse control is equally a single &lt;code&gt;mqtt out&lt;/code&gt; node — but read the next section first.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Writes: from HA / Node-RED back to the device
&lt;/h2&gt;

&lt;p&gt;This is where misjudgement creeps in, and it is the same lesson as the BACnet write path in article 24.&lt;/p&gt;

&lt;p&gt;From pressing a button in HA to the device actually acting, at least three things must happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The command is accepted by the platform&lt;/strong&gt; — immediate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The RPC reaches the device&lt;/strong&gt; — on a &lt;strong&gt;Class A&lt;/strong&gt; LoRaWAN device the downlink can only go out in the receive window after an uplink (RX1 ~1 s, RX2 ~2 s). With a ten-minute reporting interval, that command can sit for ten minutes before it lands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The device reports back&lt;/strong&gt; — the result of the execution only shows up on the next uplink.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So clicking a button in HA and seeing nothing change does not mean the command failed. Acceptance criteria should read "&lt;strong&gt;read back and confirm within N reporting cycles after sending&lt;/strong&gt;," not "click and look immediately."&lt;/p&gt;

&lt;p&gt;One recommendation for integrators: if the project needs control latency measured in seconds, a Class A device is the wrong choice and Class C should be considered. That decision belongs at device selection time — it cannot be fixed during integration.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Online status: one switch you have to turn on yourself
&lt;/h2&gt;

&lt;p&gt;Both HA and Node-RED need to know whether a sensor is still alive.&lt;/p&gt;

&lt;p&gt;From 2.00.084, a forwarder with a ThinkLink source can subscribe to the device status topic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;/v32/{tenant}/tkl/device/status/{eui}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or, within an authorised organisation, &lt;code&gt;/v32/{tenant}/tkl/device/status/+&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two traps to know in advance:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, status messages require &lt;code&gt;notify_offline="TRUE"&lt;/code&gt; on the device, and that switch defaults to off.&lt;/strong&gt; Leave it off and there are no status messages at all — no amount of forwarder configuration will produce them. Note that the forwarder itself needs no device-side "third-party forward" switch; whether status messages exist depends solely on &lt;code&gt;notify_offline&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, this message has no &lt;code&gt;telemetry_data&lt;/code&gt;.&lt;/strong&gt; The example script above opens with &lt;code&gt;if (!msg?.telemetry_data) return null&lt;/code&gt;, which discards status messages outright. To forward status, either leave the message pass-through or handle the status format explicitly in the script.&lt;/p&gt;

&lt;p&gt;Also worth pinning down: "online" has three definitions on the platform and they are not interchangeable (article 22 covered this) — the activity time in the device list, &lt;code&gt;server_attrs.online&lt;/code&gt;, and the boolean in MQTT notifications. Whichever one your integration uses should be written into the delivery document, so both sides do not hold different ideas of what "online" means.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. After 2.00.070: do not just watch for RUNNING
&lt;/h2&gt;

&lt;p&gt;Connection and subscription behaviour changed in 2.00.070, and it directly affects troubleshooting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registration is not subscription.&lt;/strong&gt; When a rule is enabled, the subscription requirement is registered even if the source broker is offline, and the subscription is attempted once the connection recovers. But subscription is only confirmed on &lt;strong&gt;SUBACK&lt;/strong&gt;. Failed subscriptions retry every 3 seconds while connected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No buffering when the target is down.&lt;/strong&gt; At startup, a rule waits for its own enabled target broker within the original connection timeout, then registers the source subscription anyway; when the target is unavailable it falls back to skipping the forward. There is &lt;strong&gt;no new message buffering and no offline redelivery guarantee.&lt;/strong&gt; The forwarder is not a reliable queue — messages produced during an outage are not replayed afterwards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No exactly-once.&lt;/strong&gt; MQTT redelivery or duplicate sends at the source can produce duplicate messages; if the business needs deduplication, carry a message identifier.&lt;/p&gt;

&lt;p&gt;In short: &lt;strong&gt;do not conclude that forwarding works from "rule enabled" or "broker connected" — verify the actual message flow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two more behaviours: forwarder brokers for the same organisation load in parallel, so one slow connection does not make the others queue. When several scripts share a topic, removing one does not affect the others; unsubscribe only happens once the last callback is removed.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Troubleshooting: work this order
&lt;/h2&gt;

&lt;p&gt;The official five steps hold up well in practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm both source and target brokers are enabled and the target shows &lt;code&gt;RUNNING&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;ErrMsg&lt;/code&gt;, host, port, credentials and TLS certificates.&lt;/li&gt;
&lt;li&gt;Confirm the forwarder itself is enabled (not merely saved).&lt;/li&gt;
&lt;li&gt;Confirm &lt;code&gt;Subscription Topic&lt;/code&gt; matches the real message topic — especially whether &lt;code&gt;{tenant}&lt;/code&gt; was substituted and whether a path level is missing or extra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disable the custom script temporarily&lt;/strong&gt; and confirm the raw message passes through; then debug the script's return value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 5 is the one most often skipped and the one that most often finds the problem. The classic beginner error is a script returning &lt;code&gt;null&lt;/code&gt; (because &lt;code&gt;msg.telemetry_data&lt;/code&gt; was absent) without realising it — the symptom looks like "data isn't being forwarded," when in fact the script is throwing it away.&lt;/p&gt;

&lt;p&gt;Two operational extras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every save of a forwarder script creates a version snapshot&lt;/strong&gt;, viewable and restorable in the editor. Restoring creates a new version record and does not delete history — a broken script is recoverable.&lt;/li&gt;
&lt;li&gt;The system platform maintains &lt;strong&gt;public forwarders&lt;/strong&gt;: public rules are visible but read-only in the tenant; selecting a specific organisation lets a rule reference that organisation's brokers and &lt;code&gt;org_params&lt;/code&gt;. Useful when multiple organisations share one forwarding pattern.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Acceptance checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Pass criterion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Path&lt;/td&gt;
&lt;td&gt;Uses "Advanced → Broker + Forwarder"; does not rely on the deactivated legacy third-party switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Source broker&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ThinkLink&lt;/code&gt; (decoded) or &lt;code&gt;AS&lt;/code&gt; (raw) chosen deliberately, not by accident&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Target broker&lt;/td&gt;
&lt;td&gt;Type &lt;code&gt;Customize&lt;/code&gt;; state &lt;code&gt;RUNNING&lt;/code&gt;; &lt;code&gt;ErrMsg&lt;/code&gt; empty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Subscription topic&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{tenant}&lt;/code&gt; replaced with the real organisation account; path levels match the documented format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Rule enabled&lt;/td&gt;
&lt;td&gt;Forwarder "enabled" is on (not just saved); SUBACK received&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Real message flow&lt;/td&gt;
&lt;td&gt;Verified by subscribing on the target broker, not inferred from status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Script behaviour&lt;/td&gt;
&lt;td&gt;Pass-through validated first; with the script on, no unintended &lt;code&gt;null&lt;/code&gt; discards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Field naming&lt;/td&gt;
&lt;td&gt;Keys under &lt;code&gt;telemetry_data&lt;/code&gt; confirmed against a real message, not guessed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;HA / Node-RED side&lt;/td&gt;
&lt;td&gt;Entities or flow read values that match what the platform shows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Online status&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;notify_offline="TRUE"&lt;/code&gt; set; status topic subscribed and not discarded by the script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Write control&lt;/td&gt;
&lt;td&gt;Read back and confirm within N reporting cycles; "send succeeded" is not acceptance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Disconnection behaviour&lt;/td&gt;
&lt;td&gt;Confirmed that messages during an outage are not redelivered; dedup or compensation designed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Versioning&lt;/td&gt;
&lt;td&gt;Forwarder script version, platform version and target broker config recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  12. Closing
&lt;/h2&gt;

&lt;p&gt;From 2.00.066, ThinkLink replaced "integrate with one specific platform" with "integrate with any MQTT endpoint." For Home Assistant and Node-RED that is not bad news — a built-in integration can only offer one fixed payload shape, whereas the forwarder offers somewhere to write your own translation.&lt;/p&gt;

&lt;p&gt;The cost is that the script is yours to write and debug. But the boundaries are clear: topics follow a documented format, the script has one entry function, the return value has three fields, and there is a documented five-step troubleshooting order. What actually goes wrong is detail — &lt;code&gt;{tenant}&lt;/code&gt; left as a placeholder, a script silently returning &lt;code&gt;null&lt;/code&gt;, status messages carrying no &lt;code&gt;telemetry_data&lt;/code&gt;, messages during a target outage never being replayed.&lt;/p&gt;

&lt;p&gt;Put those details into an acceptance checklist. It is faster than trial and error.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Article 21: Writing Payload Decoders in ThinkLink — From 15 Bytes to Readable Data&lt;/li&gt;
&lt;li&gt;Article 22: ThinkLink Trigger Models and Alarm Rules — Alerts That Arrive on Time and Get Read&lt;/li&gt;
&lt;li&gt;Article 24: Connecting ThinkLink to BACnet/IP and Modbus TCP — From Field Mapping to YABE Verification&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Based on ThinkLink official documentation; paths and parameters follow your actual platform version. Official manuals:&lt;br&gt;
&lt;a href="https://www.think-link.net/docs/en/Advanced/MQTTForwarder.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Advanced/MQTTForwarder.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.think-link.net/docs/en/QuickStart/SystemManagement/ServerConfiguration.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/QuickStart/SystemManagement/ServerConfiguration.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.think-link.net/docs/en/Protocol/ThinkLinkProtocol.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Protocol/ThinkLinkProtocol.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Connecting ThinkLink to BACnet/IP and Modbus TCP: From Field Mapping to YABE Verification</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Mon, 26 Oct 2026 09:35:08 +0000</pubDate>
      <link>https://dev.to/manthink/connecting-thinklink-to-bacnetip-and-modbus-tcp-from-field-mapping-to-yabe-verification-4b3o</link>
      <guid>https://dev.to/manthink/connecting-thinklink-to-bacnetip-and-modbus-tcp-from-field-mapping-to-yabe-verification-4b3o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mb7g0azed0r4wc6ow8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mb7g0azed0r4wc6ow8c.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Currency note.&lt;/strong&gt; Figures in this article are quoted in CNY. Where a source price was published in another currency, the CNY equivalent is converted at the fixed October 2026 reference rate of &lt;strong&gt;1 USD ≈ 6.71 CNY&lt;/strong&gt;, with the original currency shown alongside. Publicly listed prices come from different sources with inconsistent scopes; they indicate order of magnitude and are not a sourcing recommendation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;A LoRaWAN project is finished. The sensors are mounted, the gateway is online, and the platform shows clean curves. Then the customer asks a single question: can this data get into the building management system we already have?&lt;/p&gt;

&lt;p&gt;What follows that question is work nobody particularly wants. Building management speaks BACnet. The plant floor speaks Modbus. LoRaWAN speaks neither. So you either buy another protocol gateway, or you pay an integrator to write a bridge service that translates MQTT messages into point values. That work produces no new data — it only makes data you already have readable by a system that cannot read it. And yet it has a price, a schedule, and a change-management process attached to it that runs for the life of the project.&lt;/p&gt;

&lt;p&gt;ThinkLink ships a built-in BACnet/IP service and a built-in Modbus TCP Server in its TKE (edge server) and TKG (in-gateway) forms, and that is exactly what they are for. This article walks the integration in the order it actually happens: when you can use them, how fields become points, what has to be checked before you hand over a point list, and why "the point table saved successfully" is not the same thing as "the BMS is reading values."&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Scope First: BACnet and Modbus Are TKE / TKG Only
&lt;/h2&gt;

&lt;p&gt;This is the first thing to settle, because it is a hard boundary rather than a configuration issue.&lt;/p&gt;

&lt;p&gt;The official documentation states the same thing in three places: &lt;strong&gt;the BACnet service is supported only on independently deployed TKE devices and gateways running TKL (TKG); the cloud version does not provide it.&lt;/strong&gt; The Modbus TCP Server carries an identical restriction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deployment form&lt;/th&gt;
&lt;th&gt;BACnet/IP&lt;/th&gt;
&lt;th&gt;Modbus TCP Server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloud (public SaaS)&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TKE (local server / industrial PC)&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TKG (embedded in gateway, e.g. GDO51 / GDI51)&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is not a feature that was withheld. It follows from the protocol. BACnet/IP runs on &lt;strong&gt;UDP 47808 (0xBAC0)&lt;/strong&gt; by default, and device discovery depends on local broadcast: a workstation sends a Who-Is broadcast and every device that hears it answers with an I-Am. That works inside one broadcast domain. IP routers do not forward broadcasts, so crossing subnets requires a BBMD (BACnet Broadcast Management Device). A multi-tenant public cloud has neither a customer's on-premise broadcast domain nor a fixed UDP port into their internal network. This is architecture, not backlog.&lt;/p&gt;

&lt;p&gt;So align sales and pre-sales on this before the proposal goes out: &lt;strong&gt;if the customer is on Cloud, the data leaves via the MQTT forwarder or the REST API, and the integrator lands it into points on their side.&lt;/strong&gt; Promising "BACnet points straight from the cloud into your BMS" is a commitment that fails during implementation.&lt;/p&gt;

&lt;p&gt;There is a second operational constraint that is easy to miss: &lt;strong&gt;a single backend process runs the BACnet service for one organisation only.&lt;/strong&gt; Starting BACnet in another organisation stops the previous organisation's instance; you cannot run multiple organisations in parallel on different ports within one process. The Modbus TCP Server behaves the same way — one instance serves one organisation, and switching service organisation replaces the running instance. A multi-tenant edge deployment (one TKE serving several subsidiaries, say) has to be designed for explicitly. Parallel operation is not the default.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. What This Segment Actually Costs: The Industry Prices by the Point
&lt;/h2&gt;

&lt;p&gt;Building automation and industrial integration share a unit of account: the &lt;strong&gt;point&lt;/strong&gt;. One temperature, one valve state, one meter reading — each is a point. Once you internalise that, it becomes clear what a built-in protocol service removes.&lt;/p&gt;

&lt;p&gt;Two sets of publicly listed figures (2026):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;China — BA system software pricing, software and commissioning included&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Listed price&lt;/th&gt;
&lt;th&gt;Per point&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200 control points&lt;/td&gt;
&lt;td&gt;~CNY 18,000&lt;/td&gt;
&lt;td&gt;~CNY 90/point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 control points&lt;/td&gt;
&lt;td&gt;~CNY 26,000&lt;/td&gt;
&lt;td&gt;~CNY 52/point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000 control points&lt;/td&gt;
&lt;td&gt;~CNY 38,000&lt;/td&gt;
&lt;td&gt;~CNY 38/point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2,000 control points&lt;/td&gt;
&lt;td&gt;~CNY 46,000&lt;/td&gt;
&lt;td&gt;~CNY 23/point&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The broader industry range for medium projects (roughly 2,000–5,000 points) is about &lt;strong&gt;CNY 80–200 per point&lt;/strong&gt;, covering controllers, sensors, software licences and commissioning; high-spec environments such as hospital clean rooms and data centres push past CNY 300 per point. The two sets differ in scope — the first is mostly software platform, the second includes hardware and installation — so treat both as order-of-magnitude only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overseas retrofit pricing (original currency; CNY at 1 USD ≈ 6.71)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Retrofit type&lt;/th&gt;
&lt;th&gt;Listed price&lt;/th&gt;
&lt;th&gt;Converted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Equipment with native BACnet/Modbus, connected directly&lt;/td&gt;
&lt;td&gt;$200–500 / point&lt;/td&gt;
&lt;td&gt;~CNY 1,342–3,355 / point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Equipment needing a protocol gateway&lt;/td&gt;
&lt;td&gt;$500–1,500 / point&lt;/td&gt;
&lt;td&gt;~CNY 3,355–10,065 / point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Equipment over 20 years old, controller replacement&lt;/td&gt;
&lt;td&gt;$1,500–4,000 / point&lt;/td&gt;
&lt;td&gt;~CNY 10,065–26,840 / point&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The middle row is the one that matters: &lt;strong&gt;points that need a protocol gateway cost 2.5 to 3 times what directly connected points cost.&lt;/strong&gt; A 2026 UK BMS cost guide lands in the same place, quoting £300–600 per connected point and naming point count as the primary cost driver.&lt;/p&gt;

&lt;p&gt;That is the value of an embedded protocol service. It moves LoRaWAN data out of the "needs a protocol gateway" bucket and into the "connects directly" bucket. What it saves is not sensor money — it is the 2.5× multiplier on every point, plus the recurring cost of re-running the change process every time the point list moves.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. BACnet vs Modbus: You Are Delivering Objects, or You Are Delivering Addresses
&lt;/h2&gt;

&lt;p&gt;Both protocols expose platform data to a third-party system. What you hand over is completely different, and that is where selection usually goes wrong.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;BACnet/IP&lt;/th&gt;
&lt;th&gt;Modbus TCP Server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data model&lt;/td&gt;
&lt;td&gt;Object model: Analog / Binary Input, Output, Value&lt;/td&gt;
&lt;td&gt;Register model: address plus bits or words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-describing&lt;/td&gt;
&lt;td&gt;Yes — object name, description, units, data type&lt;/td&gt;
&lt;td&gt;No — everything is convention, carried in a spreadsheet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;Broadcast Who-Is / I-Am; the BMS can find devices&lt;/td&gt;
&lt;td&gt;None; the client must be pre-configured with addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change notification&lt;/td&gt;
&lt;td&gt;COV subscription (&lt;code&gt;cov_increment&lt;/code&gt; threshold)&lt;/td&gt;
&lt;td&gt;None; the client polls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write path&lt;/td&gt;
&lt;td&gt;Write to an Output/Value object → bound RPC fires&lt;/td&gt;
&lt;td&gt;Write to a register → bound RPC fires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Counterpart&lt;/td&gt;
&lt;td&gt;Building management systems, DDC controllers&lt;/td&gt;
&lt;td&gt;SCADA, HMI, PLC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;UDP, default 47808&lt;/td&gt;
&lt;td&gt;TCP, default 502&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One line separates them: &lt;strong&gt;BACnet for building automation, Modbus for the industrial side.&lt;/strong&gt; You can run both at once — a single TKE can publish BACnet objects to the BMS and Modbus registers to SCADA independently. They have separate service permissions and separate ports.&lt;/p&gt;

&lt;p&gt;The test is simple. If the other system can scan the network and list point names by itself, you are in the BACnet world. If the other engineer opens with "send me the point list and tell me what 40001 is," you are in the Modbus world.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. BACnet in Five Steps, in This Order
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1 — the system administrator enables the service permission
&lt;/h3&gt;

&lt;p&gt;From 2.00.077, System Platform → System Configuration carries two independent switches, &lt;strong&gt;ModbusTcpServer&lt;/strong&gt; and &lt;strong&gt;BACnet&lt;/strong&gt;, stored in &lt;code&gt;system_param.service_enable&lt;/code&gt; (not as a sub-field of &lt;code&gt;config&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Two details matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only a JSON boolean &lt;code&gt;false&lt;/code&gt; disables it.&lt;/strong&gt; A missing key, &lt;code&gt;null&lt;/code&gt;, or an empty object all default to allowed. Do not leave the field blank.&lt;/li&gt;
&lt;li&gt;Disabling stops the service, blocks configuration and point-table operations, and prevents both manual start and automatic recovery. Configuration and point tables are &lt;strong&gt;retained&lt;/strong&gt;; re-enabling requires a &lt;strong&gt;manual restart&lt;/strong&gt; — nothing starts on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2 — configure the BACnet fields in the thing model
&lt;/h3&gt;

&lt;p&gt;Before enabling the BACnet service, you must configure BACnet attributes for the fields you want to expose, inside the thing model. The thing model field's &lt;code&gt;unit&lt;/code&gt; maps to the BACnet object's &lt;code&gt;units&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is the most common source of rework: &lt;strong&gt;a deliverable thing model has four parts — the parser script, the display fields, the Modbus mapping, and the BACnet fields.&lt;/strong&gt; A working script that parses data correctly is not the same as having the BACnet fields configured. Article 21 covered the parser script and article 22 covered triggers; this is a fourth, separate block of configuration work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — enable BACnet on the device
&lt;/h3&gt;

&lt;p&gt;Device details → Basic Information, enable BACnet (on the Modbus side the equivalent is setting &lt;code&gt;modbus_tcp&lt;/code&gt; to &lt;code&gt;TRUE&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Only devices with this switch on get mapped.&lt;/strong&gt; When you generate a point table by thing model, it covers only devices &lt;strong&gt;already bound to that thing model and already enabled for BACnet&lt;/strong&gt; — it does not generate objects for every device in the tenant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — generate the point table
&lt;/h3&gt;

&lt;p&gt;Operations → BACnet → Incremental Generate → select the thing model → confirm.&lt;/p&gt;

&lt;p&gt;You can also add objects manually. Constraints for the manual form:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Eui&lt;/td&gt;
&lt;td&gt;Required; select the device to map&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_from&lt;/td&gt;
&lt;td&gt;From 2.00.085, free text; defaults to &lt;code&gt;telemetry_data&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;thing_model&lt;/td&gt;
&lt;td&gt;Required for telemetry sources only; attribute sources save it as an empty string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;field_name&lt;/td&gt;
&lt;td&gt;Required; a thing model field for telemetry, an attribute path for attribute sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;object_type&lt;/td&gt;
&lt;td&gt;Defaults to &lt;code&gt;analogOutput&lt;/code&gt;; choose according to the actual read/write purpose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;object_id&lt;/td&gt;
&lt;td&gt;Required; 0–4194303&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;object_name&lt;/td&gt;
&lt;td&gt;Required; the name the integrator will see&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;default_value&lt;/td&gt;
&lt;td&gt;Defaults to 0; lower bound 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;units&lt;/td&gt;
&lt;td&gt;Defaults to &lt;code&gt;noUnits&lt;/code&gt;; mapped from the thing model field's &lt;code&gt;unit&lt;/code&gt; when one is selected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cov_increment&lt;/td&gt;
&lt;td&gt;Required; defaults to 0, lower bound 0; change-notification threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;description, RPC&lt;/td&gt;
&lt;td&gt;Optional; bind an RPC when you need write control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;From 2.00.077 the "Apply point table" button is gone from the UI. Saving, deleting, importing, incrementally generating and renumbering objects &lt;strong&gt;automatically synchronise the running service&lt;/strong&gt;. The reverse is also true: &lt;strong&gt;saving a point table does not start a stopped service&lt;/strong&gt; — starting is a separate action in the service configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — configure service parameters and restart
&lt;/h3&gt;

&lt;p&gt;System Management → Server Configuration → BACnet. Fill in the network and device parameters, &lt;strong&gt;click Submit, then click Restart&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Reference value&lt;/th&gt;
&lt;th&gt;Editable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IP address&lt;/td&gt;
&lt;td&gt;Local IP of the host running TKL; &lt;code&gt;0.0.0.0&lt;/code&gt; binds all interfaces&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;BACnet listening port&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;47808&lt;/code&gt; (UDP, i.e. 0xBAC0)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device ID&lt;/td&gt;
&lt;td&gt;Unique BACnet device identifier, must be unique in the system&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor Identifier&lt;/td&gt;
&lt;td&gt;Vendor identification number&lt;/td&gt;
&lt;td&gt;Per actual vendor&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device Name&lt;/td&gt;
&lt;td&gt;Name shown in the BMS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TKE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max APDU Length Accepted&lt;/td&gt;
&lt;td&gt;Maximum accepted APDU length&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1024&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segmentation Supported&lt;/td&gt;
&lt;td&gt;Current version does not enable segmentation through this field&lt;/td&gt;
&lt;td&gt;As shown in the form&lt;/td&gt;
&lt;td&gt;Confirm compatibility with the BMS party&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Reference values are for field configuration only — they do not mean the new-entry form is pre-filled. Read the existing configuration and confirm each item with the BMS integrator. Changing listening parameters still requires Submit followed by Restart.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Three Point-Table Constraints With Long Reach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. object_id runs 0–4194303, and renumbering changes what the integrator is using
&lt;/h3&gt;

&lt;p&gt;The list offers a "renumber object id" action. It looks like housekeeping. It &lt;strong&gt;changes the object identifiers the integrator is already using&lt;/strong&gt; — the BMS addresses points by object instance number, so one renumbering pass on your side misaligns every point on theirs. After renumbering you must reissue the delivered point list and tell the integrator to reconfigure.&lt;/p&gt;

&lt;p&gt;The permitted range is 0–4194303, which reflects the 22-bit object instance number field in BACnet. BACnet device instance numbers must also be unique across the entire BACnet internetwork; duplicates produce intermittent faults that are genuinely unpleasant to diagnose, because the symptom is "sometimes it does not read," not "it never reads."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;data_from&lt;/code&gt; is free text, not an enum
&lt;/h3&gt;

&lt;p&gt;From 2.00.085, BACnet fields carry &lt;code&gt;data_from&lt;/code&gt;. Its type is a &lt;strong&gt;free string (varchar(32))&lt;/strong&gt;, not a fixed enum. Three values are suggested:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;data_from&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Meaning and configuration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;telemetry_data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default; &lt;code&gt;thing_model&lt;/code&gt; required, field read from &lt;code&gt;device.telemetry_data[thing_model]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server_attrs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reads an attribute path from &lt;code&gt;device.server_attrs&lt;/code&gt;; no thing model, saved as &lt;code&gt;""&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shared_attrs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reads an attribute path from &lt;code&gt;device.shared_attrs&lt;/code&gt;; saved as &lt;code&gt;""&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any other string&lt;/td&gt;
&lt;td&gt;Reads from the device's own attributes; falls back to &lt;code&gt;default_value&lt;/code&gt; if the source does not exist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Memorise the fallback rule: &lt;strong&gt;unknown source, missing value, null, empty string or whitespace all fall back to &lt;code&gt;default_value&lt;/code&gt;; but numeric &lt;code&gt;0&lt;/code&gt; and boolean &lt;code&gt;false&lt;/code&gt; are preserved.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which leads to the important conclusion: &lt;strong&gt;a default value is not evidence of the device's real state.&lt;/strong&gt; A fallback to 0 may mean "the value is 0" or "the source does not exist," and the BMS displays both identically.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The unique key is a four-tuple, not a field name
&lt;/h3&gt;

&lt;p&gt;An object's business key is &lt;code&gt;(eui, data_from, thing_model, field_name)&lt;/code&gt;. BACnet fields in the thing model use the "source + field name" composite key. &lt;strong&gt;Same-named fields from different sources can coexist&lt;/strong&gt; — so do not deduplicate on field name alone; you will delete the wrong one.&lt;/p&gt;

&lt;p&gt;Related: adding an attribute object directly does not require a thing model, but incremental generation by thing model still only covers devices bound to that model with BACnet enabled, and &lt;strong&gt;will not generate status objects for all devices automatically.&lt;/strong&gt; If you want an "online" point, add it manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Turning "Offline" Into a Point the BMS Can Read
&lt;/h2&gt;

&lt;p&gt;A BMS needs to know whether a sensor is still alive. On the ThinkLink side, you expose online status as an attribute point.&lt;/p&gt;

&lt;p&gt;Three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the device's basic information, set &lt;code&gt;notify_offline = "TRUE"&lt;/code&gt; and configure the real heartbeat period (confirm the source of the detection state).&lt;/li&gt;
&lt;li&gt;Add a BACnet object manually: pick the real device EUI and a non-conflicting object ID/name, set source to &lt;code&gt;server_attrs&lt;/code&gt;, field to &lt;code&gt;_online&lt;/code&gt;, type to &lt;code&gt;binaryInput&lt;/code&gt;, units to &lt;code&gt;noUnits&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Save the point table, confirm the running service synchronised, then check online, timeout-offline and recovery from the BMS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Key fields when creating it (EUI, object identifier and other required fields also apply):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"data_from": "server_attrs",&lt;br&gt;
"thing_model": "",&lt;br&gt;
"field_name": "_online",&lt;br&gt;
"object_type": "binaryInput",&lt;br&gt;
"units": "noUnits",&lt;br&gt;
"default_value": 0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One warning belongs in the handover document: &lt;strong&gt;a &lt;code&gt;default_value&lt;/code&gt; of 0 does not prove the detection result is offline&lt;/strong&gt; — a missing attribute also returns 0. With offline notification disabled, &lt;code&gt;_online&lt;/code&gt; can freeze at its last state.&lt;/p&gt;

&lt;p&gt;Online status also has three non-interchangeable meanings on the platform (covered in article 22): the activity time in the device list, &lt;code&gt;server_attrs.online&lt;/code&gt; (a number 1/0 maintained by the detector), and the boolean &lt;code&gt;data.online&lt;/code&gt; in MQTT notifications. &lt;code&gt;notify_offline&lt;/code&gt; is a string switch on the device or template, &lt;code&gt;"TRUE"&lt;/code&gt;/&lt;code&gt;"FALSE"&lt;/code&gt;, disabled by default — &lt;strong&gt;when it is not enabled, or missing, you may not treat the device as offline.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Modbus TCP: Four Register Types and Ten Encodings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Three configuration steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;The system administrator enables ModbusTcpServer under organisation service permissions.&lt;/li&gt;
&lt;li&gt;System Management → Server Configuration → Modbus TCP Server: set the listening port (usually &lt;strong&gt;502&lt;/strong&gt;), Submit, then Restart.&lt;/li&gt;
&lt;li&gt;Device details → Basic Information: set &lt;code&gt;modbus_tcp&lt;/code&gt; to &lt;code&gt;TRUE&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Register mapping entries
&lt;/h3&gt;

&lt;p&gt;Operations → Modbus TCP → register list; add mappings for enabled devices:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device EUI&lt;/td&gt;
&lt;td&gt;The device whose data is being mapped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Register type&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;coils&lt;/code&gt; (1 bit, R/W) / &lt;code&gt;discrete_inputs&lt;/code&gt; (1 bit, read-only) / &lt;code&gt;holding_registers&lt;/code&gt; (16 bit, R/W) / &lt;code&gt;input_registers&lt;/code&gt; (16 bit, read-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Register address&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Hex&lt;/strong&gt;; the platform detects conflicts, addresses must be unique within a type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data source&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;telemetry_data&lt;/code&gt; / &lt;code&gt;shared_attrs&lt;/code&gt; / &lt;code&gt;server_attrs&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Field path (&lt;code&gt;name_path&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;The field name; multi-level paths supported, e.g. &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;sensor.value&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value type&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;string&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;Int16LE&lt;/code&gt;, &lt;code&gt;Int16BE&lt;/code&gt;, &lt;code&gt;Int32LE&lt;/code&gt;, &lt;code&gt;Int32BE&lt;/code&gt;, &lt;code&gt;FloatLE&lt;/code&gt;, &lt;code&gt;FloatBE&lt;/code&gt;, &lt;code&gt;DoubleLE&lt;/code&gt;, &lt;code&gt;DoubleBE&lt;/code&gt;; &lt;strong&gt;there is no generic &lt;code&gt;number&lt;/code&gt; option&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPC binding&lt;/td&gt;
&lt;td&gt;Optional; when the client writes this register, the bound RPC fires&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Three form-filling traps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Addresses are hex, register counts are decimal.&lt;/strong&gt; Do not mix the two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The register count is computed from the type and cannot be edited.&lt;/strong&gt; Selecting &lt;code&gt;FloatBE&lt;/code&gt; shows a count of 2. When you allocate the following address, account for the full length occupied — a FloatBE consumes two 16-bit registers, so the next point must start two addresses later. Checking only the start address will overlap them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LE/BE is an encoding choice and must match how the reader interprets bytes.&lt;/strong&gt; Choose &lt;code&gt;FloatBE&lt;/code&gt; on the platform while the SCADA decodes little-endian and you get a completely wrong number, with no error raised.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read and write behaviour
&lt;/h3&gt;

&lt;p&gt;Reading: when the client reads a register, ThinkLink returns the current value of the mapped field. The value refreshes on each device uplink — &lt;strong&gt;no polling configuration is needed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Writing: the register &lt;strong&gt;must have an RPC bound&lt;/strong&gt;. ThinkLink calls the bound RPC with the written value as a parameter, in the form &lt;code&gt;{ _eui, [field_name]: value }&lt;/code&gt;, with the call source marked &lt;code&gt;bacnet_server&lt;/code&gt; (the same mechanism applies on the Modbus side).&lt;/p&gt;

&lt;p&gt;Typical use: SCADA writes a &lt;code&gt;holding_registers&lt;/code&gt; value to change the sampling interval; ThinkLink fires a "set sampling interval" RPC down to the device.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. The Write Path: Three Things to Accept Separately
&lt;/h2&gt;

&lt;p&gt;This is where integration disputes come from. The documentation is deliberately careful in its wording:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A successful BACnet write does not mean the device has executed it; check the device reply or a subsequent uplink.&lt;br&gt;
Write accepted, device execution succeeded, and attribute persistence completed must be verified separately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write accepted&lt;/strong&gt; — the platform received the request and the object value in the point table may already be updated. This completes in seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device execution succeeded&lt;/strong&gt; — the RPC reaches the device and the device actually changes the parameter. For a Class A LoRaWAN end device, a downlink can only be sent in the receive windows after an uplink (RX1 at roughly 1 s, RX2 at roughly 2 s). A device that reports every ten minutes may take ten minutes to receive the command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribute persistence completed&lt;/strong&gt; — the device reports the new value back, it is written to attributes, and the BMS sees the real result on its next read.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A failure at any stage presents as "the BMS shows the write succeeded but the device did not change." If the RPC fails or the device reports its original value, a later attribute notification can push the true cached value back — but that push arrives on the next attribute update, not immediately.&lt;/p&gt;

&lt;p&gt;So on the acceptance sheet, write control should be specified as "read back and confirm within N reporting cycles," not "write operation returned success."&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Network and Ports: 47808 Does Not Work Just Because You Configured It
&lt;/h2&gt;

&lt;p&gt;The networking requirements for BACnet/IP are more specific than most people expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UDP 47808, both directions.&lt;/strong&gt; Firewall rules must permit UDP 47808 inbound and outbound. An outbound-only rule means the workstation can send Who-Is and will never see an I-Am come back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broadcast only works inside one broadcast domain.&lt;/strong&gt; The workstation sends a Who-Is broadcast and only devices on the same Layer-2 segment answer. Put an IP router in between and the router does not forward broadcasts, so discovery fails silently — the workstation reports "nothing found," never "network unreachable." The standard fix for crossing subnets is a BBMD: one per subnet holding devices, each carrying a Broadcast Distribution Table naming its peers. A broadcast is unicast to those peers and re-broadcast locally by each.&lt;/p&gt;

&lt;p&gt;A few hard rules when configuring BBMDs: the distribution table must match on every BBMD — a subnet listed in one table and omitted from the others is reachable in one direction only; the BBMD's own address must be static, because foreign-device registrations and peer table entries point at it by address; and &lt;strong&gt;two BBMDs on the same subnet is a configuration error, not redundancy&lt;/strong&gt;, producing duplicate traffic and duplicate I-Am answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT breaks BACnet/IP.&lt;/strong&gt; BACnet/IP carries the originating address inside the message payload — in the Forwarded-NPDU a BBMD sends, and in a foreign device registration. NAT rewrites the IP header and leaves the payload alone, so requests get out and replies never arrive. The workable path is a routed or VPN connection, not address translation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Site-to-site VPNs and wireless bridges frequently drop broadcast.&lt;/strong&gt; Unicast working is not evidence that broadcast works; supervision across such a link normally needs foreign-device registration rather than plain discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One deployment-level note.&lt;/strong&gt; The TKE Docker deployment guide lists host inbound ports (80/8080, 443, 18083, 18084, 1883, 8883, 8083, 8084, 1700 UDP, 9000, 9001) and &lt;strong&gt;does not include 47808 or 502&lt;/strong&gt;. The installer does not create mappings or allow rules for these two services; the deployment team has to confirm container port mapping, host firewall and security group rules themselves. Miss this and the symptom is "the platform says the service is running, but the BMS finds nothing."&lt;/p&gt;

&lt;p&gt;One last item is a security requirement rather than an option: &lt;strong&gt;BACnet was designed for isolated control networks, and much of the installed base has little or no authentication.&lt;/strong&gt; Once the control network is reachable from the business network, that assumption no longer holds. Both UDP 47808 and TCP 502 should be reachable only from the building automation or SCADA segment — never from the public internet.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Verifying With YABE, and Delivering the Point List
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A five-minute loop with YABE
&lt;/h3&gt;

&lt;p&gt;YABE (Yet Another BACnet Explorer) is the common tool for browsing and debugging BACnet devices. Once configured, connect YABE to ThinkLink to discover the published BACnet devices and their object properties, and confirm the data is being published correctly.&lt;/p&gt;

&lt;p&gt;Work through the checks in this order; each one isolates a different class of problem:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Pass criterion&lt;/th&gt;
&lt;th&gt;First suspect if it fails&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device discovery&lt;/td&gt;
&lt;td&gt;YABE sees the Device ID and Device Name&lt;/td&gt;
&lt;td&gt;UDP 47808 blocked / no BBMD across subnets / service not restarted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object list&lt;/td&gt;
&lt;td&gt;Count and object_ids match the point table&lt;/td&gt;
&lt;td&gt;BACnet not enabled on the device / thing model BACnet fields not configured&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read value&lt;/td&gt;
&lt;td&gt;presentValue matches platform telemetry&lt;/td&gt;
&lt;td&gt;Wrong field name or source / value fell back to default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Units&lt;/td&gt;
&lt;td&gt;units shows the expected unit (e.g. degreesCelsius)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;unit&lt;/code&gt; not filled in the thing model field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COV&lt;/td&gt;
&lt;td&gt;Notification arrives when change exceeds the threshold&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cov_increment&lt;/code&gt; set to 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write control&lt;/td&gt;
&lt;td&gt;Device read-back changes after writing an Output/Value&lt;/td&gt;
&lt;td&gt;No RPC bound / Class A downlink window not reached&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Modbus has no general-purpose browser equivalent; you typically use a Modbus master utility (Modbus Poll and similar) to read addresses one by one against the point list. Focus on two things: the address convention (hex vs decimal) and byte order (LE vs BE).&lt;/p&gt;

&lt;h3&gt;
  
  
  Delivering the point list
&lt;/h3&gt;

&lt;p&gt;Both BACnet and Modbus point lists export to Excel and import back for bulk configuration. The export contains object type, address, name, description, data type, units and read/write permissions — exactly what the integrator needs to configure their client.&lt;/p&gt;

&lt;p&gt;One caveat on import: &lt;strong&gt;entries with an existing ID are overwritten.&lt;/strong&gt; This is the same class of risk as the Excel migration traps covered in article 23 — export a backup before importing, because the overwrite cannot be rolled back.&lt;/p&gt;

&lt;p&gt;Two delivery recommendations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Version the point list.&lt;/strong&gt; Record the point list version alongside the thing model version and the platform version. If BACnet object identifiers shift, every point on the BMS side is misaligned, and retrospective investigation costs far more than keeping a record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver first, then commission together.&lt;/strong&gt; Hand the point list to the integrator, let them configure their client, then commission jointly. That is much faster than adjusting the point list during commissioning. Point-table saves do synchronise the running service automatically, but every change forces the other side to reconfigure.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  11. Acceptance Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Pass criterion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Deployment form&lt;/td&gt;
&lt;td&gt;Confirmed TKE or TKG; Cloud exposes neither BACnet nor Modbus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Service permission&lt;/td&gt;
&lt;td&gt;Both BACnet and ModbusTcpServer explicitly &lt;code&gt;true&lt;/code&gt; in system configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Thing model&lt;/td&gt;
&lt;td&gt;All four blocks done: parser script, display fields, Modbus mapping, BACnet fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Device switch&lt;/td&gt;
&lt;td&gt;BACnet / &lt;code&gt;modbus_tcp&lt;/code&gt; enabled on target devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Service parameters&lt;/td&gt;
&lt;td&gt;Device ID unique network-wide; Port agreed with the BMS party; submitted and restarted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Port reachability&lt;/td&gt;
&lt;td&gt;UDP 47808 open both directions (BBMD deployed if crossing subnets); TCP 502 open to the control segment only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Point list completeness&lt;/td&gt;
&lt;td&gt;Object/address, name, data type, units, R/W permission all present; write points have RPCs bound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Read correctness&lt;/td&gt;
&lt;td&gt;YABE / Modbus master reads match platform telemetry, units correct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Status point&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;_online&lt;/code&gt; point exists and online, timeout-offline and recovery have all been tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;COV&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cov_increment&lt;/code&gt; set to a real precision value, not 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Write control&lt;/td&gt;
&lt;td&gt;Confirmed by read-back over reporting cycles, not by write success alone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Runtime monitoring&lt;/td&gt;
&lt;td&gt;No point-table sync errors or retries; service restarts automatically after abnormal exit, and does not resurrect after a manual stop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Deliverables&lt;/td&gt;
&lt;td&gt;Point list Excel exported and versioned; backup taken before any import&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  12. Closing
&lt;/h2&gt;

&lt;p&gt;Getting LoRaWAN data into a BMS or SCADA is not fundamentally hard — the protocols are public and a bridge can always be written. The real cost is that every point has to be configured by someone, checked by someone, and changed again by someone throughout the project's life. The industry prices by the point; points that need a protocol gateway cost 2.5 to 3 times what direct points cost. That number prices integration labour, not software features.&lt;/p&gt;

&lt;p&gt;ThinkLink's built-in BACnet/IP and Modbus TCP on TKE and TKG remove that segment. What they do not remove is &lt;strong&gt;engineering discipline&lt;/strong&gt;: BACnet is available only in the self-hosted forms, one process serves one organisation, renumbering a point list breaks the integrator's configuration, a successful write is not a successful execution, and UDP 47808 needs two-way rules plus a BBMD once you cross a subnet.&lt;/p&gt;

&lt;p&gt;All of these are documented. They are just spread across different pages. Collecting them into an acceptance checklist is the cheapest way to get the integration right the first time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Article 21: ThinkLink Thing Model Decoder Scripts in Practice — Turning 15 Bytes Into a Readable Table&lt;/li&gt;
&lt;li&gt;Article 22: ThinkLink Trigger Models and Alarm Rules in Practice — On Time, Not Spammy, To the Right Person&lt;/li&gt;
&lt;li&gt;Article 23: ThinkLink Edge On-Premises Deployment in Practice — What "Data Never Leaves the Plant" Actually Requires&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Based on official ThinkLink documentation (versions 2.00.077–2.00.085). Configuration paths and parameters follow your deployed version. Official manuals:&lt;br&gt;
&lt;a href="https://www.think-link.net/docs/en/Maintenance/BACnet.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Maintenance/BACnet.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.think-link.net/docs/en/Maintenance/ModbusTCP.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/Maintenance/ModbusTCP.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.think-link.net/docs/en/QuickStart/SystemManagement/ServerConfiguration.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/en/QuickStart/SystemManagement/ServerConfiguration.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>ThinkLink Edge On-Premises Deployment in Practice: What "Data Never Leaves the Plant" Actually Requires</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:06:53 +0000</pubDate>
      <link>https://dev.to/manthink/thinklink-edge-on-premises-deployment-in-practice-what-data-never-leaves-the-plant-actually-561e</link>
      <guid>https://dev.to/manthink/thinklink-edge-on-premises-deployment-in-practice-what-data-never-leaves-the-plant-actually-561e</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7c8xxh6p6s4csc4sqk7p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7c8xxh6p6s4csc4sqk7p.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Currency note.&lt;/strong&gt; Figures were collected from Chinese public channels in October 2026. Where a price was quoted in CNY, the USD figure is converted at the fixed October 2026 reference rate of &lt;strong&gt;1 USD ≈ 6.71 CNY&lt;/strong&gt;. Hardware prices are indicative of order of magnitude and are not a sourcing recommendation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;"Data must not leave the plant." It shows up in industrial IoT tenders as a single line, usually in the third clause of the technical specification, with no further explanation. The integrator wins the bid, buys an industrial PC, installs the on-premises version of the IoT platform, passes acceptance, and the job looks done.&lt;/p&gt;

&lt;p&gt;The problem is that the sentence describes &lt;strong&gt;where data sits&lt;/strong&gt;. It says nothing about &lt;strong&gt;how data moves inside the plant&lt;/strong&gt;. Once you place a seven-container platform on the shop-floor network, questions do not disappear because the data stays local — is MQTT in cleartext, who can reach the object-storage console, how large will the history table be in twelve months. Centralising data tends to enlarge the internal attack surface, not shrink it.&lt;/p&gt;

&lt;p&gt;This article walks through a ThinkLink Edge (TKE) deployment in the order it actually happens. The focus is not the install command — it is the set of things that are usually discovered &lt;em&gt;after&lt;/em&gt; the install, and that should have been settled before the machine was ordered.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Before You Buy Anything: Three Questions That Decide Whether You Need TKE
&lt;/h2&gt;

&lt;p&gt;ThinkLink ships in three deployment forms: public-cloud SaaS (Cloud), self-hosted on a local server (TKE / ThinkLink Edge), and embedded inside a gateway (TKG). All three share the same thing models, RPC definitions and trigger logic, and assets can be migrated between them. That is what makes it safe to defer the decision — up to a point.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Cloud&lt;/th&gt;
&lt;th&gt;TKE (Edge)&lt;/th&gt;
&lt;th&gt;TKG (in-gateway)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where it runs&lt;/td&gt;
&lt;td&gt;Public-cloud SaaS&lt;/td&gt;
&lt;td&gt;Local server / industrial PC, self-hosted&lt;/td&gt;
&lt;td&gt;Inside a ManThink gateway (e.g. GDO51 / GDI51)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device ceiling&lt;/td&gt;
&lt;td&gt;1,000 (free, permanently)&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data throughput&lt;/td&gt;
&lt;td&gt;~100k messages/day&lt;/td&gt;
&lt;td&gt;No stated ceiling&lt;/td&gt;
&lt;td&gt;~10k messages/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reference hardware&lt;/td&gt;
&lt;td&gt;Nothing to buy&lt;/td&gt;
&lt;td&gt;8-core / 8 GB / 64 GB storage&lt;/td&gt;
&lt;td&gt;Integrated (GDI51 has 32 GB eMMC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connectivity&lt;/td&gt;
&lt;td&gt;Requires public internet&lt;/td&gt;
&lt;td&gt;Local, runs offline&lt;/td&gt;
&lt;td&gt;Local, no public internet needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Evaluation, small pilots&lt;/td&gt;
&lt;td&gt;Data localisation, mid-to-large enterprises, private networks&lt;/td&gt;
&lt;td&gt;Small private deployments, brownfield retrofits, no extra server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three questions to answer first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you actually need TKE?&lt;/strong&gt; Under 100 devices and under 10k messages a day, TKG embeds the network server directly in the gateway — no extra server, no server procurement cycle. A great many "data must not leave the plant" requirements are really about not pushing production data out through a public internet egress, and TKG satisfies that at a completely different cost structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which side of 10k messages/day are you on?&lt;/strong&gt; That line separates TKG from TKE. 1,000 devices reporting every 10 minutes is 144,000 messages a day — above Cloud's reference density and far past TKG. 50 meters reporting hourly is 1,200 a day, which TKG handles comfortably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who owns this machine afterwards?&lt;/strong&gt; TKE is a standing operational commitment: OS patches, Docker engine, seven containers, certificate renewals, backups. If the customer's IT department has not explicitly accepted ownership, you have created an unowned server, usually discovered in year two when the disk is full.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Hardware Selection: x64 Is a Hard Constraint, Not a Recommendation
&lt;/h2&gt;

&lt;p&gt;The official documentation carries two different statements of TKE's hardware requirements, and they do not agree. Worth laying out before you commit budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Statement A (product comparison table):&lt;/strong&gt; reference hardware 8 cores / 8 GB RAM / 64 GB storage, minimum 2 cores and 2 GB, architecture listed as &lt;strong&gt;ARM64 / x64&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Statement B (Docker deployment manual; install flow updated 2026-09-11, TLS section updated 2026-10-22):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Privileges&lt;/td&gt;
&lt;td&gt;root (install commands use sudo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU architecture&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;x64 only (x86_64 / amd64)&lt;/strong&gt;, minimum 2 cores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;minimum &lt;strong&gt;4 GiB&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk&lt;/td&gt;
&lt;td&gt;minimum &lt;strong&gt;20 GiB&lt;/strong&gt; free on the filesystem holding &lt;code&gt;/opt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;HTTPS access to &lt;code&gt;package.think-link.net&lt;/code&gt; for online install; the offline target needs no internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicitly unsupported&lt;/td&gt;
&lt;td&gt;ARM, ARM64, 32-bit x86&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two statements disagree on three points: 2 GB or 4 GB of RAM, 64 GB or 20 GB of disk, and — most consequentially — &lt;strong&gt;whether ARM works at all&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow statement B.&lt;/strong&gt; Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Statement B comes from the deployment manual itself and is what the installer actually checks against; failing it terminates the install. Statement A is a summary line in a comparison table.&lt;/li&gt;
&lt;li&gt;Statement B is the stricter constraint. Seven containers run concurrently — EMQX, the NS bridge, PostgreSQL, Redis, ThinkLink, ThinkOne and MinIO. Two gigabytes leaves no headroom at that scale.&lt;/li&gt;
&lt;li&gt;Statement B explicitly lists ARM, ARM64 and 32-bit x86 as unsupported, and separately notes the restriction applies to both the one-line online install and the scripted offline install. Wording that specific usually comes from having tried it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;This constraint collides head-on with domestic-CPU mandates.&lt;/strong&gt; Chinese CPUs split into two camps:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Camp&lt;/th&gt;
&lt;th&gt;Representative parts&lt;/th&gt;
&lt;th&gt;Works with TKE?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;x86&lt;/td&gt;
&lt;td&gt;Zhaoxin KX-6000/KX-7000, Hygon 3000/5000 series&lt;/td&gt;
&lt;td&gt;Yes — architecture is compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARM&lt;/td&gt;
&lt;td&gt;Phytium FT-2000/4 and D2000, Kunpeng 920, Rockchip RK3568/RK3588&lt;/td&gt;
&lt;td&gt;No — incompatible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a localisation mandate lands on the ARM camp, TKE should be ruled out during selection, not after the machine arrives and &lt;code&gt;uname -m&lt;/code&gt; prints &lt;code&gt;aarch64&lt;/code&gt;. The x86 camp works directly — Hygon 3350 (8 cores / 16 threads at 3.0 GHz) is x86_64.&lt;/p&gt;

&lt;p&gt;Indicative pricing collected from public channels in October 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Indicative price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4U rackmount, i5-6500U / 8 GB / 1 TB&lt;/td&gt;
&lt;td&gt;Proof of concept (2 cores, sitting exactly on the minimum)&lt;/td&gt;
&lt;td&gt;~$477 (¥3,200)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Industrial PC, Hygon 3350 (8C/16T) / 16 GB / 1 TB SSD&lt;/td&gt;
&lt;td&gt;Recommended for production&lt;/td&gt;
&lt;td&gt;~$1,550–1,700 (¥10,400–11,400)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same, with domestic OS licence&lt;/td&gt;
&lt;td&gt;Localisation-mandate projects&lt;/td&gt;
&lt;td&gt;~$1,950 (¥13,100)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first tier is a POC machine only. The i5-6500U is two cores / four threads, exactly the stated minimum; CPU becomes the bottleneck before the disk does.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Disk Calculation: 20 GiB Is the Entry Ticket, Not the Plan
&lt;/h2&gt;

&lt;p&gt;The 20 GiB check is the installer's admission gate. Real consumption comes from three sources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seven container images.&lt;/strong&gt; The offline bundle accepted on 2026-09-11 for version &lt;code&gt;2.00.062&lt;/code&gt; is about &lt;strong&gt;2.45 GB&lt;/strong&gt;, holding the application archive, the Compose file and seven image archives — nine files total. Later versions will differ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database growth.&lt;/strong&gt; At 1,000 devices reporting every 10 minutes, that is 144,000 rows a day. At roughly 1 KB per row including indexes, about 144 MB/day, or ~52 GB a year. Add PostgreSQL WAL, index bloat and history-query overhead and the usual practice is to provision two to three times that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MinIO object storage.&lt;/strong&gt; Reports and images live in the Docker named volume &lt;code&gt;minio_data&lt;/code&gt;. This swings wildly depending on whether the business generates reports and how often.&lt;/p&gt;

&lt;p&gt;Sum them and 20 GiB covers a few months. &lt;strong&gt;Go to a 1 TB SSD for production.&lt;/strong&gt; The price delta sits in the table above and is trivial against total project value; the alternative is an online capacity expansion in year two.&lt;/p&gt;

&lt;p&gt;One detail that is easy to miss: &lt;strong&gt;object files live in a Docker named volume, so routine backups must cover that volume; backing up the &lt;code&gt;/opt&lt;/code&gt; directory alone does not substitute for object data.&lt;/strong&gt; A backup script that only walks a directory path will silently lose every report file.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Port Planning: "Not Leaving the Plant" Is Not the Same as "Not on a Network"
&lt;/h2&gt;

&lt;p&gt;This is the section worth reading twice. On-premises deployment solves data residency. A default install then opens a full set of ports on the host, and a meaningful share of them are cleartext.&lt;/p&gt;

&lt;p&gt;Complete the HTTP install first, then configure HTTPS with tkl-tls 2.0.0 — that is the documented order. Host inbound ports:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;80 (or 8080)&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;ThinkLink web / API over HTTP&lt;/td&gt;
&lt;td&gt;Original entry; if 80 is taken the installer interactively offers 8080; retained after TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;443&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;ThinkLink web / API over HTTPS&lt;/td&gt;
&lt;td&gt;Enabled once tkl-tls 2.0.0 configures the in-container Nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1700&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;UDP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LoRaWAN GWMP gateway uplink&lt;/td&gt;
&lt;td&gt;Open per gateway access needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1883&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;Device MQTT (cleartext)&lt;/td&gt;
&lt;td&gt;Open per device access needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;8883&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;Device MQTTS&lt;/td&gt;
&lt;td&gt;Not published by default; configure and verify separately in EMQX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8083&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;MQTT over WebSocket&lt;/td&gt;
&lt;td&gt;Open per client needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;8084&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;MQTT over WSS&lt;/td&gt;
&lt;td&gt;Path &lt;code&gt;/mqtt&lt;/code&gt;; requires its own certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18083&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;EMQX dashboard over HTTP&lt;/td&gt;
&lt;td&gt;Retained; not automatically upgraded to HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;18084&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;EMQX dashboard over HTTPS&lt;/td&gt;
&lt;td&gt;Enabled by tkl-tls 2.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9000&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;MinIO S3 API&lt;/td&gt;
&lt;td&gt;Restrict source addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9001&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;MinIO console&lt;/td&gt;
&lt;td&gt;Trusted administrator networks only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Details that belong in the plan:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Port conflicts are handled inconsistently.&lt;/strong&gt; If 80 is taken, the installer asks whether to use 8080 and leaves the occupying service alone. But if &lt;strong&gt;9000 or 9001 is taken, the installer stops outright&lt;/strong&gt; and will not pick an alternative. A target machine already running another storage service will stall mid-install.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5432 and 6379 never need to be exposed.&lt;/strong&gt; PostgreSQL and Redis ports are container-internal only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Management HTTPS is not device MQTTS.&lt;/strong&gt; tkl-tls produces 443 and 18084. Device-side 8883 and 8084 are unpublished by default and need certificates uploaded in EMQX, mappings opened and connectivity verified. &lt;strong&gt;Replacing the certificate in the management UI does not replace device listener certificates&lt;/strong&gt; — those are two separate configurations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An open port is not an enabled TLS listener.&lt;/strong&gt; Worth copying the manual's reminder straight into the acceptance sheet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The EMQX console at 18083 stays HTTP.&lt;/strong&gt; The HTTPS console is 18084; the old entry is retained. Locking down 18083 while forgetting 18084 accomplishes nothing.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. On-Premises Deployment ≠ Regulatory Compliance
&lt;/h2&gt;

&lt;p&gt;This is the most common misreading of "data must not leave the plant."&lt;/p&gt;

&lt;p&gt;Moving the platform inside the plant addresses &lt;strong&gt;storage location&lt;/strong&gt;. The path from sensor to platform is still network transmission, still subject to whatever the applicable rules require of transmission.&lt;/p&gt;

&lt;p&gt;China's &lt;em&gt;Interim Measures for Data Security Management in the Industry and Information Technology Sector&lt;/em&gt; (MIIT Network Security Circular No. 166, issued 2022-12-08, effective 2023-01-01) classifies sector data into three tiers — general, important and core — and states in Article 17:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Data processors shall formulate security policies and adopt protective measures based on the type, level and application scenario of transmitted data. When transmitting important data or core data, they shall adopt verification technology, cryptographic technology, secure transmission channels or secure transmission protocols.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read that against the port table above. Under a default install, device MQTT runs cleartext on 1883, HTTP runs on 80, and MinIO's S3 API on 9000. If this system carries data classified as important, &lt;strong&gt;on-premises deployment alone does not satisfy Article 17&lt;/strong&gt; — the transmission channels have to be closed as well, meaning web/API on 443 and device MQTT on 8883.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;Network Data Security Regulations&lt;/em&gt; (State Council Decree No. 790, published 2024-09-24, effective 2025-01-01, nine chapters and 64 articles) establishes the classification-and-grading regime one level up, with a dedicated chapter on important data.&lt;/p&gt;

&lt;p&gt;Two further clauses land on concrete operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Article 15:&lt;/strong&gt; storing important and core data requires secure storage using verification and cryptographic technologies, plus &lt;strong&gt;data disaster-recovery backup&lt;/strong&gt; and &lt;strong&gt;storage-media security management&lt;/strong&gt;, with &lt;strong&gt;periodic data recovery testing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Article 25:&lt;/strong&gt; processors must log data processing, permission management and operator actions, retaining logs for &lt;strong&gt;no less than six months&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For European readers the pressure arrives from a different direction. The EU Data Act's design obligation for data access (Article 3(1)) took effect on 2026-09-12, with cloud switching charges falling to zero on 2027-01-12. Different instrument, same structural conclusion: the ability to move a deployment — including moving it onto your own hardware — is becoming a compliance matter, not an architecture preference.&lt;/p&gt;

&lt;p&gt;The three clauses together form a chain: &lt;strong&gt;local deployment is step one, TLS is step two, backup and log retention are step three.&lt;/strong&gt; Declaring compliance after step one is what gets caught in an audit.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Two Install Paths: Online One-Liner and Scripted Offline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Online
&lt;/h3&gt;

&lt;p&gt;On a connected server, no arguments needed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;curl --tlsv1.2 --tls-max 1.2 -fsSL &lt;a href="https://package.think-link.net/install.sh" rel="noopener noreferrer"&gt;https://package.think-link.net/install.sh&lt;/a&gt; | sudo bash&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The installer: detects OS, CPU, RAM, disk and ports → installs Docker on supported systems (reusing any working Docker) → downloads the application archive, the Compose file and seven image archives (nine files) → installs to the target directory, loads images and starts Compose → checks ThinkLink HTTP, MinIO readiness and bucket initialisation → records version and access information.&lt;/p&gt;

&lt;p&gt;MinIO creates a private bucket named &lt;code&gt;thinklink&lt;/code&gt; on first start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scripted offline
&lt;/h3&gt;

&lt;p&gt;The documentation summarises it as "download online → transfer and verify → install offline."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step one, on a connected machine.&lt;/strong&gt; The download mode must run from a local script file, never through &lt;code&gt;curl | bash&lt;/code&gt;, because the bundle has to carry the same complete installer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;curl --fail --silent --show-error --proto '=https' \&lt;br&gt;
  --tlsv1.2 --tls-max 1.2 --connect-timeout 10 --max-time 60 \&lt;br&gt;
  &lt;a href="https://package.think-link.net/install.sh" rel="noopener noreferrer"&gt;https://package.think-link.net/install.sh&lt;/a&gt; -o thinklink-install.sh&lt;/p&gt;

&lt;p&gt;bash thinklink-install.sh --help&lt;br&gt;
bash thinklink-install.sh --download-only ./thinklink-offline&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Run &lt;code&gt;--help&lt;/code&gt; first and confirm it lists &lt;code&gt;--download-only&lt;/code&gt;, &lt;code&gt;--verify-only&lt;/code&gt; and &lt;code&gt;--offline&lt;/code&gt;. The target directory must not yet exist and its parent must; &lt;strong&gt;do not &lt;code&gt;mkdir&lt;/code&gt; it beforehand&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The delivered directory holds 13 checksummed files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;application.tar&lt;/td&gt;
&lt;td&gt;Application archive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docker-compose.yml&lt;/td&gt;
&lt;td&gt;Compose definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tkl-emqx.tar / tkl-nsbrg.tar / tkl-postgres.tar&lt;/td&gt;
&lt;td&gt;EMQX, NS bridge, PostgreSQL images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tkl-redis.tar / tkl-thinklink.tar / tkl-thinkone.tar&lt;/td&gt;
&lt;td&gt;Redis, ThinkLink, ThinkOne images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tkl-minio.tar&lt;/td&gt;
&lt;td&gt;MinIO image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;install.sh / install-offline.sh&lt;/td&gt;
&lt;td&gt;Installer scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;release.json&lt;/td&gt;
&lt;td&gt;Release id, version, channel, architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA256SUMS&lt;/td&gt;
&lt;td&gt;Covers 9 artifacts, 2 scripts, the version record and the readme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;README.txt&lt;/td&gt;
&lt;td&gt;In-bundle notes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Step two, transfer and verify.&lt;/strong&gt; Move the directory intact — it is created with mode 0700 and should stay read-restricted afterwards. On the target:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;cd thinklink-offline&lt;br&gt;
bash install.sh --verify-only .&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This mode needs no root, no Docker and makes no network requests. It checks file integrity, manifest paths and version format, and only proceeds if all pass. &lt;strong&gt;SHA-256 verifies transfer integrity; it is not a publisher signature and does not independently prove provenance&lt;/strong&gt; — a candid note in the manual, and a reminder that supply-chain trust still rests on the delivery channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step three, install.&lt;/strong&gt; Run &lt;code&gt;sudo bash install-offline.sh&lt;/code&gt; in the bundle directory, adding &lt;code&gt;--yes&lt;/code&gt; for unattended runs (it skips only the final confirmation prompt, not verification or port checks).&lt;/p&gt;

&lt;p&gt;The offline target must already have Docker Engine and Docker Compose V2, because &lt;strong&gt;the bundle does not include Docker or OS dependencies&lt;/strong&gt;. Check first:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;uname -m&lt;br&gt;
sudo docker version&lt;br&gt;
sudo docker compose version&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;uname -m&lt;/code&gt; must print &lt;code&gt;x86_64&lt;/code&gt;. Anything else: stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three limits of the offline path
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New installations only — no automatic upgrade, no rollback on failure.&lt;/strong&gt; If it detects an existing install or leftover data, it leaves the scene intact for you to investigate rather than cleaning up and retrying. Upgrades need new artifacts, a backup and a version-matched upgrade plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not mix download batches.&lt;/strong&gt; The package service checks upstream at 00:00 Beijing time daily and updates artifacts. Mixing batches produces &lt;code&gt;OFFLINE_IMAGES_MISSING&lt;/code&gt; — Compose and images out of sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No resumable downloads across processes.&lt;/strong&gt; A failure means re-downloading the whole 2.45 GB. On an expired URL or single-file failure, the script refreshes the address within the same session and retries once.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  7. The One Red Line When Running Alongside Cloud
&lt;/h2&gt;

&lt;p&gt;Most projects pass through a transition period with a foot in both camps — legacy devices in the cloud, new devices on-premises, both live.&lt;/p&gt;

&lt;p&gt;The documentation is unambiguous:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not enable the same LoRaWAN device profile on two platforms at once. If TKE and the cloud platform both respond to Join or Confirm messages, join failures and downlink conflicts can result. When switching platforms, disable or delete the profile on the one you are not using.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a functional constraint, not a performance tip. A Join Request is forwarded to every NS registered for that DevEUI. Both answer with a Join Accept; the device accepts one, but the other NS now believes the device joined and holds frame counters — subsequent downlinks go to the wrong path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;During transition, the profile is enabled on exactly one side. Not "both on, whoever answers first."&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Cloud → Edge Migration: Three Traps in the Excel Import/Export
&lt;/h2&gt;

&lt;p&gt;ThinkLink moves bulk data through Excel across six module types: device configurations, LoRaWAN profiles, thing models, RPC commands, linkage/trigger models and device templates. The workflow is identical on Cloud, TKE and TKG — &lt;strong&gt;the only difference being that TKE/TKG have their own local admin account, unrelated to the cloud one.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the cloud, open the target module (e.g. LoRaWAN Profiles)&lt;/li&gt;
&lt;li&gt;Select the entries to sync (none selected = export all)&lt;/li&gt;
&lt;li&gt;Click Export and download the generated spreadsheet&lt;/li&gt;
&lt;li&gt;Repeat 2–3 for each data type (thing models, RPC commands, …)&lt;/li&gt;
&lt;li&gt;Switch to TKE and open the matching module&lt;/li&gt;
&lt;li&gt;Click Import and choose the spreadsheet&lt;/li&gt;
&lt;li&gt;Confirm the import completed without errors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Importing public models requires logging in as admin&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three traps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap one: DevEUI is globally unique, so cross-organisation migration is delete-then-import.&lt;/strong&gt; A given DevEUI belongs to one organisation within a platform. Moving a profile from organisation A to B requires deleting it in A first; otherwise the import fails outright.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data type&lt;/th&gt;
&lt;th&gt;Delete first?&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LoRaWAN Profiles&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DevEUI is globally unique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thing models / RPC commands / device templates&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Same ID means overwrite; not uniqueness-constrained&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Trap two: a matching ID means full overwrite, and it cannot be rolled back.&lt;/strong&gt; The rule is "create if the ID is absent, overwrite completely if present." That is a replacement, not a merge. Stale field values in the spreadsheet will overwrite live configuration on the target.&lt;/p&gt;

&lt;p&gt;There is exactly one mitigation: &lt;strong&gt;export first, before importing, and keep that spreadsheet as the backup.&lt;/strong&gt; Validate format on a small batch before the first large import.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap three: there is no undo.&lt;/strong&gt; With a backup, re-import it. Without one, rebuild the configuration by hand. Review the ID column row by row so the file contains only what you intend to create or update.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Backups: Three Layers That Do Not Substitute for One Another
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Configuration and install record&lt;/td&gt;
&lt;td&gt;Install directory under &lt;code&gt;/opt&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;File-level backup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;PostgreSQL container volume&lt;/td&gt;
&lt;td&gt;Volume snapshot or logical dump&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object files&lt;/td&gt;
&lt;td&gt;Docker named volume &lt;code&gt;minio_data&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Volume-level backup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Backing up &lt;code&gt;/opt&lt;/code&gt; alone does not substitute for object data.&lt;/strong&gt; A container restart preserves existing buckets and objects; host disk failure does not.&lt;/p&gt;

&lt;p&gt;Article 15 of Circular 166 requires disaster-recovery backup &lt;em&gt;and&lt;/em&gt; periodic recovery testing. Note the second half — &lt;strong&gt;a backup that has never been restored is a hypothesis.&lt;/strong&gt; One way to exercise the whole chain during acceptance is generating and downloading a report:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;sudo docker compose -f  exec -T minio /thinklink-minio check-ready&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That command checks whether the image's built-in initialisation completed; pair it with a container status check.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Error Codes Worth Recognising
&lt;/h2&gt;

&lt;p&gt;The manual lists the full set. These are the ones that surface during deployment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Message&lt;/th&gt;
&lt;th&gt;Meaning and handling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OFFLINE_OUTPUT_EXISTS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Download directory already exists — pick one that does not; do not overwrite the old bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SCRIPT_FILE_REQUIRED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Download mode must run from a local script file, not `curl \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}&lt;code&gt;ARTIFACT_DOWNLOAD_FAILED&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Check network and disk space, re-download the whole set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DOWNLOAD_REFRESH_INVALID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Version or artifacts changed while refreshing — re-download the full bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;OFFLINE_BUNDLE_INVALID&lt;/code&gt; / &lt;code&gt;OFFLINE_CHECKSUM_FAILED&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Re-transfer the complete directory; &lt;strong&gt;do not edit the manifest to bypass&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OFFLINE_DOCKER_REQUIRED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install offline dependencies, start Docker, verify Compose V2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OFFLINE_EXISTING_INSTALL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Existing install or data present — prepare a backup and upgrade plan first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;PORT_IN_USE&lt;/code&gt; / &lt;code&gt;ALTERNATE_PORT_IN_USE&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Resolve the conflict, arrange a usable port, retry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OFFLINE_IMAGES_MISSING&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compose and images out of sync — supply a matching full bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HEALTH_CHECK_FAILED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check container status and logs; preserve install data while investigating&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two for day-to-day work:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;sudo docker compose -f  ps&lt;br&gt;
sudo docker compose -f  logs &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check logs for connection strings and credentials before sharing them externally — a reminder the manual makes on its own.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Acceptance Checklist
&lt;/h2&gt;

&lt;p&gt;In the order of this article, a TKE deployment ready to hand over:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Pass criterion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;uname -m&lt;/code&gt; prints &lt;code&gt;x86_64&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Non-x64 fails outright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;CPU ≥ 2 cores, RAM ≥ 4 GiB, &lt;code&gt;/opt&lt;/code&gt; ≥ 20 GiB&lt;/td&gt;
&lt;td&gt;Production: 8 cores / 16 GB / 1 TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Pre-flight port check on 80/8080, 9000, 9001, 1700, 1883&lt;/td&gt;
&lt;td&gt;A 9000/9001 conflict aborts the install&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;All seven containers running&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose ps&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Private MinIO bucket ready, anonymous access refused&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;check-ready&lt;/code&gt; plus an anonymous access attempt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Web/API on HTTPS 443, EMQX console on 18084&lt;/td&gt;
&lt;td&gt;tkl-tls 2.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Device MQTT on 8883 (where required)&lt;/td&gt;
&lt;td&gt;Configured and verified separately in EMQX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;MinIO 9000/9001 reachable only from trusted networks&lt;/td&gt;
&lt;td&gt;Firewall rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;No device profile enabled on both cloud and TKE&lt;/td&gt;
&lt;td&gt;Profile inventory cross-check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Export taken before import&lt;/td&gt;
&lt;td&gt;Backup file retained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Backup scope covers the &lt;code&gt;minio_data&lt;/code&gt; volume&lt;/td&gt;
&lt;td&gt;Backup script review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;One recovery test completed&lt;/td&gt;
&lt;td&gt;Recovery drill record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Default passwords changed (ThinkLink / EMQX / MinIO)&lt;/td&gt;
&lt;td&gt;Business client configs updated to match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Full offline bundle + &lt;code&gt;release.json&lt;/code&gt; + &lt;code&gt;SHA256SUMS&lt;/code&gt; retained&lt;/td&gt;
&lt;td&gt;Version traceability&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Item 5's "anonymous access to the private bucket refused" was explicitly covered in the vendor's own 2026-09-11 acceptance record, and it belongs on your checklist too. A private bucket that is anonymously readable is every report file sitting in an internal share.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Closing
&lt;/h2&gt;

&lt;p&gt;"Data must not leave the plant" is a requirement about storage location, and it triggers three consequences: you buy the machine, you close the transmission channels, and you run the backups. Only the first of those is a procurement problem.&lt;/p&gt;

&lt;p&gt;Two points this article has argued repeatedly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On-premises is not the same as compliant.&lt;/strong&gt; Article 17 of Circular 166 requires secure transmission channels or protocols for important data. A default TKE install runs MQTT in cleartext on 1883 and HTTP on 80. tkl-tls is not an optional hardening step; it is what closes that clause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confirm the x64 constraint before the purchase order.&lt;/strong&gt; The vendor's own documentation carries two conflicting statements about TKE's hardware requirements, and they disagree on whether ARM works. Taking the deployment manual as authoritative: it does not. If a localisation mandate has already settled on Phytium or Kunpeng, raise it at proposal stage rather than when &lt;code&gt;uname -m&lt;/code&gt; prints &lt;code&gt;aarch64&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;TKE's value is that it bundles the network server, thing models, trigger logic, alarms and object storage into one Compose command while preserving a migration path to and from both the cloud and the in-gateway form. The price is that someone now owns it. Deciding who, before buying anything, matters more than the spec sheet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next in the series (Issue 24):&lt;/strong&gt; the data is local; now let the rest of the building read it — BACnet/IP and Modbus TCP integration on ThinkLink, from field mapping to commissioning with YABE.&lt;/p&gt;




&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ThinkLink documentation, &lt;em&gt;Docker Deployment (TKE)&lt;/em&gt; — install flow updated 2026-09-11, TLS and port notes updated 2026-10-22: &lt;a href="https://www.think-link.net/docs/zh/QuickStart/Deployment/ThinkLinkDocker.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/zh/QuickStart/Deployment/ThinkLinkDocker.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ThinkLink documentation, &lt;em&gt;ThinkLink (TKL) Introduction&lt;/em&gt;: &lt;a href="https://www.think-link.net/docs/zh/QuickStart/ThinkLinkIntroduction.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/zh/QuickStart/ThinkLinkIntroduction.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ThinkLink documentation, &lt;em&gt;Batch Data Management Guide&lt;/em&gt;: &lt;a href="https://www.think-link.net/docs/zh/AN/BatchDataManagementGuide.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/zh/AN/BatchDataManagementGuide.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ThinkLink documentation, &lt;em&gt;ThinkLink in Gateway (TKG)&lt;/em&gt;: &lt;a href="https://www.think-link.net/docs/zh/QuickStart/Deployment/ThinkLinkGateway.html" rel="noopener noreferrer"&gt;https://www.think-link.net/docs/zh/QuickStart/Deployment/ThinkLinkGateway.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MIIT, &lt;em&gt;Interim Measures for Data Security Management in the Industry and Information Technology Sector&lt;/em&gt;, Network Security Circular No. 166, effective 2023-01-01&lt;/li&gt;
&lt;li&gt;State Council, &lt;em&gt;Network Data Security Regulations&lt;/em&gt;, Decree No. 790, effective 2025-01-01&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>infrastructure</category>
      <category>iot</category>
    </item>
    <item>
      <title>The Last Mile of Industrial IoT: An LPWAN Technology Selection Analysis</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Sun, 20 Sep 2026 08:18:51 +0000</pubDate>
      <link>https://dev.to/manthink/the-last-mile-of-industrial-iot-an-lpwan-technology-selection-analysis-4b36</link>
      <guid>https://dev.to/manthink/the-last-mile-of-industrial-iot-an-lpwan-technology-selection-analysis-4b36</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Series: ManThink "LoRaWAN Technical Reading" Issue #15 · Industry Trends, Part 5&lt;br&gt;
Keywords: Industrial IoT, last mile, LPWAN selection, LoRaWAN, NB-IoT, private LoRa, DTU, RS-485, Modbus, brownfield retrofit&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Opening: A Number Mismatch Everyone Misses
&lt;/h2&gt;

&lt;p&gt;One statistic from the 2026 industrial communication market circulates widely: HMS Networks' twelfth consecutive annual analysis shows Industrial Ethernet accounting for &lt;strong&gt;79% of newly installed nodes&lt;/strong&gt; worldwide, fieldbus dropping to 14%, and wireless holding steady at 7%.&lt;/p&gt;

&lt;p&gt;Many conclude from this that the industrial communication war is over and Ethernet has won.&lt;/p&gt;

&lt;p&gt;But the same research bodies (LNS Research, ARC Advisory, and McKinsey's 2025 manufacturing benchmarks) offer another number: &lt;strong&gt;roughly 70% of installed industrial control assets have been in service for more than 15 years&lt;/strong&gt;, and a meaningful share still speaks Modbus RTU over RS-485 — using a 1998-vintage protocol to report data to a controller whose vendor stopped patching firmware decades ago.&lt;/p&gt;

&lt;p&gt;Put the two numbers side by side and the structural mismatch of industrial IoT becomes visible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;At the &lt;strong&gt;new-node&lt;/strong&gt; level, Ethernet has indeed won (79%);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the &lt;strong&gt;installed-base&lt;/strong&gt; level, serial and fieldbus remain dominant (70% of assets older than 15 years, PLC lifespans of 10–20 years, process-industry pumps, transmitters, and valves lasting 20–30 years, and the average age of US manufacturing equipment approaching 20 years).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the true nature of the "last mile" problem: &lt;strong&gt;it is not "the last stretch of distance" — it is "the last batch of un-digitized assets."&lt;/strong&gt; These assets share three properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cannot be removed&lt;/strong&gt; — the injection molder on the line, the compressor in a pharmaceutical cold chain, the pump station at the water plant: removal means downtime, and one unplanned hour on an automotive subassembly line costs five figures in scrap alone;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cannot be modified&lt;/strong&gt; — a 1998 PLC may carry qualification documents that took a customer audit six months to obtain. Re-flashing it is not on the table;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Should not be replaced&lt;/strong&gt; — the equipment itself runs fine. Replacement means paying for an entire machine to serve the accessory need of "getting data online."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the technology selection question for the industrial IoT last mile was never "which wireless technology is more advanced," but "&lt;strong&gt;which retrofit route can bring installed assets online under those three constraints&lt;/strong&gt;."&lt;/p&gt;

&lt;p&gt;This article unpacks the problem: first the true shape of the installed base, then a horizontal comparison of candidate technologies, then a quantified look at four classes of industrial-environment challenges, and finally a selection decision tree you can follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Know Your Opponent: Why the Installed Base Cannot Be Eliminated
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Modbus: Modest Share, Irreplaceable Position
&lt;/h3&gt;

&lt;p&gt;The 2026 protocol market-share data is misleading. Modbus TCP holds &lt;strong&gt;5%&lt;/strong&gt; of new industrial Ethernet nodes, and Modbus RTU holds &lt;strong&gt;3%&lt;/strong&gt; of new fieldbus nodes — apparently "a declining legacy protocol."&lt;/p&gt;

&lt;p&gt;But note two facts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, those shares have been "stable" for years.&lt;/strong&gt; Across HMS's historical reports, Modbus RTU's 3% is the flattest curve in the fieldbus category. It plays the role of the "universal connection layer": unlike PROFINET or EtherNet/IP, which mainly serve specific vendor ecosystems, Modbus appears in equipment from virtually every major automation brand. One fact confirms its standing in cost-sensitive segments: in small-PLC and sensor access scenarios, Modbus's share has long hovered around 80%, and a Modbus driver costs roughly one-fifth of an OPC UA driver per device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, the installed base matters far more than new-install share.&lt;/strong&gt; Equipment lifecycles dictate protocol survival: PLCs 10–20 years, process equipment 20–30 years. Today's 79% Ethernet share of new nodes will not become the "installed majority" until 2036–2046; meanwhile, the tens of millions of Modbus devices still running today will keep serving for another decade or more.&lt;/p&gt;

&lt;p&gt;This creates a powerful lock-in effect: new equipment must be compatible with existing Modbus networks, and the existence of those networks makes Modbus the natural choice for new projects. &lt;strong&gt;Manufacturers do not replace stable, running systems because a protocol is "outdated" — an upgrade means coordinating a line-wide replacement or maintaining parallel communication infrastructure, both expensive and risky.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 RS-485: The Evergreen Physical Layer
&lt;/h3&gt;

&lt;p&gt;Beneath Modbus RTU sits RS-485, whose longevity comes from three engineering properties:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value / Behavior&lt;/th&gt;
&lt;th&gt;Engineering Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Distance without repeater&lt;/td&gt;
&lt;td&gt;1,200 m&lt;/td&gt;
&lt;td&gt;Far beyond RS-232 (15 m); covers plant-level spans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Differential signaling&lt;/td&gt;
&lt;td&gt;Common-mode noise rejection&lt;/td&gt;
&lt;td&gt;First choice for high-EMI plant floors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bus topology&lt;/td&gt;
&lt;td&gt;One master, many slaves&lt;/td&gt;
&lt;td&gt;Lowest cabling cost of any industrial bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical slave count&lt;/td&gt;
&lt;td&gt;Dozens on one bus&lt;/td&gt;
&lt;td&gt;One twisted pair serves a whole metering cabinet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Electricity meters, water meters, heat meters, flow meters, PLCs, variable-frequency drives, environmental monitors, industrial controllers — nearly every industrial metering and control device offers RS-485 terminals. That is not technological inertia; it is three decades of proven reliability.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 The Communication Dilemma of the Installed Base
&lt;/h3&gt;

&lt;p&gt;The problem is "access." A typical wired architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RS-485 device → Data collector → Industrial switch → Server → Management platform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This architecture works fine for "in-building, newly built, centralized" scenarios, but costs spiral out of control in four situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Across floors / buildings / campuses&lt;/strong&gt;: communication cable + trays + conduit + labor — communication infrastructure becomes a major cost line;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operational sites&lt;/strong&gt;: pulling new cable through a running factory means downtime windows and hot-work permits;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expansion&lt;/strong&gt;: every new monitoring point adds cable, and maintenance complexity compounds as the network grows;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Remote accessibility&lt;/strong&gt;: RS-485 is a local protocol by birth; going cloud requires stacking an entire additional system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;That is the precise shape of the last-mile problem: on the device side, an RS-485 bus that runs reliably for 1,200 meters; on the platform side, a modern cloud and historian; and in between, the stretch of road that "carries serial data to the cloud" — the real bottleneck.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Candidate Technology Review: The Real Boundaries of Six Routes
&lt;/h2&gt;

&lt;p&gt;The candidates that actually get serious evaluation for that middle stretch are six: private LoRaWAN, NB-IoT, private LoRa (data radios), 4G/5G DTUs, Wi-Fi/BLE, and Wi-SUN. The first four are mainstream; the last two have clear boundaries in industrial settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Six-Dimension Comparison Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Private LoRaWAN&lt;/th&gt;
&lt;th&gt;NB-IoT&lt;/th&gt;
&lt;th&gt;Private LoRa Radio&lt;/th&gt;
&lt;th&gt;4G/5G DTU&lt;/th&gt;
&lt;th&gt;Wi-Fi/BLE&lt;/th&gt;
&lt;th&gt;Wi-SUN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spectrum&lt;/td&gt;
&lt;td&gt;Unlicensed Sub-GHz&lt;/td&gt;
&lt;td&gt;Licensed (operator)&lt;/td&gt;
&lt;td&gt;Unlicensed Sub-GHz&lt;/td&gt;
&lt;td&gt;Licensed (operator)&lt;/td&gt;
&lt;td&gt;2.4/5 GHz unlicensed&lt;/td&gt;
&lt;td&gt;Unlicensed Sub-GHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network ownership&lt;/td&gt;
&lt;td&gt;Self-owned&lt;/td&gt;
&lt;td&gt;Operator&lt;/td&gt;
&lt;td&gt;Self-owned&lt;/td&gt;
&lt;td&gt;Operator&lt;/td&gt;
&lt;td&gt;Self-owned&lt;/td&gt;
&lt;td&gt;Self-owned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage&lt;/td&gt;
&lt;td&gt;5–15 km (site-dependent)&lt;/td&gt;
&lt;td&gt;Depends on operator lighting&lt;/td&gt;
&lt;td&gt;Point-to-multipoint 3–10 km&lt;/td&gt;
&lt;td&gt;Depends on cellular&lt;/td&gt;
&lt;td&gt;30–100 m&lt;/td&gt;
&lt;td&gt;Several km, Mesh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power adaptability&lt;/td&gt;
&lt;td&gt;10-yr battery or DC&lt;/td&gt;
&lt;td&gt;Battery months–years&lt;/td&gt;
&lt;td&gt;Requires stable DC (9–30V)&lt;/td&gt;
&lt;td&gt;Requires stable DC&lt;/td&gt;
&lt;td&gt;High power draw&lt;/td&gt;
&lt;td&gt;Low power&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-message size&lt;/td&gt;
&lt;td&gt;Tens of bytes&lt;/td&gt;
&lt;td&gt;Hundreds of bytes–KB&lt;/td&gt;
&lt;td&gt;Tens of bytes&lt;/td&gt;
&lt;td&gt;MB-scale&lt;/td&gt;
&lt;td&gt;MB-scale&lt;/td&gt;
&lt;td&gt;Hundreds of bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost structure&lt;/td&gt;
&lt;td&gt;CAPEX (one-time gateways)&lt;/td&gt;
&lt;td&gt;OPEX (SIM fee × devices × years)&lt;/td&gt;
&lt;td&gt;CAPEX (module-level)&lt;/td&gt;
&lt;td&gt;OPEX (data plan)&lt;/td&gt;
&lt;td&gt;CAPEX&lt;/td&gt;
&lt;td&gt;CAPEX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol adaptation&lt;/td&gt;
&lt;td&gt;Standard + DTU pass-through&lt;/td&gt;
&lt;td&gt;CoAP/MQTT&lt;/td&gt;
&lt;td&gt;Serial pass-through (any protocol)&lt;/td&gt;
&lt;td&gt;TCP/UDP pass-through&lt;/td&gt;
&lt;td&gt;Full IP stack&lt;/td&gt;
&lt;td&gt;6LoWPAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interference immunity&lt;/td&gt;
&lt;td&gt;CSS spread spectrum, strong&lt;/td&gt;
&lt;td&gt;Protected licensed band&lt;/td&gt;
&lt;td&gt;Implementation-dependent&lt;/td&gt;
&lt;td&gt;Licensed band&lt;/td&gt;
&lt;td&gt;Congested 2.4G&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical role&lt;/td&gt;
&lt;td&gt;Campus/plant sensor network&lt;/td&gt;
&lt;td&gt;Nationally scattered assets&lt;/td&gt;
&lt;td&gt;Point-to-point link replacement&lt;/td&gt;
&lt;td&gt;Bulk data / video&lt;/td&gt;
&lt;td&gt;High-bandwidth short range&lt;/td&gt;
&lt;td&gt;Metering Mesh (North America)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2.2 Route by Route
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Private LoRaWAN&lt;/strong&gt; — the advantages are threefold "ownership": unlicensed spectrum, self-built network, sovereign data. The gateway sits on your own site; coverage is defined by you. It does not depend on whether an operator has lit up NB-IoT on a given mast, and there is no risk of devices going dark en masse because an operator sunsets a service (a real failure category in NB-IoT deployments). The price: up-front CAPEX and gateway operations responsibility that stays with you. CSS modulation gives it natural resistance to narrowband interference, and the Sub-GHz band diffracts around concrete and metal far better than 2.4 GHz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB-IoT&lt;/strong&gt; — the advantage is "no network to build": you use operator infrastructure directly, which suits assets scattered nationwide (shared-bike locks, manhole covers, cross-border logistics). The price: a per-SIM annual fee (OPEX that grows linearly with fleet size), coverage entirely dependent on the operator (indoor, basement, and remote plant areas are often unlit), and service-continuity risk over the device lifecycle. &lt;strong&gt;In industrial scenarios where devices cluster on your own site, NB-IoT's advantages are mostly unusable while its disadvantages are fully exposed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private LoRa radios (data radios)&lt;/strong&gt; — the difference from LoRaWAN is the absence of a standard protocol stack: point-to-multipoint transparent pass-through with custom protocols. It suits "stable power, no cellular coverage, private protocol" scenarios, such as water-quality monitoring at a mountain fish farm (24V power available, no cellular signal, Modbus data across 3 km). The price: none of LoRaWAN's standard ecosystem (NS, platforms, certified device pool), with management costs rising at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4G/5G DTUs&lt;/strong&gt; — the bandwidth route. Tower-crane video monitoring and AGV bulk telemetry can only go here. Using it for metering-grade small messages is economically irrational: you pay for megabytes and transmit tens of bytes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wi-Fi/BLE&lt;/strong&gt; — high-bandwidth short range, suited to AGVs/AMRs and handheld terminals. In industrial sensing the problems are poor 2.4 GHz penetration, high power draw, and the cost of dense AP deployment. A pharmaceutical cold-storage lesson: the insulation is thick metal plate plus polyurethane foam; a Wi-Fi solution attenuated badly inside the chamber and dropped constantly; the final fix was 470 MHz LoRaWAN, where &lt;strong&gt;one gateway penetrated 20 cm of cold-storage insulation and covered the entire campus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wi-SUN&lt;/strong&gt; — Sub-GHz Mesh with an installed-base advantage in North American metering, but its ecosystem and device selection are far smaller than LoRaWAN's in industrial scenarios elsewhere; it usually enters evaluation only when a customer explicitly specifies it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 A Quick-Reference Conclusion Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your Scenario&lt;/th&gt;
&lt;th&gt;First Choice&lt;/th&gt;
&lt;th&gt;Rationale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Devices clustered on your own site; metering/status small messages&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Private LoRaWAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sovereign coverage, no SIM fees, CSS interference immunity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assets scattered nationwide, no fixed site&lt;/td&gt;
&lt;td&gt;NB-IoT&lt;/td&gt;
&lt;td&gt;Trade self-built cost for operator coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Point-to-point 3–10 km, stable power, private protocol&lt;/td&gt;
&lt;td&gt;Private LoRa radio&lt;/td&gt;
&lt;td&gt;Flexible pass-through, no platform dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video / large files / high-frequency waveforms&lt;/td&gt;
&lt;td&gt;4G/5G&lt;/td&gt;
&lt;td&gt;The only bandwidth answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Already a nationwide metering Mesh (North American legacy)&lt;/td&gt;
&lt;td&gt;Wi-SUN&lt;/td&gt;
&lt;td&gt;Legacy continuity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  3. Four Classes of Industrial-Environment Challenges: Separating "Works" from "Works for Ten Years"
&lt;/h2&gt;

&lt;p&gt;A selection table only answers "which route." The cruelty of industrial sites is that &lt;strong&gt;the numbers on a datasheet and the site three years later are different things.&lt;/strong&gt; Four challenge classes decide equipment-selection survival.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Metal and Electromagnetics: Where 15% Packet Loss Comes From
&lt;/h3&gt;

&lt;p&gt;The three least wireless-friendly things on an industrial site: metal structures (reflection, blockage), VFDs and motors (EMI), and dense radio equipment (co-channel interference).&lt;/p&gt;

&lt;p&gt;A mining case provides representative measured data: in large-scale mining and petrochemical facilities, &lt;strong&gt;commercial off-the-shelf gateways in plastic enclosures showed a 15% packet-loss rate&lt;/strong&gt;, causing frequent manual resets and on-site technician visits; after switching to a solution with optimized RF shielding and industrial-grade components, packet loss fell to &lt;strong&gt;0.8%&lt;/strong&gt;, annual downtime dropped from 48 hours to 4, and per-unit annual maintenance cost fell from $1,200 to $150.&lt;/p&gt;

&lt;p&gt;LoRaWAN's confidence in such environments comes from the technical layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSS (Chirp Spread Spectrum) modulation&lt;/strong&gt; spreads signal energy across the whole bandwidth, giving natural immunity to narrowband interference (VFD harmonics, motor arcing) — precisely why it remains viable in "electrically dense" environments;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Sub-GHz band&lt;/strong&gt; (470 MHz in China, 868 MHz in Europe) diffracts and penetrates significantly better than 2.4 GHz;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ADR&lt;/strong&gt; lets weak spots automatically retreat to higher SF for link margin, at the cost of longer airtime;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;FEC&lt;/strong&gt; lets receivers repair damaged packets.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But three disciplines still apply: keep antennas off metal longitudinal axes, stay more than 30 cm from reflective surfaces, and do frequency planning across multiple gateways. In high-EMI environments, consider actively pushing SF down to 7/8 — sacrifice extreme range for shorter time-on-air and lower interference exposure.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Temperature: What Freezes and Cracks at -80°C Is Not the Sensor
&lt;/h3&gt;

&lt;p&gt;The conventional industrial temperature requirement is &lt;strong&gt;-40°C to +85°C&lt;/strong&gt;, and that number alone is not hard to meet (standard industrial-grade component binning). The traps are in the details:&lt;/p&gt;

&lt;p&gt;A 2,000 m² pharmaceutical cold-storage project (three -80°C ultra-low freezers plus one 2–8°C cold room, holding over ¥50M of vaccines and blood products) learned this the hard way: on day one of the LoRaWAN deployment, data from the -80°C chamber was still unstable. Investigation showed &lt;strong&gt;the problem was not radio but the rubber jacket of the probe wiring, which hardened and embrittled at ultra-low temperature, causing intermittent contact&lt;/strong&gt;. The fix: replace with Teflon-jacketed low-temperature shielded cable and pot every terminal with sealant.&lt;/p&gt;

&lt;p&gt;The general lesson: cold's failure points are usually in "accessories" — cable, connectors, battery — not the chips on the main board. At selection time, audit wiring, terminals, and packaging with the same rigor as the host. Placement matters too: probe into the chamber, host outside — protecting both measurement accuracy and battery performance in the cold.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Power Supply: AC Wide-Voltage Is an Underrated Differentiator
&lt;/h3&gt;

&lt;p&gt;Industrial-site power is far dirtier than assumed: voltage fluctuation on shared supplies, harmonics fed back by VFDs, maintenance outages. "Unexpected gateway/DTU reboot interrupting packet forwarding" is a high-frequency failure class, and diagnosing it is extremely expensive at unattended sites.&lt;/p&gt;

&lt;p&gt;Here an important selection fork appears — &lt;strong&gt;the DTU's power format is effectively doing scenario segmentation for you&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Power Format&lt;/th&gt;
&lt;th&gt;Fitted Scenario&lt;/th&gt;
&lt;th&gt;Typical Product Form&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AC 85–270V wide voltage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inside power/metering cabinets, drawing site AC directly&lt;/td&gt;
&lt;td&gt;Rail-mounted DTU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DC 5–24V&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low-voltage cabinets, instrument boxes&lt;/td&gt;
&lt;td&gt;Compact rail DTU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Battery (Li-SOCl₂, 10,800 mAh)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remote points with no supply&lt;/td&gt;
&lt;td&gt;Battery DTU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;AC wide voltage (85–270V) means the device can hang inside a power distribution cabinet in any country without a separate adapter — in retrofits, that is the difference between "installable" and "not installable." For battery versions, audit sleep current (industry level ≤5–15 μA) and battery internal-resistance degradation in the cold.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Operations Inaccessibility: Remote Manageability Is the Industrial-Grade Threshold
&lt;/h3&gt;

&lt;p&gt;Large numbers of industrial points are "install and never visit." Robustel's summary of industrial gateway failure modes is apt: &lt;strong&gt;many gateway failures are not caused by the "outdoors" but occur indoors in apparently protected locations — high temperature in metal cabinets, condensation during start/stop cycles, shared-supply fluctuation, motor interference, signal attenuation through the metal cabinet, restricted maintenance access.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That turns remote management from a nice-to-have into a survival requirement. At minimum: remote parameter configuration (via the NS, no site visit), remote firmware upgrade (FUOTA), disconnect-reconnect with data buffering and retransmission (for metering continuity), and remote health visibility (battery level, signal quality, module self-check).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Selection Decision Tree: Five Questions to Fix the Route
&lt;/h2&gt;

&lt;p&gt;Converging the preceding analysis into five questions, answered in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Q1. What is the data profile?
    ├─ Video / large files / high-frequency waveforms ───→ 4G/5G DTU. End of analysis.
    └─ Metering / status / alarms (small messages) ───→ Q2

Q2. Are devices clustered or scattered?
    ├─ Scattered nationwide, no fixed site ───────────→ NB-IoT (use operator coverage)
    └─ Clustered on your own site / campus ───────────→ Q3

Q3. Is there deep cellular coverage on site (indoor/basement/metal plant)?
    ├─ Yes, and customer accepts OPEX ───────────────→ NB-IoT viable; recheck at Q4
    └─ No, or network sovereignty required ──────────→ Private LoRaWAN; proceed to Q4

Q4. What interface do the target devices have?
    ├─ RS-485/Modbus, M-Bus, 4-20mA, DI/DO (installed wired assets)
    │    └─→ DTU route: keep original devices, replace only the last hop → Q5
    └─ New sensor points
         └─→ Choose native LoRaWAN sensors directly → Q5

Q5. What is the power condition at the points?
    ├─ Power/metering cabinet (AC available) ────────→ Rail DTU (AC wide voltage)
    ├─ Low-voltage cabinet (DC 5–24V) ──────────────→ Compact rail DTU
    └─ No supply ───────────────────────────────────→ Battery DTU (audit sleep current
                                                        and cold performance)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tree's three pivotal judgments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Q2 is the watershed&lt;/strong&gt;: the distribution shape of devices (clustered vs. scattered) determines the route earlier than any technical parameter. Most industrial scenarios fall on the "clustered" side — which explains why industrial private networks are LoRaWAN's fastest-growing segment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Q4 is where the money is&lt;/strong&gt;: if the target devices are RS-485 installed assets, the DTU route expands your sensor sourcing from "LoRaWAN-interface sensors only" to "any wired sensor" — far cheaper, far more options, and &lt;strong&gt;not one line of code changes on the original equipment&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Q5 is the final gate to deployment&lt;/strong&gt;: power format determines the specific model and the installation workload (whether you must provision a separate power supply for the DTU).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  5. ManThink's Answer: The DTU Route and EdgeBus
&lt;/h2&gt;

&lt;p&gt;With the methodology covered, here is our own engineering answer. Since its founding in 2014, ManThink has focused on a single positioning: &lt;strong&gt;connecting the installed base&lt;/strong&gt; — low-cost wireless retrofit of wired-interface field devices (RS-485, M-Bus, 4-20mA, 0-10V, DI). The output of that route is a complete DTU product line plus an edge-computing virtual machine that runs inside the DTUs.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Three DTUs Segmented by Power Condition
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;KC11&lt;/th&gt;
&lt;th&gt;KC25&lt;/th&gt;
&lt;th&gt;KC21&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Positioning&lt;/td&gt;
&lt;td&gt;Rail-mounted industrial workhorse&lt;/td&gt;
&lt;td&gt;2nd-gen compact rail&lt;/td&gt;
&lt;td&gt;Battery-type remote points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AC 85–270V wide voltage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DC 5–24V&lt;/td&gt;
&lt;td&gt;4× ER14505 Li-SOCl₂ (10,800 mAh)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface&lt;/td&gt;
&lt;td&gt;RS-485&lt;/td&gt;
&lt;td&gt;RS-485&lt;/td&gt;
&lt;td&gt;RS-485&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mounting&lt;/td&gt;
&lt;td&gt;DIN rail&lt;/td&gt;
&lt;td&gt;DIN rail&lt;/td&gt;
&lt;td&gt;Wall-mount (PG7 gland)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operating class&lt;/td&gt;
&lt;td&gt;Class C&lt;/td&gt;
&lt;td&gt;Class C&lt;/td&gt;
&lt;td&gt;Class A (battery) / Class C (DC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TX power&lt;/td&gt;
&lt;td&gt;22 dBm&lt;/td&gt;
&lt;td&gt;22 dBm&lt;/td&gt;
&lt;td&gt;22 dBm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RX sensitivity&lt;/td&gt;
&lt;td&gt;-142 dBm @SF12&lt;/td&gt;
&lt;td&gt;-142 dBm @SF12&lt;/td&gt;
&lt;td&gt;-142 dBm @SF12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temperature&lt;/td&gt;
&lt;td&gt;-40 to +85°C&lt;/td&gt;
&lt;td&gt;-40 to +85°C&lt;/td&gt;
&lt;td&gt;-40 to +85°C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protection&lt;/td&gt;
&lt;td&gt;IP53 (in-cabinet)&lt;/td&gt;
&lt;td&gt;Aluminum enclosure&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;IP65&lt;/strong&gt; (outdoor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distinguishing feature&lt;/td&gt;
&lt;td&gt;Compatible with all RS-485 protocols&lt;/td&gt;
&lt;td&gt;Ultra-compact (69×25×25 mm)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Can power external sensors&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment scale&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100,000+ units deployed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Current generation&lt;/td&gt;
&lt;td&gt;Harsh points&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The three models cover all three branches of decision-tree Q5: AC from the power cabinet with KC11, DC from the low-voltage cabinet with KC25, and no-supply remote points with the battery KC21 (IP65 outdoor protection, plus the ability to power external water/gas meters — saving a whole supply system).&lt;/p&gt;

&lt;p&gt;All support the six regional standards — CN470/EU433/EU868/AS923/AU915/US902 — and connect to any standard LoRaWAN platform: ThinkLink, ChirpStack, or TTN. &lt;strong&gt;No lock-in at the gateway or platform layer&lt;/strong&gt; — the fundamental difference from vendors of "complete closed systems."&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 EdgeBus: Why Protocol Adaptation Cannot Be Just "Configuration"
&lt;/h3&gt;

&lt;p&gt;The deepest pit on the DTU route is not radio but &lt;strong&gt;protocol adaptation&lt;/strong&gt;. On the surface, connecting a Modbus meter means configuring a slave address, register map, and data types. In real projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Electricity meters speak &lt;strong&gt;DL/T 645-2007&lt;/strong&gt;, water/gas/heat meters speak &lt;strong&gt;CJ/T 188&lt;/strong&gt;, imported instruments speak all manner of proprietary protocols — three address lengths (1/6/7 bytes), three frame formats, each with its own CRC;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need &lt;strong&gt;COV (Change of Value)&lt;/strong&gt;: don't transmit when metering data hasn't changed — saving not just airtime but battery life;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need &lt;strong&gt;threshold logic&lt;/strong&gt;: report a temperature violation immediately, not at the next cycle;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need &lt;strong&gt;data restructuring&lt;/strong&gt;: split, scale, and structurally package multiple register values from one 485 frame.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ManThink's answer is &lt;strong&gt;EdgeBus (EB)&lt;/strong&gt;: an event-driven edge-computing virtual machine. You write collection logic in TypeScript, compile it to a few hundred bytes of binary, and run it low-power on a Cortex-M0-class MCU. Its runtime model is two periodic events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Query event&lt;/strong&gt;: periodically send commands to RS-485 sub-devices and fetch raw data;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uplink event&lt;/strong&gt;: periodically package processed data and send it via LoRaWAN.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EB natively supports Modbus (CRC checks, integer/float/BCD read-write), DL/T 645, CJ/T 188, and any custom protocol, and completes COV, alarm triggering, and data restructuring locally at the endpoint — &lt;strong&gt;with that logic pushed down to the device, uplink data volume, airtime consumption, and cloud-side parsing burden all fall together&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;More important is the change in engineering workflow: EB code is debugged and upgraded entirely online. In real projects you can &lt;strong&gt;install the hardware on site first, then push the business logic via FUOTA&lt;/strong&gt; (multi-bin block-wise, compressed low-power over-the-air upgrade) — decoupling field installation from software debugging. For retrofitting factories that cannot be stopped, this is decisive: hardware installation fits in one maintenance window; protocol adaptation is done slowly from the office.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 A Chain Proven Across 100,000 Units
&lt;/h3&gt;

&lt;p&gt;Assembling the full chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Installed RS-485 devices (meters / PLCs / transmitters, untouched)
    ↓ RS-485 / Modbus / DL/T645 / CJ/T188
DTU (KC11/KC25/KC21, EB VM runs protocol parsing &amp;amp; COV locally)
    ↓ LoRaWAN (CN470 private network, CSS interference immunity)
Gateway (GDI51/GDO51/GD61x, per indoor/outdoor and scale)
    ↓ Ethernet / Wi-Fi / 4G backhaul
NS + Platform (ThinkLink, or ChirpStack/TTN — no lock-in)
    ↓
SCADA / BMS / energy management / third-party platforms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The economics of this chain: &lt;strong&gt;installed wired assets see zero replacement; only the "last hop" wireless conversion layer is added.&lt;/strong&gt; Compared with the "replace with native LoRaWAN sensors" route, per-point cost drops sharply; compared with the "replace whole machines" route, the cost differs by an order of magnitude. The KC11 alone passing 100,000 deployed units is the most direct evidence that this route has survived real industrial sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Five Common Misconceptions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Misconception 1: "79% of new nodes are Ethernet; serial is being phased out."&lt;/strong&gt;&lt;br&gt;
New-install share and installed base are two different statistical frames. With 70% of in-service assets older than 15 years and process equipment lifespans of 20–30 years, serial devices will keep serving on-site for another decade — "phase-out" is a 2040s topic. The last-mile problem exists precisely inside that time gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Misconception 2: "Operator networks are broad; just use NB-IoT on industrial sites."&lt;/strong&gt;&lt;br&gt;
"Broad coverage" means outdoor ground level. The places industrial assets live — inside power cabinets, basements, deep inside metal plants, remote sites — are exactly where deep cellular coverage is worst. The more practical problem: NB-IoT's OPEX model (SIM annual fee × device count × years) is a continuously growing bill at thousand-point scale, and service continuity over the device lifecycle is not under your control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Misconception 3: "LoRaWAN capacity is insufficient for industrial point counts."&lt;/strong&gt;&lt;br&gt;
We did this math in Issue #10: a single gateway carries five-figure node counts at SF7 and hundreds at SF12. Industrial metering messages are "tens of bytes every 15 minutes" — the real bottleneck is coverage, not capacity. Coverage-starved points pushed to SF12 by ADR are the capacity killers, so well-placed gateways are themselves the most effective capacity upgrade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Misconception 4: "A DTU is just a pass-through module; buy a cheap one."&lt;/strong&gt;&lt;br&gt;
Pass-through only moves bytes from serial to cloud. What decides project survival is protocol parsing (the address-length differences of DL/T645/CJ188), COV strategy (the key to battery life), FUOTA (the only way to fix logic defects when no one can reach the site), and wide-voltage power (whether it installs in a distribution cabinet). These capability gaps are invisible at selection and visible in year three. The mining case's 15% vs. 0.8% packet-loss gap and the $1,200 vs. $150 annual maintenance gap are the three-year ledger of "cheap off-the-shelf" versus "engineered product."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Misconception 5: "Wireless retrofit means touching the original system — too risky."&lt;/strong&gt;&lt;br&gt;
The opposite is true: the DTU route is the least invasive of all retrofit paths — original equipment untouched (no re-flashing, only a parallel connection onto the 485 bus), original control systems running as before, wireless layer independently overlaid. The real risk lives in routes that "modify the original system" — that is where qualification documents lapse, SIL ratings need re-assessment, and downtime windows appear.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. A Closing Clarification
&lt;/h2&gt;

&lt;p&gt;The industrial IoT last mile is often framed as a technology contest: "LoRaWAN or NB-IoT?" This article's argument: &lt;strong&gt;that framing itself asks the wrong question.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The real question is: &lt;strong&gt;under the three constraints (cannot remove, cannot modify, should not replace), how do you bring in-service installed assets online?&lt;/strong&gt; Under those constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Data profile routes first (video to 4G/5G, metering to LPWAN);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Device distribution picks the path (clustered → private network, scattered → operator);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Target assets pick the form (RS-485 installed base → DTU route, new points → native sensors);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Power condition picks the model (AC cabinet / DC cabinet / no-supply points).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And technology selection is only the entry ticket. What decides whether a project lives to year five is engineering detail beyond the datasheet: cable that does not embrittle at -40°C, a 0.8% packet-loss rate next to a VFD, a wide-voltage design that draws power directly in the distribution cabinet, and remote upgrade capability that frees protocol adaptation from on-site debugging.&lt;/p&gt;

&lt;p&gt;The next decade of industrial digitalization will be fought not in brand-new smart factories but in legacy sites where "the equipment has more seniority than the engineers." Whoever completes the last mile with the lowest invasiveness holds the ticket to this market.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix A: Glossary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LPWAN&lt;/td&gt;
&lt;td&gt;Low-Power Wide-Area Network; umbrella term for LoRaWAN/NB-IoT/Sigfox/Wi-SUN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DTU&lt;/td&gt;
&lt;td&gt;Data Transfer Unit; protocol-conversion terminal between serial devices and wireless networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modbus RTU&lt;/td&gt;
&lt;td&gt;Master-slave serial industrial protocol running on the RS-485 physical layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DL/T 645&lt;/td&gt;
&lt;td&gt;Chinese power-industry standard protocol for multi-function electricity meters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CJ/T 188&lt;/td&gt;
&lt;td&gt;Chinese urban-construction standard protocol for household metering instruments (water/gas/heat)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COV&lt;/td&gt;
&lt;td&gt;Change of Value; do not upload unchanged data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FUOTA&lt;/td&gt;
&lt;td&gt;Firmware Update Over The Air for LoRaWAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS&lt;/td&gt;
&lt;td&gt;Chirp Spread Spectrum; the LoRa physical layer, resistant to narrowband interference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADR&lt;/td&gt;
&lt;td&gt;Adaptive Data Rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EB (EdgeBus)&lt;/td&gt;
&lt;td&gt;ManThink's event-driven edge-computing VM; written in TypeScript, runs low-power on MCUs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Installed base&lt;/td&gt;
&lt;td&gt;The retrofit market of already-deployed, mostly wired-interface devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIL&lt;/td&gt;
&lt;td&gt;Safety Integrity Level&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Appendix B: References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;HMS Networks, &lt;em&gt;Industrial Network Market Analysis 2026&lt;/em&gt; — Ethernet 79% / fieldbus 14% / wireless 7% of new nodes; PROFINET 30%, Modbus TCP 5%, Modbus RTU 3%&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LNS Research / ARC Advisory / McKinsey 2025 manufacturing benchmarks — ~70% of installed industrial control assets older than 15 years&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;QYResearch, &lt;em&gt;Global Industrial DTU Market Research Report 2026&lt;/em&gt; — $709M (2025), $750M (2026), $1,052M (2032), CAGR 5.8%, average price $102, ~6.95M units/year&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;360iResearch / Data Insights Market, &lt;em&gt;Industrial Wireless DTU Market&lt;/em&gt; — $1.37B (2025), CAGR 8.85%&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NiceRF, "LoRa, LoRaWAN, NB-IoT, and 4G DTU: Industrial Wireless Solution Selection Analysis" — four-technology comparison and three selection cases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;KaaIoT, &lt;em&gt;NB-IoT vs LoRaWAN: which to use for industrial IoT applications?&lt;/em&gt; — CAPEX/OPEX structures, coverage behavior, interference immunity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VolleyBoast, &lt;em&gt;Using VoBo in Noisy Industrial Environments&lt;/em&gt; — CSS interference immunity and deployment discipline in industrial EMI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Robustel, &lt;em&gt;How to Choose an Industrial LoRaWAN Gateway for Harsh Environments&lt;/em&gt; — failure-mode analysis of "hidden harsh" indoor environments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AnyPCBA industrial gateway case — 15% → 0.8% packet loss in high-interference mining sites; 68% TCO reduction over three years&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yunzhibian pharmaceutical cold-storage case study — 470 MHz penetrating 20 cm insulation; -80°C cable-embrittlement lesson&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ThinkLink official documentation — KC11/KC25/KC21 DTU specifications, EdgeBus architecture, ManThink company positioning (&lt;a href="http://www.think-link.net" rel="noopener noreferrer"&gt;www.think-link.net&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ManThink, "How to Quickly Connect Traditional RS485 Devices to a LoRaWAN Network" — RS-485 installed-base integration architecture&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>The LPWAN Market in 2026: LoRaWAN vs NB-IoT vs Sigfox</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Fri, 11 Sep 2026 01:59:05 +0000</pubDate>
      <link>https://dev.to/manthink/the-lpwan-market-in-2026-lorawan-vs-nb-iot-vs-sigfox-1fm</link>
      <guid>https://dev.to/manthink/the-lpwan-market-in-2026-lorawan-vs-nb-iot-vs-sigfox-1fm</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdk5utqlq6x677j2ors3k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdk5utqlq6x677j2ors3k.png" alt=" " width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From "three-way race" to "one retreat, one hold, one advance" — Sigfox has restructured after bankruptcy, NB-IoT leans heavily on the Chinese market, and LoRaWAN runs away with the private-network segment overseas. The 2026 LPWAN story is not about displacement; it is a marathon between three business models.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Short Version
&lt;/h2&gt;

&lt;p&gt;If you only have 30 seconds to understand the 2026 LPWAN landscape, remember three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;NB-IoT holds the largest connection count, but it is highly dependent on China&lt;/strong&gt; — roughly 84% of global NB-IoT connections are in China. Exclude China, and the picture changes completely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LoRaWAN leads overseas markets and China's private-network segment&lt;/strong&gt; — LoRa Alliance figures show more than 125 million deployed end devices growing at about 25% per year; outside China, LoRaWAN holds roughly 41% of LPWAN connections, the largest single share.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sigfox has exited mainstream competition&lt;/strong&gt; — after its 2022 receivership and acquisition by Singapore's UnaBiz for about €25 million, it was rebranded as "Sigfox 0G Technology" and now plays a supporting role in a multi-protocol convergence strategy, no longer a standalone track.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Research firms disagree widely on total LPWAN connection counts (from roughly one billion to several billion, depending on whether Chinese metering, LTE-M, and private LoRa networks are counted), but the directional conclusion is consistent: &lt;strong&gt;NB-IoT and LoRa together account for about 83% of the LPWAN market — a stable duopoly — while Sigfox has retreated into a niche.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Technology Profiles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 LoRaWAN: The Open-Ecosystem Private-Network Champion
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foundation&lt;/strong&gt;: Semtech's LoRa physical layer (chirp spread spectrum) plus the MAC-layer protocol maintained by the LoRa Alliance. It operates in Sub-GHz unlicensed spectrum (EU868, US915, CN470, AS923, etc.) with a star topology and a four-tier architecture: end device — gateway — network server (NS) — application server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key parameters&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data rates of 0.3–50 kbps (DR0–DR5 in EU868); payloads up to ~242 bytes depending on DR&lt;/li&gt;
&lt;li&gt;AES-128 end-to-end encryption with OTAA dynamic joining&lt;/li&gt;
&lt;li&gt;Class A/B/C device types; battery life of 8–10 years is achievable&lt;/li&gt;
&lt;li&gt;ADR (adaptive data rate) plus LR-FHSS long-range frequency hopping for dense deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Market position&lt;/strong&gt; (LoRa Alliance 2025 End of Year Report):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More than &lt;strong&gt;125 million deployed end devices&lt;/strong&gt;, growing at roughly &lt;strong&gt;25% annually&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Around &lt;strong&gt;360 alliance members&lt;/strong&gt;, with 57 added in 2025&lt;/li&gt;
&lt;li&gt;LoRa-family technologies hold roughly 64% of smart-building deployments — precisely because private networks don't depend on operators&lt;/li&gt;
&lt;li&gt;The LoRaWAN connectivity market is projected to grow from about US$10.7B in 2025 to about US$44.8B by 2030 (~33% CAGR)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Moat&lt;/strong&gt;: You can build the network yourself. One open-source gateway (such as the ManThink GD6, with tri-path backhaul and a full protocol stack) plus an open-source NS (ChirpStack) gets you a private network where data never leaves your campus. No cellular technology offers that.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 NB-IoT: The Licensed-Spectrum Regular Army
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foundation&lt;/strong&gt;: A cellular narrowband technology standardized in 3GPP Release 13 (2016), running in licensed spectrum with a carrier bandwidth of only 200 kHz — deployable in-band, in guard band, or standalone within LTE.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key parameters&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Peak downlink ~26 kbps; uplink ~15.6 kbps single-tone (higher multi-tone)&lt;/li&gt;
&lt;li&gt;Relies on operator base-station coverage; coverage depth roughly 20 dB better than legacy GSM (MCL 164 dB)&lt;/li&gt;
&lt;li&gt;Power-saving via PSM, eDRX, and PSA mechanisms&lt;/li&gt;
&lt;li&gt;Continued evolution in 3GPP Rel-17/18, with NTN satellite connectivity validated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Market position&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;About &lt;strong&gt;84% of global NB-IoT connections are in China&lt;/strong&gt;, driven by carrier base-station upgrades since 2017 and the policy-backed migration of water and gas metering&lt;/li&gt;
&lt;li&gt;NB-IoT and LTE-M together reached roughly one billion active connections by the end of 2025&lt;/li&gt;
&lt;li&gt;NB-IoT accounts for roughly 54%–58% of total LPWAN share (with China's weight included)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Moat&lt;/strong&gt;: The operator network. No gateways to deploy or maintain — insert a SIM card and coverage is the carrier's problem. The price: subscription fees, carrier lock-in, and uncertainty around network sunsetting cycles.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Sigfox: From Unicorn to "0G Technology Brand"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foundation&lt;/strong&gt;: Ultra-narrowband (UNB) modulation with channels only 100 Hz wide, ~100 bps uplink, 12-byte payloads, and a message budget of 140 uplinks and 4 downlinks per day. Radical simplicity buys radical low power and rock-bottom silicon cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rise and fall&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Founded in 2010; peaked at a valuation of about US$1 billion, once mentioned alongside LoRaWAN and NB-IoT as one of the three LPWAN schools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filed for receivership in January 2022&lt;/strong&gt;; acquired by Singapore's UnaBiz in April for roughly €25 million (retaining 110 of 174 employees)&lt;/li&gt;
&lt;li&gt;UnaBiz's plan was never to "revive Sigfox" but to pursue &lt;strong&gt;multi-protocol convergence&lt;/strong&gt;: rebranded as "Sigfox 0G Technology," it became one option in UnaBiz's LPWAN abstraction layer alongside LoRaWAN, LTE-M, and Wi-SUN — exemplified by Japan's Nicigas gas-metering project, where 90% of sensors use Sigfox and 10% use Cat-M for coverage gaps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Today&lt;/strong&gt;: The 0G network covers 70+ countries and over a billion people, with roughly 20 million devices still in service. It retains unique value in ultra-low-cost asset tracking (single-use logistics trackers, cold-chain tags). But the narrative of Sigfox as a mainstream rival to LoRaWAN and NB-IoT is over.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The 2026 Market in Numbers
&lt;/h2&gt;

&lt;p&gt;Counting methodologies vary across research firms; sources are cited for cross-reference:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Figure&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LoRaWAN deployed end devices&lt;/td&gt;
&lt;td&gt;125M+, ~25% annual growth&lt;/td&gt;
&lt;td&gt;LoRa Alliance 2025 EOY Report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRa Alliance membership&lt;/td&gt;
&lt;td&gt;~360 (57 added in 2025)&lt;/td&gt;
&lt;td&gt;LoRa Alliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NB-IoT geographic concentration&lt;/td&gt;
&lt;td&gt;~84% of connections in China&lt;/td&gt;
&lt;td&gt;IEEE ComSoc Technology Blog (2026.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LPWAN share outside China&lt;/td&gt;
&lt;td&gt;LoRaWAN ~41%, #1&lt;/td&gt;
&lt;td&gt;IEEE ComSoc Technology Blog (2026.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long-range IoT connectivity revenue (2025)&lt;/td&gt;
&lt;td&gt;NB-IoT ~$6.2B (43.5%), LoRaWAN ~$4.5B (31.8%), LTE-M ~$2.1B (14.9%), Sigfox &amp;amp; others ~$1.4B (9.9%)&lt;/td&gt;
&lt;td&gt;PW Consulting market report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRaWAN connectivity market forecast&lt;/td&gt;
&lt;td&gt;~$10.7B (2025) → ~$44.8B (2030), 33.1% CAGR&lt;/td&gt;
&lt;td&gt;Industry forecast (cited by IEEE ComSoc)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duopoly concentration&lt;/td&gt;
&lt;td&gt;NB-IoT + LoRa ≈ 83% of LPWAN&lt;/td&gt;
&lt;td&gt;IoT Analytics (baseline, structure persists)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sigfox/0G network&lt;/td&gt;
&lt;td&gt;70+ countries, ~20M devices in service&lt;/td&gt;
&lt;td&gt;Sigfox/UnaBiz official&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Three cautions when reading these numbers&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"LoRa" and "LoRaWAN" are not the same count.&lt;/strong&gt; Cumulative LoRa chipset shipments (700M+) far exceed LoRaWAN protocol connections (125M) — many proprietary-protocol devices also use the LoRa PHY.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;China's weight inverts conclusions.&lt;/strong&gt; Include China and NB-IoT is the runaway leader; exclude it and LoRaWAN leads overseas. Global product planning must split the markets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revenue share ≠ connection share.&lt;/strong&gt; NB-IoT's revenue share (~43%) is lower than its connection share (~54%–58%) because many Chinese metering connections carry very low ARPU.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. Three Dividing Lines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dividing line 1: China vs. the rest — two parallel markets
&lt;/h3&gt;

&lt;p&gt;China is NB-IoT's home turf: carrier-led base-station coverage and policy-driven metering migration (smart water/gas meter penetration above 80% in tier-1 cities) make NB-IoT the default in public utilities.&lt;/p&gt;

&lt;p&gt;Overseas markets (Europe, North America, Southeast Asia, Latin America) never saw comparable carrier NB-IoT investment. LoRaWAN took roughly 41% of connections there on the strength of &lt;strong&gt;private networks and an open ecosystem&lt;/strong&gt;, with growth led by smart buildings, smart agriculture, asset tracking, and campus deployments.&lt;/p&gt;

&lt;p&gt;For product companies: &lt;strong&gt;in China, plan for NB-IoT and LoRaWAN coexisting; globally, LoRaWAN's ecosystem advantage is more pronounced.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dividing line 2: The Sigfox lesson — great technology is not a great business
&lt;/h3&gt;

&lt;p&gt;Sigfox's UNB technology remains unmatched on ultra-low power and ultra-low cost. Why did it fall?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Closed ecosystem&lt;/strong&gt;: Chip supply, base stations, and the cloud were all controlled by one company; partners could only act as distributors — a stark contrast to the LoRa Alliance's 360-member open model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single business model&lt;/strong&gt;: Selling connectivity alone, without end-to-end vertical solutions, stalled growth in an industry that demands solutions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capital mismatch&lt;/strong&gt;: The heavy-asset "build the network first, find customers later" model burned out over IoT's long adoption cycle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UnaBiz's post-acquisition pivot answers each lesson: no more single-technology evangelism, but an LPWAN abstraction layer that mixes networks by coverage, cost, and use case. &lt;strong&gt;"Customers don't care which LPWAN they use — they care about getting devices online at a sensible cost."&lt;/strong&gt; Every IoT professional should keep that sentence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dividing line 3: Convergence is the 2026 theme
&lt;/h3&gt;

&lt;p&gt;The LPWAN market is moving from "picking sides" to "combining":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Sidewalk&lt;/strong&gt;: a consumer-grade LoRa-based shared network already covering 95% of the US population, expanding into Canada and Mexico in 2026 — Big Tech chose the LoRa PHY as the foundation for mass consumer IoT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid networking as the norm&lt;/strong&gt;: 1NCE (cellular) and Netmore (LoRaWAN) announced integrated global coverage; UnaBiz's 0G abstraction spans Sigfox/LoRaWAN/LTE-M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Satellite NTN for coverage gaps&lt;/strong&gt;: 3GPP Rel-17/18 takes NB-IoT to direct-to-satellite; the LoRa camp's LR1121 chipset supports Sub-GHz + 2.4 GHz + satellite S-band&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LoRaWAN keeps evolving&lt;/strong&gt;: LR-FHSS lifts dense-deployment capacity by an order of magnitude, and the 2025 Regional Parameters update tripled the top data rate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. An Engineer's Selection Guide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision dimension&lt;/th&gt;
&lt;th&gt;Choose LoRaWAN&lt;/th&gt;
&lt;th&gt;Choose NB-IoT&lt;/th&gt;
&lt;th&gt;Choose Sigfox/0G&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment model&lt;/td&gt;
&lt;td&gt;Self-built private network&lt;/td&gt;
&lt;td&gt;Operator network&lt;/td&gt;
&lt;td&gt;Operator network (70+ countries)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data sovereignty&lt;/td&gt;
&lt;td&gt;Fully yours&lt;/td&gt;
&lt;td&gt;Data transits carrier&lt;/td&gt;
&lt;td&gt;Data transits carrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max payload&lt;/td&gt;
&lt;td&gt;~242 B&lt;/td&gt;
&lt;td&gt;~1600 B (theoretical)&lt;/td&gt;
&lt;td&gt;12 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink capability&lt;/td&gt;
&lt;td&gt;Weak (Class A) / strong (Class C)&lt;/td&gt;
&lt;td&gt;Fairly strong&lt;/td&gt;
&lt;td&gt;Very weak (4 msgs/day)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobility / handover&lt;/td&gt;
&lt;td&gt;Weak (designed for static nodes)&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic cost&lt;/td&gt;
&lt;td&gt;CAPEX + zero fees&lt;/td&gt;
&lt;td&gt;SIM subscription&lt;/td&gt;
&lt;td&gt;Subscription (lowest)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entry threshold&lt;/td&gt;
&lt;td&gt;One gateway is enough&lt;/td&gt;
&lt;td&gt;Depends on carrier coverage&lt;/td&gt;
&lt;td&gt;Depends on carrier coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ecosystem openness&lt;/td&gt;
&lt;td&gt;Open alliance, 360+ members&lt;/td&gt;
&lt;td&gt;3GPP standard, operator-led&lt;/td&gt;
&lt;td&gt;Single-vendor technology (UnaBiz-operated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical use cases&lt;/td&gt;
&lt;td&gt;Buildings, campuses, agriculture, factories&lt;/td&gt;
&lt;td&gt;City-scale metering, municipal assets&lt;/td&gt;
&lt;td&gt;One-way tracking, cold-chain tags&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Three questions for a quick decision&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does data need to leave your site?&lt;/strong&gt; No → LoRaWAN private network; Yes → next question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there stable operator coverage at the deployment site?&lt;/strong&gt; Yes, and the project is urban → evaluate NB-IoT; No (remote, basement, cross-border) → LoRaWAN or hybrid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uplink-only, 12 bytes per message enough, cost squeezed to the limit?&lt;/strong&gt; Yes → evaluate Sigfox/0G; No → back to the first two questions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A pragmatic trend is &lt;strong&gt;dual-mode hybrid&lt;/strong&gt;: LoRaWAN collects campus sensors at the access layer while backhaul runs over 4G/Ethernet; or core assets use NB-IoT for guaranteed coverage while high-density sensing uses LoRaWAN for cost control. ManThink's GD6 gateway does this at the hardware level — LoRaWAN access plus Ethernet/Wi-Fi/4G tri-path backhaul, one device filling both network roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The ManThink Perspective: The Engineering Dividend of Private Networks
&lt;/h2&gt;

&lt;p&gt;As a device vendor in the LoRaWAN camp, our read of the landscape is direct: &lt;strong&gt;LoRaWAN's long-term value lies in connecting the installed base.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A huge share of sensors in industrial and building environments are wired (RS-485, M-Bus, 4-20mA, DI/DO). When retrofitting them for wireless, operator networks are neither economical nor controllable. A LoRaWAN private network lets integrators expand their sourcing from "LoRaWAN-interface sensors only" to "any wired sensor," completing retrofits at low cost with a gateway plus wireless conversion modules (such as Edge-Bus architecture DTUs).&lt;/p&gt;

&lt;p&gt;That is why GD6 exists as an open-source gateway and ThinkLink as a lightweight NS plus application platform: once the connectivity market settled into a duopoly, &lt;strong&gt;the real competition moved to lowering the entry barrier for private networks&lt;/strong&gt; — a network in five minutes, template-based sensor onboarding, event-driven low-power edge logic. The market data backs this direction: the main engine of LoRaWAN's 25% annual growth is precisely private and enterprise-built networks.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Conclusion
&lt;/h2&gt;

&lt;p&gt;The 2026 LPWAN market has no winner-take-all outcome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NB-IoT&lt;/strong&gt; wins on carrier infrastructure and Chinese metering — the "public-utility-grade" choice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LoRaWAN&lt;/strong&gt; wins on open ecosystem, private deployment, and overseas markets — the "enterprise-autonomy-grade" choice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sigfox&lt;/strong&gt; lost its standalone track, but its UNB technology lives on as "0G" inside a multi-protocol convergence ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For engineers and decision-makers, the question was never "which technology is better" but "which route fits your data sovereignty, deployment environment, and cost structure" — and increasingly, the right answer is a combination, not a side.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;_1. LoRa Alliance 2025 End of Year Report (Feb 2026) — 125M devices, 360 members&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;IEEE ComSoc Technology Blog (Mar 2026) — NB-IoT share 54%–58%, China ~84% of global NB-IoT, LoRaWAN ~41% outside China&lt;/li&gt;
&lt;li&gt;PW Consulting, Worldwide Long Range IoT Connectivity Market 2026 — revenue share by technology&lt;/li&gt;
&lt;li&gt;Light Reading, "Sigfox rescued from receivership by Singapore's UnaBiz" (Apr 2022) — receivership and acquisition details&lt;/li&gt;
&lt;li&gt;Stacey on IoT, "UnaBiz has a nice plan for Sigfox" — 0G convergence strategy and the Nicigas case&lt;/li&gt;
&lt;li&gt;Sigfox/UnaBiz official site — 0G network coverage data&lt;/li&gt;
&lt;li&gt;IoT Analytics — 83% duopoly baseline (historical)&lt;/li&gt;
&lt;li&gt;ThinkLink knowledge base — ManThink market positioning and product line_&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title># LoRaWAN Device Classes: Class A, B, and C Compared — A Selection Guide</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Fri, 28 Aug 2026 07:42:19 +0000</pubDate>
      <link>https://dev.to/manthink/-lorawan-device-classes-class-a-b-and-c-compared-a-selection-guide-5ad9</link>
      <guid>https://dev.to/manthink/-lorawan-device-classes-class-a-b-and-c-compared-a-selection-guide-5ad9</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: Why do water meters, streetlights, and gateways look different on the same network?
&lt;/h2&gt;

&lt;p&gt;Open the datasheet of any LoRaWAN device and you will find a line item: &lt;strong&gt;Device Class&lt;/strong&gt;. Water meters say Class A. Smart streetlights might be Class B. Relay cabinets and gateways are Class C.&lt;/p&gt;

&lt;p&gt;These letters are not marketing labels. They are the LoRaWAN specification's three conventions for &lt;strong&gt;how a device receives downlink data&lt;/strong&gt; — and they directly determine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how long the device can run on a battery;&lt;/li&gt;
&lt;li&gt;how quickly it receives commands sent by the platform;&lt;/li&gt;
&lt;li&gt;how you should plan power supply and maintenance for the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One sentence captures the essence: &lt;strong&gt;in LoRaWAN, uplink is easy, downlink is expensive&lt;/strong&gt;. Sending data is cheap for a device; but to "always hear the platform talking," the radio receiver must stay on — and a receiver's power draw is typically a hundredfold or more above deep sleep. Class A/B/C are the protocol's three answers to this conflict.&lt;/p&gt;

&lt;p&gt;This article explains all three mechanisms and gives you a selection table you can use directly in your next project.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. First, understand the conflict: why is downlink so hard?
&lt;/h2&gt;

&lt;p&gt;LoRaWAN is a low-power wide-area network (LPWAN). Its typical endpoint is a battery-powered sensor, with a design goal of "one battery lasting 5–10 years."&lt;/p&gt;

&lt;p&gt;To achieve that, the device must spend the vast majority of its life in deep sleep — and a sleeping device is deaf. It cannot hear any call from the gateway. If the platform must be able to send commands at any time (remote switch-off, changing the reporting interval), the receiver has to stay on continuously, and battery life immediately shrinks from "a decade" to "a few months."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power consumption and downlink responsiveness are natural adversaries.&lt;/strong&gt; Class A, B, and C are not three "technologies" — they are three compromise points along this axis: from "spend nothing on downlink" (A), to "wake up on a schedule to check for commands" (B), to "always online" (C).&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Class A: Listen only after speaking — the lowest-power baseline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mechanism: the two receive windows
&lt;/h3&gt;

&lt;p&gt;Class A is the &lt;strong&gt;mandatory baseline for all LoRaWAN devices&lt;/strong&gt; — whatever class a device claims, it always implements Class A behavior first.&lt;/p&gt;

&lt;p&gt;The logic is simple: the device sleeps deeply and &lt;strong&gt;only briefly opens two receive windows after it has sent an uplink&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Device      ──uplink──►  Gateway/NS
              │
              │ wait RECEIVE_DELAY1 (default 1 second)
              ▼
            RX1 window opens (brief)
              │ if nothing, wait another second
              ▼
            RX2 window opens (brief)
              │ if still nothing
              ▼
            back to deep sleep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RX1&lt;/strong&gt;: opens about 1 second after the uplink ends, typically on the same (or similar) frequency and rate as the uplink;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RX2&lt;/strong&gt;: follows about 1 second later, using the region's fixed frequency and rate (e.g., EU868's RX2 is fixed at 869.525 MHz / DR0; check your Regional Parameters).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both windows are short; once closed, the device returns to sleep. In other words, &lt;strong&gt;the network can only reach a Class A device by "hitching a ride" — it must wait for the device to speak first&lt;/strong&gt;. Downlink payloads queue at the NS until the next uplink opens RX1/RX2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics and use cases
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Power&lt;/td&gt;
&lt;td&gt;Lowest of the three; deep sleep dominates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink timing&lt;/td&gt;
&lt;td&gt;Only after uplink; cannot be woken on demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink latency&lt;/td&gt;
&lt;td&gt;Bound by reporting interval: hourly reports → up to ~1 hour wait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical supply&lt;/td&gt;
&lt;td&gt;Primary battery (lithium), life of 8–10 years achievable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Use cases&lt;/strong&gt;: water/gas/electricity meters, temperature/humidity and soil sensors — anything that is "sense and report, with almost no downlink." This is why Class A dominates the LoRaWAN sensor ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Class B: Scheduled listening — the middle ground
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mechanism: Beacon sync + Ping Slots
&lt;/h3&gt;

&lt;p&gt;Class B adds a "&lt;strong&gt;wake up on schedule and take a look&lt;/strong&gt;" mechanism on top of Class A:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Beacon synchronization&lt;/strong&gt;: gateways periodically broadcast Beacons; after receiving one, the device aligns with network time — from then on, it "knows what time it is."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ping Slots&lt;/strong&gt;: with time sync in place, the device briefly opens a receive window at periodic fixed moments (Ping Slots), listening for downlink addressed to it. Nothing? Back to sleep. Something? Receive and process.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Ping Slot period is configurable (the specification defines several tiers from seconds up to 128 seconds): shorter period → more responsive downlink, but more wake-ups and higher power.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        After Beacon sync, the device's timeline:
  ──┬────┬────┬────┬────┬──►
    │    │    │    │
  Ping  Ping  Ping  Ping      ← scheduled brief windows
  Slot  Slot  Slot  Slot
   (awake for milliseconds, deep sleep the rest)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Characteristics and use cases
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Power&lt;/td&gt;
&lt;td&gt;Slightly above Class A (Beacon reception + Ping Slot wake-ups)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink timing&lt;/td&gt;
&lt;td&gt;Can be scheduled into Ping Slots; no longer fully dependent on uplink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink latency&lt;/td&gt;
&lt;td&gt;Bounded: at worst one Ping Slot period&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment requirement&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;The network side must support Beacon broadcast&lt;/strong&gt; — gateway and NS both; not something a device can do alone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Use cases&lt;/strong&gt;: smart streetlights (seasonal on/off schedules pushed remotely), devices needing periodic time sync, monitoring points that must receive downlink within minutes. Class B is comparatively rare in practice, largely because of this deployment threshold: the whole chain (device–gateway–NS) must support it.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Class C: The "real-time mode" — for mains-powered devices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mechanism: receiving everything except while transmitting
&lt;/h3&gt;

&lt;p&gt;Class C abandons the "sleep to save power" idea altogether: &lt;strong&gt;the radio receiver stays on almost continuously&lt;/strong&gt;, closing only for the instant of uplink transmission (to avoid self-jamming), then immediately returning to receive mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ──RX──RX──RX──│TX│──RX──RX──RX──RX──►
              (receiver off only while transmitting)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, commands from the platform arrive &lt;strong&gt;almost instantly&lt;/strong&gt; — downlink latency drops from "minutes/hours" to "seconds."&lt;/p&gt;

&lt;h3&gt;
  
  
  The cost: power is dominated by RX current
&lt;/h3&gt;

&lt;p&gt;This is the account every engineer must run. A radio receiver typically draws milliamps to tens of milliamps, while a Class A device in deep sleep draws microamps — &lt;strong&gt;three to four orders of magnitude apart&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is a well-established engineering conclusion (not a protocol prohibition): &lt;strong&gt;Class C is generally unsuitable for primary-battery devices&lt;/strong&gt;. A primary cell (e.g., lithium thionyl chloride) cannot sustain continuous RX current; without a complete power-lifecycle budget, no multi-year lifetime claim is credible.&lt;/p&gt;

&lt;p&gt;Hence Class C's typical supplies: &lt;strong&gt;mains power, PoE, or large rechargeable batteries&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Power&lt;/td&gt;
&lt;td&gt;Highest of the three; average current dominated by RX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink timing&lt;/td&gt;
&lt;td&gt;Anytime, near real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink latency&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical supply&lt;/td&gt;
&lt;td&gt;Mains / PoE / always-on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Use cases&lt;/strong&gt;: relays and control cabinets (remote switching), industrial real-time monitoring, actuators — and LoRaWAN gateways themselves (a gateway, as an "always-on" device, is naturally Class C in behavior).&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Side-by-side comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Class A&lt;/th&gt;
&lt;th&gt;Class B&lt;/th&gt;
&lt;th&gt;Class C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Receive timing&lt;/td&gt;
&lt;td&gt;RX1/RX2 after uplink only&lt;/td&gt;
&lt;td&gt;Uplink windows + periodic Ping Slots&lt;/td&gt;
&lt;td&gt;Continuous except while transmitting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink capability&lt;/td&gt;
&lt;td&gt;Weakest (rides on uplink)&lt;/td&gt;
&lt;td&gt;Scheduled, bounded latency&lt;/td&gt;
&lt;td&gt;Near real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downlink latency&lt;/td&gt;
&lt;td&gt;Next uplink (minutes–hours)&lt;/td&gt;
&lt;td&gt;At worst one Ping period (seconds–minutes)&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power&lt;/td&gt;
&lt;td&gt;Lowest&lt;/td&gt;
&lt;td&gt;Slightly above A&lt;/td&gt;
&lt;td&gt;Highest (RX-dominated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical supply&lt;/td&gt;
&lt;td&gt;Primary battery&lt;/td&gt;
&lt;td&gt;Battery (capacity uprated accordingly)&lt;/td&gt;
&lt;td&gt;Mains/PoE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Battery-life magnitude&lt;/td&gt;
&lt;td&gt;5–10 years&lt;/td&gt;
&lt;td&gt;Years (depends on Ping period)&lt;/td&gt;
&lt;td&gt;Not applicable to primary batteries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network-side requirements&lt;/td&gt;
&lt;td&gt;None special&lt;/td&gt;
&lt;td&gt;Gateway + NS must support Beacons&lt;/td&gt;
&lt;td&gt;None special&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical devices&lt;/td&gt;
&lt;td&gt;Utility meters, temp/humidity sensors&lt;/td&gt;
&lt;td&gt;Smart streetlights&lt;/td&gt;
&lt;td&gt;Relays, actuators, gateways&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One point worth emphasizing: &lt;strong&gt;the device class does not change regional data-rate definitions, nor can it bypass local transmission regulations&lt;/strong&gt; — it is a MAC-layer receive-behavior convention, independent of the physical-layer parameters (SF/BW/CR — see Article 4 in this series).&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Selection: ask yourself three questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question 1: Does this device need to receive downlink commands?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Almost never (report-only) → &lt;strong&gt;Class A&lt;/strong&gt;, no hesitation.&lt;/li&gt;
&lt;li&gt;Yes, but waiting minutes is fine → see Question 2.&lt;/li&gt;
&lt;li&gt;Yes, with second-level response (control) → &lt;strong&gt;Class C&lt;/strong&gt;, and plan mains/PoE supply.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Question 2: Is the device battery-powered?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes, and must last 5+ years → &lt;strong&gt;Class A&lt;/strong&gt;; if periodic downlink is genuinely required, evaluate &lt;strong&gt;Class B&lt;/strong&gt; and budget the power carefully.&lt;/li&gt;
&lt;li&gt;Mains/always-on → &lt;strong&gt;Class C&lt;/strong&gt; is available; enjoy real-time downlink.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Question 3 (for Class B): Does the infrastructure support it?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do the gateway and NS support Beacon broadcast? Without it, Class B exists only on paper.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A practical rule of thumb: &lt;strong&gt;sensors default to Class A, actuators default to Class C, and consider Class B only for the middle ground&lt;/strong&gt;. This matches the product mix you see across most LoRaWAN vendors today.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Three common misconceptions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Misconception 1: "Class C is more advanced — pick it and you're safe."&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Class C is not an upgrade; it is a different trade-off. Configuring a battery sensor as Class C means burning its battery on RX current — lifetime drops from a decade to months, while also consuming gateway downlink capacity. Choosing the wrong class costs more directly than choosing the wrong SF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Misconception 2: "Class A devices can never receive downlink."&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
False. A Class A device receives downlink in the RX1/RX2 windows after every uplink — ACKs, MAC commands, and configuration changes all fit in these windows. Only the &lt;em&gt;timing&lt;/em&gt; is tied to uplink. In practice, with a sensible reporting interval and command queuing, Class A handles most configuration-delivery needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Misconception 3: "Class is baked into the device and cannot change."&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Class is MAC-layer behavior. Many devices (especially configurable DTUs and modules) support Class A/C switching, letting you choose dynamically by project phase: Class C during commissioning for real-time provisioning, back to Class A in production for power savings. Just make sure the switching logic matches the power supply.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Engineering practice tips
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Power budget first&lt;/strong&gt;: whatever the class, run the power-lifecycle estimate first (RX/TX/sleep current × time share), then pick battery capacity — especially for Class B and C. "Back-of-envelope lifetime promises" are the top source of after-sales disputes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trim downlink requirements&lt;/strong&gt;: audit every "needs real-time downlink" requirement. Many so-called real-time controls degrade gracefully to "deliver configuration on next report" — which Class A satisfies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mind the downlink bottleneck&lt;/strong&gt;: a typical gateway has 8 channels and 16 demodulators — 16 parallel uplink packets but often only a single downlink channel. Many Class C devices plus frequent downlink will squeeze that resource; plan downlink traffic density accordingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation is special&lt;/strong&gt;: during OTAA, the Join Accept itself is delivered in RX1/RX2 — even Class C devices follow Class A timing during activation. This is yet another reflection of A being the baseline.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Class A/B/C are, at their core, three lines LoRaWAN draws between "low power" and "downlink responsiveness": A pushes power to the minimum and queues the downlink; B trades time synchronization for bounded downlink latency; C trades mains power for second-level response.&lt;/p&gt;

&lt;p&gt;Once you internalize this main axis, you can look at any LoRaWAN device's class label and immediately infer its power supply, downlink capability, and appropriate use cases — a skill more valuable than memorizing any parameter.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by the ManThink technical team. ManThink is committed to open-source and reliable LoRaWAN infrastructure: the GD6 open-source gateway (ESP32-S3 + SX1302) supports global bands and mainstream network servers, and the in-house EdgeBus edge-computing engine supports Class A/C mode switching to connect sensors to LoRaWAN at minimal power.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>LoRa Physical Layer Parameters: How SF, BW, and CR Shape Range and Data Rate</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Wed, 26 Aug 2026 01:37:51 +0000</pubDate>
      <link>https://dev.to/manthink/lora-physical-layer-parameters-how-sf-bw-and-cr-shape-range-and-data-rate-38b8</link>
      <guid>https://dev.to/manthink/lora-physical-layer-parameters-how-sf-bw-and-cr-shape-range-and-data-rate-38b8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: Same sensor, but 2 km for one team and 15 km for another?
&lt;/h2&gt;

&lt;p&gt;A recurring puzzle in LoRaWAN projects: identical sensors and gateways, yet one customer reports "coverage of only 2 km" while another claims "we reach 15 km." Antennas and mounting aside, the most overlooked cause is the configuration of three LoRa physical-layer parameters — &lt;strong&gt;Spreading Factor (SF), Bandwidth (BW), and Coding Rate (CR)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;LoRa's core design philosophy is "trading bandwidth for distance." Unlike WiFi or 4G, which chase high throughput, LoRa spreads the signal so the receiver can demodulate it at much lower signal-to-noise ratios. But &lt;em&gt;how much&lt;/em&gt; spreading, and &lt;em&gt;how&lt;/em&gt;, is governed by SF, BW, and CR.&lt;/p&gt;

&lt;p&gt;This article explains these parameters thoroughly: what each one is, how it affects range and data rate, the concrete numbers, and how to make trade-offs in real projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. SF (Spreading Factor): The "gear" for range
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the spreading factor
&lt;/h3&gt;

&lt;p&gt;The Spreading Factor (SF) defines &lt;strong&gt;how many chips (chirp symbols) each data bit is expanded into&lt;/strong&gt;. Each step up in SF doubles the number of chips per symbol:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcj9nhvdfsit956fw32ma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcj9nhvdfsit956fw32ma.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At SF12, each data bit is represented by 4096 chips — the signal is "spread out" 32 times relative to SF7. The receiver can therefore pull it out of the noise at much weaker signal levels, and the communication range grows accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why larger SF means longer range
&lt;/h3&gt;

&lt;p&gt;A larger SF brings two direct benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lower (more negative) receiver sensitivity.&lt;/strong&gt; SF7 sensitivity is roughly −124.5 dBm; SF12 reaches about −137 to −141 dBm (values vary slightly with link-budget assumptions). Every 3 dB of sensitivity gain roughly doubles the theoretical range.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Higher processing gain.&lt;/strong&gt; The spread signal is stretched in time, and correlation demodulation at the receiver yields processing gain, improving robustness against interference.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The cost is rate and airtime: &lt;strong&gt;larger SF means lower data rate and longer time-on-air per packet&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How fast is each tier, really
&lt;/h3&gt;

&lt;p&gt;Measured with the calculation engine (BW = 125 kHz, CR = 4/5):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk2771bk1yr59qlltfmjt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk2771bk1yr59qlltfmjt.png" alt=" " width="799" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From SF7 to SF12, the rate drops by nearly 19×.&lt;/strong&gt; That is the physical-layer conflict between "long range" and "high throughput" made concrete.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One common point of confusion: although larger SF means longer symbol duration, different SFs are &lt;strong&gt;orthogonal&lt;/strong&gt; — signals on different SFs can coexist on the same channel without interfering. This orthogonality is exactly why a gateway can demodulate multiple SF streams concurrently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. BW (Bandwidth): The "accelerator" for rate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is modulation bandwidth
&lt;/h3&gt;

&lt;p&gt;Bandwidth (BW) is the actual frequency span occupied by the LoRa signal. The most common setting in LoRaWAN is &lt;strong&gt;125 kHz&lt;/strong&gt;, with 250 kHz and 500 kHz also available.&lt;/p&gt;

&lt;p&gt;The relationship with data rate is straightforward: &lt;strong&gt;doubling BW halves the symbol duration and doubles the rate.&lt;/strong&gt; Measured (SF7, CR = 4/5):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Combination&lt;/th&gt;
&lt;th&gt;PHY data rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SF7 / 125 kHz&lt;/td&gt;
&lt;td&gt;≈ 5.47 kbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF7 / 250 kHz&lt;/td&gt;
&lt;td&gt;≈ 10.94 kbps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But there is no free lunch: &lt;strong&gt;a wider BW also widens the receiver's noise bandwidth&lt;/strong&gt;, raising the noise floor, degrading sensitivity, and shortening range. BW is an "accelerator" — floor it and you gain speed but lose endurance (range).&lt;/p&gt;

&lt;h3&gt;
  
  
  How BW is used in LoRaWAN
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The vast majority of regional DR0–DR5 definitions are based on &lt;strong&gt;125 kHz&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Some regions (e.g., EU868) define DR6 as SF7 / 250 kHz, as a higher-rate tier;&lt;/li&gt;
&lt;li&gt;The 500 kHz tier rarely appears as a device data rate in the LoRaWAN standard; it is more common in gateway uplink test scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. CR (Coding Rate): The "insurance" for reliability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the coding rate
&lt;/h3&gt;

&lt;p&gt;The Coding Rate (CR) is the forward error correction (FEC) redundancy ratio in LoRa, with four possible values:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06f5ynhi77ih0s1dtbip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06f5ynhi77ih0s1dtbip.png" alt=" " width="799" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;p&gt;CR lets the receiver &lt;strong&gt;recover the original data even when some bits are corrupted by interference&lt;/strong&gt;. The worse the signal and the more interference, the more redundancy is needed. The cost: lower effective rate and longer time-on-air — each extra redundancy bit reduces coding efficiency.&lt;/p&gt;

&lt;p&gt;The LoRaWAN standard defaults to &lt;strong&gt;CR = 4/5&lt;/strong&gt; (coding rate offset 1), which already provides good anti-ber capability at the highest effective rate. In practice, CR is rarely the parameter you tune day-to-day, but understanding it helps diagnose issues like "why is my over-the-air time longer than estimated."&lt;/p&gt;




&lt;h2&gt;
  
  
  4. LDRO: The overlooked fourth parameter
&lt;/h2&gt;

&lt;p&gt;When &lt;strong&gt;a single symbol lasts longer than 16 ms&lt;/strong&gt; (typical in low-rate scenarios such as SF11/SF12 with 125 kHz), long transmissions can cause crystal oscillator frequency drift that affects demodulation. In that case, &lt;strong&gt;Low Data Rate Optimization (LDRO)&lt;/strong&gt; should be enabled, adding redundancy bits in the header to combat clock drift.&lt;/p&gt;

&lt;p&gt;Note: LDRO is &lt;strong&gt;not&lt;/strong&gt; a coding rate. It does not change rate calculation itself; it is simply a reliability switch for low-rate scenarios. Most LoRaWAN stacks (including the Semtech reference implementation) set LDRO automatically based on SF and BW, so manual intervention is rarely needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Quantified comparison: Time-on-air for a 13-byte packet
&lt;/h2&gt;

&lt;p&gt;Time-on-air directly determines channel occupancy and battery life — arguably the single most important number for a project. Measured with the calculation engine (13-byte payload, CR = 4/5, explicit header):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Combination&lt;/th&gt;
&lt;th&gt;Time-on-air&lt;/th&gt;
&lt;th&gt;Ratio vs SF7&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SF7 / 125 kHz&lt;/td&gt;
&lt;td&gt;≈ 46.3 ms&lt;/td&gt;
&lt;td&gt;1×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF12 / 125 kHz&lt;/td&gt;
&lt;td&gt;≈ 1155.1 ms&lt;/td&gt;
&lt;td&gt;≈ 25×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same temperature/humidity reading takes 46 ms at SF7 but 1.15 s at SF12 — &lt;strong&gt;a 25× difference&lt;/strong&gt;. For battery-powered devices, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under duty-cycle limits, SF12 devices can transmit far less frequently per hour;&lt;/li&gt;
&lt;li&gt;Power consumption rises (longer RF transmit time);&lt;/li&gt;
&lt;li&gt;Channel occupancy at the gateway grows, reducing network capacity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Industry capacity estimates confirm this: on the same 8-channel gateway with the same reporting interval, a network of all-SF7 devices can theoretically host 20× more nodes than an all-SF12 network (different models give SF7 ≈ 787k vs SF12 ≈ 29k devices; exact figures depend on the assumed SF distribution, but the conclusion is consistent).&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Real-world trade-offs: Why there is no "best" setting
&lt;/h2&gt;

&lt;p&gt;Put SF, BW, and CR together, and the core problem is a &lt;strong&gt;four-corner trade-off&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsr5tywvqi87m2wtw8p39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsr5tywvqi87m2wtw8p39.png" alt=" " width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Want range&lt;/strong&gt; → raise SF (e.g., SF12), lower BW;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want throughput&lt;/strong&gt; → lower SF, raise BW;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want reliability&lt;/strong&gt; → raise CR;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want low power / high capacity&lt;/strong&gt; → use low SF and short packets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You cannot win all four at once. This is exactly why LoRaWAN designed &lt;strong&gt;ADR (Adaptive Data Rate)&lt;/strong&gt; — the network side measures the actual signal quality received by gateways and automatically assigns each device the most suitable SF: good signal → drop to SF7 for higher rate, lower power, and freed-up channels; weak signal → move up to SF11/SF12 to protect coverage. ADR is the most cost-effective way to resolve the range-vs-rate dilemma.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two common engineering misconceptions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1: Locking everything to SF12 for coverage.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The sensitivity advantage of SF12 is real, but the cost is a three-way hit to rate, power, and capacity. The right approach: let ADR adapt first, then pin high SF only for the few weak-signal devices — never a network-wide one-size-fits-all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 2: Assuming chip support means LoRaWAN support.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Chip capability ≠ protocol capability. For example, the SX1262 radio supports SF5, but the current LoRaWAN Regional Parameters do not define SF5/SF6 as standard data rates — devices cannot join using SF5. SF selection must satisfy both "chip support" and "Regional Parameters definition."&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Configuration recommendations for project teams
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Default to ADR&lt;/strong&gt;: enable ADR after join so the network adapts SF to real signal conditions — the best return on effort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier by use case&lt;/strong&gt;: allow SF10–SF12 for long-range reporting (remote agriculture, mountain monitoring); push dense urban deployments (smart buildings) down to SF7–SF9.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep packets small&lt;/strong&gt;: a LoRaWAN frame maxes out at 255 bytes, but airtime grows linearly with payload — don't send 50 bytes when 13 will do. Data compression and change-of-value (COV) reporting significantly extend battery life.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget airtime up front&lt;/strong&gt;: before deployment, calculate device airtime × transmit frequency and check against regional duty-cycle limits (e.g., EU868's 1% rule) to avoid running out of channel capacity later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate in the real environment&lt;/strong&gt;: theoretical sensitivity differences ≠ field coverage differences. Metal structures, foliage, and terrain all take their toll — a field test across SFs is the most reliable check.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;SF, BW, and CR are the three knobs of the LoRa physical layer. They determine how far, how fast, and how reliably the same radio hardware can communicate. Understanding them lets you make deliberate trade-offs among range, rate, power, and capacity — instead of being carried away by "LoRa transmits far."&lt;/p&gt;

&lt;p&gt;The good news for LoRaWAN developers: the network side (NS) and ADR already automate most of the tuning. Your job is to understand the principles, set the boundaries, and let the system find the balance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by the ManThink technical team. ManThink is committed to open-source and reliable LoRaWAN infrastructure. Its GD6 open-source gateway (ESP32-S3 + SX1302) covers CN470 / EU868 / US915 / AS923 and other global bands, with ADR, OTA, and support for mainstream network servers.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>LoRaWAN Device Activation Explained: OTAA vs ABP</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Mon, 17 Aug 2026 08:44:16 +0000</pubDate>
      <link>https://dev.to/manthink/lorawan-device-activation-explained-otaa-vs-abp-10bh</link>
      <guid>https://dev.to/manthink/lorawan-device-activation-explained-otaa-vs-abp-10bh</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4okzja42edbh3ipxtqgc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4okzja42edbh3ipxtqgc.png" alt=" " width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before a LoRaWAN device can send or receive any data, it must complete a process called activation — the step where the device obtains its network address and session keys. The activation method you choose affects security, deployment complexity, and day-to-day operations.&lt;br&gt;
The LoRaWAN specification defines two activation methods: OTAA (Over-The-Air Activation) and ABP (Activation By Personalization). This article breaks down how each works, compares them side by side, and gives practical selection guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  OTAA: Over-The-Air Activation
&lt;/h2&gt;

&lt;p&gt;OTAA is the recommended activation method. Devices ship without session keys and complete authentication over the air after the first power-up.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;OTAA activation happens in three steps:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. The device sends a Join Request
&lt;/h4&gt;

&lt;p&gt;The device transmits a Join Request carrying:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm5gxf8xue31su4z56bxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm5gxf8xue31su4z56bxd.png" alt=" " width="668" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Join Request is authenticated with a MIC (Message Integrity Code) computed using the AppKey, ensuring the message was not tampered with.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. The network server validates and sends a Join Accept
&lt;/h4&gt;

&lt;p&gt;On receiving the Join Request, the network server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Looks up the device's AppKey (and NwkKey on LoRaWAN 1.1) by JoinEUI/AppEUI&lt;/li&gt;
&lt;li&gt;Verifies the MIC to confirm message integrity&lt;/li&gt;
&lt;li&gt;Checks the DevNonce to prevent replay (each DevNonce can only be used once)&lt;/li&gt;
&lt;li&gt;On success, assigns a DevAddr (32-bit device network address)&lt;/li&gt;
&lt;li&gt;Generates a Join Nonce (network-server-side random value)&lt;/li&gt;
&lt;li&gt;Builds and encrypts a Join Accept message with the AppKey
The Join Accept carries:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmq898i7mm68galhg4bo9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmq898i7mm68galhg4bo9.png" alt=" " width="657" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. The device derives its session keys
&lt;/h4&gt;

&lt;p&gt;The device decrypts the Join Accept with its AppKey, then derives session keys from the AppKey, JoinNonce, DevNonce, and NetID.&lt;br&gt;
&lt;strong&gt;LoRaWAN 1.0.x (1.0.2 / 1.0.3 / 1.0.4) derives two keys:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NwkSKey (Network Session Key): MIC computation for MAC-layer messages and MAC command encryption&lt;/li&gt;
&lt;li&gt;AppSKey (Application Session Key): application payload encryption
Simplified derivation:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4nlbu4mwn92sb7fa12ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4nlbu4mwn92sb7fa12ov.png" alt=" " width="669" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LoRaWAN 1.1 introduces key separation, deriving four keys:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FNwkSIntKey: Forward Network Session Integrity Key&lt;/li&gt;
&lt;li&gt;SNwkSIntKey: Serving Network Session Integrity Key&lt;/li&gt;
&lt;li&gt;NwkSEncKey: Network Session Encryption Key&lt;/li&gt;
&lt;li&gt;AppSKey: Application Session Key
LoRaWAN 1.1 renames AppEUI to JoinEUI and separates the NwkKey from the AppKey, enabling network-level and application-level key separation — the foundation for secure roaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  OTAA Security Properties
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keys never travel over the air: AppKey/NwkKey are provisioned on the device and network server; session keys are derived independently on both sides. Only the encrypted Join Accept crosses the air interface.&lt;/li&gt;
&lt;li&gt;DevNonce replay protection: each DevNonce can be used exactly once; servers track used values.&lt;/li&gt;
&lt;li&gt;Key rotation: a device can re-join at any time to obtain fresh session keys.&lt;/li&gt;
&lt;li&gt;Roaming support: LoRaWAN 1.1's key separation design enables cross-network roaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ABP: Activation By Personalization
&lt;/h3&gt;

&lt;p&gt;ABP skips the join procedure entirely. Devices are pre-provisioned with all communication parameters at manufacture and start sending immediately after power-up.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Is Pre-Provisioned
&lt;/h3&gt;

&lt;p&gt;The following must be written to the device before shipping and registered on the network server in advance:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk62piqf1l7ekj536dguh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk62piqf1l7ekj536dguh.png" alt=" " width="588" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ABP devices do not need a DevEUI, JoinEUI, or AppKey (unless you plan to migrate to OTAA later).&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;An ABP device goes straight to work after power-up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses the pre-configured DevAddr as its source address&lt;/li&gt;
&lt;li&gt;Computes MICs with NwkSKey and encrypts MAC commands with NwkSKey&lt;/li&gt;
&lt;li&gt;Encrypts/decrypts application data with AppSKey&lt;/li&gt;
&lt;li&gt;Starts transmitting on default channels
There is no Join Request / Join Accept handshake.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Frame Counter Problem
&lt;/h3&gt;

&lt;p&gt;ABP devices must manage their uplink (FCntUp) and downlink (FCntDown) frame counters. Network servers track these counters to prevent replay attacks — if a device reboots and its counter resets below the value the server last recorded, its frames will be rejected.&lt;br&gt;
Two common approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-side reset: reset the device's frame counters manually on the platform (fine for debugging)&lt;/li&gt;
&lt;li&gt;Device-side persistence: store counters in non-volatile storage and resume from the last value after reboot (required for production)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  OTAA vs ABP: Side-by-Side
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Dimension                    | OTAA                                                           | ABP                                                                                 |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;| ---------------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------- |&lt;br&gt;
| &lt;strong&gt;Security&lt;/strong&gt;                 | High — keys derived over the join procedure, never transmitted | Low — keys must be written at manufacture and registered server-side; exposure risk |&lt;br&gt;
| &lt;strong&gt;Key rotation&lt;/strong&gt;             | Yes — re-join to obtain fresh keys                             | No — keys are fixed; changing them requires reflashing devices                      |&lt;br&gt;
| &lt;strong&gt;DevAddr assignment&lt;/strong&gt;       | Dynamically assigned by network server                         | Fixed at manufacture; uniqueness must be managed manually                           |&lt;br&gt;
| &lt;strong&gt;Deployment complexity&lt;/strong&gt;    | Device only needs root keys; server handles the rest           | Both device and server need full pre-configuration                                  |&lt;br&gt;
| &lt;strong&gt;Time to first packet&lt;/strong&gt;     | Join procedure first (typically 5–15 seconds)                  | Instant — works right after power-up                                                |&lt;br&gt;
| &lt;strong&gt;Frame counter management&lt;/strong&gt; | Starts from zero after join; no conflict issues                | Must be managed carefully; reboot may cause rejected frames                         |&lt;br&gt;
| &lt;strong&gt;Roaming&lt;/strong&gt;                  | Supported (LoRaWAN 1.1 key separation)                         | Not supported                                                                       |&lt;br&gt;
| &lt;strong&gt;LoRaWAN 1.1&lt;/strong&gt;              | Fully supported — 1.1 relies on OTAA                           | Not recommended under 1.1                                                           |&lt;br&gt;
| &lt;strong&gt;Deployment scale&lt;/strong&gt;         | Suitable for production fleets                                 | Suitable for small tests                                                            |&lt;br&gt;
| &lt;strong&gt;Network switching&lt;/strong&gt;        | Change JoinEUI to join another network                         | Requires reflashing all parameters                                                  |&lt;/p&gt;

&lt;h2&gt;
  
  
  Which One Should You Use?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use OTAA when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Production deployments — any fleet beyond a handful of devices should be OTAA&lt;/li&gt;
&lt;li&gt;Security matters — sensitive data or compliance requirements&lt;/li&gt;
&lt;li&gt;Large scale — DevAddr is dynamically assigned, avoiding conflicts&lt;/li&gt;
&lt;li&gt;Roaming is needed — cross-network or multi-region deployments&lt;/li&gt;
&lt;li&gt;LoRaWAN 1.1 networks — 1.1's security features depend on OTAA&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ABP is acceptable when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Development and debugging — validate device communication quickly without the join handshake&lt;/li&gt;
&lt;li&gt;Teaching and demos — simplify the flow so students focus on data exchange&lt;/li&gt;
&lt;li&gt;Very small, fixed deployments — one or two devices in a controlled environment with low security requirements&lt;/li&gt;
&lt;li&gt;Uplink-only scenarios — devices only transmit, with minimal key-management needs (still weigh the security trade-off)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A Common Misconception
&lt;/h3&gt;

&lt;p&gt;"ABP saves power because there's no join procedure."&lt;br&gt;
Not really. The join procedure costs very little — one Join Request and one Join Accept, typically completed in a few seconds. Compared to a device's multi-year battery life, the energy of the join phase is negligible. What ABP actually saves is development-time configuration effort — and in production that convenience comes at the cost of lower security and higher operational overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Notes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OTAA in Practice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;DevEUI must be globally unique: use an IEEE EUI-64 derived from the device MAC; never hardcode a default value&lt;/li&gt;
&lt;li&gt;Store AppKey securely: it's the root key — compromise means the device's entire communication can be decrypted. Prefer a secure element, or at least the MCU's flash encryption&lt;/li&gt;
&lt;li&gt;Persist DevNonce: it must live in non-volatile storage and keep incrementing across reboots. A rollback causes the network server to reject Join Requests&lt;/li&gt;
&lt;li&gt;Implement join retry with backoff: avoid hammering the channel if the network is temporarily unreachable&lt;/li&gt;
&lt;li&gt;Listen in the join windows: Join Accept arrives in RX1 (default 5 s) and RX2 after the Join Request; the device must be listening&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ABP in Practice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Persist frame counters: store FCntUp and FCntDown in non-volatile storage (RTC backup registers, flash, or EEPROM)&lt;/li&gt;
&lt;li&gt;Plan DevAddr carefully: the 7-bit NwkID must match the network server's NetID; the 25-bit address must be unique within the network&lt;/li&gt;
&lt;li&gt;Protect keys in manufacturing: ABP keys are written at manufacture — keep them out of production logs and test records&lt;/li&gt;
&lt;li&gt;Never commit keys to public repos: if you share code on GitHub or similar, don't hardcode NwkSKey and AppSKey&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Working with the ThinkLink Platform
&lt;/h3&gt;

&lt;p&gt;On ThinkLink:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OTAA devices: register DevEUI and AppKey on the platform; the device joins automatically after power-up&lt;/li&gt;
&lt;li&gt;ABP devices: register DevAddr, NwkSKey, and AppSKey; the device communicates immediately&lt;/li&gt;
&lt;li&gt;The platform shows join status and frame counters for every device&lt;/li&gt;
&lt;li&gt;If a frame counter conflict occurs, reset it from the device management page&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivpe4ajbrylivm9omouk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivpe4ajbrylivm9omouk.png" alt=" " width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bottom line: &lt;strong&gt;use OTAA in production, ABP only for debugging and teaching.&lt;/strong&gt; If you have more than ten devices, or if devices sit in environments you can't physically control, OTAA is the only sensible choice.&lt;br&gt;
Written against the LoRaWAN 1.0.4 and 1.1 specifications. Protocol details follow the LoRa Alliance specification documents; operational advice draws from ThinkLink platform experience.&lt;br&gt;
ThinkLink is the IoT platform product from ManThink, providing LoRaWAN network management, device operations, and data services.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ManThink Launches GD6 Open-Source LoRaWAN Gateway: ESP32-S3 + SX1302 Indoor Solution</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Thu, 06 Aug 2026 02:14:32 +0000</pubDate>
      <link>https://dev.to/manthink/manthink-launches-gd6-open-source-lorawan-gateway-esp32-s3-sx1302-indoor-solution-22oi</link>
      <guid>https://dev.to/manthink/manthink-launches-gd6-open-source-lorawan-gateway-esp32-s3-sx1302-indoor-solution-22oi</guid>
      <description>&lt;p&gt;ManThink has officially released the GD6 (GD61x series), an open-source indoor LoRaWAN gateway. The gateway is built around an ESP32-S3 MCU with an optional Semtech SX1301 or SX1302 concentrator, integrating Ethernet, Wi-Fi, and optional 4G multi-link backhaul. It covers major LoRaWAN regional bands worldwide — including CN470, EU868, AS923, and US915 — supports the full protocol stack (UDP Packet Forwarder, MQTT Bridge, and Basic Station), and delivers its complete web configuration system and firmware management capabilities as an open-source platform.&lt;/p&gt;

&lt;p&gt;GD6 is positioned as a cost-effective indoor LoRaWAN gateway for developers, system integrators, and IoT solution providers. It is suitable for smart buildings, campus networks, small industrial sites, prototyping, and academic research.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Philosophy
&lt;/h2&gt;

&lt;p&gt;Building a LoRaWAN gateway is not primarily a hardware challenge — the SX1302 + ESP32 combination is well-established. The real challenge lies in balancing "works out of the box" with "deeply customizable."&lt;/p&gt;

&lt;p&gt;Most commercial gateways lock their configuration systems inside closed apps or cloud backends, limiting the parameters developers can tune. Pure DIY solutions offer flexibility but lack engineered configuration workflows and reliable OTA mechanisms, making them difficult to deploy in production.&lt;/p&gt;

&lt;p&gt;GD6 takes a different approach: the hardware is designed and manufactured to commercial standards, but the configuration system, management interfaces, and firmware upgrade mechanisms are fully open. You can unbox a GD6, connect the antenna and power, and have it online in 5 minutes through the web interface. At the same time, you can integrate it into your own operations stack via REST API and remote MQTT, or even build and flash custom firmware.&lt;/p&gt;

&lt;p&gt;It's a gateway that works out of the box — and can also be taken apart and modified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware
&lt;/h2&gt;

&lt;p&gt;GD6's hardware design centers on three goals: sufficient performance, deployment flexibility, and convenient power.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCU: ESP32-S3-WROOM-1 (N8R8)
&lt;/h3&gt;

&lt;p&gt;8 MB QIO Flash + 8 MB Octal PSRAM, both running at 80 MHz. The ESP32-S3's dual-core processor handles multi-channel LoRa transceiving while simultaneously running the web console, TLS-encrypted communication, and MQTT remote configuration. The 8 MB PSRAM ensures the gateway doesn't drop packets or lag under high channel load.&lt;/p&gt;

&lt;h3&gt;
  
  
  LoRa Concentrator: SX1301 or SX1302
&lt;/h3&gt;

&lt;p&gt;GD6 offers two concentrator options, identified directly by the model suffix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Suffix &lt;code&gt;1&lt;/code&gt;: Semtech SX1301 — the classic solution, mature and stable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Suffix &lt;code&gt;2&lt;/code&gt;: Semtech SX1302 — lower power consumption, higher sensitivity&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both use an A-type LoRa architecture: single LoRa antenna, 8 frequency channels, 65 sub-channels, half-duplex.&lt;/p&gt;

&lt;h3&gt;
  
  
  RF Versions: Covering Major Global Bands
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcd6nqhhydjusic9yollc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcd6nqhhydjusic9yollc.png" alt=" " width="798" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;4&lt;/code&gt; and &lt;code&gt;8&lt;/code&gt; in the model number indicate the RF frequency range, not the number of channels. The region code must match the RF hardware and local regulations — you cannot convert a gateway from one frequency band to another through software alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backhaul: Ethernet + Wi-Fi + Optional 4G
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ethernet&lt;/strong&gt;: W5500, 10/100 Mbps, RJ45, supports DHCP or static IP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wi-Fi&lt;/strong&gt;: ESP32-S3 integrated 2.4 GHz, supports AP + STA concurrently&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;4G (optional)&lt;/strong&gt;: LTE Cat 1, miniPCIe interface, module is swappable for different carrier bands&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ethernet is the default priority link; when the primary link fails, the gateway automatically switches to the backup. Models with 4G (indicated by &lt;code&gt;G&lt;/code&gt; in the model number) have triple-link backhaul; models without 4G (indicated by &lt;code&gt;N&lt;/code&gt;) have dual-link.&lt;/p&gt;

&lt;p&gt;The Wi-Fi AP mode operates independently of the backhaul link, providing a local configuration and recovery entry point. The default hotspot SSID is &lt;code&gt;LGW-Config&lt;/code&gt;, password &lt;code&gt;lgw12345678&lt;/code&gt;, management address &lt;code&gt;192.168.4.1&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Power Supply: Three Options
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Type-C 5V&lt;/strong&gt;: convenient for desktop debugging&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DC terminal 5–24V&lt;/strong&gt;: wide-voltage input for industrial sites&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PoE (AG configuration only)&lt;/strong&gt;: power and data over a single RJ45 cable&lt;/p&gt;

&lt;p&gt;Connecting multiple power sources simultaneously is not recommended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protocol Support
&lt;/h2&gt;

&lt;p&gt;GD6 supports three mainstream uplink protocols, covering virtually all LoRaWAN network servers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semtech UDP Packet Forwarder&lt;/strong&gt; — The classic protocol with the broadest compatibility. Configure the server address, uplink/downlink ports, and timeout parameters to connect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MQTT Bridge&lt;/strong&gt; — Forwards LoRa data via MQTT, supporting mutual TLS, CA certificates, and client certificates. Suitable for enterprise deployments with data security requirements. The MQTT Bridge uses an independent connection that does not interfere with the remote configuration channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic Station&lt;/strong&gt; — Semtech's recommended next-generation gateway protocol, supporting LNS direct connection or CUPS bootstrap. Authentication options include TLS + Token or mTLS (client certificates). Compatible with TTN/TTI, ChirpStack, and other major network servers.&lt;/p&gt;

&lt;p&gt;All three protocols are switched from the "LNS Configuration" page in the web console. Switching the uplink driver triggers a gateway reboot — confirm no OTA or configuration write is in progress before switching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source: What's Open
&lt;/h2&gt;

&lt;p&gt;GD6's firmware and web configuration system are open-sourced on GitHub: &lt;strong&gt;&lt;a href="https://github.com/ManThink/gd6-open" rel="noopener noreferrer"&gt;github.com/ManThink/gd6-open&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The open-source design spans several layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complete Web Configuration System&lt;/strong&gt;&lt;br&gt;
A bilingual (Chinese/English) web console covering network backhaul, LoRaWAN server, RF parameters, system logs, firmware upgrades, file system management, and user management. All configuration items are exposed via REST API for programmatic management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Independent Remote MQTT Configuration Channel&lt;/strong&gt;&lt;br&gt;
Through a dedicated MQTT connection, you can remotely read and write permitted configuration items and trigger reboots without physical device access. This channel is completely independent from the data-forwarding MQTT Bridge, using separate connections and credentials. To prevent lockout from remote misconfiguration, the remote channel cannot modify its own Broker settings. Suitable for large-scale gateway operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A/B Dual-Partition OTA&lt;/strong&gt;&lt;br&gt;
GD6 uses an A/B dual firmware partition design. During upgrades, new firmware is written to the inactive partition, verified, and then the boot partition is switched. Even if an upgrade is interrupted or fails, the device boots from the original partition — no bricking. Firmware &lt;code&gt;.bin&lt;/code&gt; files can be built independently and flashed via the web interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessible File System&lt;/strong&gt;&lt;br&gt;
Configuration files under &lt;code&gt;/spiffs&lt;/code&gt; can be viewed and managed from the web console. Configuration JSON takes effect after reboot, supporting deep customization. Note: the &lt;code&gt;web/&lt;/code&gt; directory's static files should not be modified carelessly — overwriting them may render the console inaccessible, and a factory reset will not restore them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Workflow
&lt;/h2&gt;

&lt;p&gt;From power-on to online, the process typically takes under 5 minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Power up&lt;/strong&gt;: Connect the LoRa antenna (antenna must be connected before power-on), then power via Type-C or DC terminal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connect to the gateway&lt;/strong&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Via Ethernet: find the gateway address in your router's DHCP list, open it in a browser&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Via Wi-Fi: connect to the &lt;code&gt;LGW-Config&lt;/code&gt; hotspot, navigate to &lt;code&gt;http://192.168.4.1&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Log in&lt;/strong&gt;: use the default password &lt;code&gt;wifi!0804&lt;/code&gt;, then change it immediately in User Management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure backhaul&lt;/strong&gt;: set up network connection on the "Ethernet" or "Wi-Fi" page&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure LNS&lt;/strong&gt;: select the uplink protocol on the "LNS Configuration" page, enter the network server address and port&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set frequency band&lt;/strong&gt;: confirm the region and sub-band on the "Frequency &amp;amp; RF" page, apply, and restart the LoRa service&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No serial cable needed, no command line required. If a configuration error makes the web console inaccessible, the REC button performs a factory reset — hold for 2 seconds, the device resets and reboots. Network and LoRaWAN configurations are restored to defaults; the written Gateway EUI is preserved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Application Scenarios
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Smart Buildings &amp;amp; Campuses&lt;/strong&gt;&lt;br&gt;
GD6's indoor design and Wi-Fi backhaul suit office buildings and industrial parks. A single gateway can cover one floor of LoRaWAN devices — temperature/humidity monitoring, personnel positioning, energy management. Ethernet provides stable backhaul; Wi-Fi serves as backup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small Industrial Sites&lt;/strong&gt;&lt;br&gt;
The 5–24V wide-voltage power input adapts to industrial power conditions. Models with 4G can deploy in warehouses and workshops without wired network infrastructure, using 4G as primary or backup link. The miniPCIe 4G module is swappable for local carrier bands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development &amp;amp; Prototyping&lt;/strong&gt;&lt;br&gt;
The ESP32-S3's performance and open-source configuration system make GD6 suitable as a LoRaWAN development platform. Developers can manage gateways in bulk via REST API, customize configurations through the file system, and quickly set up test environments to verify device communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Education &amp;amp; Research&lt;/strong&gt;&lt;br&gt;
Universities and research institutions can use GD6 to build LoRaWAN lab environments. Students can explore gateway internals through the web console and file system rather than facing a closed black-box device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Region Global Deployment&lt;/strong&gt;&lt;br&gt;
GD614 and GD618 cover major global frequency bands, and the 4G module is swappable by region — suitable for cross-regional project deployment. The region code in the model number clearly identifies the supported LoRaWAN regional parameters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Specifications
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiugd73o8hxi7ji4qvqg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiugd73o8hxi7ji4qvqg3.png" alt=" " width="552" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Model Numbering
&lt;/h2&gt;

&lt;p&gt;GD6 model format: &lt;code&gt;GD61{4|8}-A{N|G}-{Region}-{Version}-{1|2}&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9o17g14kemghyo1bu82o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9o17g14kemghyo1bu82o.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;GD618-AG-AS923-N-2&lt;/code&gt; = 800 MHz+ RF, with 4G and PoE, AS923 region, default version, SX1302 concentrator.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration with ThinkLink Platform
&lt;/h2&gt;

&lt;p&gt;GD6 is the native gateway hardware for the ThinkLink IoT platform. When used with ThinkLink, you can register gateways with one click and auto-sync Gateway EUI, visually manage devices, thing models, and automation rules through the platform, remotely push configurations without on-site visits, and monitor gateway status and backhaul links in real time.&lt;/p&gt;

&lt;p&gt;At the same time, GD6's full protocol stack support means you're free to connect to any third-party LoRaWAN network server — TTN/TTI, ChirpStack, LoRiot, or a self-hosted LNS are all compatible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn More
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;GD6 Open-Source Repository (firmware + web config): &lt;a href="https://github.com/ManThink/gd6-open" rel="noopener noreferrer"&gt;github.com/ManThink/gd6-open&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GD61x Specifications &amp;amp; User Guide: &lt;a href="https://www.think-link.net/docs/zh/Device/LoRaWANGateway/gd61x-user-guide" rel="noopener noreferrer"&gt;think-link.net/docs/zh/Device/LoRaWANGateway/gd61x-user-guide&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GD6 Configuration Guide: &lt;a href="https://www.think-link.net/docs/zh/Device/LoRaWANGateway/gd6-configuration-guide" rel="noopener noreferrer"&gt;think-link.net/docs/zh/Device/LoRaWANGateway/gd6-configuration-guide&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ThinkLink Platform Website: &lt;a href="https://www.think-link.net" rel="noopener noreferrer"&gt;www.think-link.net&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ManThink Website: &lt;a href="https://www.manthink.cn" rel="noopener noreferrer"&gt;www.manthink.cn&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;ManThink — Making IoT development more efficient.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ThinkLink Integrated Device Library: No Device Left Behind — Retrofitting Starts with a Search</title>
      <dc:creator>manthink</dc:creator>
      <pubDate>Tue, 21 Jul 2026 01:55:52 +0000</pubDate>
      <link>https://dev.to/manthink/thinklink-integrated-device-library-no-device-left-behind-retrofitting-starts-with-a-search-4ed3</link>
      <guid>https://dev.to/manthink/thinklink-integrated-device-library-no-device-left-behind-retrofitting-starts-with-a-search-4ed3</guid>
      <description>&lt;p&gt;Covering 29+ verified field devices across metering, industrial sensing &amp;amp; control, building &amp;amp; environment, and smart agriculture. Search by name, model, or protocol — every device comes with complete integration documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why a "Device Catalog"?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In IoT projects, the hardest part isn't the technology itself — it's figuring out "can I connect this device?"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The client's site has a Schneider Electric power meter with Modbus RTU. Can it go LoRaWAN?&lt;/li&gt;
&lt;li&gt;A heating retrofit project uses CJ/T 188 heat meters on an M-Bus. How do you take them wireless?&lt;/li&gt;
&lt;li&gt;An Acrel multi-circuit power meter — how many circuits per collector?
In the traditional LoRaWAN ecosystem, answering these means: digging through sensor datasheets, scouring ChirpStack codec repositories, writing your own parsing scripts — &lt;strong&gt;every step costs time.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ThinkLink's Integrated Device Library was built to solve exactly this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device-First Search Logic&lt;/strong&gt;&lt;br&gt;
The core philosophy is simple: don't start from platform features — start from what's in the field.&lt;br&gt;
Open &lt;a href="https://www.think-link.net/zh/devices/" rel="noopener noreferrer"&gt;https://www.think-link.net/zh/devices/&lt;/a&gt; and you'll see a clean search interface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search by device name — type "ADW2xx" or "three-phase meter", go straight to the target&lt;/li&gt;
&lt;li&gt;Filter by model — exact model matching supported&lt;/li&gt;
&lt;li&gt;Filter by protocol — Modbus RTU / DL/T 645 / CJ/T 188 / native LoRaWAN, at a glance
No need to understand ThinkLink's architecture first. No need to know what EdgeBus is. Whatever device you're holding, start there.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Four Categories Covering Mainstream Retrofitting Scenarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Metering (11 devices)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpcb3zhbdcq74owe0x372.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpcb3zhbdcq74owe0x372.png" alt=" " width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Covers the most common meter types for building energy monitoring and heating/water metering.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Industrial Sensing &amp;amp; Control (12 devices)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuc2ulhn3q4yl4xsfp2h5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuc2ulhn3q4yl4xsfp2h5.png" alt=" " width="799" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Industrial sites are characterized by diverse device types, inconsistent protocols, and harsh environments. The library covers the complete sensing chain from temperature, level, and RPM to oil spill detection, with KC11/KC21 collectors providing a unified RS-485-to-LoRaWAN access layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Building &amp;amp; Environment (5 devices)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xkklamqsfr0ailuitdx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xkklamqsfr0ailuitdx.png" alt=" " width="799" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Smart Agriculture (1 device, packed with capability)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvpvfo2ttp04nmtvtvu5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvpvfo2ttp04nmtvtvu5.png" alt=" " width="799" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A single KC21 supports up to 3 soil sensors, covering multi-dimensional farmland sensing in one deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Access Paths, One Card Tells the Whole Story
&lt;/h2&gt;

&lt;p&gt;Every device card on the library shows not just the name, model, category, and protocol — it also labels the access path:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsgro2sd2an8727o2fq1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsgro2sd2an8727o2fq1p.png" alt=" " width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And every device card comes with complete integration documentation. Click "View Integration Guide" on any card and you'll jump directly to that device's step-by-step manual, which covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wiring diagrams (which wire goes to which KC collector terminal)&lt;/li&gt;
&lt;li&gt;EdgeBus configuration (function codes, register addresses, data formats)&lt;/li&gt;
&lt;li&gt;Thing model parsing scripts (pre-written JS parsing logic)&lt;/li&gt;
&lt;li&gt;Parameter configuration tables (upload interval, read interval, COV thresholds, slave address)&lt;/li&gt;
&lt;li&gt;Key caveats (e.g., DL/T 645's +0x33 offset encoding, CZ580's register unlock command)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More Than a List — It's an Integration Decision Tool
&lt;/h2&gt;

&lt;p&gt;The library's value goes beyond "looking things up" — it helps integrators make technical decisions:&lt;/p&gt;

&lt;p&gt;Scenario 1: A client says "We have Acrel ADW2xx meters and want energy monitoring."&lt;br&gt;
→ Search the library → Confirm Modbus RTU protocol → Open the integration guide → Learn that 1 KC21 handles 1 ADW2xx with 4 circuits uplinked independently → Assess feasibility in under 10 minutes.&lt;/p&gt;

&lt;p&gt;Scenario 2: A heating retrofit project has Jingquan LXSY-15E cold water meters on site.&lt;br&gt;
→ Search "CJ188" → Confirm KC22 + M-Bus + EdgeBus access → The guide provides complete frame format, data identifiers, and thing model parsing → No need to dig through the CJ/T 188 national standard.&lt;/p&gt;

&lt;p&gt;Scenario 3: Comparing a weighing transmitter vs. ultrasonic level sensor for the right fit.&lt;br&gt;
→ Search both devices → Compare accuracy, response time, power requirements, and integration complexity from the documentation → Make an informed selection based on actual parameters.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Growing Device Ecosystem
&lt;/h2&gt;

&lt;p&gt;ThinkLink's device library is not static. Every time a new device is validated for integration, its documentation is added. The library currently covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocols: Modbus RTU, DL/T 645-2007, CJ/T 188-2004, native LoRaWAN&lt;/li&gt;
&lt;li&gt;Collectors: KC11 (220 VAC powered, Class C), KC21 (battery powered, IP65), KC22 (M-Bus dedicated)&lt;/li&gt;
&lt;li&gt;Brands: Schneider Electric, Acrel, ZENNER, Huizhong, Elitech, Renke, Zhuowen, Disen, Dianyingpu, Shenling, GXHY, Tianwei, Ringder, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have a device not yet listed, ThinkLink's EdgeBus framework supports rapid adaptation. Using EBHelper's JSON configuration or EBSDK's TypeScript scripting, most Modbus RTU devices can be protocol-adapted and added to the library within 30 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The ThinkLink Integrated Device Library is more than the number "29 verified devices." Its real value lies in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lowering the technical evaluation barrier — integrators don't need to become LoRaWAN experts first; just look up the device by name to know if it works&lt;/li&gt;
&lt;li&gt;Shortening project startup time — the complete path from wiring to data-on-platform is already documented for every device&lt;/li&gt;
&lt;li&gt;Eliminating repeated trial-and-error — DL/T 645 offset encoding, M-Bus parity settings, sensor-specific unlock commands — all battle-tested knowledge is baked into the docs, no need to rediscover it on every project
&lt;strong&gt;Start from the device, not the platform.&lt;/strong&gt; That's ThinkLink's answer to the IoT retrofit market.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
  </channel>
</rss>
