Browse Source

APIModuleGis 增加精准度状态改版 增添高效率启动接口 修改获取经纬度部分逻辑

1037015548@qq.com 1 năm trước cách đây
mục cha
commit
c86e68cdaf

BIN
.gradle/5.6.4/fileHashes/fileHashes.lock


BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock


+ 6 - 0
app/src/main/assets/widget/index_frm.html

@@ -42,6 +42,11 @@
 	        var res = uzmoduleGis.huaceRtkList(param);
 	        alert("获取手机已配对RTK设备列表:"+JSON.stringify(res));
 		}
+		function startGisAndSend(){
+			var param = {appParam:"Hello APICloud!"};
+	        var res = uzmoduleGis.startGisAndSend(param);
+	        alert("高效率启动结果为:"+JSON.stringify(res));
+		}
 		function startGisService(){
 			var param = {appParam:"Hello APICloud!"};
 	        var res = uzmoduleGis.startGisService(param);
@@ -205,6 +210,7 @@
 				<div class="clickbtn" tapmode="active" onclick="showAlert()" >点击弹出</div>     
 <!--				<div class="clickbtn" tapmode="active" onclick="startGisActivity()" >启动GisActivity</div>-->
 				<div class="clickbtn" tapmode="active" onclick="huaceRtkList()" >获取手机已配对RTK设备列表</div>
+				<div class="clickbtn" tapmode="active" onclick="startGisAndSend()" >高效率简洁启动Gnss服务并发送连接</div>
 				<div class="clickbtn" tapmode="active" onclick="startGisService()" >启动GisService</div>
 				<div class="clickbtn" tapmode="active" onclick="sendConnect()" >尝试连接</div>
 				<div class="clickbtn" tapmode="active" onclick="loginCors()" >登录cors</div>

+ 285 - 24
moduleGis/src/main/java/com/example/moduleGis/APIModuleGis.java

@@ -60,6 +60,8 @@ import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 import java.util.TimeZone;
+import java.util.Timer;
+import java.util.TimerTask;
 
 /**
  * 该类映射至Javascript中moduleDemo对象<br><br>
@@ -95,6 +97,29 @@ public class APIModuleGis extends UZModule {
 
 	private volatile static String logCorsCod = "";//连接状态:0登录成功 1:登录失败
 
+	//TODO Lx 统一断开所有的服务
+	public ModuleResult jsmethod_stopAllService_sync(final UZModuleContext context){
+		JSONObject res = new JSONObject();
+		try {
+			res.put("code", "0");
+			res.put("msg", "");
+
+			DiffConnectManager.loginOutCors(this.context());
+			//TODO 无异常
+			logCorsCod = "1";
+
+			ReceiverConnectProxy.getInstance().disConnect();
+			//TODO 无异常
+			connectCode = "1";
+
+			onUnBindClick();
+			bindCode = "1";
+		}catch(Exception ex){
+			Log.i(TAG,ex.getLocalizedMessage());
+		}
+		return new ModuleResult(res);
+	}
+
 	//TODO Lx 获取经纬度
 	public ModuleResult jsmethod_gisLatLng_sync(final UZModuleContext context){
 		String code = "1";//0表示成功;1表示失败
@@ -103,31 +128,83 @@ public class APIModuleGis extends UZModule {
 		try {
 			res.put("code",code);
 			res.put("msg",msg);
+			res.put("version","1.0.7");
 
-			//TODO 做连接状态字段connectCode的监听
-			long time = System.currentTimeMillis();
-			while (true) {
-				if(System.currentTimeMillis() - time < 3 * 1000) {
-					if ("0".equals(connectCode)) {
-						//TODO 说明已经调用过启动连接方法,并且连接成功
-						//TODO 而且还要满足此时经纬度返回已经不是0.0了
-						if(!"0.0".equals(wgslat)&&!"0.0".equals(wgslng)) {
-							code = "0";
-							res.put("code", code);
-							JSONObject gisObj = new JSONObject();
-							gisObj.put("wgslat", wgslat);
-							gisObj.put("wgslng", wgslng);
-							gisObj.put("wgsblh", wgsblh);
-							gisObj.put("postType", postType);
-							res.put("data", gisObj);
-							break;
-						}
-					}
-				}else{
-					//TODO 说明超时
-					msg = "获取超时";
-					res.put("msg",msg);
-					break;
+			code = "0";
+			res.put("code", code);
+			JSONObject gisObj = new JSONObject();
+			if(!"0.0".equals(wgslat)&&!"0.0".equals(wgslng)) {
+				gisObj.put("wgslat", wgslat);
+				gisObj.put("wgslng", wgslng);
+				gisObj.put("wgsblh", wgsblh);
+			}else{
+				gisObj.put("wgslat", "0.0".equals(wgslat)?"":wgslat);
+				gisObj.put("wgslng", "0.0".equals(wgslng)?"":wgslng);
+				gisObj.put("wgsblh", "0.0".equals(wgsblh)?"":wgsblh);
+			}
+
+			gisObj.put("postType", postType);
+
+			//TODO 连接状态返回
+			gisObj.put("bindCode",bindCode);
+			gisObj.put("connectCode",connectCode);
+			gisObj.put("logCorsCod",logCorsCod);
+
+			//TODO 当前连接的信息
+			gisObj.put("ramRtkName",ramRtkName);//RTK设备名称
+			gisObj.put("ramIp",ramIp);//corsIp
+			gisObj.put("ramPort",ramPort);//端口
+			gisObj.put("ramMountName",ramMountName);//源名称
+			gisObj.put("ramCorsUserName",ramCorsUserName);//用户名
+			gisObj.put("ramCorsPassword",ramCorsPassword);//密码
+
+			res.put("data", gisObj);
+
+			//TODO 大逻辑 是否重连判断
+			String rtkName = context.optString("rtkName");
+			//TODO cors相关判断 , 全传就登录, 有一个没传就不登
+			String ip = context.optString("ip");
+			Integer port = Integer.valueOf(context.optString("port"));
+			String mountName = context.optString("mountName");
+			String userName = context.optString("userName");
+			String passWord = context.optString("passWord");
+
+			//TODO rtk连接比cors连接优先级要高
+			if(rtkName!=null&&rtkName.length()>0){
+				if(!rtkName.equals(ramRtkName)){
+					//TODO 说明RTK 更换名称了 , 断开原连接再重新发送连接
+					ReceiverConnectProxy.getInstance().disConnect();
+					DiffConnectManager.loginOutCors(this.context());
+					connectCode = "1";
+					logCorsCod = "1";
+					startSendMessage(res,context);
+				}
+			}else{
+				//TODO 说明RTK 没传, 就断开连接
+				ReceiverConnectProxy.getInstance().disConnect();
+				DiffConnectManager.loginOutCors(this.context());
+				connectCode = "1";
+				logCorsCod = "1";
+			}
+			//TODO cors更换
+			if((ip!=null&&!ip.equals(ramIp))||(port!=null&&!port.equals(ramPort))
+					||(mountName!=null&&!mountName.equals(ramMountName))
+					||(userName!=null&&!userName.equals(ramCorsUserName))
+					||(passWord!=null&&!passWord.equals(ramCorsPassword))){
+				//TODO 有一个条件不一致就要重连 cors
+				DiffConnectManager.loginOutCors(this.context());
+				if(ip!=null&&ip.length()>0&&
+						port!=null&&
+						mountName!=null&&mountName.length()>0&&
+						userName!=null&&userName.length()>0&&
+						passWord!=null&&passWord.length()>0){
+					//TODO 重连必须满足以上条件
+					DiffConnectManager.loginCors(this.context(),ip,port,mountName,userName,passWord);
+					ramIp = ip;
+					ramPort = port;
+					ramMountName = mountName;
+					ramCorsUserName = userName;
+					ramCorsPassword = passWord;
 				}
 			}
 		}catch (Exception ex){
@@ -452,6 +529,190 @@ public class APIModuleGis extends UZModule {
 		}
 	}
 
+	//TODO 当前连接的rtk和 cors 账号内存信息
+	private volatile static String ramRtkName = null;
+
+	//TODO 当前登录cors相关
+	private volatile static String ramIp = null;
+	private volatile static Integer ramPort = null;
+	private volatile static String ramMountName = null;
+	private volatile static String ramCorsUserName = null;
+	private volatile static String ramCorsPassword = null;
+
+	//TODO Lx 高效率并简洁启动gisService服务并发送连接
+	public ModuleResult jsmethod_startGisAndSend_sync(UZModuleContext moduleContext){
+		JSONObject res = new JSONObject();
+		String code = "1";
+		String msg = "error";
+		try{
+			//TODO 启动服务相关判断
+			res.put("code",code);
+			res.put("msg",msg);
+			startSendMessage(res,moduleContext);
+			return new ModuleResult(res);
+		}catch(Exception ex){
+			code = "1";
+			msg = "errorException";
+			try{res.put("code",code);res.put("msg",msg);}catch(Exception e){}
+			Log.e(TAG,ex.getLocalizedMessage());
+			return new ModuleResult(res);
+		}
+	}
+
+	//TODO 统一启动服务和发送连接命令
+	private void startSendMessage(JSONObject res,UZModuleContext moduleContext) throws JSONException {
+		BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+		if (adapter == null) {
+			res.put("code","2");
+			res.put("msg","本机没有找到蓝牙硬件或驱动!");
+		} else {
+			if (!adapter.isEnabled()) {
+				//直接开启蓝牙
+				adapter.enable();
+			}
+		}
+		if (ContextCompat.checkSelfPermission(this.context(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
+			res.put("code","3");
+			res.put("msg","定位授权:请授予APP位置访问权限,以便应用可检测外围设备");
+		}
+
+		//TODO 连接相关判断
+		String rtkName = moduleContext.optString("rtkName");
+		if(rtkName==null||"".equals(rtkName)){
+			res.put("code","4");
+			res.put("msg","配对设备参数不存在");
+		}
+		//打开蓝牙
+		if (!BlueUtils.isOpen()) {
+			//Util.showOnUiThreadToast(this, "请打开蓝牙进行手机蓝牙配对!");
+//            errorPromote(this, "温馨提示", "请在设置页面打开手机蓝牙配对连接!");
+			res.put("code","5");
+			res.put("msg","请在设置页面打开手机蓝牙配对连接!");
+		}
+		List<String> arrBle = BlueUtils.getBluetoothDevice(BleStatusDefine.CONNECTED);
+		if (arrBle != null && arrBle.size() > 0) {
+			for (int i = arrBle.size() - 1; i >= 0; i--) {
+				if (!arrBle.get(i).startsWith("GNSS"))
+					arrBle.remove(i);
+			}
+		}
+		if (arrBle == null || arrBle.size() <= 0) {
+//            errorPromote(this, "温馨提示", "没有已配对连接的RTK蓝牙设备!");
+			res.put("code","6");
+			res.put("msg","没有已配对连接的RTK蓝牙设备!");
+		}
+		if(!arrBle.contains(rtkName)){
+			res.put("code","7");
+			res.put("msg","您选择的设备"+rtkName+"未配对,请重新选择或在手机蓝牙设置页重新配对");
+		}
+		//TODO cors相关判断 , 全传就登录, 有一个没传就不登
+		String ip = moduleContext.optString("ip");
+		Integer port = Integer.valueOf(moduleContext.optString("port"));
+		String mountName = moduleContext.optString("mountName");
+		String userName = moduleContext.optString("userName");
+		String passWord = moduleContext.optString("passWord");
+
+		if (!EventBus.getDefault().isRegistered(this)) {
+			EventBus.getDefault().register(this);
+		}
+		if (checkPermissionEnable(PERMISSIONS)) {
+			//TODO ①先绑服务
+			if(!"0".equals(bindCode)){
+				initGnss();
+				if (!EventBus.getDefault().isRegistered(this)) {
+					EventBus.getDefault().register(this);
+				}
+				onBindClick();
+			}
+			Context thisContext = this.context();
+			//TODO ②发送连接
+			Timer timer = new Timer();
+			timer.schedule(new TimerTask() {
+				@Override
+				public void run() {
+					if(!"0".equals(connectCode)) {
+						ReceiverConnectProxy.getInstance().connByBluetooth(rtkName);
+					}else{
+						//TODO rtk连接比cors连接优先级要高
+						if(rtkName!=null&&rtkName.length()>0){
+							if(!rtkName.equals(ramRtkName)){
+								//TODO 说明RTK 更换名称了 , 断开原连接再重新发送连接
+								ReceiverConnectProxy.getInstance().disConnect();
+								DiffConnectManager.loginOutCors(thisContext);
+								connectCode = "1";
+								logCorsCod = "1";
+								try {
+									ReceiverConnectProxy.getInstance().connByBluetooth(rtkName);
+								} catch (Exception e) {
+									throw new RuntimeException(e);
+								}
+							}
+						}else{
+							//TODO 说明RTK 没传, 就断开连接
+							ReceiverConnectProxy.getInstance().disConnect();
+							DiffConnectManager.loginOutCors(thisContext);
+							connectCode = "1";
+							logCorsCod = "1";
+						}
+					}
+				}
+			},1000);
+
+			//TODO ③登录cors
+			if(ip!=null&&ip.length()>0&&
+					port!=null&&
+					mountName!=null&&mountName.length()>0&&
+					userName!=null&&userName.length()>0&&
+					passWord!=null&&passWord.length()>0){
+				Timer timer2 = new Timer();
+				Context corsContext = this.context();
+				timer2.schedule(new TimerTask() {
+					@Override
+					public void run() {
+						if(!"0".equals(logCorsCod)){
+							DiffConnectManager.loginCors(corsContext,ip,port,mountName,userName,passWord);
+						}else{
+							//TODO cors更换
+							if((ip!=null&&!ip.equals(ramIp))||(port!=null&&!port.equals(ramPort))
+									||(mountName!=null&&!mountName.equals(ramMountName))
+									||(userName!=null&&!userName.equals(ramCorsUserName))
+									||(passWord!=null&&!passWord.equals(ramCorsPassword))){
+								//TODO 有一个条件不一致就要重连 cors
+								DiffConnectManager.loginOutCors(thisContext);
+								if(ip!=null&&ip.length()>0&&
+										port!=null&&
+										mountName!=null&&mountName.length()>0&&
+										userName!=null&&userName.length()>0&&
+										passWord!=null&&passWord.length()>0){
+									//TODO 重连必须满足以上条件
+									DiffConnectManager.loginCors(thisContext,ip,port,mountName,userName,passWord);
+									ramIp = ip;
+									ramPort = port;
+									ramMountName = mountName;
+									ramCorsUserName = userName;
+									ramCorsPassword = passWord;
+								}
+							}
+						}
+					}
+				},1500);
+			}
+
+			//static 内存赋值
+			ramRtkName = rtkName;
+			ramIp = ip;
+			ramPort = port;
+			ramMountName = mountName;
+			ramCorsUserName = userName;
+			ramCorsPassword = passWord;
+
+			res.put("code","0");
+			res.put("msg","success");
+		}else {
+			ActivityCompat.requestPermissions(this.activity(), PERMISSIONS, REQUEST_PERMISSION);
+		}
+	}
+
 	//TODO Lx 销毁服务绑定
 	public ModuleResult jsmethod_stopGisService_sync(final UZModuleContext context) {
 		String code = "1";//0表示成功;1表示失败