@superpigy
2020-11-20T15:26:04.000000Z
字数 19423
阅读 25
版本 | 修改内容 | 提交人 |
---|---|---|
0001 | TV格式设备状态改成1B 标签信息上传指令分畜牧业标签cla=0x21和定位标签cla=0x22 |
屈琦伟 |
当前版本:0001
本项目的目标是实现CAN定位节点、CAN网关、网络定位节点与 主机之间的通讯
协议需要与网络定位节点的协议兼容
此协议适用UDP、2.4G 和 Zigbee 的传输
配置接收端口:3824 (该固定,不允许变更)
发送目标端口:3721(可修改,用于定位信息上传)
协议格式 | 前缀标识 | 长度 | PREFIX | 数据包 | CRC |
---|---|---|---|---|---|
1B | 1B | 2B | ... | ... | 2B可选 |
高4bits为协议格式, 局域网新版协议固定为8,
低4bits为系统类别(0~15) , 定位固定为8,
所以,定位系统为0x88
0x01- 校验码(可选)
附加尾缀: 校验码="协议格式"开始到"数据包"结束的所有数据计算CRC16
udp 有自身的校验,不需要这个CRC16
Zigbee传输模式下,如果是带分隔符的方式,也自带校验,不需要这个CRC16
Zigbee老模式不带分隔符,必须携带这个CRC16
2.4G 卡的代码中带了这个CRC16,但实际上硬件机制中有CRC16,所以应该省略
0x02 - 源地址(4B)--最初发指令的设备地址
主机(引擎)发送时: 必须带,000000开头(高000000XX低)
0x04 - 目标地址(4B)
0x08 - 系统编号(4B)
注: 同一个CAN网关下的节点,系统编号必须相同,网关自动强制同步
0x40 - 存在中继负载信息
0x80 - 网关地址(4B)(经过网关时添加)
编号: CAN节点、网络节点、网关统一编号
PREFIX + 数据包,不算CRC
按照前缀标识存放数据,数据顺序如下:
系统编号 | 源地址 | 目标地址 | 中继负载信息 | 网关地址 | |||
---|---|---|---|---|---|---|---|
4B | 4B | 4B | 12B | 4B |
CLA | INS | PARAMS |
---|---|---|
指令类别 | 指令码 | 指令参数 |
1B | 1B | ... |
- CLA
bit7,6:
- 00~指令
- 01~消息
- 10~ACK
- 11~NAK
bit5~0
0 通用类别
1 网关(该系列指令不会转发到CAN节点)
2~7 系统保留
0x08 定位基站
INS
指令码
PARAMS
尽量采用4字节对齐的模式来安排各个字段
注: 在错误应答中,在参数中存放2字节错误码
指令:
INS=0x00
PARAMS=参数ID(4B)
应答:
PARAMS=参数ID(4B)+参数值(...B)
属性ID:
0~ 保留
1~ 设备编号(4B,逻辑编号,默认等于CPUID)+CPUID(4B)+设备型号(2B)+固件版本(2B)+硬件版本(1B)+保留(1B)
2~
3~
6~ 初始化参数(8B)--见 出厂格式化
7~ 当前时刻(4B)
8~ IP地址: 模式(1B,1~DHCP, 2~静态IP)+IP(4B)+掩码(4B)+网关(4B) (CAN节点不支持)
9~ FLASH-IP地址,同上(CAN节点不支持)
12~主机IP(4B)+主机通讯端口(2B,发送到主机)+本地通讯端口(0000H 表示自主分配)(CAN节点不支持)
14~PING间隔(2B,秒,默认10s)
15~4G模块FLASH中的协议类型(1B)
16~4G模块内存中的协议类型(1B)+通道掩码(1B)+网络状态(1B)+信号强度(1B)+ping间隔(2B,秒)
17~授权信息
18~RSSI_M1(1B)+保留(1B)+ RSSI_N(2B,环境因子*100)
19~扫描模式(1B,0定长,1动长)+扫描波特率(1B)
25~zigbee参数(14B)
网关收到指令后,应将所有子节点信息全部上传(包括自身)
对于节点不支持的属性则忽略
指令:
INS=0x01
PARAMS=参数ID(4B)+参数值(...B)
应答:
PARAMS=参数ID(4B)+参数值(...B)
属性ID:
8~ IP地址: 模式(1B,1~DHCP, 0~静态IP)+IP(4B)+掩码(4B)+网关(4B) (CAN节点不支持)
9~ FLASH-IP地址,同上(CAN节点不支持)
12~主机IP(4B)+主机通讯端口(2B,发送到主机)+本地通讯端口(0000H 表示自主分配)(CAN节点不支持)
14~PING间隔(2B,秒,默认10s)
15~4G模块FLASH中的协议类型(1B)
16~4G模块内存中的协议类型(1B)+通道掩码(1B)+网络状态(1B)+信号强度(1B)+ping间隔(2B,秒)
18~RSSI_M1(1B)+保留(1B)+ RSSI_N(2B,环境因子*100)
19~51822模块扫描模式(1B,见下表)+2.4G信道(1B)+[蓝牙1扫描模式(1B)+蓝牙2扫描模式(1B)]
20~以太网络协议类型(0-停止转发,1~UDP,2-TCP)
21~4G模块通道信息[通道号(1B)+协议类型(1B)+ 通道参数(主机IP(4B)+主机通讯端口(2B)+本地端口(2B)],若通道号0,stm32需要存储作为默认4G地址,其他不需要存储
22~4G模块配置生效
23~4G模块flash中的profileId(1B)+APN长度(1B)+APN内容(...)
24~4G模块内存中的profileId(1B)+APN长度(1B)+APN内容(...)
25~zigbee参数(网络1B+频段1B)
51822扫描模式 | 信道 | 蓝牙扫描模式 | |||||
---|---|---|---|---|---|---|---|
定长/动长,仅针对2.4G模式 | 仅2.4G模式 | ||||||
1~定长250k,CRC8 2~动长250k,CRC16 3~蓝牙BLE |
0~0 1~ |
3~ble 4~ble 125K |
|||||
指令:
INS=0x02
PARAMS=格式化标记(8B)+初始属性(8B)
应答:
PARAMS=(无)
说明:
格式化标记:"FOFIAXYK"
初始属性:传输工作模式(1B)+模块工作模式(1B)+代理商编号(2B)+设备逻辑编号(4B)
注: 对于网关,如果是通用地址,则所有子节点都同时被格式化
此配置通过ping从网卡和4G发送到平台
传输工作模式
bit0 | 1 | 2 | 3,4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
1:中继将2.4G发送到网关时,不带SOF/EOF分隔符(兼容旧版网关) | 1:网关专用:接收不带SOF/EOF分隔符的消息(兼容旧版中继) | 1:中继-接收RTLS消息,网关-发送RTLS-PING | 网卡模式 bit00:默认 bit01:启用(必选),10秒检测一次,失败10次后重启 bit10:可选 bit11:禁用,不发数据,仅支持配置 |
1:老中继-仅在RAW模式下生效,不发送CRC16 | ||
模块工作模式
bit0 | 1 | 2 | 3 | 4 | 5 | 6,7 | |
---|---|---|---|---|---|---|---|
nrf51822 1禁用,0启用 | 蓝牙 1禁用,0启用 | 远距离蓝牙 1禁用,0启用 | 4G传输 1:禁用 0:启用 |
zigbee传输 11:禁用,参数配置为中继,但不发数据 01:网关接受模式, 00:中继发送模式 |
|||
指令:
INS=0x08
注: 对于网关,如果是通用地址,则所有子节点都同时被重启
指令:
INS=0x09
PARAMS=授权标记(8B)+ 授权信息(12B)
说明:
授权标记"FOFIAXYK"
授权信息= 有效期(4B,YYYYMMDD)+校验码(8B)
注: 设备只是单纯的保留这个授权信息,以后在运行过程中PING包会输出这个授权码,此时引擎端分析授权码,得到有效期,如果设备超出有效期,引擎忽略该设备的所有数据
校验码由工具计算计算方式:用户密钥+设备编号+PROXYID(2B)计算md5取前8B
指令:
INS=0x0a
PARAMS=固件数据起始地址(4B)+固件数据长度(4B)+随机数A(8B)+密码(8B)
应答:
PARAMS=随机数B(8B)
说明:
设备中固件存放位置不一定从0开始的,这里下载固件起始地址按hex文件实际地址下发,如现在的地址是0x08004000
随机数A请保证每次不同,设备未完成升级前,对相同随机数A不响应,目的是放置恶意不断发送准备升级指令
密码计算方式:随机数A(8B)+"YZKJT6ny3sof4PSJ"计算MD5,取前8B
指令:
INS=0x0b
PARAMS=地址(4B)+数据(xB)
应答:
PARAMS=下一起始地址(4B)
说明:
地址为实际地址
主机发送固件数据后需要等待设备应答,再发送下一包
指令:
INS=0x0c
PARAMS=数据校验(16B)
应答:
PARAMS=数据校验状态(1B)
说明:
数据校验算方式:固件总数据(xB)+随机数A(8B)+随机数B(8B)+"YZKJT6ny3sof4PSJ"计算MD5
升级状态:0代表校验失败,1代表校验成功
数据校验成功后设备不自动重启,等待服务器发送重启指令完成升级
指令:
INS=0x0d
PARAMS=网址长度(2B)+网址(128B,string,以\0填充)
应答:
PARAMS=空
说明:
禁止接收一段时间的广播指令/消息
指令:
INS=0x10|消息模式
PARAMS=静默时长(2B,ms)
静默时长: 一段时间之内,不再响应广播指令
发送:
INS=0x02
PARAMS=系统ID(4B)+保留(8B)
应答:
PARAMS=保留(4B)
系统ID:
前2B必须与PROXYID相同,否则失败
4字节系统编号,在校园卡系统中,前2B是代理商编号,后2B是学校编号(如果不启用学校编号,则保持为0)
中继会通过Zigbee 和udp 两种形式上报
发送:
CLA|=消息模式
INS=0x00
PARAMS=设备编号(CPU_ID 4B)+设备MARK(复位计数 4B)+当前时刻(4字节 10ms)
注:
开机10秒后发送一次,以后每5分钟发送一次
说明:旧版中继使用CLA=0x10,网关使用0x11
发送:
CLA|=消息模式
INS=0x01
PARAMS=设备编号(CPU_ID 4B)+设备MARK(复位计数 4B)+当前时刻(4字节 10ms)+设备型号(2B)+设备固件版本(2B)+设备硬件版本(2B)+模块状态(2B)+【授权信息(4B时间+8B验证码)+设备标志位(1B)+传输工作模式(1B)+模块工作模式(1B)+空1B+工作状态(4B)+[4G网络状态(1B)+4G信号强度(1B)+4G模块IMEI(8B)+4G模块固件型号(2B)+4G模块固件版本(2B)+4G模块硬件件版本(1B)+预留(1B)+IMSI(8B),仅当模块存在时才有本信息]】
传输工作模式(1B)+模块工作模式(1B)见出厂格式化3.1.3, 老网关模块工作模式为空
设备标志位:
bit0 ~ 1:已执行格式化,0未格式化(出厂格式化指令,设置代理商编号(2B)+设备逻辑编号(4B))
bit1 ~ 1:已执行初始化(设置系统代码,系统ID(4B)后置位)
bit2 ~ 1:已授权(设备授权后置位)
bit3 ~ 1:DHCP模式开启
bit4~7 ~ 保留
工作状态:
bit0 ~ 4G模块异常
bit1 ~ 2.4G模块异常
bit2 ~ 蓝牙模块异常
bit3 ~ 远距离蓝牙模块异常
bit4 ~ 内部无线模块异常(zigbee,远距离蓝牙等)
模块状态:
bit0 ~ 4G模块存在
bit1 ~ 2.4G采集模块存在
bit2 ~ 正常蓝牙采集模块存在
bit3 ~ 远距离蓝牙采集模块存在
bit4 ~ 内部无线模块存在
注:
开机10秒发送一次,以后每1分钟发送一次
说明:zigbee模块ping只发送到模块状态
这个指令需要考虑一下,是否会影响设备正常工作
说明:
收到2.4g测试指令反会结果到2.4g
设备发送:
CLA|=消息模式
INS=0x20
PARAMS=物理卡号(4B)+测试流水号(4B)+包数量(1B)+包序号(1B)
说明:注:2020年11月4日之前有几台
蓝牙收到的数据,can收到的标签数据通过基站转换后按此指令格式转发到平台
2.4G标签直接发送符合此格式的数据
设备发送:
CLA|=消息模式
INS=0xA0
PARAMS=标签ID(6B)+数据标志(1B)+标签类型(1B)+[TV格式RSSI,0x0C(1B)+RSSI(1B)]+TV格式数据
说明:
标签ID正常为4B,最高2B为0,外购的标签ID为6B
如果设置了定位标志一定包含RSSI,并且RSSI一定要放在TV的第一包
数据标志:
bit0:1定位数据,0非定位数据
标签类型:
1~动物标签
2~人员标签
3~资产标签
4~外购标签
5~手机
说明:
蓝牙收到的数据,can收到的标签数据通过基站转换后按此指令格式转发到平台
2.4G标签直接发送符合此格式的数据
设备发送:
CLA=0x61(消息模式)
INS=0xA0
PARAMS=标签ID(6B)+数据标志(1B)+标签类型(1B)+[TV格式RSSI,0x0C(1B)+RSSI(1B)]+TV格式数据
说明:
标签ID正常为4B,最高2B为0,外购的标签ID为6B
如果设置了定位标志一定包含RSSI,并且RSSI一定要放在TV的第一包
数据标志: bit0:1定位数据,0非定位数据
标签类型:见文档最后
通过2.4G 上报
蓝牙定位卡片,平时在处在设备主动通讯模式下工作
后期可以考虑变更CLA=0x23,0x24,... 用于指示不同的卡类别,譬如二合一卡
工作状态下,每10秒(默认)发送一次 , 静止状态下,每10分钟发送一次
运动状态转换成静止状态时,至少维持1分钟高频发送
发送:
CLA|=消息模式
INS=0x10
PARAMS=物理编号(4B)+tick计数(4B 5S为单位)+标签编号(2B)+标签状态(1B)+标签电压(1B)+工作模式(1B)+上报频率(1B)+保留(...B)
注: 旧版协议中把按键作为一个状态,在PING中发送,新版标签中用独立的指令来发送报警信息
注: 新版协议中去除了低电量标志,改为软件判定
当卡片状态发生改变的时候,如按键信息,需要立刻发送;当无状态改变,5分钟发送一包数据
标签状态:按键 0x02,低电量 0x01,0x04~静止
标签电压: 单位10mv
说明:
卡片处于透传模式下,只是简单的转发信标发送的定位数据,这种模式下,数据传输量会很大
设备发送:
CLA|=消息模式
INS=0x12
PARAMS=卡号(4B)+时间戳(2B)+mac(6B)+volt(1B)+保留(1B)+distance(2B)+信标区域号(2B)*4
说明:
按键等
设备发送:
CLA|=消息模式
INS=0x16
PARAMS=卡号(4B)+tick计数(4B)+标签编号(2B)+事件类型(1B)+保留(1B)+事件参数(...)
事件类型:
0x01 ~ 按键
事件参数:
保留
说明:
这个模式能上传信标Mac地址,所以单信标定位尽可能采用该协议传输
设备发送:
CLA|=消息模式
INS=0x17
PARAMS=卡号(4B)+记录序号(4B)+标签编号(2B)+标签状态(1B)+ 电压(1B)+Mac地址(6B)+RSSI/距离(2B)
` `
0x40 ~ 新版硬件,采用距离模式
0x80 ~ 按键有效
0x01 ~ 静止
说明:
当某个区域定位信标超过1个时,用该指令发送定位信息
由于协议长度限制,信标编号无法发送,只能发送信标所在区域的顶点位置
设备发送:
CLA|=消息模式
INS=0x18
PARAMS=物理卡号(4B)+记录序号(4B)+标签用户号(2B)+保留(2B)+信标区域号(2B)+[距离(2B)]*N
标签区域号(2B):信标区域(12bits)+区域类型(4bits)
高4bits ~ 区域类型
0~ 无效
1~ 零维定位
2~ 一维定位
4~ 二维定位
8~ 二道门(保留,暂时通过区域号来分辨,如:0x0F01)
在信标中的区域类型按如下方式定义
1~ 零维定位(单个信标)
2~ 一维定位(信标0)
3~ 一维定位(信标1)
4~ 二维定位(信标0)
5~ 二维定位(信标1)
6~ 二维定位(信标2)
7~ 二维定位(信标3)
后12bits ~ 区域号(整型)
距离
低字节在前,高字在后, 0表示无效,单位mm
说明:
考虑一种新的定位方式,该方式不配置区域,只发送距离最短的4~8个信标编号
由于协议长度限制,旧版基站最多支持4个信标
考虑采用新基站,扩充到8个信标来提高可靠度
设备发送:
CLA|=消息模式
INS=0x19
PARAMS=物理卡号(4B)+记录序号(4B)+[信标号(4B)+距离(1B)+电压(1B)]*N
距离: 压缩到1字节,基础单位为10mm, 255表示无穷大, 0表示1米之内
电压: 单位10mv
说明:
考虑一种新的定位方式,该方式不配置区域,只发送距离最短的4~8个信标编号
由于协议长度限制,旧版基站最多支持4个信标
考虑采用新基站,扩充到8个信标来提高可靠度
设备发送:
CLA|=消息模式
INS=0x19
PARAMS=物理卡号(4B)+记录序号(2B)+信标前缀(2B)+[信标号(2B)+距离(1B)+电压(1B)]*4
距离: 压缩到1字节,基础单位为10mm, 255表示无穷大, 0表示1米之内
工作状态下,每10秒(默认)发送一次 , 静止状态下,每1分钟发送一次
运动状态转换成静止状态时,至少维持1分钟高频发送
发送:
CLA|=消息模式
INS=0x1A
PARAMS=物理编号(4B)+tick计数(4B,5S为单位)+标签版本(2B)+标签状态(1B)+标签电压(1B)+工作模式(1B)+上报频率(1B)+保留(...B)
标签版本: 标签固件版本号
标签电压: 单位50mv
工作状态下,每10秒(默认)发送一次 ,连续发送,直到用户自己停止,这个过程中tick计数 保持不变
说明:
按键等
设备发送:
CLA|=消息模式
INS=0x1C
PARAMS=卡号(4B)+tick计数(4B)+标签编号(2B)+事件类型(1B)+保留(1B)+事件参数(...)
事件类型:
0x01 ~ 按键
事件参数:
保留
说明:
按键,发送100包测试指令
设备发送:
CLA|=消息模式
INS=0x20
PARAMS=物理卡号(4B)+测试流水号(4B)+保留0(2B)+包数量(1B)+包序号(1B)
说明:
发送信号测试指令
1.指令模式下基站收到一条回应一条
2.消息模式下基站收到所有的测试包后回应1条
设备发送:
CLA|=消息模式,指令模式
INS=0x21
PARAMS=物理卡号(4B)+测试流水号(4B)+需要发送的包总数量(1B)+当前包序号(1B)+补足码(补满60B或30字节)
说明:
发送信号测试指令,基站收到后回应的数据
1.指令模式下基站收到一条回应一条
2.消息模式下基站收到所有的测试包后回应1条
设备发送:
CLA|=消息模式,指令模式的返回
INS=0x21
PARAMS=基站编号(4B)+物理卡号(4B)+测试流水号(4B)+已接收到的包总数量(1B)+最后收的包序号(1B)+补足码(可有可无)
说明:
蓝牙收到的数据,can收到的标签数据通过基站转换后按此指令格式转发到平台
2.4G标签直接发送符合此格式的数据
设备发送:
CLA=0x62(消息模式)
INS=0xA0
PARAMS=标签ID(6B)+数据标志(1B)+标签类型(1B)+[TV格式RSSI,0x0C(1B)+RSSI(1B)]+TV格式数据
说明:
标签ID正常为4B,最高2B为0,外购的标签ID为6B
如果设置了定位标志一定包含RSSI,并且RSSI一定要放在TV的第一包
数据标志:
bit0:1定位数据,0非定位数据
标签类型见文档最后
网关启动后,立即发送app_cantx_config(0,0),确保所有节点处在无地址状态
网关稍等一段时间(1秒),确保节点已正常启动(清除过期指令)
网关开始监听节点(注册指令和状态指令)
3.1 发现注册指令,则分配地址
3.2 发现状态指令, 设置激活时间
3.3 发现授权指令,向UDP转发
3.4 发现定位记录,向UDP转发
每隔一段时间,网关广播一条状态指令(节点刷狗)
31.. 21 | 20..3 | 2 | 1 | 0 |
---|---|---|---|---|
标准ID[28:18] | 扩展ID[17:0] | IDE | RTR | 保留 |
逻辑地址 | FLAG(2bits)+指令码(1B)+GBP(1B) | 1(扩展模式) | 0(数据帧) | 0 |
ID[28]=0 表示节点=>网关
ID[28]=1 表示网关=>节点
ID[27:18] 表示节点地址,理论上最多允许1023个节点串接(主机总是为0)
<指令码> = 0x01
<参数> = 序列号(4B)+逻辑地址(2B)+从机PING间隔(2B)
<FLAG> = 指令源:0~网关
序列号(4B)全0时,表示对所有设备匹配,可用于将所有设备地址清0
逻辑地址(2B)为0时,表示撤销当前地址,强制节点复位
网关对节点指定一个查询间隔,默认为1秒,每隔这么长时间,节点必须向主机发送一次自身状态信息
<地址码> = 通用地址/特定地址
<指令码> = 0x02
<FLAG> = 指令源:0~网关
<GBP> = 0x00
<参数> = 特定节点地址(2B)+通信时间(2B)
网关定时发送PING指令,节点将其视为刷狗指令和令牌配置指令
参数表示当前持有令牌的设备编号
<地址码> = 特定地址
<指令码> = 0x03
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 时间间隔(1B,以秒为单位)
<参数> = (无)
<地址码> = 特定地址
<指令码> = 0x04
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0x00
<参数> = (无)
<地址码> = 特定地址
<指令码> = 0x04
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0x01
<参数> = (无)
<地址码> = 特定地址
<指令码> = 0x04
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0x02
<参数> = (无)
<地址码> = 通用地址/特定地址
<指令码> = 0x05
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0x00
<参数> = SYSTEMID(4B)
<地址码> = 通用地址/特定地址
<指令码> = 0x05
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0x01
<参数> = 扫描模式(1B)+扫描波特率(1B)
<地址码> = 通用地址/特定地址
<指令码> = 0x05
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0x02
<参数> = 保留(1B)+RSSI_M1(1B)+ RSSI_N(2B,环境因子*100)
<地址码> = 通用地址/特定地址
<指令码> = 0x06
<FLAG> = 指令源: 1~引擎,0~网关
<参数> = 序列号(4B)
序列号(4B)全0时,表示对所有设备匹配
5.3.11 FORMAT
<地址码> = 通用地址/特定地址
<指令码> = 0x07
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0
<参数> = 固件数据起始地址(4B)+固件数据长度(4B)
<地址码> = 通用地址/特定地址
<指令码> = 0x07
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 1
<参数> = 随机数A(8B)
<地址码> = 通用地址/特定地址
<指令码> = 0x07
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 2
<参数> = 固件数据起始地址(4B)+固件数据(4B)
<地址码> = 通用地址/特定地址
<指令码> = 0x07
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 3
<参数> = 固件数据校验码(8B)
数据校验码计算方式:固件总数据(xB)+随机数A(8B)+随机数B(8B)+"YZKJT6ny3sof4PSJ"计算MD5,取前8字节
<地址码> = 通用地址/特定地址
<指令码> = 0x07
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 4
<参数> = 静默时间秒(1B)
设备收到这条指令后需要静默一定时间,固件升级前建议先广播发送本指令让所有设备静默,否则升级容易出错
<地址码> = 0x00
<指令码> = 0x81
<FLAG> = 目标: 0~网关
<参数> = 设备编号(4B)+型号(2B)+版本(2B)
注: 在非地址模式下,发送注册请求
<地址码> = 0x00
<指令码> = 0x82
<FLAG> = 目标: 0~网关
<参数> = 设备编号(4B)+状态(1B)
状态:
bit0:令牌状态,0 释放令牌,1 数据发送忙
bit1:节点异常,0 正常, 1 异常
说明:正常运行之后需要定时上传本指令,否则网关会将设备地址清零,并发送配置指令
在未获取地址模式下,不应该发送该指令,应该发送注册请求
<地址码> = 0x00
<指令码> = 0x84/0x85
<FLAG> = 目标: 1~引擎,0~网关
<GBP> = 0x00
<参数> = 设备编号(4B)+SYSTEMID(4B)
<地址码> = 0x00
<指令码> = 0x84/0x85
<FLAG> = 目标: 1~引擎,0~网关
<GBP> = 0x01
<参数> = 设备编号(4B)+扫描模式(1B)+扫描波特率(1B)
扫描模式:
0x01~2.4G
0x02~ 标准ibeacon
0x04~自定义ibeacon
<地址码> = 0x00
<指令码> = 0x84/0x85
<FLAG> = 目标: 1~引擎,0~网关
<GBP> = 0x02
<参数> = 设备编号(4B)+保留(1B)+RSSI_M1(1B)+环境因子(2B)
注: 在地址模式下,发送状态,该指令被视为PING,定期发送
<地址码> = 通用地址/特定地址
<指令码> = 0x87
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 0
<参数> = 空
<地址码> = 通用地址/特定地址
<指令码> = 0x87
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 1
<参数> = 随机数B(8B)
<地址码> = 通用地址/特定地址
<指令码> = 0x87
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 2
<参数> = 下一个写入的固件地址数据(4B)
<地址码> = 通用地址/特定地址
<指令码> = 0x87
<FLAG> = 指令源: 1~引擎,0~网关
<GBP> = 3
<参数> = 0:失败 1:成功
<地址码> = 通用地址/特定地址
<指令码> = 0x20
<FLAG> = 00
<GBP> = 查询类型
<参数> = 标签ID(4B)
<地址码> = 通用地址/特定地址
<指令码> = 0x21
<FLAG> = 00
<GBP> =
<参数> = 标签ID(4B)+运动判断加速度值(int16,单位mg)+运动滤波周期(2B,单位ms)
<地址码> = 通用地址/特定地址
<指令码> = 0x22
<FLAG> = 00
<GBP> =
<参数> = 标签ID(4B)+采集周期(2B,秒)+广播周期(2B,单位ms)
<地址码> = 通用地址/特定地址
<指令码> = 0x23
<FLAG> = 00
<GBP> =
<参数> = 标签ID(4B)+行为代码(xB)
行为代码:
0:亮灯1, 1:亮灯2 ,2:亮灯3
3:beep
<地址码> = 通用地址/特定地址
<指令码> = 0xA0|标签类型 (0xA1~0xA5)
<FLAG> = 数据源
<GBP> = 数据类型 0x0B(bit7为1表示后面还有数据包,为0表示数据包结束)
<参数> = 标签ID(4B)+运动判断加速度值(int16,单位mG)
注:
标签类型:
0~定位功能,非标签类型
1~动物标签
2~人员标签
3~资产标签
4~外购标签
5~手机
数据类型中最高位0表示一组数据的结束,1表示多帧数据中的一帧
<地址码> = 通用地址/特定地址
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x01(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 标签ID(4B)+采集周期(2B,秒)+广播周期(2B,ms)
<地址码> = 通用地址/特定地址
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x02(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 标签ID(4B)+行为索引号(2B)+行为代码(xB)
行为代码:
0:亮灯1, 1:亮灯2 ,2:亮灯3
0x10:beep
0x11:按键
<地址码> = 0x00
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x03(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 设备MAC[0:3](4B)+设备tick(4B)
<地址码> = 0x01
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x04(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 设备MAC[0:3](4B)+运动量(4B)
<地址码> = 0x01
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x05(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 标签MAC[0:3](4B)+运动时间(4B)
<地址码> = 0x01
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x06(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> =
<地址码> = 0x01
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x07(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 标签MAC[0:3](4B)+体温信息(2B)
<地址码> = 0x01
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x08(bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 标签MAC[0:3](4B)+电压(2B,mV)
<地址码> = 0x01
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x09 (bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 标签MAC[0:3](4B)+状态(4B)
<地址码> = 0x01
<指令码> = 0xA0|标签类型
<FLAG> =
<GBP> = 数据类型 0x0A (bit7:1表示后面还有数据包,0表示数据包结束)
<参数> = 标签MAC[0:3](4B)+设备类型(2B)+固件版本(2B)
<地址码> = 0x00
<指令码> = 0xA0
FLAG = 是否为定位数据 0:非定位数据 1:定位数据
<GBP> = 标签类型
<参数> = 标签MAC[0:3](4B)+mac[4:5]+RSSI(1B)+发射功率(1B)
说明:
nRF 模块与CAN节点CPU
4G模块与cpu
STB | CLA | INS | LEN | flag | DATA | CRC8 | ETB |
---|---|---|---|---|---|---|---|
1B | 1B | 1B | 1B | 1B | xB | 1B | 1B |
- 起始字符 STB = 0x1A
- 结束字符 ETB = 0x17
- 转义字符 ESC = 0x1B
0x1B, 0x9A => 0x1A
0x1B, 0x97 => 0x17
0x1B, 0x9B => 0x1B
注: 在STB和ETB之间的中间内容如果出现0x1A,0x17,0x1B都必须转义
- CLA
- bit[6:7]:00~指令,01~消息 10~ACK 11~NAK
- 00 指令必须有回应
- 01 消息可以没有回应
- 10 ACK为对应指令回应正确,并携带反馈数据
- 11 NAK为对应指令的错误反馈,可以携带错误代码也可以不带,一般带2字节错误代码
- bit[0:5] :指令分类,以下文档CLA仅指指令分类部分
- INS:指令
- LEN:DATA未转译之前的原始数据的长度
- FLAG[4:6]:四位表示指令源,PC或手机~4,引擎~3,网关~2,内部中转设备(STM32)~1, 终端模块~0;指令中写明指令源,回应时拷贝指令的flag即可
- FLAG 0表示终端,若只有一个mcu,则flag=0表示此mcu,若是mcu带一个模块,则0表示模块
- 如果设备内部有中转的MCU,1表示此中转设备,比如网关网口数据发给stm32,stm32再传给Nordic,则stm32为1
- 若mcu下面带多个模块,则每个设备单独定义编号
- FLAG[0:3]:作为长度的扩展
- 注: 本系统一律采用消息模式,消息类型全部忽略
如果主机以消息方式发送指令,模块也应当用消息方式应答
指令:
PARAMS[0..3]=属性ID(1B)
应答:
PARAMS[0..3]= 属性ID(1B)+属性值(...)
属性ID:
- 0~系统ID: 系统编号(4B)+设备编号(4B)
- 1~工作模式: 扫描模式(1B)+扫描波特率(1B)
- 2~定位参数: 保留(1B)+rssi_m(1B)+rssi_n(2B)
- 3~模块信息: 设备类型(2B)+固件版本(2B)+硬件版本(1B)
指令源:
必须与指令中的参数相同(引擎~3,网关~2,STM32节点~1, 模块自身~0)
扫描模式:
0x01~2.4G定长
0x02~2.4G动长
0x04~BLE
0x08~BLE Long range
指令:
PARAMS[0..3]= 属性ID(1B) 属性值(...)
属性ID:
- 0~系统ID: 系统编号(4B)+设备编号(4B)
- 1~工作模式: 扫描模式(1B)+扫描波特率(1B)
- 2~定位参数: 保留(1B)+rssi_m(1B)+rssi_n(2B)
指令源:
必须与指令中的参数相同(引擎~3,网关~2,STM32节点~1, 模块自身~0)
扫描模式:
0x01~2.4G定长
0x02~2.4G动长
0x04~BLE
0x08~BLE Long range
应答:
同上
以消息模式发送, 模块=>主机,30秒一次,向主机通报自身工作状态
PARAMS= 模块编号(4B)+系统编号(4B)+保留(1B)+rssi_m(1B)+rssi_n(2B)+扫描模式(1B)+频率通道(1B,仅2.4G)+设备类型(2B)+固件版本(2B)+硬件版本(1B)
注: 模块->stm32,PING(INS=0x80) 30秒一次
模块将收到的标签信息以消息模式发送到主机,这个过程中附加一些定位需要用到的参数
参数说明:
toggle= 消息索引
RSSI= 信标/卡 当前RSSI值
标签负载=卡发的数据定位数据(CLA+PREFIX+LEN+....)
标签负载=mac[6]+uuid[16]+major[2]+minor[2]+rssi_m1
标签负载=mac[6]+uuid[16]+major[2]+minor[2]+rssi_m1
uuid.txpower: "标签/信标"发射功率
uuid.tagType: 卡型,譬如用于区分二合一卡
标签负载=mac[6]+协议类型(1B)+数据格式(1B)+数据
注:参考广播包数据
标签负载=mac[6]+FactoryId(2B)+广播数据
富华FactoryId=0xFAF0,广播数据=协议类型(1B)+数据格式(1B)+数据,详见<<广播数据格式>>
指令:
INS=0x00
PARAMS=参数ID(1B) + 节点ID(4B)
应答:
PARAMS=参数ID(1B)+参数值(...B)
属性ID:
0~ 模块ID(4B)+保留(4B)+设备型号(2B)+固件版本(2B)+硬件版本(1B)+保留(1B)
1~ 节点ID(4B) + 扫描模式(1B,0定长,1动长)+扫描波特率(1B)
2~ 节点ID(4B) + 保留(1B)+ RSSI_M1(1B)+RSSI_N(2B,环境因子*100)
节点ID为0xffff 则为广播模式
节点ID为0x0000 则为模块
指令:
INS=0x00
PARAMS=参数ID(1B)
应答:
PARAMS=参数ID(1B)+参数值(...B)
属性ID:
1~ 节点ID(4B) + 扫描模式(1B,见3.1.2)+扫描通道(1B,见3.1.2)
2~ 节点ID(4B) + 保留(1B)+ RSSI_M1(1B)+RSSI_N(2B,环境因子*100)
节点ID为0xffff 则为广播模式
模块主动以消息方式发送
CLA|=消息模式
INS=0x02
PARAMS=节点同步码(4B)+节点数量(1B)+保留(3B)+主机TICK值(4B)
模块主动以消息方式发送
CLA|=消息模式
INS=0x04
PARAMS=节点ID(4B)
节点ID为0xffff 则为广播模式
节点ID为0x0000 则模块复位
指令:
INS=0x03
PARAMS=索引(1B)
应答:
PARAMS=节点ID(4B)+节点型号(2B)+节点版本(2B)+感应板状态(2B)
感应板状态:
0x8000~出错状态
0x0002~已配置地址
模块主动以消息方式发送
CLA|=消息模式
INS=0x10
PARAMS=节点ID(4B)+标签ID(6B)+数据标志(1B)+标签类型(1B)+[RSSI]+[其他属性]
说明:
标签ID(低字节在前)正常为4B,不足补0,外购标签/手机ID为6B
数据标志:
bit0: 1~定位数据,0~非定位数据
如果设置了定位标志一定包含RSSI,并且RSSI一定要放在TV的第一包,RSSI类型码为0x0C
标签类型:
1~动物标签
2~人员标签
3~资产标签
4~外购标签(6B的序列号)
5~手机(6B的序列号)
注明: 属性均符合TV格式,参见文本末尾的附录
模块主动以消息方式发送
CLA|=消息模式
INS=0x11
PARAMS=节点ID(4B)[+其他属性]
说明:
目前没有其他属性
指令:
INS=0x00
PARAMS=参数ID(1B)
应答:
PARAMS=参数ID(1B)+参数值(...B)
属性ID:
1~ IMEI(8B)+设备型号(2B)+固件版本(2B)+硬件版本(1B)+保留(1B)
14~4G模块与STM32的PING间隔(2B,秒,默认10s)
15~FLASH中的协议类型(1B)
16~内存中的协议类型(1B)+通道掩码(1B)+网络状态(1B)+信号强度(1B)+ping间隔(2B,秒)
23~flash中的profileId(1B)+APN长度(1B)+APN内容(...)
24~内存中的profileId(1B)+APN长度(1B)+APN内容(...)
网络状态(可组合):
0x01~GSM基站在线
0x02~网络在线
指令:
INS=0x01
PARAMS=参数ID(1B)+参数值(...B)
应答:
PARAMS=参数ID(1B)+参数值(...B)
属性ID:
14~4G模块与STM32的PING间隔(2B,秒,默认10s)
15~修改FLASH中的转发协议类型(1B)
23~flash中的profileId(1B)+APN长度(1B)+APN内容(...)
24~内存中的profileId(1B)+APN长度(1B)+APN内容(...)
注解: 同一时刻只允许一种协议类型,目前只支持UDP(0~停止转发,1~UDP),总设置是udp的话,通道如果设置了http,此通道就不起作用
模块以消息方式向主机发送自身状态
cla=0x50
INS=0x02
PARAMS=协议类型(1B)+通道掩码(1B)+网络状态(1B)+信号强度(1B)+ping间隔(2B,秒)+IMEI(8B)+设备型号(2B)+固件版本(2B)
发送:
INS=0x03
PARAMS=通道号(1B)
应答:
PARAMS=通道号(1B)+协议类型(1B)+ 通道参数(...B)
参数:
通道号: 0~7 最多支持7个通道
协议类型: 0~停止转发,1~UDP
通道参数: 主机IP(4B)+主机通讯端口(2B,发送到主机)+本地通讯端口(0000H 表示自主分配)
注: 目前只支持UDP
指令:
INS=0x04
PARAMS=通道号(1B)+协议类型(1B)+ 通道参数(...B)
应答:
PARAMS=通道号(1B)+协议类型(1B)+ 通道参数(...B)
参数:
通道号: 0~7 最多支持7个通道
协议类型: 1~UDP
通道参数=主机IP(4B)+主机通讯端口(2B,发送到主机)+本地通讯端口(0000H 表示自主分配)
注: 目前只支持UDP
主机端以消息模式发送
INS=0x10
PARAMS=通道掩码(1B)+转发数据(...)
注: 通道掩码默认0xFF,表示所有有效通道均发送
指令:
INS=0x11
PARAMS=网址(string)
应答:
PARAMS=(空)
指令:
INS=0x20
PARAMS=空
应答:
PARAMS=(空)
cla=0x50
INS=0x02
PARAMS=协议类型(1B)+通道掩码(1B)+网络状态(1B)+信号强度(1B)+ping间隔(2B,秒)+IMEI(8B)+设备型号(2B)+固件版本(2B)+硬件版本(1B)+保留(1B)+IMSI(8B)
STB | DATA | CRC8 | ETB |
---|---|---|---|
1B | xB | 1B | 1B |
- 起始字符 STB = 0x1A
- 结束字符 ETB = 0x17
- 转义字符 ESC = 0x1B
0x1B, 0x9A => 0x1A
0x1B, 0x97 => 0x17
0x1B, 0x9B => 0x1B
注: 在STB和ETB之间的中间内容如果出现0x1A,0x17,0x1B都必须转义
- DATA透传的数据(YZ协议)
类型最高位表示数据是否结束,1表示后续还有数据,0代表最后一笔数据
类型ID | 类型 | 长度 | 说明 |
---|---|---|---|
0 | 保留 | ||
1 | 工作频率 | 4B | 采集周期(uint16,秒)+广播周期(uint16,ms)jingz |
2 | 设备行为 | 3B | 行为索引2B+1B行为ID(0:亮灯1, 1:亮灯2 ,2:亮灯3, 0x10:beep, 0x11:按键),0x04静止, 0x08运动;0x10按键,0x00无按键 |
3 | 系统Tick | 4B | uint32,系统时钟tick数(不一定是时间) |
4 | 运动量 | 4B | uint32 |
5 | 运动时间 | 4B | uint32,从开机到当前总运动时间秒 |
6 | |||
7 | 体温 | 2B | uint16,绝对温度值,单位0.01度(减去27315就是摄氏0.01度) |
8 | 电压 | 2B | uint16,mV |
9 | 设备状态 | 1B | 各设备自定义 (定位卡,定位耳标 bit2:静止~0x04静止) |
10 | 设备版本 | 4B | 设备类型(2B)+固件版本(2B) |
11 | 运动判断阈值 | 2B | int16,单位mG |
12 | RSSI | 1B | uint8 |
8.2 标签类型
ID | 说明 |
---|---|
1~ | 通用动物标签 |
2 | 人员标签 |
3 | 资产标签 |
4 | 外购标签 |
5 | 手机 |