ESP8266使用过程中涉及的网关通信协议的学习与总结
ESP8266使用过程中涉及的网关通信协议标准
在使用的ESP8266中给出了一个网关通信协议标准,为了更规范的按照要求的进行程序编写,学习这份标准,从而被指导着进行VST终端与服务期间的无线通讯数据约束。
网关通信的了解
网关
网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同层–应用层。
协议
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
这次学习的标准便是使用的ESP8266在进行网络通信时,我们对其通信协议编写时应该遵从的一套规则。
科隆终端与网关通信协议标准学习
在这个协议标准中使用的是GPRS协议
标准中用到的术语
-
上位机
指远程控制中心的平台或平台软件或手机 APP。 -
下位机
指 VST 终端或终端软件。 -
下行
指远程平台或手机下发给 VST 的数据帧。下行数据总长度一次不超过 256 字节。 -
上行
指 VST 上报给后台控制中心的数据帧。 -
终端登录
终端登录时发送车机 CPU-ID、 SIM-IMSI、 SIM-CCID、 GSM-IMEI 码信息给平台用于终端的登录身份信息验证,这部分信息需要事先录入系统数据库
数据类型和格式
数据类型
数据类型 | 说明 | 备注 |
---|---|---|
u8/BYTE | 8 位无符号整数 | |
u16/WORD | 16 位无符号整数 | 高位在前,低位在后,组成 16 位 |
u32/DWORD | 32 位无符号整数 | 高位在前,低位在后,组成 32 位 |
Float | 32 位单精度数据类型 | 高位在前,低位在后,组成 32 位 |
Double | 64 位双精度数据类型 | 高位在前,低位在后,组成 64 位 |
Ascii/Srting | ASCII 码字符/GBK 编码 | ASCII 编码 / GBK 编码 |
协议数据采用大端存储模式
GPRS 数据格式
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段 | 校验 |
---|---|---|---|---|---|---|
2Byte | 2Byte | 2Byte | 7Byte | 2Byte | nByte | 2Byte |
备注: GPRS 协议数据包主要用于终端与服务器网关之间的数据通信约定;
串口数据格式
消息头 | 消息长度 | 无 | 无 | 功能 ID | 数据段 | 校验 |
---|---|---|---|---|---|---|
2Byte | 2Byte | 无 | 无 | 2Byte | nByte | 2Byte |
备注: 串口协议数据包主要用于终端与外围设备之间的物理串口数据通信约定;除了“消息流水号”和“设备 ID”字段为空之外,其它字段与 GPRS 数据包格式一致;
数据包格式说明
消息头: 固定两个字符“@@”, HEX 表示为 40h 40h;
消息长度: Word 数据类型,从消息流水号到校验字段前所有字节的总和;
消息流水号: Word 数据类型,标识本数据包的流水号;
设备 ID: 7 字节 ID,第 1 个字节为 ASCII,第 2-7 字节为 BCD 码,高字节在前,低字节在后。
如:
- 乘用车车机 ID: M121501010001,即 0x4D,0x12,0x15,0x01,0x01,0x00,0x01;
- 商用车车机 ID: B121501010001,即 0x42,0x12,0x15,0x01,0x01,0x00,0x01;
功能 ID: Word 数据类型,标识本数据包的功能;
校验字段: 从消息头开始到校验字段前所有字节的 CRC16 校验,算法如下:
public short Caculate(byte[] msg)
{
short crc = (short) 0xFFFF;
int i, j;
boolean c15, bit;
for (i = 0; i < msg.length; i++) {
for (j = 0; j < 8; j++) {
c15 = ((crc >> 15 & 1) == 1);
bit = ((msg[i] >> (7 - j) & 1) == 1);
crc <<= 1;
if (c15 ^ bit) crc ^= 0x1021;
}
}
return crc;
}
GPRS协议的学习
这里以[0000/8000]通用应答为例,记录一下这个协议描述怎么看。
- 序号1对应的框内的数字为功能ID,上行和下行是肯定不一样的,由于下行有重复的所以都以上行的功能ID为开头,明白这个以后可以快速的对功能ID进行查看。
- 序号2对应的框内为功能名称,大致能体现出功能是什么
- 序号3横线内容为功能的说明
-
序号4 这里以更能直观的方式展示了数据格式是什么样子的。每个横线对应引线指导的部分,代表着对应的含义。
其中,数据段又分为了两部分,参考数据包的展示便可以得知各部分是什么。
[0000/8000]通用应答
[功能说明] 终端与平台间指令交互通用应答
[上行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(3Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 00 00 | 通用应答数据包 | CRC16 |
[下行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(3Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 80 00 | 通用应答数据包 | CRC16 |
通用应答数据包:
字节位置 | 字节数 | 数据类型 | 描述 |
---|---|---|---|
0 | 2 | u16 | 对应应答的功能 ID |
2 | 1 | u8 | 0x00 成功 0x01 失败-参数错误/操作失败0x02 失败-OBD 通信异常0x03 失败-车辆运行中0x04 失败-终端拔出0xEE 失败-指令不支持 |
[0002]终端登陆
[功能说明] 终端每次上线向服务器请求登陆
[上行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(74Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 00 02 | 终端身份信息 | CRC16 |
[下行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(1Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 80 02 | 0x00:登陆成功 0x01:登陆失败, CPU-ID 错误;0x02:登陆失败, IMSI 错误;0x03:登陆失败, CCID 错误;0x04:登陆失败, IMEI 错误; | CRC16 |
备注: 终端登录时至少附带 CPU-ID 和 IMSI 数据信息内容;
[0003]终端上报链路心跳包**
[功能说明] 终端链路维持心跳包上报
[上行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(0Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 00 03 | 无 | CRC16 |
[下行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(3Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 80 00 | 通用应答 | CRC16 |
[0004]终端请求时间同步
[功能说明] 终端请求与平台之间的时间同步
[上行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(0Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 00 04 | 无 | CRC16 |
[下行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(6Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 80 04 | 时间信息 | CRC16 |
[0005]终端上报版本信息
[功能说明] 终端主动上报版本信息
[上行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(36Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 00 05 | 版本信息包 | CRC16 |
[下行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(3Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 | 字节 | 2 字节 | 7 字节 | 80 00 | 通用应答 |
[0006]终端上报车辆唯一识别码
[功能说明] 终端上报当前车辆唯一识别码
[上行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(nByte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 00 06 | 车辆唯一识别码 | CRC16 |
[下行]
消息头 | 消息长度 | 消息流水号 | 设备 ID | 功能 ID | 数据段(3Byte) | 校验 |
---|---|---|---|---|---|---|
40 40 | 2 字节 | 2 字节 | 7 字节 | 80 00 | 通用应答 | CRC16 |