第八次培训任务:熟悉传输协议

百度介绍
传输协议,传输协议中各层都为上一层提供功能。为了提供这种业务功能,下一层将上一层中的数据并入到本层的数据域中,然后通过加入 报头或报尾来实现该层业务功能,该过程叫做 数据封装(从数据链路层开始往上走的过程)用户的数据要经过一次次包装,最后转化成可以在网络上传输的信号,发送到网络上。当到达目标计算机后,再执行相反的 拆包过程。这类似于日常生活中写信,把自己要表达的意思写到纸上,有兴趣的话还要把纸折叠成特殊的形状,然后放到信封里并封好口,写好收信人的地址、邮政编码和姓名,再贴上邮票,邮局的工作人员再盖上邮戳送到收信人所在邮局,邮递员按信上的地址把信交给收信人,收信人再拆信,阅读其内容。
 

学习素材:网关通信协议标准-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)在通信协议中,大小端是非常重要的,大家使用别人定义的通信协议还是自己要去定义通信协议,一定都要注意标明通信协议中大小端的问题。
 
GPRS 数据格式
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,第 27 字节为 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 数据类型,标识本数据包的功能;
校验字段: 从消息头开始到校验字段前所有字节的 CRC16 校验, CRC原理详解(附crc16校验代码)算法如下:
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 402字节2字节7字节00 00通用应答数据包CRC16
下行
消息头消息长度消息流水号设备ID功能ID数据段(3Byte)校验
40 402字节2字节7字节80 00通用应答数据包CRC16

设备ID获取

通用应答数据包

字节位置字节数数据类型描述
02u16对应应答的功能ID
21u8

0x00 成功

0x01 失败-参数错误/操作失败

0x02 失败-OBD通信异常

0x03 失败-车辆运行中

0x04 失败-终端拔出

0XEE 失败-指令不支持

(注意:0x中的0是数字0,而不是字母O,其中的x也不区分大小写。)

主动上报

[0002]终端登录

终端每次上线向服务器请求登陆
上行
消息头消息长度消息流水号设备ID功能1D数据段(3Byte)校验
40 402字节2字节7字节00 02终端身份信息CRC16
下行
消息头消息长度消息流水号设备ID功能1D数据段(3Byte)校验
40 402字节2字节7字节80 02
0x00 :登陆成功
0x01 :登陆失败, CPU-ID 错误;
0x02 :登陆失败, IMSI 错误;
0x03 :登陆失败, CCID 错误;
0x04 :登陆失败, IMEI 错误;
CRC16
备注:终端登录时至少附带 CPU-ID IMSI 数据信息内容;
 

查询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
15ASCII
GSM 模块 IMEI

每个字段不足的位数后补 ASCII 空格符

[0003]终端上报链路心跳包

终端链路维持心跳包上报
上行
消息头消息长度消息流水号设备ID功能1D数据段(0Byte)校验
40 402字节2字节7字节00 03CRC16
下行
消息头消息长度消息流水号设备ID功能1D数据段(3Byte)校验
40 402字节2字节7字节80 00通用应答CRC16

[0004]终端请求时间同步

终端请求与平台之间的时间同步
上行
消息头消息长度消息流水号设备ID功能ID数据段(0Byte)校验
40 402字节2字节7字节00 04CRC16
下行
消息头消息长度消息流水号设备ID功能ID数据段(3Byte)校验
40 402字节2字节7字节80 04通用应答CRC16

[0005]终端上报版本信息

终端主动上报版本信息
上行
消息头消息长度消息流水号设备ID功能1D数据段(36Byte)校验
40 402字节2字节7字节00 04版本信息包CRC16
下行
消息头消息长度消息流水号设备ID功能1D数据段(3Byte)校验
40 402字节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 402字节2字节7字节00 06车辆唯一识别码CRC16
下行
消息头消息长度消息流水号设备ID功能1D数据段(3Byte)校验
40 402字节2字节7字节80 00通用应答CRC16

车辆唯一识别码(39 字节)

序号内容字节数数据类型描述
1VIN码17Byte
ASCII
VIN码
2逗号1
ASCII
0x2C
3CID码16Byte
ASCII
CID 码,不足 16Bytes 后补结束符 „\0‟
4逗号1
ASCII
0x2C   
5CVN码4ByteHEXCVN码
每个字段用 ASCII 逗号字符隔开,车辆不支持读取时,字段为空即可
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值