指令 | 发送数据 | ||
字节 | 参数 | 请求指令 | 应答指令 |
1 | m_iHeader | 0XAA | 0XAA |
2 | m_iOpCode | 0X1D | 0X9D |
3 | m_iValueA | Object.MSB | Quantum.Size |
4 | m_iValueB | Object.LSB | Write.Size |
5 | m_iValueC | Attribute | Attribute |
6 | m_iValueD | SerialNumber | SerialNumber |
7 | m_iAmount | Payload.Size | 0X10 |
8 | m_iCRCode.MSB | 0X## | 0X## |
9 | m_iCRCode.LSB | 0X## | 0X## |
10 | m_pBuffer[0] | Payload[0] | Host.Status |
11 | m_pBuffer[1] | Payload[1] | NET.Status |
12 | m_pBuffer[2] | Payload[2] | IOS.Head |
13 | m_pBuffer[3] | Payload[3] | IOS.Used.MSB |
14 | m_pBuffer[4] | Payload[4] | IOS.Used.LSB |
15 | m_pBuffer[5] | Payload[5] | IOS.Free.MSB |
16 | m_pBuffer[6] | Payload[5] | IOS.Free.LSB |
17 | m_pBuffer[7] | Payload[7] | IOS.Size.MSB |
18 | m_pBuffer[8] | Payload[8] | IOS.Size.LSB |
19 | m_pBuffer[9] | Payload[9] | TCP.Head |
20 | m_pBuffer[10] | Payload[10] | TCP.Used.MSB |
21 | m_pBuffer[11] | Payload[11] | TCP.Used.LSB |
22 | m_pBuffer[12] | Payload[12] | TCP.Free.MSB |
23 | m_pBuffer[13] | Payload[13] | TCP.Free.LSB |
24 | m_pBuffer[14] | 依此类推 …… | TCP.Size.MSB |
25 | m_pBuffer[15] | 依此类推 …… | TCP.Size.LSB |
备注-1 | Object.MSB:目标节点的 16 位地址的高字节 Object.LSB:目标节点的 16 位地址的低字节 如果从节点向主节点发送数据,有两种写法:
| ||
备注-2 | Attribute:报文的属性 SerialNumber:报文的序号 Payload.Size:用户数据静荷的长度 Quantum.Size:协议栈定长数据大小 Write.Size:本次实际写入的报文的长度 Payload[0~N]:用户静荷数据字节 | ||
备注-3 | Host.Status:模块当前的运行状态 NET.Status:模块当前的网络连接状态 | ||
备注-4 | IOS.Head:模块串口或者网口的接收缓冲区**个字节 IOS.Used.MSB:模块串口或者网口的接收缓冲区当前占用的大小高字节 IOS.Used.LSB:模块串口或者网口的接收缓冲区当前占用的大小低字节 IOS.Free.MSB:模块串口或者网口的接收缓冲区当前剩余的大小高字节 IOS.Free.LSB:模块串口或者网口的接收缓冲区当前剩余的大小低字节 IOS.Size.MSB:模块串口或者网口的接收缓冲区当前总数的大小高字节 IOS.Size.LSB:模块串口或者网口的接收缓冲区当前总数的大小低字节 该数据块描述模块的串口或者网口的接收缓冲区的状况,其中 IOS.Size = IOS.Used + IOS.Free,也就是说总大小 = 剩余字节 + 占用字节 | ||
备注-5 | TCP.Head:模块的发送缓冲区**个字节 TCP.Used.MSB:模块的发送缓冲区当前占用大小高字节 TCP.Used.LSB:模块串的发送缓冲区当前占用大小低字节 TCP.Free.MSB:模块的发送缓冲区当前剩余的大小高字节 TCP.Free.LSB:模块的发送缓冲区当前剩余的大小低字节 TCP.Size.MSB:模块的发送缓冲区当前总数的大小高字节 TCP.Size.LSB:模块的发送缓冲区当前总数的大小低字节 该数据块描述模块的发送缓冲区的状况,其中TCP.Size = TCP.Used + TCP.Free,也就是说总大小 = 剩余字节 + 占用字节 | ||
备注-6 | Attribute 的属性定义:
报文属性的Bit6:要求或者放弃异步通知,Bit6=1是要求异步通知说明发送成功或者失败,Bit6=0是放弃异步通知说明发送成功或者失败 | ||
备注-7 | 发送定长的小型数据块,建议采用 UDP(0X14)发送,如需关闭回显可采用 0X94 | ||
备注-8 | 发送少量的较大数据块,建议采用 TCP(0X03)传送,如需关闭回显可采用 0X83 | ||
备注-9 | 发送大型数据块,比如一张 BMP 图片,建议采用多包组合的 TCP 传送,不关闭回显,首包 (0X01)+ 多个扩展包 (0X00) + 尾包(0X02) | ||
备注-9 | SerialNumber:报文序列号码
注意:SerialNumber在发送数量不大的报文的时候,可以设置 SerialNumber 为 0X00,也就是无条件接收;在发送通过连续多包的形式发送较大的数据块的时候,才有必要启用SerialNumber的报文需要比对功能 | ||
请求示例 | AA 1D 7E 50 03 00 0A 45 90 30 31 32 33 34 35 36 37 38 39 | ||
应答示例 | AA 9D 10 0A 03 00 10 49 21 50 30 11 00 10 3A F0 3B 00 00 00 00 01 00 01 00 | ||
请求示例 | AA 1D FE 64 16 00 02 B9 F9 13 88 备注:无线电波远程唤醒,不要求从站确认 | ||
请求示例 | AA 1D FE 64 17 00 02 79 E9 13 88 备注:无线电波远程唤醒,且要求从站确认 |
指令 | 接收数据 | |
字节 | 参数 | 输出指令 |
1 | m_iHeader | 0XAA |
2 | m_iOpCode | 0X1E |
3 | m_iValueA | Source.MSB |
4 | m_iValueB | Source.LSB |
5 | m_iValueC | Attribute |
6 | m_iValueD | 0X00 |
7 | m_iAmount | Payload.Size |
8 | m_iCRCode.MSB | 0X## |
9 | m_iCRCode.LSB | 0X## |
10 | m_pBuffer[0] | Payload[0] |
11 | m_pBuffer[1] | Payload[1] |
12 | m_pBuffer[2] | 依此类推 …… |
13 | m_pBuffer[3] | 依此类推 …… |
备注-1 | 无线模块主动输出,用户不需要做出应答 | |
备注-2 | Source.MSB:原始发送节点的16位网络地址高字节 Source.LSB:原始发送节点的16位网络地址低字节 | |
备注-3 | Attribute:报文属性 如果对端以 0X03 指令的 TCP 形式发送较大的数据块,且无线模块没有做拼包输出的话,用户接收端需要自己做拼包处理,具体如下: 0X01:**包,代表这是**包,后面还有会尾包,可能会有中间包 0X00:中间包,中间包可能会有多个,也可能没有 0X02:尾包,如果有**包,一定会有尾包 0X03:仅此一包,也就是首包 + 尾包(0X03=0X01 + N * 0X00 + 0X02),N为自然数 | |
备注-4 | Payload.Size:报文长度 | |
备注-5 | Payload[0-N]:报文的静荷部分 | |
示例报文 | AA 1E FD D7 14 00 0A 85 85 30 31 32 33 34 35 36 37 38 39 |
指令 | 查询发送缓冲区 | ||
字节 | 参数 | 请求指令 | 应答指令 |
1 | m_iHeader | 0XAA | 0XAA |
2 | m_iOpCode | 0X1C | 0X9C |
3 | m_iValueA | 0X00 | Quantum.Size |
4 | m_iValueB | 0X00 | 0X00 |
5 | m_iValueC | 0X00 | 0X00 |
6 | m_iValueD | 0X00 | 0X00 |
7 | m_iAmount | 0X00 | 0X10 |
8 | m_iCRCode.MSB | 0X## | 0X## |
9 | m_iCRCode.LSB | 0X## | 0X## |
10-25 | m_pBuffer[0-15] | 定义同 0X9D 指令,详见“主机的工作状态信息” | |
备注-1 | Quantum.Size:协议栈定长数据大小 | ||
备注-2 | 请求指令参数 m_iValueB:未定义,可以取任意数值,默认填写 0X00 m_iValueC:未定义,可以取任意数值,默认填写 0X00 m_iValueD:
| ||
备注-3 | 应答指令参数 m_iValueB:同请求指令,未做修改 m_iValueC:同请求指令,未做修改 m_iValueD:同请求指令,未做修改 | ||
请求示例 | AA 1C 00 00 00 FF 00 1A BD | ||
应答示例 | AA 9C 10 00 00 FF 10 5A B4 50 30 00 00 00 3B 00 3B 00 00 00 00 01 00 01 00 |
主机工作状态信息:
1)Byte00:当前的主机工作状态
2)Byte01:当前的网络注册状态
0X00:正在搜索网络,没有向基站发出注册请求
0X01:已经完成和父节点的一次注册,并向基站发出全局注册请求,等待基站批准
0X02:已经收到了基站的注册批准信号,等待和父节点的二次注册
0X03:完成了和父节点的二次注册工作,节点已经处于联网状态。
上述应答示例中,0X30(Byte1=0XAA,Byte11=0X30)的高四位0X03就是代表注册成功
3)Byte02-Byte08(共计7个字节):当前的本地接收缓冲区的信息 Byte02:缓冲区中的**个字节
Byte03:当前已经占用的缓冲区大小的高字节(MSB)
Byte04:当前已经占用的缓冲区大小的低字节(LSB)
Byte05:当前剩余未用的缓冲区大小的高字节(MSB)
Byte06:当前剩余未用的缓冲区大小的低字节(LSB)
Byte07:总共的缓冲区大小的高字节(MSB)
Byte08:总共的缓冲区大小的低字节(LSB)
4) Byte09-Byte15(共计7个字节):当前的网络发送缓冲区的信息
Byte09:缓冲区中的**个字节
Byte10:当前已经占用的缓冲区大小的高字节(MSB)
Byte11:当前已经占用的缓冲区大小的低字节(LSB)
Byte12:当前剩余未用的缓冲区大小的高字节(MSB)
Byte13:当前剩余未用的缓冲区大小的低字节(LSB)
Byte14:总共的缓冲区大小的高字节(MSB)
Byte15:总共的缓冲区大小的低字节(LSB)
说明:发送大型数据包的流程步骤如下:
通过0X1C指令查询发送的缓冲区长度,检查“主机的工作状态信息”的Byte05-Byte06(红色字体标注),这是实际的可以写入的**长度,超过了该长度,就会造成缓冲区溢出。如果该长度为零,则等待一段时间后(建议100ms)再次查询,否则执行步骤(2);
通过0X1D指令写入数据,根据应答指令中的返回信息,检查“主机的工作状态信息” 的Byte05-Byte06,获得下一次可写入的**长度,如果该长度为零,则跳转到步骤(1);
如果还有数据需要写入,执行步骤(2)或者(1),直到全部数据写入完成。
发送大型数据块,比如30K+字节的时候,为了方便接收方显示接收进度并自动进行CRC校验,发送端通常会发送一个全局报文描述符的报文,报文属性0X3F。
该报文的数据结构定义如下:
1)数据块的大小,32位长度
Byte00:数据长度24-31位
Byte01:数据长度16-23位
Byte02:数据长度8-15位
Byte03:数据长度0-7位
2) 数据块的CRC校验
Byte04:CRC32数据的24-31位
Byte05: CRC32数据的16-23位
Byte06:CRC32数据的8-15位
Byte07:CRC32数据的0-7位
3)业务的流水序列号码
Byte08:业务流水序列号码的24-31位
Byte09: 业务流水序列号码的16-23位
Byte10:业务流水序列号码的8-15位
Byte11:业务流水序列号码的0-7位
计算CRC32的函数和算法,参考附录中的CRC-32的实现方式。