最近发现,深圳做网约车和货车的协议的公司越来越多了,之前在公司做过一些这方面的项目。就来写个这方面的文章记录下,也顺便分享下。

GB905,主要是面向网约车的一种协议,主要监控司机的行为,确保乘车安全。 首先一些协议的指令。


public class JTT905Cmd {/** * ISU通用应答 */public static final int ISU_GENERAL_RESPONSE = 0x0001;/*** 中心通用应答 */public static final int CENTER_GENERAL_RESPONSE = 0x8001;/** * ISU心跳 */public static final int ISU_HEART = 0x0002;/** * 设置参数 */public static final int SET_PARAMETERS = 0x8103;/*** 查询ISU参数*/public static final int QUERY_ISU_PARAMETERS = 0x8104;/** * 查询ISU参数应答 */public static final int QUERY_THE_ISU_PARAMETERS_RESPONSE = 0x0104;/** * ISU控制 */public static final int ISU_CONTROL = 0x8105;/** * ISU升级结果报告消息 */public static final int ISU_UPDATE_RESULT_REPORT_MESSAGE = 0x0105;/* 位置信息汇报 */public static final int LOCATION_INFORMATION_REPORT = 0x0200;/** * 位置信息查询 */public static final int LOCATION_INFORMATION_QUERY = 0x8201;/** * 位置信息查询应答 */public static final int LOCATION_INFORMATION_QUERY_RESPONSE = 0x0201;/*** 位置跟踪控制 */public static final int POSITION_TRACKING_CONTROL = 0x8202;/** * 位置跟踪信息汇报 */public static final int POSITION_TRACKING_MESSAGE_REPORT = 0x0202;/** * 位置汇报数据补传 */public static final int LOCATION_REPORT_DATA_UPLOAD = 0x0203;/** * 文本信息下发  */public static final int TEXT_MESSAGING = 0x8300;/*** 事件设置*/public static final int EVENT_SET = 0x8301;/** * 事件报告 */public static final int INCIDENT_REPORT = 0x0301;/** * 提问下发  */public static final int QUESTIONS_ISSUED = 0x8302;/** * 提问应答 */public static final int QUESTIONS_ANSWERING = 0x0302;/** * 电话回拨  */public static final int BACK_TO_THE_DIAL = 0x8400;/*** 设置电话本*/public static final int SET_UP_THE_PHONE_BOOK = 0x8401;/*** 车辆控制*/public static final int VEHICLE_CONTROL = 0x8500;/** * 车辆控制应答*/public static final int VEHICLE_CONTROL_RESPONSE = 0x0500;/*** 摄像头图像上传*/public static final int CAMERA_PICTURE_UPLOAD = 0x0800;/*** 摄像头立即拍摄命令*/public static final int THE_CAMERA_IMMEDIATELY_SHOT_THE_COMMAND = 0x8801;/*** 存储图像检索*/public static final int STORAGE_OF_PICTURE_RETRIEVAL = 0x8802;/*** 存储图像检索应答*/public static final int STORAGE_PICTURE_RETRIEVAL_RESPONSE = 0x0802;/*** 存储图像/音视频上传命令*/public static final int STORE_MULTIMEDIA_DATA_UPLOAD_COMMAND = 0x8803;/*** 订单任务下发*/public static final int ORDER_TASK_ISSUED = 0x8B00;/*** 驾驶员抢答*/public static final int DRIVER_ANSWER = 0x0B01;/*** 下发抢答结果信息*/public static final int SEND_THE_RESULT_INFORMATION = 0x8B01;/*** 驾驶员电召任务完成确认*/public static final int DRIVER_CALL_TASK_HAS_BEEN_CONFIRMED = 0x0B07;/*** 驾驶员取消订单*/public static final int DRIVER_CANCELLED_THE_ORDER = 0x0B08;/*** 中心取消订单*/public static final int CENTER_CANCELLED_THE_ORDER = 0x8B09;/*** 上班签到信息上传*/public static final int CHECK_IN_INFORMATION_UPLOADED = 0x0B03;/*** 下班签退信息上传*/public static final int CHECK_OUT_INFORMATION_UPLOAD = 0x0B04;/*** 运营数据上传*/public static final int OPERATION_DATA_UPLOAD = 0x0B05;/*** 外围设备指令下行透传*/public static final int PERIPHERAL_DEVICE_PASS_THROUGH = 0x8B10;/*** 外围设备指令上行透传*/public static final int PERIPHERAL_DEVICE_INSTRUCTION_UPLINK = 0x0B10;/*** 音频检索*/public static final int AUDIO_RETRIEVAL = 0x8805;/*** 存储音频检索应答*/public static final int AUDIO_RETRIEVAL_RESPONSE = 0x0805;/*** 音视频上传*/public static final int AUDIO_AND_VIDEO_UPLOAD = 0x0806;/*** 中心确认报警*/public static final int CENTER_CONFIRM_ALARM = 0x8B0A;/*** 中心解除报警*/public static final int CENTER_RELEASE_ALARM = 0x8B0B;/*** 中心巡检设备*/public static final int CENTER_PATROL_EQUIPMENT = 0x8B11;/*** 设备巡检应答*/public static final int EQUIPMENT_INSPECTION_RESPONSE = 0x0B11;/*** 终端请求下发重要初始化参数指令*/// public static final int TERMINAL_REQ_ISSUE_PARAMETER = 0x0F40;/*** 网约车驾驶员签到/签退通知*/public static final int DRIVER_CHECK_IN_OR_OUT_NOTIFY = 0x8BC5;/*** 请求关联司机列表信息*/public static final int REQ_DRIVER_LIST_INFO = 0x0BD2;/*** 请求关联司机列表信息应答*/public static final int REP_DRIVER_LIST_INFO = 0x8BD2;/*** 云端人脸识别结果通知*/public static final int CLOUD_PERSON_FACE_CHECK_RESULT_NOTIFY = 0x8BD3;/*** 终端请求驾驶员信息*/public static final int TERMINAL_REQ_DRIVER_INFO = 0x0BD0;/*** 平台下发驾驶员信息*/public static final int PLATFORM_ISSUED_DRIVER_INFO = 0x8BD0;/*** 平台删除驾驶员信息*/public static final int PLATFORM_DELETE_DRIVER_INFO = 0x8BD1;/*** 实时音视频传输请求*/public static final int AUDIO_AND_VIDEO_REALTIME_UPLOAD = 0x9501;/*** 音视频传输控制*/public static final int AUDIO_AND_VIDEO_CONTROL = 0x9102;/*** 实时音视频媒体通道注册*/public static final int AUDIO_AND_VIDEO_RESGITER = 0x1209;/*** 存储音视频检索*/public static final int STORAGE_AUDIO_AND_VIDEO_SEARCH = 0x9505;/*** 终端上传音视频资源列表*/public static final int TERMINAL_UP_AUDIO_AND_VIDEO_LIST = 0x1505;/*** 终端搜索月历信息列表*/public static final int TERMINAL_SEARCH_MONTH_LIST = 0x9508;/*** 月历查询应答*/public static final int SEARCH_MONTH_REPLY = 0x1508;/*** 存储音视频回放请求*/public static final int STORAGE_AUDIO_AND_VIDEO_PLAYBACK = 0x9509;/*** 存储音视频回放控制*/public static final int STORAGE_AUDIO_AND_VIDEO_CONTROL = 0x950A;/*** 网约车订单开始执行通知*/public static final int ORDER_START_NOTIFY = 0x8BC2;/*** 网约车订单执行完成通知*/public static final int ORDER_DONE_NOTIFY = 0x8BC3;/*** 特殊报警信息上报(DMS报警)*/public static final int DMS_ALARM_REPORT = 0x0BC4;/*** @param Command*            指令* @throws UnsupportedEncodingException* * @return String 通过command指令换取对应的指令字符*/public static String Command2CmdString(int Command) throws UnsupportedEncodingException {// 默认的字符提示String CommandStr = "错误的指令类型";switch (Command) {// ISU通用应答case JTT905Comd.ISU_GENERAL_RESPONSE:CommandStr = "ISU通用应答";break;// 中心通用应答case JTT905Comd.CENTER_GENERAL_RESPONSE:CommandStr = "中心通用应答";break;// ISU心跳case JTT905Comd.ISU_HEART:CommandStr = "ISU心跳";break;// 设置参数case JTT905Comd.SET_PARAMETERS:CommandStr = "设置参数";break;// 查询ISU参数case JTT905Comd.QUERY_ISU_PARAMETERS:CommandStr = "查询ISU参数";break;// 查询ISU参数应答case JTT905Comd.QUERY_THE_ISU_PARAMETERS_RESPONSE:CommandStr = "查询ISU参数应答";break;// ISU控制case JTT905Comd.ISU_CONTROL:CommandStr = "ISU控制";break;// ISU升级结果报告消息case JTT905Comd.ISU_UPDATE_RESULT_REPORT_MESSAGE:CommandStr = "ISU升级结果报告消息";break;// 位置信息汇报case JTT905Comd.LOCATION_INFORMATION_REPORT:CommandStr = "位置信息汇报";break;// 位置信息查询case JTT905Comd.LOCATION_INFORMATION_QUERY:CommandStr = "位置信息查询";break;// 位置信息查询应答case JTT905Comd.LOCATION_INFORMATION_QUERY_RESPONSE:CommandStr = "位置信息查询应答";break;// 位置跟踪控制case JTT905Comd.POSITION_TRACKING_CONTROL:CommandStr = "位置跟踪控制";break;// 位置跟踪信息汇报case JTT905Comd.POSITION_TRACKING_MESSAGE_REPORT:CommandStr = "位置跟踪信息汇报";break;// 位置汇报数据补传case JTT905Comd.LOCATION_REPORT_DATA_UPLOAD:CommandStr = "位置汇报数据补传";break;// 文本信息下发case JTT905Comd.TEXT_MESSAGING:CommandStr = "文本信息下发";break;// 事件设置case JTT905Comd.EVENT_SET:CommandStr = "事件设置";break;// 事件报告case JTT905Comd.INCIDENT_REPORT:CommandStr = "事件报告";break;// 提问下发case JTT905Comd.QUESTIONS_ISSUED:CommandStr = "提问下发";break;// 提问应答case JTT905Comd.QUESTIONS_ANSWERING:CommandStr = "提问应答";break;// 电话回拨case JTT905Comd.BACK_TO_THE_DIAL:CommandStr = "电话回拨";break;// 设置电话本case JTT905Comd.SET_UP_THE_PHONE_BOOK:CommandStr = "设置电话本";break;// 车辆控制case JTT905Comd.VEHICLE_CONTROL:CommandStr = "车辆控制";break;// 车辆控制应答case JTT905Comd.VEHICLE_CONTROL_RESPONSE:CommandStr = "车辆控制应答";break;// 摄像头图像上传case JTT905Comd.CAMERA_PICTURE_UPLOAD:CommandStr = "摄像头图像上传";break;// 摄像头立即拍摄命令case JTT905Comd.THE_CAMERA_IMMEDIATELY_SHOT_THE_COMMAND:CommandStr = "摄像头立即拍摄命令";break;// 存储图像检索case JTT905Comd.STORAGE_OF_PICTURE_RETRIEVAL:CommandStr = "存储图像检索";break;// 存储图像检索应答case JTT905Comd.STORAGE_PICTURE_RETRIEVAL_RESPONSE:CommandStr = "存储图像检索应答";break;// 存储图像/音视频上传命令case JTT905Comd.STORE_MULTIMEDIA_DATA_UPLOAD_COMMAND:CommandStr = "存储图像/音视频上传命令";break;// 订单任务下发case JTT905Comd.ORDER_TASK_ISSUED:CommandStr = "订单任务下发";break;// 驾驶员抢答case JTT905Comd.DRIVER_ANSWER:CommandStr = "驾驶员抢答";break;// 下发抢答结果信息case JTT905Comd.SEND_THE_RESULT_INFORMATION:CommandStr = "下发抢答结果信息";break;// 驾驶员电召任务完成确认case JTT905Comd.DRIVER_CALL_TASK_HAS_BEEN_CONFIRMED:CommandStr = "驾驶员电召任务完成确认";break;// 驾驶员取消订单case JTT905Comd.DRIVER_CANCELLED_THE_ORDER:CommandStr = "驾驶员取消订单";break;// 中心取消订单case JTT905Comd.CENTER_CANCELLED_THE_ORDER:CommandStr = "中心取消订单";break;// 上班签到信息上传case JTT905Comd.CHECK_IN_INFORMATION_UPLOADED:CommandStr = "上班签到信息上传";break;// 下班签退信息上传case JTT905Comd.CHECK_OUT_INFORMATION_UPLOAD:CommandStr = "下班签退信息上传";break;// 运营数据上传case JTT905Comd.OPERATION_DATA_UPLOAD:CommandStr = "运营数据上传";break;// 外围设备指令下行透传case JTT905Comd.PERIPHERAL_DEVICE_PASS_THROUGH:CommandStr = "外围设备指令下行透传";break;// 外围设备指令上行透传case JTT905Comd.PERIPHERAL_DEVICE_INSTRUCTION_UPLINK:CommandStr = "外围设备指令上行透传";break;// 音频检索case JTT905Comd.AUDIO_RETRIEVAL:CommandStr = "音频检索";break;// 存储音频检索应答case JTT905Comd.AUDIO_RETRIEVAL_RESPONSE:CommandStr = "存储音频检索应答";break;// 音视频上传case JTT905Comd.AUDIO_AND_VIDEO_UPLOAD:CommandStr = "音视频上传";break;// 中心确认报警 -> 无消息体case JTT905Comd.CENTER_CONFIRM_ALARM:CommandStr = "中心确认报警";break;// 中心解除报警case JTT905Comd.CENTER_RELEASE_ALARM:CommandStr = "中心解除报警";break;// 中心巡检设备case JTT905Comd.CENTER_PATROL_EQUIPMENT:CommandStr = "中心巡检设备";break;// 设备巡检应答case JTT905Comd.EQUIPMENT_INSPECTION_RESPONSE:CommandStr = "设备巡检应答";break;// 终端请求下发重要初始化参数指令// case JTT905Comd.TERMINAL_REQ_ISSUE_PARAMETER:// CommandStr = "终端请求下发重要初始化参数指令";// break;// 请求关联司机列表信息case JTT905Comd.REQ_DRIVER_LIST_INFO:CommandStr = "请求关联司机列表信息";break;// 请求关联司机列表信息应答case JTT905Comd.REP_DRIVER_LIST_INFO:CommandStr = "请求关联司机列表信息应答";break;// 终端请求驾驶员信息case JTT905Comd.TERMINAL_REQ_DRIVER_INFO:CommandStr = "终端请求驾驶员信息";break;// 平台下发驾驶员信息case JTT905Comd.PLATFORM_ISSUED_DRIVER_INFO:CommandStr = "平台下发驾驶员信息";break;// 平台删除驾驶员信息case JTT905Comd.PLATFORM_DELETE_DRIVER_INFO:CommandStr = "平台删除驾驶员信息";break;// 实时音视频传输请求case JTT905Comd.AUDIO_AND_VIDEO_REALTIME_UPLOAD:CommandStr = "实时音视频传输请求";break;// 存储音视频回放请求case JTT905Comd.STORAGE_AUDIO_AND_VIDEO_PLAYBACK:CommandStr = "存储音视频回放请求";break;// 音视频传输控制case JTT905Comd.AUDIO_AND_VIDEO_CONTROL:CommandStr = "音视频传输控制";break;// 实时音视频媒体通道注册case JTT905Comd.AUDIO_AND_VIDEO_RESGITER:CommandStr = "实时音视频媒体通道注册";break;// 存储音视频检索case JTT905Comd.STORAGE_AUDIO_AND_VIDEO_SEARCH:CommandStr = "存储音视频检索";break;// 终端上传音视频资源列表case JTT905Comd.TERMINAL_UP_AUDIO_AND_VIDEO_LIST:CommandStr = "终端上传音视频资源列表";break;// 终端搜索月历信息列表case JTT905Comd.TERMINAL_SEARCH_MONTH_LIST:CommandStr = "终端搜索月历信息列表";break;// 月历查询应答case JTT905Comd.SEARCH_MONTH_REPLY:CommandStr = "月历查询应答";break;// 存储音视频回放控制case JTT905Comd.STORAGE_AUDIO_AND_VIDEO_CONTROL:CommandStr = "存储音视频回放控制";break;// 网约车驾驶员签到/签退通知case JTT905Comd.DRIVER_CHECK_IN_OR_OUT_NOTIFY:CommandStr = "网约车驾驶员签到/签退通知";break;// 云端人脸识别结果通知case JTT905Comd.CLOUD_PERSON_FACE_CHECK_RESULT_NOTIFY:CommandStr = "云端人脸识别结果通知";break;// 网约车订单开始执行通知case JTT905Comd.ORDER_START_NOTIFY:CommandStr = "网约车订单开始执行通知";break;// 网约车订单执行完成通知case JTT905Comd.ORDER_DONE_NOTIFY:CommandStr = "网约车订单执行完成通知";break;// 特殊报警信息上报(DMS报警)case JTT905Comd.DMS_ALARM_REPORT:CommandStr = "特殊报警信息上报(DMS报警)";break;}return CommandStr;}}

当设备上电后,核心后台服务启动,也是整个项目最核心的启动模块,初始化化的工作。

主要核心操作有初始化定位服务、初始化ID与车牌、初始化车辆状态管理、初始化默认参数设置、

添加需要监听的Observer、初始化串口与外设模块、初始化Window视窗管理、更新并加载参数设置缓存、更新

并加载参数设置缓存中的连接参数、初始化mina4框架、连接平台检测、ISU升级判断、更新位置上报参数并启动上报线程、

注册调试广播、初始化拍照管理、初始化动态查岗管理

@Overridepublic void onCreate() {GpsLocationManager.initializeInstance(this);         // 初始化GPSmProtocolPreference = new ProtocolPreference(this); // init ProtocolPreferencegetIsuId();// usb 摄像头启用状态,0启用;非0不启用;hasUSBCamera = Settings.System.getInt(getContentResolver(), "cameraState", 1) == 0 ? true : false;// init VehicleManagermVehicleManager = VehicleManager.getVehicleManager(this);mVehicleManager.setOnVehicleStateListener(mVehicleStateListener);// init dbmJTTDBOperation = new JTTDBOperation(this);boolean firstBootApplication = Settings.System.getInt(getContentResolver(), FIRST_BOOT_APP,0) == 0;// first boot applicationif (firstBootApplication)// 插入默认的参数到数据库insertDefaultParams();// get system device state , register system state and parameter settings ObservergetSysStateRegisterObserver();// init wdmPeripheralsManager = PeripheralsManager.getInstance(this);// 启动检测mPeripheralsManager.queryDevSatate(new byte[0]);// init WindowManagerinitWindowManager();// intit gps serviceinitGps();if (updateMapCacheOk()) {updateConnectParameter();}// initialization connectorinitializationConnector();startConnect();// 判断ISU是否进行了升级UpdateCheck();// 开始上传位置基本信息,不论连接成功与否updateReportParameter(false);// 初始化录音管理实例对象,如果中心设置了全程录音,即开始录音// mMediaRecordManager = MediaRecordManager.getInstance(this);// 初次初始化录音参数配置// mMediaRecordManager.updateAudioParameter();// 注册主备服务器切换监听initReceiver();TakePictureManager.initializeInstance(this);mTimerQueryManager = TimerQueryManager.getInstance(this);}

onStart:实际运营时可以屏蔽里面的逻辑,实际运营前可用于调试905协议

startConnect:如果系统开机后,车牌与ISUID非空就直接启动mina4连接平台

initializationConnector:网络连接初始化,这也是终端与平台交互的核心模块,终端发出去的所有协议消息,平台的应答

都会走到这个方法里的匿名接口ConnectionListener的receiveData方法里,其中还有对连接成功、连接断开、连接异常、连接次数超限的检测

 mConnector.setOnConnectionListener(new ConnectionListener() {@Overridepublic void receiveData(Object data) {if (config.getFactory() instanceof ByteArrayCodecFactory) {dispatchProtocol(data);}}@Overridepublic void disConnect() {// startTimer(DEV_REBOOT_DEFAULT_TIME);// 获取设备Idint devideId = JTTUtils.getDeviceId("与平台连接");// 不存在此设备if (devideId == -1) return;// 更新设备的状态-异常mJTTDBOperation.insert(devideId, 1);if (!isActiveDisconnection) {// 断开了主服务器,切换到备份服务器if (isCurConnMainIp) {isCurConnMainIp = false;Log.d(TAG,"主服务器:" + cur_ip + "\t端口:" + cur_port + "");Log.d(TAG, "备服务器:" + backups_ip + "\t端口:" + backups_port);// 中心设置了备份服务器if (!TextUtils.isEmpty(backups_ip) && backups_port > 0) {// 备份ip、port与主服务ip、port一致if (backups_ip.equals(cur_ip) && backups_port == cur_port) {SocketAddress socket = new InetSocketAddress(cur_ip, cur_port);mConnector.switchConnection(socket);return;}// 开始切换到备份服务器Log.d(TAG, "切换到备份服务器:" + backups_ip + "\t端口:" + backups_port);SocketAddress socket = new InetSocketAddress(backups_ip, backups_port);// 切换备份服务器mConnector.switchConnection(socket);}} else { // 断开了备份服务器,切换到主服务器isCurConnMainIp = true;SocketAddress socket = new InetSocketAddress(cur_ip, cur_port);mConnector.switchConnection(socket);  // 切换备份服务器}}}@Overridepublic void connectOk() {isActiveDisconnection = false;Log.d(TAG, "连接平台成功");sendKeepAliveRequest();// 请求关联司机列表信息 - 下载驾驶员信息、驾驶员头像mProtocolManager.sendBytesMsg(JTT905Comd.REQ_DRIVER_LIST_INFO, null);// boolean isLogin = mProtocolPreference.isDriverLogin();// Log.i(TAG, "connectOk() isLogin : " + isLogin);// // 已签到// if (isLogin) {//// Log.d(TAG, "connectOk() 驾驶员已签到,开始判断缓存头像是否存在...");//// String CertificateNum =// mProtocolPreference.getEmploymentNumber();//// if (TextUtils.isEmpty(CertificateNum)) return;//// String path = ProtocolPreference.DEFAULT_DRIVER_PIC_SAVE_DIRECTORY + CertificateNum + ".jpg";//// // ***************** 判断缓存头像是否全部下载完毕 *****************// File file = new File(path);//// // 不存在缓存头像// if (!file.exists()) {//// Log.d(TAG, "connectOk() 驾驶员缓存头像不存在,开始请求...");// // 请求关联司机列表信息 - 下载驾驶员信息、驾驶员头像// mProtocolManager.sendBytesMsg(JTT905Comd.REQ_DRIVER_LIST_INFO,// null);// }// }// // 未签到// else {// Log.d(TAG, "connectOk() 驾驶员未签到,开始请求...");// // 请求关联司机列表信息 - 下载驾驶员信息、驾驶员头像// mProtocolManager.sendBytesMsg(JTT905Comd.REQ_DRIVER_LIST_INFO,// null);// }// 获取设备Idint devideId = JTTUtils.getDeviceId("与平台连接");// 不存在此设备if (devideId == -1) return;// 更新设备的状态-正常mJTTDBOperation.insert(devideId, 0);// 如果连接上了服务器,发送ISU升级成功的消息if (updateRebootFlag == 2) {// 发升级结果报告消息给服务器mProtocolManager.sendBytesMsg(JTT905Comd.ISU_UPDATE_RESULT_REPORT_MESSAGE, updateBytesArray.toBytes());// clearupdateBytesArray.clear();// falseisUpdate = false;updateRebootFlag = 0;}// 检测中心设置参数,动态设置汇报时间间隔、距离间隔的值updateReportParameter(false);// 数据补传,补传的数据包括签到、签退、位置基本信息、营运记录if (mDataReUpManager == null)mDataReUpManager = DataReUpManager.getDataReUpManager(JTTBGService.this, mProtocolManager);mDataReUpManager.reUpData();}@Overridepublic void connectError(SocketAddress s, Exception e) {// 获取设备Idint devideId = Utils.getDeviceId("与平台连接");// 不存在此设备if (devideId == -1) return;// 更新设备的状态-异常DBOperation.insert(devideId, 1);if (s instanceof InetSocketAddress) {InetSocketAddress address = (InetSocketAddress) s;}}@Overridepublic void exceptionCaught(Throwable cause) {Log.e(TAG, cause == null ? "exceptionCaught()..." : printfThrowable("exceptionCaught()", cause));}});

dispatchProtocol:平台回复或下发的消息最终都由initializationConnector方法的匿名接口ConnectionListener回调,经receiveData方法调用dispatchProtocol方法进行校验,如校验成功将由框架里协议部分的管理者对其进行下发并分发处理,架里协议部分的管理者类ProtocolManager类,

.ProtocolManager类的核心方法

onProtocol:该方法数据来自核心后台服务rmt.jtt.bgs.JTTBGService的dispatchProtocol方法,如校验成功后进行数据回调给onProtocol方法

createProtocol:该方法是实际终端与平台进行交互的地方,解析来自平台的指令并对其做出响应

 @Overridepublic void onProtocol(Protocol protocol) {if (protocol == null) return;// 如果是中心/平台/服务器通用应答 -> 8001if (protocol.getCommand() == JTT905Comd.CENTER_GENERAL_RESPONSE) {// 消息体byte[] MessageBody = protocol.getBody().toBytes();// 取出中心应答ISU的指令IDint AnswerID = JTTUtils.Byte2Int(new byte[] { MessageBody[2], MessageBody[3] });// 中心应答位置信息汇报 -> 200if (AnswerID == JTT905Comd.LOCATION_INFORMATION_REPORT) {// 空转重清零VehicleManager.getVehicleManager(mJTTBGService).put(VehicleManager.VEHICLESTATEMAP, 5, 0);// 重转空清零VehicleManager.getVehicleManager(mJTTBGService).put(VehicleManager.VEHICLESTATEMAP, 6, 0);// 车辆非法点火VehicleManager.getVehicleManager(mJTTBGService).put(VehicleManager.WARNINGMARKMAP, 24, 0);}// 摄像头图像上传 || 音视频上传if (AnswerID == JTT905Comd.CAMERA_PICTURE_UPLOAD || AnswerID == JTT905Comd.AUDIO_AND_VIDEO_UPLOAD) {// 继续TCP分包的维持条件if (mMediaFileSendManager != null && MessageBody[4] == 0)// 继续上传TCP分包mMediaFileSendManager.resumUpload(protocol);}if (AnswerID == JTT905Comd.DMS_ALARM_REPORT) {JTTUtils.FileEncoder(mPicture, mJTTDBOperation, mPath, true, mMediaFileSendManager, 0, ProtocolManager.this);}// 终止return;}// 上班签到、下班签退信息不需要累积角标消息数目// if (protocol.getCommand() != JTT905Comd.CHECK_IN_INFORMATION_UPLOADED && protocol.getCommand() != JTT905Comd.CHECK_OUT_INFORMATION_UPLOAD) {// // 更新905入口浮窗的角标消息的值// update905WindowNumber();// }// 生成协议消息并开始分发协议createProtocol(protocol);}

大概的流程就是这样 下次分享808.

Android GB905协议详解相关推荐

  1. Http协议详解,android文件下载

    5xx:服务器端错误–服务器未能实现合法的请求 常见状态代码.状态描述.说明: 200 OK      //客户端请求成功 400 Bad Request  //客户端请求有语法错误,不能被服务器所理 ...

  2. Android network — DHCP协议详解

    DHCP协议详解 0. 前言 1. DHCP协议 1.1 DHCP报文种类 1.2 DHCP报文格式 2. DHCP工作流程 2.1 IP地址分配方式 2.2 租约表 2.3 工作流程 2.4 服务器 ...

  3. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  4. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  5. 全志 android 编译,全志Android SDK编译详解(二)

    注意要确定安装了jdk) 第一步: cd  lichee; ./build.sh  -p sun5i_elite -k 3.0  (apt-get install uboot-mkimage需要安装m ...

  6. android传递socket对象,Android Socket通信详解

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  7. FFmpeg入门详解之87:HLS直播协议详解

    引言与效果演示 ----------------------------------------- FFmpeg431的官方地址已经无法打开, 我将ffmepg4.3.1的开发包和源码上传到了百度云: ...

  8. FFmpeg入门详解之102:HLS直播协议详解

    引言与效果演示 ----------------------------------------- FFmpeg431的官方地址已经无法打开, 我将ffmepg4.3.1的开发包和源码上传到了百度云: ...

  9. RTSP、HTTP、HTTPS、SDP四种协议详解

    RTSP.HTTP.HTTPS.SDP四种协议详解 从这篇开始我们将进入流媒体的环节,流媒体在android中有nuplayer来实现的,在开始讲解android流媒体前,我们先来讲讲流媒体传输协议, ...

最新文章

  1. Python学习笔记--序列
  2. 内存和显存_详谈服务器内存和显存知识
  3. XCTF-高手进阶区:Web_php_unserialize(详解)
  4. [Oracle] UNIX与Windows 2000上Oracle的差异(II)
  5. 数据eda_银行数据EDA:逐步
  6. Linux软件安装方法小结
  7. 常用 doc bat 命令总结
  8. HDU 6336 Matrix from Arrays (杭电多校4E)
  9. 【算法面试题】工厂木材加工问题
  10. 应用树莓派GPIO完成智能红绿灯系统
  11. 系统安装 使用VMware15安装Win7系统
  12. 解决Appium Desktop 测试中,元素不能准确定位的问题
  13. JAVA与C语言的区别之我见
  14. 功率开关的RC-Snubber电路设计
  15. 【matlab】输入一字符串,字母大写变小写,小写变大写。
  16. 面向未来,镭速助力企业构建文件安全外发新生态
  17. Ubuntu Linux出现IP inet6 addr: fe80::fe0:9b43:8a0e:2463/64的解决办法
  18. 火狐浏览器This address is restricted.端口问题
  19. 1905. 统计子岛屿-深度优先遍历图
  20. Linux C语言磁盘U盘容量读取、目录列表读取、文件夹大小读取

热门文章

  1. 移动硬盘安装ubuntu16.04
  2. STM32精英版(正点原子STM32F103ZET6开发板)学习篇13——ssd1306OLED实验
  3. 中地数码:融合创新国产GIS 乘风而上助推实景三维中国建设
  4. android安全漏洞(八)伪造短信(利用原生android4.0漏洞)
  5. EEPROM 编程器
  6. A newer version of WinPcap (internal version 10.2.0.5002) is already installed on this machine 问题解决
  7. 基于数据安全的风险评估-脆弱性识别
  8. 计算机网络硬件脆弱性,计算机网络的脆弱性包括哪些
  9. 田东县谋定产业格局-农业大健康·林裕豪:从玉农业携手推动
  10. IDEA 使用Spring Boot框架实现hello world