Android中使用JT808协议进行车载终端通信的实现

简介: Android中使用JT808协议进行车载终端通信的实现

JT808是一种在中国广泛应用的车载终端通信协议,用于车辆与监控中心之间的数据通信。下面是关于Android平台上使用JT808协议进行通信的一般步骤和注意事项:

协议了解:首先,您需要详细了解JT808协议的规范和定义。该协议包含了通信消息的格式、数据字段的含义以及通信流程等信息。您可以参考JT808协议的官方文档或相关资料进行学习和理解。

数据解析:在Android应用中,您需要编写代码来解析收到的JT808数据包。根据协议规范,您可以使用Java或Kotlin编写解析逻辑,将收到的数据包拆解为可读的字段和值。这涉及到字节操作、位操作以及数据类型转换等技术。

数据封装:同样地,您也需要编写代码将要发送的数据封装为符合JT808协议的数据包。根据通信需求,您可能需要设置不同的消息类型、数据字段和参数。确保按照协议规范将数据正确封装成字节流,并发送给服务器或车载终端。

网络通信:Android提供了多种网络通信方式,您可以选择适合您需求的方式进行数据传输。常见的方法包括使用Socket进行TCP通信或使用HTTP协议进行数据交互。根据协议要求,您需要建立与服务器或车载终端的连接,并通过网络发送和接收JT808数据包。

异常处理和错误处理:在实际通信过程中,可能会出现各种异常情况,例如网络连接断开、数据解析错误等。您需要编写适当的异常处理和错误处理逻辑,保证通信的稳定性和可靠性。

安全性考虑:在进行JT808通信时,安全性是一个重要的考虑因素。您需要确保通信数据的机密性和完整性。这可以通过加密算法、数字签名、数据校验等手段来实现。

测试和调试:在开发过程中,进行充分的测试和调试是必不可少的。您可以使用模拟器、调试工具或者搭建测试环境来验证您的通信代码是否符合预期,并修复可能存在的问题。

请注意,JT808协议有多个版本和扩展,您需要根据实际需求选择适合的协议版本,并了解所使用的具体扩展功能。


web端链接地址:

web界面可以看到车辆信息  地址http://gps.lingx.com   账号 admin  密码  123456

代码部分:

一是注册:


 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 (socketManager == null || !socketManager.isConnect()) {
                        Toast.makeText(getApplicationContext(), "Unconnected", LENGTH_SHORT).show();
                    } else {
                        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());
                  }
              }
          }
      相关文章
      |
      4天前
      |
      Android开发
      Android JNI与CAN通信遇到的问题总结
      Android JNI与CAN通信遇到的问题总结
      26 1
      |
      7月前
      |
      存储 网络协议 物联网
      Android集成MQTT教程:实现高效通信和实时消息传输
      Android集成MQTT教程:实现高效通信和实时消息传输
      661 0
      |
      7月前
      |
      编解码 前端开发 Android开发
      如何在Android平台GB28181接入终端实现语音广播和语音对讲
      在之前的blog,我们以Android平台国标接入终端为例,分别介绍了一些常规的功能,比如REGISTER、CATALOG、INVITE、Keepalive、SUBSCRIBE、NOTIFY等常规操作,今天主要介绍下语音广播和语音对讲这部分。
      164 0
      |
      6月前
      |
      设计模式 网络协议 Java
      《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式
      《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式
      65 0
      |
      7月前
      |
      XML 网络协议 前端开发
      Android国标接入终端实现GB28181实时位置(MobilePosition)上报
      在实现本文提到的Android平台国标GB28181接入终端的实时位置上报之前,之前已经完成了Android终端GB28181常规功能接入,采集到实时音视频数据,编码PS打包后,按需传到GB28281服务平台,媒体流支持最新GB28181-2016的UDP和TCP被动模式,参数配置,支持注册有效期、心跳间隔、心跳间隔次数、TCP/UDP信令设置,支持RTP Sender IP地址类型、RTP Socket本地端口、SS-R-C、RTP socket 发送Buffer大小、RTP时间戳时钟频率设置,支持注册成功、注册超时、INVITE、ACK、BYE状态回调等。
      |
      8月前
      |
      XML 前端开发 Android开发
      RE:从零开始的车载Android HMI(四) - 收音机刻度尺
      本篇文章我们来研究如何绘制一个收音机的刻度尺。
      148 0
      |
      8月前
      |
      Android开发
      Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信(二)
      Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信
      80 0
      |
      8月前
      |
      Android开发
      Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信(一)
      Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信
      69 0
      |
      8月前
      |
      Android开发
      Android ViewModel+LiveData实现Fragment间通信详解
      Android ViewModel+LiveData实现Fragment间通信详解
      101 0
      |
      6天前
      |
      Linux 编译器 Android开发
      FFmpeg开发笔记(九)Linux交叉编译Android的x265库
      在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
      24 1
      FFmpeg开发笔记(九)Linux交叉编译Android的x265库