微 网 高 通

数据无线传输命令
来源: | 作者:微网高通 | 发布时间: 2025-05-07 | 16 次浏览 | 分享到:

5.1 发送数据


指令发送数据
字节

参数

请求指令

应答指令

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 位地址的低字节

     如果从节点向主节点发送数据,有两种写法:

    • 直接写目标主站的物理地址,比如0X0001,0XFF00 等真实地址

    • 写主站的虚拟地址0X0000,改地址不随主站地址更改而变化,便于程序设计的一致性

备注-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 的属性定义:

  1. 0X00是以TCP形式发送数据报文,报文主体,代表报文的中间部分,不是头尾

  2. 0X01是以TCP形式发送数据报文,报文头部,代表报文的**个片段

  3. 0X02是以TCP形式发送数据报文,报文尾部,代表报文的最后一个片段

  4. 0X03是以TCP形式发送数据报文,单个报文,**写入长度245字节

  5. 0X10是2.4Kbps的语音编码报文,TCP连接,UDP 传送

  6. 0X11是4.8Kbps的语音编码报文,TCP连接,UDP 传送

  7. 0X12是9.6Kbps的语音编码报文,TCP连接,UDP 传送

  8. 0X13是远程语音的播放请求命令,TCP连接,UDP 传送

  9. 0X14是以UDP形式发送,要求接收端会送ACK确认

  10. 0X15是以UDP形式发送,不要求接收端送ACK确认

  11. 0X16 是无线唤醒远端休眠的从站节点,不要求从站确认;其中m_pBuffer的前两个字节是唤醒之后的驻留时间,高字节MSB在前,低字节LSB在后;比如设定 5000(0X1388)毫秒的延时,则m_pBuffer[0X00]=0X13,m_pBuffer[0X01]=0X88;时间后面(从m_pBuffer[0X02]开始的内容)可以跟上用户的UDP数据,且数据长度受电波唤醒报文静荷的总长度限制,默认配置为9个字节的 UDP 静荷长度(不包含2个字节的唤醒驻留时间)。

  12. 0X17 是无线唤醒远端休眠的从站节点,且要求从站确认;其中m_pBuffer的定义与0X16属性相同;从站的确认是应用层确认,不是协议栈本身确认。

  13. 0X1D是以UDP形式发送的带外广播报文,不要求接收端送ACK确认

  14. 0X1E是以UDP形式发送的带外和带内报文,其中带内部分要求接收端送ACK确认

  15. 0X1F是以UDP形式发送的带外和带内报文,其中带内部分不要求接收端送ACK确认

  16. 0X23是TCP形式发送的远程指令,将已经构造好的一个指令的完整报文(包括报文头部m_iHeader,m_iOpCode,m_iValueA,m_iValueB,m_iValueC,m_iValueD,m_iAmount,m_iCRCode和报文扩展部分m_pBuffer)作为本报文的内容(m_pBuffer)发送到目标节点,目标节点会将被封装的报文提取出来并进行执行,将执行的结果返回给发送节点,应答报文属性是0X27。该指令通常用作远程配置和远程诊断等用途。

  17. 如果远程请求指令很长,超出了**的本地指令缓冲区(默认**是254字节),需要切分成多条指令的拼接形式,报文属性具体如下

    • 0X20: 远程请求指令的扩展报文,代表请求指令的中间扩展片段

    • 0X21:远程请求指令的头部报文,代表请求指令的**个片段

    • 0X22:远程请求指令的尾部报文,代表请求指令的最后一个片段

    • 0X23:远程请求指令的整体报文,代表单个请求指令

  1. 如果远程应答指令很长,超出了**的本地指令缓冲区(默认**是254字节),需要切分成多条指令的拼接形式,报文属性具体如下

    • 0X24: 远程应答指令的扩展报文,代表应答指令的中间扩展片段

    • 0X25:远程应答指令的头部报文,代表应答指令的**个片段

    • 0X26:远程应答指令的尾部报文,代表应答指令的最后一个片段

    • 0X27:远程应答指令的整体报文,代表单个应答指令

  1. 报文属性的Bit7:开启/关闭本地回显(是否需要以0X9D回应),Bit7=1是关闭本地回显,Bit7=0开启本地回显

        报文属性的Bit6:要求或者放弃异步通知,Bit6=1是要求异步通知说明发送成功或者失败,Bit6=0是放弃异步通知说明发送成功或者失败

备注-7

发送定长的小型数据块,建议采用 UDP(0X14)发送,如需关闭回显可采用 0X94

备注-8

发送少量的较大数据块,建议采用 TCP(0X03)传送,如需关闭回显可采用 0X83

备注-9

发送大型数据块,比如一张 BMP 图片,建议采用多包组合的 TCP 传送,不关闭回显,首包 (0X01)+ 多个扩展包 (0X00) + 尾包(0X02)

备注-9

SerialNumber:报文序列号码

    1. Bit0-Bit6:报文的序号,取值范围0X00-0X7F。

    2. Bit7:该报文的重复发送指示 Bit7=1:需要接收端比对报文序号Bit0-Bit7,序号相同则放弃本报文,序号不一致则正常接收 Bit7=0:无条件接收该报文

注意: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    备注:无线电波远程唤醒,且要求从站确认



5.2 接收数据


指令接收数据
字节

参数

输出指令

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




5.3 查询发送缓冲区


指令查询发送缓冲区
字节

参数

请求指令

应答指令

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:

    • Bit0~Bit6:报文序号,可以取任意数值,无线模块会同步此序号

    • Bit7:未定义,默认填写 0X00

备注-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




5.4主机的工作状态信息

主机工作状态信息:

1)Byte00:当前的主机工作状态

2)Byte01:当前的网络注册状态

    • Bit0-Bit3:本地运行状态,系统内部定义
    • Bit4-Bit7:网络连接状态:
      1. 0X00:正在搜索网络,没有向基站发出注册请求

      2. 0X01:已经完成和父节点的一次注册,并向基站发出全局注册请求,等待基站批准

      3. 0X02:已经收到了基站的注册批准信号,等待和父节点的二次注册

      4. 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)


说明:发送大型数据包的流程步骤如下:

    1. 通过0X1C指令查询发送的缓冲区长度,检查“主机的工作状态信息”的Byte05-Byte06(红色字体标注),这是实际的可以写入的**长度,超过了该长度,就会造成缓冲区溢出。如果该长度为零,则等待一段时间后(建议100ms)再次查询,否则执行步骤(2);

    2. 通过0X1D指令写入数据,根据应答指令中的返回信息,检查“主机的工作状态信息” 的Byte05-Byte06,获得下一次可写入的**长度,如果该长度为零,则跳转到步骤(1);

    3. 如果还有数据需要写入,执行步骤(2)或者(1),直到全部数据写入完成。


5.5 全局报文描述符

发送大型数据块,比如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的实现方式。