Lora 它物理层有固定的数据格式:
┌──────────┬──────────────┬──────────────┬─────────┐
│ Preamble │ PHY Header │ Payload │ CRC │
└──────────┴──────────────┴──────────────┴─────────┘前导码
报文头:分为显式头和隐式头
载荷:真正传输的数据
CRC 校验
这个格式不用关系,CRC 啥的都是由硬件自动完成的。
项目中只需要关心 Payload 载荷这部分,这个的数据格式是我们自定义的,根据项目需求来。
参数:
lora 就是只负责发送接收数据的,不对数据的安全做处理
安全处理得用lorawan,就像zigbee的zstack框架一样
LoRa 发出的无线帧,只要参数一致,任何 LoRa 接收端都“可能”收到; 但如果数据经过加密,没有密钥就只能拿到一串无法解析的比特流。
这些参数:
频点 / SF / BW / CR / SyncWord
一样的lora才能通信。
它的这个交互就是广播通信。
lora 一对多通信的一种思路,自己瞎想的:
约定,从设备之间是不能直接通信的,只能主和从之间通信。
(1)地址规划
主站固定地址:0x0000
广播地址:0xFFFF
从节点地址池:0x0001 ~ 0xFFFE (建议用 2 字节地址,扩展性好;1 字节会很快不够。)
(2)自定义帧格式
┌────┬──────┬────────┬────────┬────────┬──────────┬────────┐
│Ver │ Type │ DstAdr │ SrcAdr │ Seq │ Len │ Payload│
└────┴──────┴────────┴────────┴────────┴──────────┴────────┘
1B 1B 2B 2B 2B 1B N bytesVer:协议版本Type:消息类型(JOIN_REQ / JOIN_ACK / DATA / ACK / …)0x01 JOIN_REQ:从节点入网请求0x02 JOIN_ACK:主站分配地址应答0x03 DATA:上行数据0x04 ACK:确认包(对 JOIN/DATA/命令都适用)0x05 PING/0x06 PONG:可选,在线检测0x07 BEACON:可选,主站周期广播(用于同步/宣布网络存在)
DstAdr:目的地址(广播=0xFFFF)SrcAdr:源地址(入网前可以填 0xFFFF 或 0x0000,下面我会规定)Seq:序号(用于 ACK/去重/重发)Len:payload 长度Payload:如果需要加密,就加密这个。AES 啥的加密算法。前面的不能加密,需要判断处理的。
这个项目中不需要加密,都是传感器的数据,没必要加密解密。
(3)通信流程
就是主站先启动,然后从设备启动后向主站发送入网请求,描述自己的设备类型,
主站接收后将这个设备记录下来,并生成一个网络地址返回给从设备,
从设备接收后保存这个地址并返回ACK,
这样主站就能通过这个地址找到对应的设备了。
因为从设备都能收到,所以通过地址判断这个报文是不是自己的,如果不是就忽略,是就处理。
用一个链表来保存设备信息,需要的时候遍历。
LoRA 数据安全
(1)私有LoRA
LoRAWan
设计就是要上云的,不是设备直连设备,和zigbee不一样。
LoRa 设备
↓(LoRa)
LoRaWAN 网关
↓(IP)
Network Server
↓
Application Server(云)
LoraWan 是大面积组网使用的,比如城市中远程抄表。
在LoraWan 架构下,设备之间不能直接通信。是星形结构
Device A ─┐
Device B ─┼─▶ Gateway ─▶ Network Server ─▶ Application Server
Device C ─┘
网关是需要准备的另一个芯片实现的设备了。
大约200元以上。