欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android GB905协议详解

程序员文章站 2022-06-24 18:45:19
最近发现,深圳做网约车和货车的协议的公司越来越多了,之前在公司做过一些这方面的项目。就来写个这方面的文章记录下,也顺便分享下。GB905,主要是面向网约车的一种协议,主要监控司机的行为,确保乘车安全。 首先一些协议的指令。public class JTT905Cmd {/** * ISU通用应答 */public static final int ISU_GENERAL_RESPONSE = 0x0001;/*** 中心通用应答 */public static final i...

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

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.

本文地址:https://blog.csdn.net/u011694328/article/details/109255424