Android GB905协议详解

2023-05-16

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

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升级判断、更新位置上报参数并启动上报线程、

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

@Override
	public void onCreate() {
		GpsLocationManager.initializeInstance(this);         // 初始化GPS
		
		mProtocolPreference = new ProtocolPreference(this); // init ProtocolPreference

		getIsuId();

		// usb 摄像头启用状态,0启用;非0不启用;
		hasUSBCamera = Settings.System.getInt(getContentResolver(), "cameraState", 1) == 0 ? true : false;

		// init VehicleManager
		mVehicleManager = VehicleManager.getVehicleManager(this);
		mVehicleManager.setOnVehicleStateListener(mVehicleStateListener);

		// init db
		mJTTDBOperation = new JTTDBOperation(this);

		boolean firstBootApplication = Settings.System.getInt(getContentResolver(), FIRST_BOOT_APP,0) == 0;

		// first boot application
		if (firstBootApplication)
			// 插入默认的参数到数据库
			insertDefaultParams();

		// get system device state , register system state and parameter settings Observer
		getSysStateRegisterObserver();

		// init wd
		mPeripheralsManager = PeripheralsManager.getInstance(this);
		// 启动检测
		mPeripheralsManager.queryDevSatate(new byte[0]);

		// init WindowManager
		initWindowManager();
		// intit gps service
		initGps();

		if (updateMapCacheOk()) {
			updateConnectParameter();
		}

		// initialization connector
		initializationConnector();

		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() {

			@Override
			public void receiveData(Object data) {
				if (config.getFactory() instanceof ByteArrayCodecFactory) {
					dispatchProtocol(data);
				}
			}

			@Override
			public void disConnect() {
				// startTimer(DEV_REBOOT_DEFAULT_TIME);

				// 获取设备Id
				int 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);  // 切换备份服务器
					}
				}
			}

			@Override
			public 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);
				// }

				// 获取设备Id
				int 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());
					// clear
					updateBytesArray.clear();
					// false
					isUpdate = false;
					updateRebootFlag = 0;
				}

				// 检测中心设置参数,动态设置汇报时间间隔、距离间隔的值
				updateReportParameter(false);

				// 数据补传,补传的数据包括签到、签退、位置基本信息、营运记录
				if (mDataReUpManager == null)
					mDataReUpManager = DataReUpManager.getDataReUpManager(JTTBGService.this, mProtocolManager);
				mDataReUpManager.reUpData();
			}

			@Override
			public void connectError(SocketAddress s, Exception e) {

				// 获取设备Id
				int devideId = Utils.getDeviceId("与平台连接");

				// 不存在此设备
				if (devideId == -1) return;

				// 更新设备的状态-异常
				DBOperation.insert(devideId, 1);

				if (s instanceof InetSocketAddress) {
					InetSocketAddress address = (InetSocketAddress) s;
				}
			}

			@Override
			public 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:该方法是实际终端与平台进行交互的地方,解析来自平台的指令并对其做出响应

	@Override
	public void onProtocol(Protocol protocol) {
		if (protocol == null) return;


		// 如果是中心/平台/服务器通用应答 -> 8001
		if (protocol.getCommand() == JTT905Comd.CENTER_GENERAL_RESPONSE) {

			// 消息体
			byte[] MessageBody = protocol.getBody().toBytes();

			// 取出中心应答ISU的指令ID
			int AnswerID = JTTUtils.Byte2Int(new byte[] { MessageBody[2], MessageBody[3] });

			// 中心应答位置信息汇报 -> 200
			if (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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android GB905协议详解 的相关文章

  • 在OpenCV中将cv::Mat绘制到MFC的视图中

    毕设时遇到了一个问题 xff0c 不能在MFC中显示由GrabCut抠出来的图 经一番折腾发现 xff1a 在OpenCV中如果图像最初是Mat类型的话 xff0c 就不能通过转换为IplImage xff0c 再转换为CvvImage来显
  • 【AutoLisp】AutoLisp中的DCL界面应用基础

    目录 01 DCL的作用 01 01 DCL介绍 01 02 DCL对话框成员 01 标准DCL对象家族 02 装饰DCL对象家族 03 集群DCL对象家族 04 整合DCL对象家族 02 DCL的加载 03 DCL的规则 04 DCL对话
  • 在MFC的picture控件中如何显示Mat图

    首先 xff0c 要进行输入检查 xff0c 看Mat数据是否是有效的 xff0c 如下图中所示 定义位图数据结构 xff0c 用以方便在图形设备接口 GraphicsDeviceInterface 上显示 xff0c 也就是windows
  • MFC+OPENCV+显示MAT类型图像

    MFC显示图像到界面 xff0c 可以用链接中的DrawMatToPic xff0c 有时会出现IplImage 类型转换问题 xff0c 因为用opencv做后续图像处理 xff0c 所以统一使用Mat类型 xff0c 可以showMat
  • CvMat、Mat、IplImage之间的转换详解及实例

    IplImage xff1a 在OpenCV中IplImage是表示一个图像的结构体 xff0c 也是从OpenCV1 0到目前最为重要的一个结构 xff1b 在之前的图像表示用IplImage xff0c 而且之前的OpenCV是用C语言
  • RGB和RGBQUAD的区别

    RGB和RGBQUAD的区别 昨天的晚上 为一个问题困扰了很长时间 几乎整个晚上都在弄一个小bug 感觉没有问题 但就是效果不理想 几次三番 查来查去 我想实现的功能是 生成一张图 图上有字 这张图是以一张指定的位图为背景的 我使用 COL
  • BITMAPINFO结构

    BITMAPINFO结构 BITMAPINFO结构具有如下形式 xff1a typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader RGBQUAD bmiColors 1 BITMAP
  • OpenCV中的cv::String和CString互相转换

    请注意是cv String xff0c 而不是std string xff0c 第一个字母是大写的 基本上CString转cv String网上都能查到 xff0c 而cv String转CString没有人提到 1 CString gt
  • MFC——文件打开和保存对话框(CFileDialog)

    最近要做一个文件打开和保存的对话框 xff0c 现将相关的代码记录如下 xff0c 用以备忘 xff01 所用控件 xff1a 2个静态标签 Static Text xff1a 用以显示功能标签 xff1b 2个文本框 Edit xff1a
  • OpenCv2 学习笔记(1) Mat创建、复制、释放

    OpenCV和VS2013的安装图文教程网上有很多 xff0c 建议安装好之后 xff0c 用VS2013建立一个空工程 xff0c 用属性管理器分别新建一个对应debug和release工程的props配置文件 xff0c 以后直接根据工
  • MFC C++ Cstring与string互转

    CString 转换成string 我试了很多的方法 xff0c 都不行 xff0c 我用的vs2010 解决方案 unicode CString sz1 61 L 34 abc 34 std string sz2 61 CT2A sz1
  • MFC+opencv 显示mat图像

    VS2015 43 opencv3 0 MFC显示图片中方法三在使用时 xff0c 只能显示彩色图像 xff0c 灰度图像显示有问题 xff0c 经查找 xff0c 是没有设置图像调色板的原因图片控件宽度不为4的倍数 显示错误 xff0c
  • 怎么去掉SVN前面的标签,如感叹号!

    1 问题陈述 xff1a 有时不小心将整个目录都检入 xff0c 导致整个页面的文件与目录都有svn的标签 xff0c 感叹号什么的 2 解决方法 xff1a 打开 所有程序 xff0c 找到TortoiseSVN gt Setting 修
  • 人工智能6.1 -- 机器学习算法篇(一)数据清洗、回归(含实践)

    人工智能 python xff0c 大数据 xff0c 机器学习 xff0c 深度学习 xff0c 计算机视觉 六 机器学习算法篇 xff08 一 xff09 数据清洗 回归 xff08 含实践 xff09 前言 目录算法热身结论 xff1
  • Tesseract-ocr 3.0.2源码 + VS2010项目工程 + 简单测试代码

    编译环境 Visual Studio 2010 所用类库版本 zlib 1 2 7 lpng1514 jpegsr9 tiff 4 0 3 giflib 5 0 4 leptonica 1 69 tesseract ocr3 0 2 下载地
  • Asprise OCR SDK 15.3试用版破解

    1 序言 之前因同事需要 xff0c 破解过Asprise OCR 4 0试用版本 xff0c 对这个库比较有印象 目前最新版本为15 3 xff0c 网上已经能下载到它的试用破解版本 xff0c 但似乎没有看到此版本的破解文章 Aspri
  • 内存中绘图 Memdc

    内存中绘图 Memdc CDC MemDC 首先定义一个显示设备对象 xff0c 所有的绘制首先绘制到这块内存中 CBitmap MemBitmap 定义一个位图对象 随后建立与屏幕显示兼容的内存显示设备 MemDC CreateCompa
  • MFC中char*,string和CString之间的转换

    string是使用STL时必不可少的类型 xff0c 所以是做工程时必须熟练掌握的 xff1b char 是从学习C语言开始就已经和我们形影不离的了 xff0c 有许多API都是以char 作为参数输入的 所以熟练掌握三者之间的转换十分必要
  • C++ 创建文件夹的四种方式

    在开头不得不吐槽一下 xff0c 我要的是简单明了的创建文件夹的方式 xff0c 看得那些文章给的都是复杂吧唧的一大坨代码 xff0c 不仔细看鬼知道写的是啥 因此 xff0c 为了方便以后自己阅读 xff0c 这里自己写一下 C 43 4
  • c++ 多线程:线程句柄可以提前关闭,但是线程并没有关闭

    很多程序在创建线程都这样写的 xff1a ThreadHandle 61 CreateThread NULL 0 CloseHandel ThreadHandle 1 xff0c 线程和线程句柄 xff08 Handle xff09 不是一

随机推荐

  • MFC的GDI绘制坐标问题

    MoveWindow和CDC的位置不一样 xff0c MoveWindow 起点坐标 xff0c 宽 xff0c 高 xff0c CDC xff1a 起点坐标 xff0c 终点坐标
  • C#线程同步(1)- 临界区&Lock

    文章原始出处 http xxinside blogbus com logs 46441956 html 预备知识 xff1a 线程的相关概念和知识 xff0c 有多线程编码的初步经验 一个机会 xff0c 索性把线程同步的问题在C 里面的东
  • 线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法

    线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法 注 xff1a 使用结构CRITICAL SECTION 需加入头文件 include afxmt h 定义一个全局的锁 CRITIC
  • C# 获取鼠标相对当前窗口坐标的方法

    编写客户端应用程序时 xff0c 经常要用到鼠标当前的位置 在C 的winform开发中 xff0c 可以用Control MousePosition获得当前鼠标的坐标 xff0c 使用PointToClient计算鼠标相对于某个控件的坐标
  • 【Linux】Rocky Linux 9.0 Podman服务无法正常启动

    Rocky Linux 9 0发布后 xff0c 我在本地虚拟机对该版本进行了安装和测试 xff0c 发现Podman服务在某些情况下 xff0c 无法正常启动 当 etc selinux config配置中 xff0c SELINUX 6
  • 如何在C#控件中画点并获得指定点的像素颜色

    画点的方法 方法一 用picGraphics FillRectangle new SolidBrush fillColor p X p Y 1 1 即用一个像素填充方法 方法二 用gdi32 dll库中的SetPixel方法 DllImpo
  • LinearLayout(线性布局)

    本节引言 本节开始讲Android中的布局 xff0c Android中有六大布局 分别是 LinearLayout 线性布局 xff0c RelativeLayout 相对布局 xff0c TableLayout 表格布局 FrameLa
  • 使用DockerFile创建ROS环境(带有xfce和vnc可以访问桌面查看ROS的图形工具)

    基于 consol ubuntu xfce vnc的DockerFile FROM consol ubuntu xfce vnc 切换到root xff0c root才有权限进行安装软件等操作 USER 0 替换桌面背景 xff08 Doc
  • ROS自定义消息类型与使用

    1 创建消息文件 在功能包中创建msg文件夹并在文件夹中创建消息文件exmsage msg Header header int32 demo int float64 demo double 2 修改package xml lt build
  • ROS中的订阅模式、服务模式、action模式

    在ROS的通信方式中存在订阅 发布模式 xff0c 服务模式 xff0c 动作服务模式 1 订阅 发布模式 使用订阅 发布模式进行通信 xff0c 首先要知道主题的存在 发布者向主题发布消息 xff0c 订阅者订阅主题获取消息 其中订阅者不
  • Shell获取标准错误并赋值给变量

    今天在写shell的过程中遇到个问题 xff0c 用 XXX 61 ln s XXX XXX 想在运行软链接时候把错误输出赋值给一个变量 xff0c 却怎么也赋值不了 xff0c 最后发现应该是标准输出和标准错误的问题 一般来说 只会得到命
  • C语言提高

    头文件函数声明 防止头文件重复包含 xff08 相互包含陷入包含死循环 xff09 pragma once 兼容C 43 43 编译器 如果是C 43 43 编译器 xff0c 按c标准编译 ifdefine cplusplus C语言编译
  • Python 实现文本文件多路归并排序

    开发说明 xff1a 前两天刚开始学习Python xff0c 但是厌烦了Hello World这类没用的东东 xff0c 于是就自己边学边做 xff0c 花了一天时间完成了这个稍微复杂的小应用 xff1b p 麻雀虽小五脏俱全 xff0c
  • C++ split基本操作

    源代码 xff1a void split const string amp s char delim vector lt string gt amp elems stringstream ss s string item while get
  • VSLAM学习之(一)

    相关资料整理 CVPR 2014 Visual SLAM Tutorial 学习SLAM需要哪些预备知识 VSLAM简介 VSLAM xff08 Visual Simultaneous Localization and Mapping xf
  • 一本书,让我走上编程之路

    好多年了 xff0c 我的书架上一直留着这本书 xff0c 不是因为有多好 xff0c 而是它让我明白了许多 工作后的我读过无数本厚厚薄薄的书 xff0c 其中有的确实十分精彩 但唯一让我真正用心读过的 xff0c 是大学期间一本普通的c
  • ubuntu虚拟机终端(terminal)打不开

    最近想用cmake gui编译opencv xff0c 发现虚拟机上终端 xff08 terminal xff09 打不开 xff0c 点图标也打不开 xff0c ctrl 43 alt 43 t也没反应 然后百度了一下ctrl 43 al
  • Debian 用户名密码输入成功后重复登录

    问题描述 xff1a 在用户名和密码都输入成功的情况下 xff0c 重复出现登录界面 xff0c 无法进入主界面 问题原因 xff1a 原因为修改了 etc environment 环境变量 xff0c 在文件末尾添加了 xff1a PAT
  • C++最佳实践之常用库介绍

    C 43 43 的常用库包括 xff1a algorithm chrono iostream future memory map queue unordered map regex set string sstream stdexcept
  • Android GB905协议详解

    最近发现 xff0c 深圳做网约车和货车的协议的公司越来越多了 xff0c 之前在公司做过一些这方面的项目 就来写个这方面的文章记录下 xff0c 也顺便分享下 GB905 xff0c 主要是面向网约车的一种协议 xff0c 主要监控司机的