LoRaWAN

LoRaWAN 驱动参考:内置的 Basics Station 网络服务器、网关证书、传感器与集中器两种注册,以及负载寻址。

以 Markdown 查看

LoRaWAN 驱动把 Ganter Lab 变成一台小型的 LoRaWAN 网络服务器。这层关系的方向和大多数驱动是反的:不是工作站去够传感器,而是网关连到 Ganter Lab,传感器则把它们的读数作为上行数据通过那个网关送上来。Ganter Lab 内置了一台说 Semtech LoRa Basics Station 协议的网络服务器,所以任何跑着 Basics Station 固件的网关都能把本工作站当作它的 LNS。

内置服务器是在第一台已启用的 LoRaWAN 设备被载入正在跑的连接器时启动的,不是在应用开机时,并在最后一台被移除或禁用时停下:一台传感器和一台集中器都没配置时,端口上根本没有人在听。加一台就把它带回来,不必重启应用。

这个驱动下面的每一台设备都是两种注册之一,在它的面板里选:

  • 一台传感器,由它的 DevEUI 标识,凭它的应用密钥被接纳。它的点位解码上行数据的负载。
  • 一台无线集中器(也就是网关),由它的 Station EUI 标识,并注册在一个从列表里挑出来的无线区域上。它自己不带点位。

集中器和传感器都要注册。Basics Station 集中器一连上来就会索要它的无线配置,在得到答复之前一个字都不转发,所以一台从未见过它 Station EUI 的工作站,会让它后面的每一台传感器都没有数值,而连接本身看上去还挺健康。答复是根据你挑的那个区域在这里生成的;没有什么配置文本要你去粘贴。

网络服务器与端口

项目 取值
协议 LoRa Basics Station(WebSocket,JSON)
监听 所有接口,TCP 端口 5001,只走 TLS
网关地址 wss://<station-address>:5001
发现端点 Basics Station 的 router-info 请求由同一个监听器服务
数据连接 以网关的 Station EUI 作为 WebSocket 路径的最后一段来寻址

监听永远是 TLS。没有哪个设置能把加密关掉:除了本地回环地址(它从厂区网络够不着,存在只是为了进程内测试)之外,任何地方都拒绝明文 HTTP 的监听。

证书

接纳靠的是双向 TLS:服务器用自己的证书证明它是谁,而每一台网关都必须用一份客户端证书证明它是谁。

服务器证书。 首次启动时自动生成,存在应用数据文件夹的 ua\pki\own\private 下面:

  • GanterLabOPCUAServer-with-san.pfx:私钥,用一个随机口令加密,而那个口令本身按 Windows 用户受保护(DPAPI),所以这一对文件被复制到别处之后,谁也打不开。
  • GanterLabOPCUAServer-with-san.pem:公开证书。这就是你装到网关上、让它信任本工作站的那个文件。

这份证书是自签名的,而且永不过期。它的公开那一半是你亲手在每一台集中器上装一次的,所以一份会到期的证书,会在它周年那天把整个传感器网络拖垮,在集中器那里被拒绝,而本工作站什么都看不到,还要跑一趟每一台集中器才能把它救回来。这里没有到期提醒,也没有续期命令,因为根本没有什么要续;驱动页面把它带的那个日期作为一个读数显示出来。

只有两种情况下它会被重新写一次,而且两种都会写进诊断日志:

  • 存下来的文件已经打不开了,例如它是由另一个 Windows 账户写的。
  • 它是由本应用较早的版本签发的,那时给的有效期是 12 个月。

这两种情况下,驱动页面都会说一次:每一台集中器都得拿到新的 GanterLabOPCUAServer-with-san.pem。在它们拿到之前,它们连不上。

网关客户端证书。 每一台网关都必须在 TLS 握手期间出示一份客户端证书;没有证书的握手在任何数据流动之前就被丢掉。这份证书必须:

  1. 在这台 Windows 机器上构成一条有效的证书链(根不受信任之类的链错误会拒绝连接,诊断日志记下是哪一项检查没过)。
  2. 在它的主体通用名或者一个 DNS 主体备用名里带上这台网关的 Station EUI。这个标识符是按值来读的,所以 AABBCCDDEEFF0011AA-BB-CC-DD-EE-FF-00-11AA:BB:CC:DD:EE:FF:00:11 点的都是同一台网关。
  3. 点名的必须是数据连接自称的那一台网关:一份点名了另一台网关、而不是连接地址里那一台的证书会被拒绝。

连接字段

LoRaWAN 设备没有自己的主机或端口:传感器是通过承载它无线流量的那台集中器够到的,而集中器够到的是本工作站。面板先显示注册类型的选择器,然后才是那种注册需要的字段。

字段 它是什么 格式 默认值
注册为 这台设备是两种注册中的哪一种:传感器无线集中器。切换它会清掉下面的字段,因为应用密钥和区域不是一回事。 传感器 / 无线集中器 传感器
DevEUI(传感器) 这台传感器的 DevEUI,也就是它在入网请求里出示的身份。 16 位十六进制数,可以是纯的(8899AABBCCDDEEFF)、带短横线的(88-99-AA-BB-CC-DD-EE-FF)或者带冒号的。
应用密钥(传感器) 这台传感器的 OTAA 应用密钥(AppKey)。它为入网做认证,并派生出会话密钥。 恰好 32 位十六进制数,不带分隔符。
Station EUI(集中器) 这台集中器的 Station EUI,也就是它的客户端证书必须带着、并且它写进连接地址里的那个标识符。 16 位十六进制数,上面那几种写法都行。
无线区域(集中器) 这台集中器所在的地方。它决定本工作站在它连上时交给它的信道、数据速率和接收窗口。从列表里挑;没有自由文本。 欧洲 868 MHz、美国 915 MHz、澳大利亚 915 MHz、亚洲 923 MHz、中国 470 MHz(修订版 1)、中国 470 MHz(修订版 2) 欧洲 868 MHz
无传输的最长时间(传感器) 这台传感器可以安静多少秒,超过之后它存着的那些值就不再算作读数。填 0 关掉过期。见下。 0 或更大 3600

标识符留空会退回到规整过的设备名称,而那几乎从来不是一个有效的 EUI,所以请把它填上。

应用密钥是一份机密,本工作站也这样对待它。面板把它藏在圆点后面,旁边有一个显示密码的勾选框,让你在核对刚输入的内容时看到它;配置数据库把它保护起来,绑在输入它的那个 Windows 账户上;它既不出现在诊断日志里,也不出现在驱动读取的地址里,那个地址只带着 DevEUI。换一个 Windows 账户打开同一份配置,这把密钥不会跟着打开:这个字段会空着回来,并写着“在这个 Windows 账户下无法读取:它只能在输入它的那台计算机和那个 Windows 账户上打开。请在这里重新输入。”,在你重新输入密钥之前,传感器不会再入网。用备份带走的配置会保住它,因为备份是用你给它的密码封起来的。

入网只支持 OTAA:传感器通过集中器做一次空中入网,网络服务器用配置好的 AppKey 来应答它。来自任何已配置设备都不带的那个 DevEUI 的入网请求会被拒绝并写进诊断日志。不支持个性化激活(ABP,预先下发的会话密钥)。

禁用或删除一台设备会立刻把它从网络服务器上摘下来,不必等重启:它的密钥离开注册表,任何集中器为它持有的会话都被释放,它下一次入网会被拒绝。服务器不接受的注册,比如打错的 DevEUI、应用密钥、Station EUI 或区域,会让设备读作没有连上,诊断日志会点名被拒绝的是哪个字段。

交给集中器的是什么

一台已注册的集中器做完它的版本握手之后,本工作站会用它所在区域的无线配置来应答:频率范围、数据速率以及其中哪些只用于下行,还有这个区域默认的信道计划。如果这个 Station EUI 没有在这里注册,那就什么都不发,诊断日志会说是哪一台网关问的、以及它没有注册。集中器连上了、而它后面一台传感器都从来没报过数值时,要找的就是这条记录。

没有轮询间隔字段。LoRaWAN 是推送式的:传感器自己决定什么时候上行,服务器按设备保留最近解码出来的那些负载,而点位的数值以固定的一秒周期从那份缓存里刷新。

因此,一台还没上行过的传感器是没有读数,而不是读数失败。点位保持空,设备报告的是“什么都还没观察到”,而不是转为离线,也不会有失败写进诊断日志:等第一次上行,正是协议在正常工作。而在传感器确实发来的负载里解析不到东西的地址是另一回事,那会作为一次读取失败原样报告出来。

传感器安静下来的时候

因为没有谁去轮询传感器,所以它最后发来的那份负载会一直待在缓存里,直到它再发一份。放着不管的话,一台电池耗尽的传感器会在工作站运行的整段时间里,一直把同一个数字当作一次好的读数发布出去,喂给图表、历史和报警一个已经不再为真的值。

因此每一台传感器都在自己的面板里带着一个以秒为单位的无传输的最长时间。默认是 3600 秒,也就是一小时,对常见传感器十到三十分钟的节奏来说绰绰有余;报得更稀的传感器就把自己的这个值抬高。过了那个期限:

  • 它的点位不再带数值,改为发布质量不可用,而不是把最后一次上行重复下去。
  • 设备面板会说这台传感器最后一次传输是什么时候,好让你看出它安静了多久。

把这个字段设成 0 就关掉了那台传感器的过期:它最后一次上行会一直读作良好。别的什么都不变,也不会丢弃任何存下来的负载。

点位寻址

LoRaWAN 的点位寻的是解码后上行负载里的字节。没有自由文本地址;“来源”卡片提供两种模式下的定型字段,由按 Cayenne LPP 通道/类型寻址这个勾选框切换:

字段 作用 取值 默认值
按 Cayenne LPP 通道/类型寻址 关:通道字段就是一个普通的字节偏移。开:在负载里搜索一个 Cayenne LPP 的通道/类型对。 开 / 关
通道 / 负载偏移 偏移模式:这个值起始处那个从 0 起的字节偏移。LPP 模式:要搜索的那个 LPP 通道号。 0 或更大 0
LPP 类型码 只在 LPP 模式下有:跟在通道字节后面的那个 Cayenne LPP 数据类型字节(例如温度是 103)。数值字节是从匹配上的那个通道/类型对紧后面读起的,而有好几份负载都匹配时,最新的那一份胜出。 0 或更大 0
读取长度(字节,留空 = 自动) 这个值由多少个负载字节组成。留空就由数据类型推出来:Boolean 和 Byte 是 1,Int16 是 2,Int32 和 Float 是 4,String 是 16。 1 或更大,或留空 留空
位掩码(十六进制,留空 = 无) 一个十六进制掩码,在别的一切之前先与原始字节做按位与(例如用 0x0FFF 把状态位甩掉)。0x 前缀可写可不写,长度为奇数的掩码会在左边补零。掩码覆盖的字节数必须和读取长度恰好一样,否则读取报错。 十六进制文本或留空 留空
高位字节在前 声明这份负载里的值是大端序的;读到的字节在转换之前会被翻转。这里没有字序框:一份任意长度的负载里没有 16 位的字可以交换。 开 / 关
倍数(留空 = 无) 一个总线侧的系数,由网络服务器在解码之后立刻应用,早于这个值进入点位自己的转换链。只对数值类型有效。填 0 会在打字的地方就被拒绝(“倍数为 0 会把每一次读数都归零。”),因为那会让这个点位每一次读数都以良好质量报成 0。 除 0 以外的任何数字,或留空 留空

一次读取的操作顺序是:取出被寻址的那些字节 → 应用位掩码 → 若“高位字节在前”则翻转 → 转换成点位的数据类型 → 应用倍数(数值类型)。

例子,针对一台 11 字节负载在偏移 2 处带着一个大端序 Int16 温度的传感器:

  • 偏移模式:通道/偏移填 2,读取长度填 2,“高位字节在前”打开。
  • LPP 模式,同一台传感器在通道 1 上以类型 103 说 Cayenne LPP:勾上 LPP 勾选框,通道填 1,类型码填 103,读取长度填 2

支持的数据类型

类型 读取字节数(自动) 这些字节怎么解释
Boolean 1 零为假,其余为真
Byte 1 无符号字节
Int16 2 有符号 16 位整数
Int32 4 有符号 32 位整数
Float 4 IEEE 754 单精度
String 16 读取长度那么长的 UTF-8 文本

写入与设备发现

LoRaWAN 的点位是只读的:数值只来自传感器的上行数据,读写字段不提供可写的选项,运行时也会拒绝一次写入而不是假装成功。下行在协议里作为网络流量存在(入网接受、MAC 命令),从来不作为点位数值的写入。

这个驱动没有设备发现扫描。请手工用 Station EUI 和区域添加集中器,再手工用 DevEUI 和 AppKey 添加每一台传感器;一般的添加设备流程见 Connector 页面。