JT808是一种在中国广泛应用的车载终端通信协议,用于车辆与监控中心之间的数据通信。下面是关于Android平台上使用JT808协议进行通信的一般步骤和注意事项:
-
协议了解:首先,您需要详细了解JT808协议的规范和定义。该协议包含了通信消息的格式、数据字段的含义以及通信流程等信息。您可以参考JT808协议的官方文档或相关资料进行学习和理解。
-
数据解析:在Android应用中,您需要编写代码来解析收到的JT808数据包。根据协议规范,您可以使用Java或Kotlin编写解析逻辑,将收到的数据包拆解为可读的字段和值。这涉及到字节操作、位操作以及数据类型转换等技术。
-
数据封装:同样地,您也需要编写代码将要发送的数据封装为符合JT808协议的数据包。根据通信需求,您可能需要设置不同的消息类型、数据字段和参数。确保按照协议规范将数据正确封装成字节流,并发送给服务器或车载终端。
-
网络通信:Android提供了多种网络通信方式,您可以选择适合您需求的方式进行数据传输。常见的方法包括使用Socket进行TCP通信或使用HTTP协议进行数据交互。根据协议要求,您需要建立与服务器或车载终端的连接,并通过网络发送和接收JT808数据包。
-
异常处理和错误处理:在实际通信过程中,可能会出现各种异常情况,例如网络连接断开、数据解析错误等。您需要编写适当的异常处理和错误处理逻辑,保证通信的稳定性和可靠性。
-
安全性考虑:在进行JT808通信时,安全性是一个重要的考虑因素。您需要确保通信数据的机密性和完整性。这可以通过加密算法、数字签名、数据校验等手段来实现。
-
测试和调试:在开发过程中,进行充分的测试和调试是必不可少的。您可以使用模拟器、调试工具或者搭建测试环境来验证您的通信代码是否符合预期,并修复可能存在的问题。
请注意,JT808协议有多个版本和扩展,您需要根据实际需求选择适合的协议版本,并了解所使用的具体扩展功能。
测试在
代码部分:
一是注册:
注册完成在web界面可以看到车辆信息 地址http://gps.lingx.com 账号 admin 密码 123456
/**
* 终端注册
*
* @param manufacturerId 制造商 ID
* @param terminalModel 终端型号
* @param terminalId 终端 ID
* @return
*/
public static byte[] register(String manufacturerId, String terminalModel, String terminalId) {
//省域 ID
byte[] p = BitOperator.numToByteArray(31, 2);
//省域 市县域 ID
byte[] c = BitOperator.numToByteArray(72, 2);
//制造商 ID
byte[] mId = manufacturerId.getBytes();
//终端型号
byte[] tmId = terminalModel.getBytes();
//终端 ID
byte[] tId = terminalId.getBytes();
//车牌颜色
byte[] s = {0};
// 车辆标识
byte[] vin = "LSFAM630000000008".getBytes();
return ByteUtil.byteMergerAll(p, c, mId, tmId, tId, s,vin);
}
二是鉴权:
if (authCode == null) {
TU.s("auto.null");return;}
byte[] body = JTT808Coding.generate808(0x0102, SocketConfig.getmPhont(),authCode);
socketManager.send((body));
三是上报位置信息:
private void reportMapLocation(AMapLocation amapLocation , boolean isBatch){
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
SimpleDateFormat df = new SimpleDateFormat("yy-MM-dd-HH-mm-ss");
Date date = new Date(amapLocation.getTime());
L.c(amapLocation.toString());
long latitudeInLong = (long) (amapLocation.getLatitude() * 1e6);
long longitudeInLong = (long) (amapLocation.getLongitude() * 1e6);
L.c("longitudeInLong"+longitudeInLong +" latitudeInLong"+latitudeInLong);
byte[] bytes = JT808Directive.reportLocation((long)latitudeInLong
, (long)longitudeInLong
, amapLocation.getAltitude()
, amapLocation.getSpeed()
, amapLocation.getBearing()
, amapLocation.getAccuracy()
, df.format(date));
if (isBatch){
locations.add(bytes);
if (locations.size() >= 3){
mlocationClient.stopLocation();
mlocationClient.onDestroy();
byte[] batchBytes = JT808Directive.batchReportLocation(locations);
byte[] body = JTT808Coding.generate808(0x0704, SocketConfig.getmPhont(), batchBytes);
socketManager.send((body));
}
}else {
byte[] body = JTT808Coding.generate808(0x0200, SocketConfig.getmPhont(), bytes);
socketManager.send((body));
}
} else {
// TU.s( "ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo());
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo());
}
}
}
项目源码