????????“兩客一危一重貨”車輛運(yùn)輸安全是當(dāng)前道路運(yùn)輸安全管理工作的重中之重,相應(yīng)的車輛GPS定位監(jiān)控平臺是監(jiān)控“兩客一危一重貨”車輛運(yùn)輸安全的重要平臺。本系統(tǒng)結(jié)合交通部JT808、JT1078等協(xié)議標(biāo)準(zhǔn),提供Java開發(fā)車載視頻定位監(jiān)控系統(tǒng)的開發(fā)思路。
? ? ? ? 一:JT808協(xié)議解析和服務(wù)器搭建。
? ? ?JT808協(xié)議分為2011版、2013版、2019版本。市面上大多是2013版,少數(shù)2019版。2013和2019版本的最大區(qū)別是報(bào)文固定頭部把手機(jī)號從原來的6字節(jié)BCD碼改成了10字節(jié)BCD碼。
? ? ? ? 2013版報(bào)文頭:
? ? ? ? ?2019版報(bào)文頭:
? ? ? ? ?對于TCP報(bào)文的解析,消息頭可以使用公共組件,通過版本標(biāo)記解析不同版本的消息頭。消息體用每個(gè)消息自定義的解析格式。
public abstract class JTMessage {
protected String msgId;//消息編號
protected String tid;//終端ID
protected String msgNo;//消息流水
protected int version;//版本號
protected int isPack;//分包
????????解析報(bào)文頭:
//解析報(bào)文頭
ReadByteFromHex reader = new ReadByteFromHex(msg);
//=============解析消息頭開始=============
reader.readByte(1);// 7E
String msgId = reader.readByte(2);// 消息id
String msgBodyAttr = reader.readByte(2);// 消息體屬性
int msgBodyInt = Integer.parseInt(msgBodyAttr, 16);
boolean isVersion = (msgBodyInt & 0x4000) > 0;// 是否有版本號 取第13位是否為1 0x4000二進(jìn)制是0100000000000000
int version = 0; //2019版本開始從1遞增
if (isVersion) {
version = Integer.parseInt(reader.readByte(1), 16); // 版本號
}
//如果版本號大于0 則手機(jī)號為10位
String tid = version > 0 ? reader.readByte(10) : reader.readByte(6);// 手機(jī)號,當(dāng)做id
String msgNo = reader.readByte(2);// 消息流水
// 是否分包
boolean isPack = (msgBodyInt & 0x2000) > 0;// 是否分包 取第13位是否為1 0x2000二進(jìn)制是0010000000000000
int packTotal = 0;
int packNum = 0;
if (isPack) {
// 如果有分包則多讀4個(gè)字節(jié)
packTotal = Integer.parseInt(reader.readByte(2), 16);
packNum = Integer.parseInt(reader.readByte(2), 16);
}
boolean isRSA = (msgBodyInt & 0x400) > 0;// 消息體是否過RSA算法加密; 取第13位是否為1 0x400二進(jìn)制是0000010000000000
//=============解析消息頭結(jié)束=============
? ? ? ? 解析消息體:
//=============解析消息體開始=============
String bodyHex = reader.readByte(msgBodyInt & 0x3ff); // 消息體屬性前10位是消息體長度 0x3ff二進(jìn)制是0000001111111111
if ("0200".equals(msgId)) {//位置上報(bào)
JTMessage t0200 = new T0200(tid, msgNo);
t0200.decodeBody(bodyHex);
return t0200;
} else if ("0002".equals(msgId)) {//心跳
JTMessage t0202 = new T0002(tid, msgNo);
t0202.decodeBody(bodyHex);
return t0202;
} else if ("0003".equals(msgId)) {//注銷
JTMessage t0003 = new T0003(tid, msgNo);
t0003.decodeBody(bodyHex);
return t0003;
} else if ("0100".equals(msgId)) {//注冊
JTMessage t0100 = new T0100(tid, msgNo);
t0100.decodeBody(bodyHex);
return t0100;
} else if ("0102".equals(msgId)) {//鑒權(quán)
JTMessage t0102 = new T0102(tid, msgNo);
t0102.decodeBody(bodyHex);
return t0102;
} else if ("0001".equals(msgId)) {//終端通用應(yīng)答
JTMessage t0001 = new T0001(tid, msgNo);
t0001.decodeBody(bodyHex);
return t0001;
} else if ("0704".equals(msgId)) {//定位數(shù)據(jù)批量上傳
JTMessage t0704 = new T0704(tid, msgNo);
t0704.decodeBody(bodyHex);
return t0704;
}
//=============解析消息體結(jié)束=============
二、設(shè)備上報(bào)流程:????????? ? ??
? ? ? ? 注意,設(shè)備數(shù)據(jù)大批量上報(bào)的情況下,服務(wù)器需要支持高并發(fā),netty作為天然的高并發(fā)框架,可以用作JT808服務(wù)器的接入點(diǎn)。
?三、JT1078服務(wù)器的搭建流程:
? ? ? ? 1078服務(wù)器就是一個(gè)流媒體服務(wù)器,要處理的功能是接收設(shè)備上報(bào)的視頻數(shù)據(jù),解析成瀏覽器能夠播放的格式,并通過websocket或者h(yuǎn)ttp協(xié)議發(fā)送到瀏覽器,瀏覽器解碼觀看視頻。
文章來源:http://www.zghlxwxcb.cn/news/detail-499965.html
?下面是系統(tǒng)demo演示地址:gps.cachtek.com文章來源地址http://www.zghlxwxcb.cn/news/detail-499965.html
到了這里,關(guān)于Java實(shí)現(xiàn)符合交通部標(biāo)JT808和JT1078協(xié)議服務(wù)器的思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!