JT/T 808协议的全称是《道路运输车辆卫星定位系统终端通讯协议及数据格式》,也称为部标808协议,适用于GPS定位车载终端和监控平台之间的通信。本标准规定了道路运输车辆卫星定位系统车载终端与监管/监控平台之间的通信协议与数据格式,包括协议基础、通信连接、消息处理、协议分类与要求及数据格式。

协议特点

1)双向通信:通过该协议,车辆可以将实时信息发送给监控中心,同时接收来自监控中心的指令;
2)车辆定位:JT808协议支持GPS与北斗定位,可实现车辆的实时定位和轨迹记录;
3)多种数据格式:支持多种数据格式的传输,包括文本、图片、语音等,使监控中心能够获取更丰富的信息;
4)安全性:采用了数据加密和校验机制,确保通信数据的安全性和完整性。

转码与解码

采用 0x7e 表示,若校验码、消息头以及消息体中出现 0x7e,则要进行转义处理,转义规则定义如下:
0x7e <————> 0x7d 后紧跟一个 0x02;
0x7d <————> 0x7d 后紧跟一个 0x01。
转义处理过程如下:
发送消息时:消息封装——>计算并填充校验码——>转义;
接收消息时:转义还原——>验证校验码——>解析消息。
示例:
发送一包内容为 0x30 0x7e 0x08 0x7d 0x55 的数据包,则经过封装如下:0x7e 0x30 7d 0x02 0x08 0x7d 0x01 0x55 0x7e。

java处理代码如下:


	public static final ByteBuf encode(ByteBuf byteBuf) {
		int len=byteBuf.readableBytes();
		ByteBuf buf = Unpooled.buffer();
		for(int i=0;i<len;i++) {
			byte b=byteBuf.getByte(i);
			if (i == 0 || i == len-1 ){
				buf.writeByte(b);
			} else if (b == 0x7D) {
				buf.writeByte(0x7D);
				buf.writeByte(0x01);
			} else if( b == 0x7E ){
				buf.writeByte(0x7D);
				buf.writeByte(0x02);
			} else {
				buf.writeByte(b);
			}
		}
		byteBuf.release();
		return buf;
	}
	public static final ByteBuf decode(byte[] bytes) {
		int len = bytes.length;
		ByteBuf buf = Unpooled.buffer();
		for (int i = 0; i < len; i++) {
			if (bytes[i] == 0x7d && bytes[i + 1] == 0x01) {
				buf.writeByte(0x7d);
				i++;
			} else if (bytes[i] == 0x7d && bytes[i + 1] == 0x02) {
				buf.writeByte(0x7e);
				i++;
			} else {
				buf.writeByte(bytes[i]);
			}
		}
		bytes=null;
		return buf;
	}

数据校验

JT808报文是采用常见的异或校验,校验码指从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。

java处理代码如下:

public static final boolean check(byte bytes[], byte check, int length, boolean isFB, boolean isVersion) {
		ByteBuf buff= Unpooled.copiedBuffer(bytes);
		buff.readByte();
		length += 12;
		if (isFB)
			length += 4;
		if (isVersion)
			length += 5;
		byte xor = 0;
		for (int i = 0; i < length; i++) {
			xor = xor ^= buff.readByte();
		}
		return xor == check;
	}

消息头

在这里插入图片描述
消息解析

			ByteBuf buff = new ByteBuf(JT808Utils.decode(msg));
			buff.readByte();

			int msgId = buff.readUnsignedShort();
			int length = buff.readUnsignedShort();
			String tid = "";

			boolean isFB = (length & 0b0010000000000000) > 0;// 是否分包
			boolean isVersion = (length & 0b0100000000000000) > 0;// 是否版本标识
			if (isVersion) {
				buff.readByte();
				tid = buff.readStringBCD(10);
			} else {
				tid = buff.readStringBCD(6);
			}
			int msgSn = buff.readUnsignedShort();// 消息流水号
			
			length = length & 0x3ff;//正文真正的长度
			ByteBuf content = buff.readByteBuf(length);//就里就是正文
			byte check = buff.readByte();//校验码
			buff.readByte();

开源项目地址

https://gitee.com/lingxcom/jt808

演示地址
http://gps.lingx.com/
账号:admin
密码:123456

终端设备接入
IP:47.100.112.218
端口:8808

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐