百度介绍
传输协议,传输协议中各层都为上一层提供功能。为了提供这种业务功能,下一层将上一层中的数据并入到本层的数据域中,然后通过加入
报头或报尾来实现该层业务功能,该过程叫做
数据封装。
(从数据链路层开始往上走的过程)用户的数据要经过一次次包装,最后转化成可以在网络上传输的信号,发送到网络上。当到达目标计算机后,再执行相反的
拆包过程。这类似于日常生活中写信,把自己要表达的意思写到纸上,有兴趣的话还要把纸折叠成特殊的形状,然后放到信封里并封好口,写好收信人的地址、邮政编码和姓名,再贴上邮票,邮局的工作人员再盖上邮戳送到收信人所在邮局,邮递员按信上的地址把信交给收信人,收信人再拆信,阅读其内容。
学习素材:网关通信协议标准-VST2.08
数据类型和格式
数据类型
| 说明 | 备注 |
---|---|---|
u8/BYTE
|
8
位无符号整数
| |
u16/WORD
|
16
位无符号整数
|
高位在前,低位在后
,
组成
16
位
|
u32/DWORD
|
32
位无符号整数
|
高位在前,低位在后
,
组成
32
位
|
Float
|
32
位单精度数据类型
|
高位在前,低位在后
,
组成
32
位
|
Double
|
64
位双精度数据类型
|
高位在前,低位在后
,
组成
64
位
|
Ascii/Srting
|
ASCII
码字符
/GBK
编码
|
ASCII
编码
/ GBK
编码
|
u8 是 unsigned char
u16 是 unsigned short
u32 是 unsigned int
网关通信协议数据采用大端存储模式,地址的增长顺序与值的增长顺序相反,即将高字节的数据存储在低地址,低字节数据存储在高地址。
通信系统中的大小端(数组的大小端)
(1)譬如要通过串口 发送一个0x12345678给接收方,但是因为串口本身 限制, 只能以字节为单位来发送,所以需要 发4次;接收方 分4次接收,内容分别是:0x12、0x34、0x56、0x78.接收方接收到这4个字节之后需要去 重组得到0x12345678(而不是得到0x78563412)(注意:0x中的0是数字0,而不是字母O,其中的x也不区分大小写。)
(2)所以在通信双方需要有一个默契,就是:先发/先接的是高位还是低位?这就是通信中的大小端问题。
(3)一般来说是:先发低字节叫小端;先发高字节就叫大端。实际操作中,在通信协议里面会去定义大小端,明确告诉你先发的是低字节还是高字节。
(4)在通信协议中,大小端是非常重要的,大家使用别人定义的通信协议还是自己要去定义通信协议,一定都要注意标明通信协议中大小端的问题。
(1)譬如要通过串口 发送一个0x12345678给接收方,但是因为串口本身 限制, 只能以字节为单位来发送,所以需要 发4次;接收方 分4次接收,内容分别是:0x12、0x34、0x56、0x78.接收方接收到这4个字节之后需要去 重组得到0x12345678(而不是得到0x78563412)(注意:0x中的0是数字0,而不是字母O,其中的x也不区分大小写。)
(2)所以在通信双方需要有一个默契,就是:先发/先接的是高位还是低位?这就是通信中的大小端问题。
(3)一般来说是:先发低字节叫小端;先发高字节就叫大端。实际操作中,在通信协议里面会去定义大小端,明确告诉你先发的是低字节还是高字节。
(4)在通信协议中,大小端是非常重要的,大家使用别人定义的通信协议还是自己要去定义通信协议,一定都要注意标明通信协议中大小端的问题。
GPRS
数据格式
消息头
|
消息长度
|
消息流水号
|
设备
ID
|
功能
ID
|
数据段
|
校验
|
2Byte
|
2Byte
|
2Byte
|
7Byte
|
2Byte
|
nByte
|
2Byte
|
GPRS
协议数据包主要用于终端与服务器网关之间的数据通信约定
串口数据格式
消息头
|
消息长度
|
无
| 无 |
功能
ID
|
数据段
|
校验
|
2Byte
|
2Byte
| 无 | 无 |
2Byte
|
nByte
|
2Byte
|
串口协议数据包主要用于终端与外围设备之间的物理串口数据通信约定
数据包格式说明
消息头
:固定两个字符
“@@”
,
HEX 表示为 40h 40h;
消息长度:
Word
数据类型,从消息流水号到校验字段前所有字节的总和;
消息流水号
:
Word
数据类型,标识本数据包的流水号;
设备
ID
:
7
字节
ID
,第
1 个字节为 ASCII,第 2-7 字节为 BCD
码,高字节在前,低字节在后,如:
乘用车车机
ID
:
M 12 15 01 01 00 01
,即
0x4D,0x12,0x15,0x01,0x01,0x00,0x01
;
(一空格一字节,原数据无空格,看上图,M对照4D)
商用车车机
ID
:
B121501010001
,即
0x42,0x12,0x15,0x01,0x01,0x00,0x01
;
功能
ID
:Word
数据类型,标识本数据包的功能;
public short Caculate(byte[] msg)
//byte[]是Java里的字节型数组;
//可以这样赋值:byte [] k={1,1,1,1,1,1,};
//也可以 byte [] k=new byte[size];size表示数组中变量的个数!
{
short crc = (short) 0xFFFF;
int i, j;
boolean c15, bit;
//0xFFFF:0x16进制,一个F代表4个1
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;
}
}
//java里面的>>(右移运算符)就是把要移动的数转换成2进制,
//右移几位就去掉右边的几位数,(<<(左移)左移几位就在右边加几个0),
//比如14右移2位就是转成二进制变成1110,去掉右边的10,变成11,
//11转成十进制就是3;左移2位就是111000,转成十进制就是56。
return crc;
}
0xFFFF,是16进制的 FFFF,转化成二进制就是 1111 1111 1111 1111(2 * 8 = 16 位,2字节)
1111 1111 1111 1111 在计算机里面,就是 -1 的补码.
(补码的定义:正数最高位为0,负数为1,然后绝对值按位取反,最后加1,即为补码)
1111 1111 1111 1111,最高位为1,表示负数,剩下的先减 1 ,变为 111 1111 1111 1110,然后按位取反,变为 000 0000 0000 0001,也就是说绝对值为 1.
所以,就是 -1了.
GPRS协议描述
[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 失败-指令不支持 |
(注意:0x中的0是数字0,而不是字母O,其中的x也不区分大小写。)
主动上报
[0002]终端登录
终端每次上线向服务器请求登陆
上行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(3Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 00 02 | 终端身份信息 | CRC16 |
下行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(3Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 80 02 |
0x00
:登陆成功
0x01
:登陆失败,
CPU-ID
错误;
0x02
:登陆失败,
IMSI
错误;
0x03
:登陆失败,
CCID
错误;
0x04
:登陆失败,
IMEI
错误;
| CRC16 |
备注:终端登录时至少附带
CPU-ID
和
IMSI
数据信息内容;
终端身份信息(74 字节)
序号 | 内容 | 字节数 | 数据类型 | 描述 |
1 |
CPU-ID
| 24 |
ASCII
|
CPU-ID
|
2 |
IMSI
| 15 |
ASCII
|
软件版本编译日期,举例:
2010-10-12
|
3 |
CCID
| 20 |
ASCII
|
SIM
卡
CCID
号(无法读取时填充字符
„0‟
)
|
4 |
IMEI
| 15 | ASCII |
GSM
模块
IMEI
码
|
每个字段不足的位数后补 ASCII 空格符
[0003]终端上报链路心跳包
终端链路维持心跳包上报
上行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(0Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 00 03 | 无 | CRC16 |
下行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(3Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 80 00 | 通用应答 | CRC16 |
[0004]终端请求时间同步
终端请求与平台之间的时间同步
上行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能ID | 数据段(0Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 00 04 | 无 | CRC16 |
下行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能ID | 数据段(3Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 80 04 | 通用应答 | CRC16 |
[0005]终端上报版本信息
终端主动上报版本信息
上行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(36Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 00 04 | 版本信息包 | CRC16 |
下行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(3Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 80 00 | 通用应答 | CRC16 |
版本信息包(36 字节)
序号 | 内容 | 字节数 | 数据类型 | 描述 |
1 |
车机版本信息
| 16 |
ASCII
|
车机版本信息,举例:M100AB0101.0000
|
2 |
编译日期
| 10 |
ASCII
|
软件版本编译日期,举例:
2010-10-12
|
3 |
GSM
模块型号
| 10 |
ASCII
|
GSM
模块型号,举例:
SIM800L
|
每个字段不足的位数后补 ASCII 空格符
ascii码表:
[0006]终端上报车辆唯一识别码
终端上报当前车辆唯一识别码
上行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(nByte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 00 06 | 车辆唯一识别码 | CRC16 |
下行 | ||||||
消息头 | 消息长度 | 消息流水号 | 设备ID | 功能1D | 数据段(3Byte) | 校验 |
40 40 | 2字节 | 2字节 | 7字节 | 80 00 | 通用应答 | CRC16 |
车辆唯一识别码(39 字节)
序号 | 内容 | 字节数 | 数据类型 | 描述 |
---|---|---|---|---|
1 | VIN码 | 17Byte |
ASCII
| VIN码 |
2 | 逗号 | 1 |
ASCII
|
0x2C
|
3 | CID码 | 16Byte |
ASCII
|
CID
码,不足
16Bytes
后补结束符
„\0‟
|
4 | 逗号 | 1 |
ASCII
|
0x2C
|
5 | CVN码 | 4Byte | HEX | CVN码 |
每个字段用
ASCII
逗号字符隔开,车辆不支持读取时,字段为空即可