diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
new file mode 100644
index 0000000..ea22e0b
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
@@ -0,0 +1,24 @@
+package com.casic.missiles.modular.system.utils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 指令拼接
+ *
+ * @author a203
+ */
+public class CommandManager {
+ private static final String CMD_HEADER = "*AT^IOTDATA=";
+
+ /**
+ * *AT^IOTDATA=21,"^$CC1,11,LOGIN,d, D$^"
+ *
+ * 21是双引号中间的数据长度,CC1指挥中心名称,11是指挥中心密码,d+逗号+空格+D
+ *
+ * 登录指令和发送数据指令之间,需要间隔500ms以上
+ */
+ public static byte[] createLoginCmd(String data) {
+ String cmd = CMD_HEADER + data.length() + "," + "\"" + data + "\"";
+ return cmd.getBytes(StandardCharsets.UTF_8);
+ }
+}
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 8ce4d9d..65f3c26 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -82,6 +82,11 @@
io.netty
netty-all
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
new file mode 100644
index 0000000..ea22e0b
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
@@ -0,0 +1,24 @@
+package com.casic.missiles.modular.system.utils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 指令拼接
+ *
+ * @author a203
+ */
+public class CommandManager {
+ private static final String CMD_HEADER = "*AT^IOTDATA=";
+
+ /**
+ * *AT^IOTDATA=21,"^$CC1,11,LOGIN,d, D$^"
+ *
+ * 21是双引号中间的数据长度,CC1指挥中心名称,11是指挥中心密码,d+逗号+空格+D
+ *
+ * 登录指令和发送数据指令之间,需要间隔500ms以上
+ */
+ public static byte[] createLoginCmd(String data) {
+ String cmd = CMD_HEADER + data.length() + "," + "\"" + data + "\"";
+ return cmd.getBytes(StandardCharsets.UTF_8);
+ }
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index 3a08fd0..c8eecd8 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -14,15 +14,7 @@
public static final int MAX_RADIUS = 80;
public static final int MAX_AGE = 240;
public static final int MIN_AGE = 1;
+ public static final int BAUD_RATE = 115200;
- /**
- * 洋流相关常量
- */
- private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn";
- public static final String OCEAN_HEADER_NAME = "Authorization";
- public static final String OCEAN_APPID = "WXZH888888";
- public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb";
-
- public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token";
- public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx";
+ public static final String USB_SERIAL = "/dev/tty.usbserial-1120";
}
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 8ce4d9d..65f3c26 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -82,6 +82,11 @@
io.netty
netty-all
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
new file mode 100644
index 0000000..ea22e0b
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
@@ -0,0 +1,24 @@
+package com.casic.missiles.modular.system.utils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 指令拼接
+ *
+ * @author a203
+ */
+public class CommandManager {
+ private static final String CMD_HEADER = "*AT^IOTDATA=";
+
+ /**
+ * *AT^IOTDATA=21,"^$CC1,11,LOGIN,d, D$^"
+ *
+ * 21是双引号中间的数据长度,CC1指挥中心名称,11是指挥中心密码,d+逗号+空格+D
+ *
+ * 登录指令和发送数据指令之间,需要间隔500ms以上
+ */
+ public static byte[] createLoginCmd(String data) {
+ String cmd = CMD_HEADER + data.length() + "," + "\"" + data + "\"";
+ return cmd.getBytes(StandardCharsets.UTF_8);
+ }
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index 3a08fd0..c8eecd8 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -14,15 +14,7 @@
public static final int MAX_RADIUS = 80;
public static final int MAX_AGE = 240;
public static final int MIN_AGE = 1;
+ public static final int BAUD_RATE = 115200;
- /**
- * 洋流相关常量
- */
- private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn";
- public static final String OCEAN_HEADER_NAME = "Authorization";
- public static final String OCEAN_APPID = "WXZH888888";
- public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb";
-
- public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token";
- public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx";
+ public static final String USB_SERIAL = "/dev/tty.usbserial-1120";
}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index 537739b..7c89fe7 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -1,9 +1,6 @@
package com.casic.missiles.modular.system.utils;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.TypeReference;
import com.casic.missiles.modular.system.dto.*;
-import com.casic.missiles.modular.system.dto.remote.OceanDetailModel;
import org.locationtech.spatial4j.distance.DistanceUtils;
import java.text.DecimalFormat;
@@ -27,7 +24,7 @@
* 环境数据-已校验
*/
public static Map encodeEnvironment(double targetLng, double targetLat, TyphoonDetailDTO typhoon,
- String date, String days, String hour) {
+ OceanDetailDTO oceanDetail) {
Map resultMap = createDataHead("Env");
resultMap.put("targetLng", targetLng);
resultMap.put("targetLat", targetLat);
@@ -59,16 +56,8 @@
double angle = azimuth(lng, lat, targetLng, targetLat);
dto.setAzimuth(angle);
}
-
//洋流数据
- String oceanData = HttpRequestHelper.obtainOceanData(targetLng, targetLat, date, days, hour);
- OceanDetailDTO oceanDetailDTO = null;
- if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) {
- OceanDetailModel remoteData = JSON.parseObject(oceanData, new TypeReference() {
- });
- oceanDetailDTO = new OceanDetailDTO(remoteData);
- }
- dto.setOceanDetail(oceanDetailDTO);
+ dto.setOceanDetail(oceanDetail);
resultMap.put("data", dto);
return resultMap;
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 8ce4d9d..65f3c26 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -82,6 +82,11 @@
io.netty
netty-all
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
new file mode 100644
index 0000000..ea22e0b
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
@@ -0,0 +1,24 @@
+package com.casic.missiles.modular.system.utils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 指令拼接
+ *
+ * @author a203
+ */
+public class CommandManager {
+ private static final String CMD_HEADER = "*AT^IOTDATA=";
+
+ /**
+ * *AT^IOTDATA=21,"^$CC1,11,LOGIN,d, D$^"
+ *
+ * 21是双引号中间的数据长度,CC1指挥中心名称,11是指挥中心密码,d+逗号+空格+D
+ *
+ * 登录指令和发送数据指令之间,需要间隔500ms以上
+ */
+ public static byte[] createLoginCmd(String data) {
+ String cmd = CMD_HEADER + data.length() + "," + "\"" + data + "\"";
+ return cmd.getBytes(StandardCharsets.UTF_8);
+ }
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index 3a08fd0..c8eecd8 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -14,15 +14,7 @@
public static final int MAX_RADIUS = 80;
public static final int MAX_AGE = 240;
public static final int MIN_AGE = 1;
+ public static final int BAUD_RATE = 115200;
- /**
- * 洋流相关常量
- */
- private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn";
- public static final String OCEAN_HEADER_NAME = "Authorization";
- public static final String OCEAN_APPID = "WXZH888888";
- public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb";
-
- public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token";
- public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx";
+ public static final String USB_SERIAL = "/dev/tty.usbserial-1120";
}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index 537739b..7c89fe7 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -1,9 +1,6 @@
package com.casic.missiles.modular.system.utils;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.TypeReference;
import com.casic.missiles.modular.system.dto.*;
-import com.casic.missiles.modular.system.dto.remote.OceanDetailModel;
import org.locationtech.spatial4j.distance.DistanceUtils;
import java.text.DecimalFormat;
@@ -27,7 +24,7 @@
* 环境数据-已校验
*/
public static Map encodeEnvironment(double targetLng, double targetLat, TyphoonDetailDTO typhoon,
- String date, String days, String hour) {
+ OceanDetailDTO oceanDetail) {
Map resultMap = createDataHead("Env");
resultMap.put("targetLng", targetLng);
resultMap.put("targetLat", targetLat);
@@ -59,16 +56,8 @@
double angle = azimuth(lng, lat, targetLng, targetLat);
dto.setAzimuth(angle);
}
-
//洋流数据
- String oceanData = HttpRequestHelper.obtainOceanData(targetLng, targetLat, date, days, hour);
- OceanDetailDTO oceanDetailDTO = null;
- if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) {
- OceanDetailModel remoteData = JSON.parseObject(oceanData, new TypeReference() {
- });
- oceanDetailDTO = new OceanDetailDTO(remoteData);
- }
- dto.setOceanDetail(oceanDetailDTO);
+ dto.setOceanDetail(oceanDetail);
resultMap.put("data", dto);
return resultMap;
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java
deleted file mode 100644
index 5b43a60..0000000
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.casic.missiles.modular.system.utils;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONException;
-import com.alibaba.fastjson.JSONObject;
-import lombok.NonNull;
-import okhttp3.*;
-
-import java.io.IOException;
-import java.util.Objects;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 网络请求工具
- *
- * @author a203
- */
-public class HttpRequestHelper {
-
- public static RequestBody createRequestBody(String value) {
- return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), value);
- }
-
- public static String doPost(Request request) {
- return streamResponse(request);
- }
-
- public static String doGet(String url) {
- return streamResponse(new Request.Builder()
- .url(url)
- .build());
- }
-
- private static String streamResponse(@NonNull Request request) {
- OkHttpClient httpClient = new OkHttpClient.Builder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .writeTimeout(10, TimeUnit.SECONDS)
- .readTimeout(20, TimeUnit.SECONDS)
- .build();
- Call call = httpClient.newCall(request);
- try {
- Response response = call.execute();
- return response.body() != null ? Objects.requireNonNull(response.body()).string() : "";
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
- }
-
- public static String obtainOceanData(double lng, double lat, String date, String days, String hour) {
- /**
- * 获取洋流数据Token
- * */
- JSONObject object = new JSONObject();
- try {
- object.put("appId", Constant.OCEAN_APPID);
- object.put("appKey", Constant.OCEAN_APP_KEY);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- Request tokenRequest = new Request.Builder()
- .url(Constant.OCEAN_TOKEN)
- .post(HttpRequestHelper.createRequestBody(object.toJSONString()))
- .build();
- String tokenJson = HttpRequestHelper.doPost(tokenRequest);
- if ("".equals(tokenJson)) {
- return null;
- }
- /**
- * 解析token
- * */
- JSONObject tokenObject = JSON.parseObject(tokenJson);
- JSONObject dataObject = tokenObject.getJSONObject("data");
- String token = dataObject.getString("token");
- /**
- * 封装请求参数
- * */
- JSONObject jsonObject = new JSONObject();
- try {
- jsonObject.put("lon", lng);
- jsonObject.put("lat", lat);
- jsonObject.put("date", date);
- jsonObject.put("hour", days);
- jsonObject.put("days", hour);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- /**
- * 获取洋流数据
- * */
- Request request = new Request.Builder()
- .addHeader(Constant.OCEAN_HEADER_NAME, token)
- .url(Constant.OCEAN_DETAIL)
- .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString()))
- .build();
- return HttpRequestHelper.doPost(request);
- }
-
- public static String getOceanCode(String value) {
- if ("".equals(value)) {
- return value;
- }
- JSONObject jsonObject = JSON.parseObject(value);
- Integer code = jsonObject.getInteger("code");
- return String.valueOf(code);
- }
-}
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 8ce4d9d..65f3c26 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -82,6 +82,11 @@
io.netty
netty-all
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
new file mode 100644
index 0000000..ea22e0b
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
@@ -0,0 +1,24 @@
+package com.casic.missiles.modular.system.utils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 指令拼接
+ *
+ * @author a203
+ */
+public class CommandManager {
+ private static final String CMD_HEADER = "*AT^IOTDATA=";
+
+ /**
+ * *AT^IOTDATA=21,"^$CC1,11,LOGIN,d, D$^"
+ *
+ * 21是双引号中间的数据长度,CC1指挥中心名称,11是指挥中心密码,d+逗号+空格+D
+ *
+ * 登录指令和发送数据指令之间,需要间隔500ms以上
+ */
+ public static byte[] createLoginCmd(String data) {
+ String cmd = CMD_HEADER + data.length() + "," + "\"" + data + "\"";
+ return cmd.getBytes(StandardCharsets.UTF_8);
+ }
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index 3a08fd0..c8eecd8 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -14,15 +14,7 @@
public static final int MAX_RADIUS = 80;
public static final int MAX_AGE = 240;
public static final int MIN_AGE = 1;
+ public static final int BAUD_RATE = 115200;
- /**
- * 洋流相关常量
- */
- private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn";
- public static final String OCEAN_HEADER_NAME = "Authorization";
- public static final String OCEAN_APPID = "WXZH888888";
- public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb";
-
- public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token";
- public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx";
+ public static final String USB_SERIAL = "/dev/tty.usbserial-1120";
}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index 537739b..7c89fe7 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -1,9 +1,6 @@
package com.casic.missiles.modular.system.utils;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.TypeReference;
import com.casic.missiles.modular.system.dto.*;
-import com.casic.missiles.modular.system.dto.remote.OceanDetailModel;
import org.locationtech.spatial4j.distance.DistanceUtils;
import java.text.DecimalFormat;
@@ -27,7 +24,7 @@
* 环境数据-已校验
*/
public static Map encodeEnvironment(double targetLng, double targetLat, TyphoonDetailDTO typhoon,
- String date, String days, String hour) {
+ OceanDetailDTO oceanDetail) {
Map resultMap = createDataHead("Env");
resultMap.put("targetLng", targetLng);
resultMap.put("targetLat", targetLat);
@@ -59,16 +56,8 @@
double angle = azimuth(lng, lat, targetLng, targetLat);
dto.setAzimuth(angle);
}
-
//洋流数据
- String oceanData = HttpRequestHelper.obtainOceanData(targetLng, targetLat, date, days, hour);
- OceanDetailDTO oceanDetailDTO = null;
- if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) {
- OceanDetailModel remoteData = JSON.parseObject(oceanData, new TypeReference() {
- });
- oceanDetailDTO = new OceanDetailDTO(remoteData);
- }
- dto.setOceanDetail(oceanDetailDTO);
+ dto.setOceanDetail(oceanDetail);
resultMap.put("data", dto);
return resultMap;
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java
deleted file mode 100644
index 5b43a60..0000000
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.casic.missiles.modular.system.utils;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONException;
-import com.alibaba.fastjson.JSONObject;
-import lombok.NonNull;
-import okhttp3.*;
-
-import java.io.IOException;
-import java.util.Objects;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 网络请求工具
- *
- * @author a203
- */
-public class HttpRequestHelper {
-
- public static RequestBody createRequestBody(String value) {
- return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), value);
- }
-
- public static String doPost(Request request) {
- return streamResponse(request);
- }
-
- public static String doGet(String url) {
- return streamResponse(new Request.Builder()
- .url(url)
- .build());
- }
-
- private static String streamResponse(@NonNull Request request) {
- OkHttpClient httpClient = new OkHttpClient.Builder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .writeTimeout(10, TimeUnit.SECONDS)
- .readTimeout(20, TimeUnit.SECONDS)
- .build();
- Call call = httpClient.newCall(request);
- try {
- Response response = call.execute();
- return response.body() != null ? Objects.requireNonNull(response.body()).string() : "";
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
- }
-
- public static String obtainOceanData(double lng, double lat, String date, String days, String hour) {
- /**
- * 获取洋流数据Token
- * */
- JSONObject object = new JSONObject();
- try {
- object.put("appId", Constant.OCEAN_APPID);
- object.put("appKey", Constant.OCEAN_APP_KEY);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- Request tokenRequest = new Request.Builder()
- .url(Constant.OCEAN_TOKEN)
- .post(HttpRequestHelper.createRequestBody(object.toJSONString()))
- .build();
- String tokenJson = HttpRequestHelper.doPost(tokenRequest);
- if ("".equals(tokenJson)) {
- return null;
- }
- /**
- * 解析token
- * */
- JSONObject tokenObject = JSON.parseObject(tokenJson);
- JSONObject dataObject = tokenObject.getJSONObject("data");
- String token = dataObject.getString("token");
- /**
- * 封装请求参数
- * */
- JSONObject jsonObject = new JSONObject();
- try {
- jsonObject.put("lon", lng);
- jsonObject.put("lat", lat);
- jsonObject.put("date", date);
- jsonObject.put("hour", days);
- jsonObject.put("days", hour);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- /**
- * 获取洋流数据
- * */
- Request request = new Request.Builder()
- .addHeader(Constant.OCEAN_HEADER_NAME, token)
- .url(Constant.OCEAN_DETAIL)
- .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString()))
- .build();
- return HttpRequestHelper.doPost(request);
- }
-
- public static String getOceanCode(String value) {
- if ("".equals(value)) {
- return value;
- }
- JSONObject jsonObject = JSON.parseObject(value);
- Integer code = jsonObject.getInteger("code");
- return String.valueOf(code);
- }
-}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java
new file mode 100644
index 0000000..b623041
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java
@@ -0,0 +1,67 @@
+package com.casic.missiles.modular.system.utils;
+
+import gnu.io.NRSerialPort;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+/**
+ * @author a203
+ */
+@Slf4j
+public class SerialPortManager {
+ /**
+ * 往串口发送数据
+ *
+ * @param serialPort 串口对象
+ * @param order 待发送数据
+ */
+ public static void sendToPort(NRSerialPort serialPort, byte[] order) {
+ log.info("往串口发送数据===>" + Arrays.toString(order));
+ DataOutputStream outs = null;
+ try {
+ outs = new DataOutputStream(serialPort.getOutputStream());
+ outs.write(order);
+ outs.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (outs != null) {
+ outs.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 串口读取数据
+ *
+ * @param serialPort 串口对象
+ */
+ public static String readFromPort(NRSerialPort serialPort) {
+ DataInputStream inputStream = new DataInputStream(serialPort.getInputStream());
+ String data = "";
+ try {
+ while (inputStream.available() > 0) {
+ char read = (char) inputStream.read();
+ data = data.concat(Character.toString(read));
+ }
+ return data;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return data;
+ }
+}
diff --git a/casic-shelter/pom.xml b/casic-shelter/pom.xml
index 8ce4d9d..65f3c26 100644
--- a/casic-shelter/pom.xml
+++ b/casic-shelter/pom.xml
@@ -82,6 +82,11 @@
io.netty
netty-all
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
new file mode 100644
index 0000000..ea22e0b
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java
@@ -0,0 +1,24 @@
+package com.casic.missiles.modular.system.utils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 指令拼接
+ *
+ * @author a203
+ */
+public class CommandManager {
+ private static final String CMD_HEADER = "*AT^IOTDATA=";
+
+ /**
+ * *AT^IOTDATA=21,"^$CC1,11,LOGIN,d, D$^"
+ *
+ * 21是双引号中间的数据长度,CC1指挥中心名称,11是指挥中心密码,d+逗号+空格+D
+ *
+ * 登录指令和发送数据指令之间,需要间隔500ms以上
+ */
+ public static byte[] createLoginCmd(String data) {
+ String cmd = CMD_HEADER + data.length() + "," + "\"" + data + "\"";
+ return cmd.getBytes(StandardCharsets.UTF_8);
+ }
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
index 3a08fd0..c8eecd8 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java
@@ -14,15 +14,7 @@
public static final int MAX_RADIUS = 80;
public static final int MAX_AGE = 240;
public static final int MIN_AGE = 1;
+ public static final int BAUD_RATE = 115200;
- /**
- * 洋流相关常量
- */
- private static final String OCEAN_BASE_URL = "http://api.meteo.open.ninecosmos.cn";
- public static final String OCEAN_HEADER_NAME = "Authorization";
- public static final String OCEAN_APPID = "WXZH888888";
- public static final String OCEAN_APP_KEY = "xb#bD&xtho@b80scbDb";
-
- public static final String OCEAN_TOKEN = OCEAN_BASE_URL + "/us/users/open/token";
- public static final String OCEAN_DETAIL = OCEAN_BASE_URL + "/mr/netcdf/meteo/ytx";
+ public static final String USB_SERIAL = "/dev/tty.usbserial-1120";
}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
index 537739b..7c89fe7 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java
@@ -1,9 +1,6 @@
package com.casic.missiles.modular.system.utils;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.TypeReference;
import com.casic.missiles.modular.system.dto.*;
-import com.casic.missiles.modular.system.dto.remote.OceanDetailModel;
import org.locationtech.spatial4j.distance.DistanceUtils;
import java.text.DecimalFormat;
@@ -27,7 +24,7 @@
* 环境数据-已校验
*/
public static Map encodeEnvironment(double targetLng, double targetLat, TyphoonDetailDTO typhoon,
- String date, String days, String hour) {
+ OceanDetailDTO oceanDetail) {
Map resultMap = createDataHead("Env");
resultMap.put("targetLng", targetLng);
resultMap.put("targetLat", targetLat);
@@ -59,16 +56,8 @@
double angle = azimuth(lng, lat, targetLng, targetLat);
dto.setAzimuth(angle);
}
-
//洋流数据
- String oceanData = HttpRequestHelper.obtainOceanData(targetLng, targetLat, date, days, hour);
- OceanDetailDTO oceanDetailDTO = null;
- if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) {
- OceanDetailModel remoteData = JSON.parseObject(oceanData, new TypeReference() {
- });
- oceanDetailDTO = new OceanDetailDTO(remoteData);
- }
- dto.setOceanDetail(oceanDetailDTO);
+ dto.setOceanDetail(oceanDetail);
resultMap.put("data", dto);
return resultMap;
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java
deleted file mode 100644
index 5b43a60..0000000
--- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.casic.missiles.modular.system.utils;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONException;
-import com.alibaba.fastjson.JSONObject;
-import lombok.NonNull;
-import okhttp3.*;
-
-import java.io.IOException;
-import java.util.Objects;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 网络请求工具
- *
- * @author a203
- */
-public class HttpRequestHelper {
-
- public static RequestBody createRequestBody(String value) {
- return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), value);
- }
-
- public static String doPost(Request request) {
- return streamResponse(request);
- }
-
- public static String doGet(String url) {
- return streamResponse(new Request.Builder()
- .url(url)
- .build());
- }
-
- private static String streamResponse(@NonNull Request request) {
- OkHttpClient httpClient = new OkHttpClient.Builder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .writeTimeout(10, TimeUnit.SECONDS)
- .readTimeout(20, TimeUnit.SECONDS)
- .build();
- Call call = httpClient.newCall(request);
- try {
- Response response = call.execute();
- return response.body() != null ? Objects.requireNonNull(response.body()).string() : "";
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
- }
-
- public static String obtainOceanData(double lng, double lat, String date, String days, String hour) {
- /**
- * 获取洋流数据Token
- * */
- JSONObject object = new JSONObject();
- try {
- object.put("appId", Constant.OCEAN_APPID);
- object.put("appKey", Constant.OCEAN_APP_KEY);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- Request tokenRequest = new Request.Builder()
- .url(Constant.OCEAN_TOKEN)
- .post(HttpRequestHelper.createRequestBody(object.toJSONString()))
- .build();
- String tokenJson = HttpRequestHelper.doPost(tokenRequest);
- if ("".equals(tokenJson)) {
- return null;
- }
- /**
- * 解析token
- * */
- JSONObject tokenObject = JSON.parseObject(tokenJson);
- JSONObject dataObject = tokenObject.getJSONObject("data");
- String token = dataObject.getString("token");
- /**
- * 封装请求参数
- * */
- JSONObject jsonObject = new JSONObject();
- try {
- jsonObject.put("lon", lng);
- jsonObject.put("lat", lat);
- jsonObject.put("date", date);
- jsonObject.put("hour", days);
- jsonObject.put("days", hour);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- /**
- * 获取洋流数据
- * */
- Request request = new Request.Builder()
- .addHeader(Constant.OCEAN_HEADER_NAME, token)
- .url(Constant.OCEAN_DETAIL)
- .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString()))
- .build();
- return HttpRequestHelper.doPost(request);
- }
-
- public static String getOceanCode(String value) {
- if ("".equals(value)) {
- return value;
- }
- JSONObject jsonObject = JSON.parseObject(value);
- Integer code = jsonObject.getInteger("code");
- return String.valueOf(code);
- }
-}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java
new file mode 100644
index 0000000..b623041
--- /dev/null
+++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java
@@ -0,0 +1,67 @@
+package com.casic.missiles.modular.system.utils;
+
+import gnu.io.NRSerialPort;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+/**
+ * @author a203
+ */
+@Slf4j
+public class SerialPortManager {
+ /**
+ * 往串口发送数据
+ *
+ * @param serialPort 串口对象
+ * @param order 待发送数据
+ */
+ public static void sendToPort(NRSerialPort serialPort, byte[] order) {
+ log.info("往串口发送数据===>" + Arrays.toString(order));
+ DataOutputStream outs = null;
+ try {
+ outs = new DataOutputStream(serialPort.getOutputStream());
+ outs.write(order);
+ outs.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (outs != null) {
+ outs.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 串口读取数据
+ *
+ * @param serialPort 串口对象
+ */
+ public static String readFromPort(NRSerialPort serialPort) {
+ DataInputStream inputStream = new DataInputStream(serialPort.getInputStream());
+ String data = "";
+ try {
+ while (inputStream.available() > 0) {
+ char read = (char) inputStream.read();
+ data = data.concat(Character.toString(read));
+ }
+ return data;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return data;
+ }
+}
diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java
index 9aab314..1cdc481 100644
--- a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java
+++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java
@@ -2,20 +2,21 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.modular.system.dto.OceanDetailDTO;
import com.casic.missiles.modular.system.dto.ShipDTO;
import com.casic.missiles.modular.system.dto.TyphoonDTO;
import com.casic.missiles.modular.system.dto.TyphoonDetailDTO;
import com.casic.missiles.modular.system.model.*;
import com.casic.missiles.modular.system.service.*;
-import com.casic.missiles.modular.system.utils.Constant;
-import com.casic.missiles.modular.system.utils.DecodeData;
-import com.casic.missiles.modular.system.utils.EncodeData;
-import com.casic.missiles.modular.system.utils.TimeUtil;
+import com.casic.missiles.modular.system.utils.*;
import com.casic.missiles.socket.service.ISocketService;
+import gnu.io.NRSerialPort;
+import gnu.io.SerialPortEvent;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
+import java.nio.charset.StandardCharsets;
import java.util.*;
/**
@@ -27,6 +28,7 @@
private final IRobotService robotService;
private final ITyphoonService typhoonService;
+ private final IOceanService oceanService;
private final IShipService shipService;
private final IShelterPositionService shelterPositionService;
private final IRegionPlanService regionPlanService;
@@ -34,18 +36,50 @@
private final ITaskService taskService;
private final IOperationLogService logService;
+ private NRSerialPort serialPort;
+
public SocketServiceImpl(IRobotService robotService, ITyphoonService typhoonService,
- IShipService shipService, IShelterPositionService shelterPositionService,
- IRegionPlanService regionPlanService, IRoutePlanService routePlanService,
- ITaskService taskService, IOperationLogService logService) {
+ IOceanService oceanService, IShipService shipService,
+ IShelterPositionService shelterPositionService, IRegionPlanService regionPlanService,
+ IRoutePlanService routePlanService, ITaskService taskService,
+ IOperationLogService logService) {
this.robotService = robotService;
this.typhoonService = typhoonService;
+ this.oceanService = oceanService;
this.shipService = shipService;
this.shelterPositionService = shelterPositionService;
this.regionPlanService = regionPlanService;
this.routePlanService = routePlanService;
this.taskService = taskService;
this.logService = logService;
+ //初始化串口
+ Set allPorts = NRSerialPort.getAvailableSerialPorts();
+ if (!allPorts.isEmpty()) {
+ //["/dev/tty.usbserial-1120","/dev/tty.wlan-debug"]
+ if (allPorts.contains(Constant.USB_SERIAL)) {
+ serialPort = new NRSerialPort(Constant.USB_SERIAL, Constant.BAUD_RATE);
+ serialPort.connect();
+ //登录指挥机
+ byte[] loginCmd = CommandManager.createLoginCmd("^$CC0Z06,11,LOGIN,d, D$^");
+ SerialPortManager.sendToPort(serialPort, loginCmd);
+ try {
+ serialPort.addEventListener(serialPortEvent -> {
+ if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
+ String data = SerialPortManager.readFromPort(serialPort);
+ log.info("读取到数据===>" + data);
+ } else {
+ log.info("串口状态异常");
+ serialPort.removeEventListener();
+ }
+ serialPort.notifyOnDataAvailable(true);
+ });
+ } catch (TooManyListenersException e) {
+ e.printStackTrace();
+ }
+ } else {
+ log.info("无可用串口");
+ }
+ }
}
private boolean isCorrectData(byte[] bytes) {
@@ -80,13 +114,13 @@
/**
* 记录log
* */
- OperationLog log = new OperationLog();
- log.setLogType("2");
- log.setLogName("水下机器人Socket数据通信");
- log.setClassName(this.getClass().getSimpleName());
- log.setMethod("communicate");
- log.setCreateTime(new Date());
- log.setSucceed("成功");
+ OperationLog operationLog = new OperationLog();
+ operationLog.setLogType("2");
+ operationLog.setLogName("水下机器人Socket数据通信");
+ operationLog.setClassName(this.getClass().getSimpleName());
+ operationLog.setMethod("communicate");
+ operationLog.setCreateTime(new Date());
+ operationLog.setSucceed("成功");
/**
* 回应客户端
@@ -95,14 +129,14 @@
int dataType = data[2];
int robotId = decodeRobotId(data);
- log.setUserId((long) robotId);
+ operationLog.setUserId((long) robotId);
/**
* 先解析再回应
* */
switch (dataType) {
case 0x01:
RobotInfo robotInfo = DecodeData.decodeRobotInfo(data);
- log.setMessage("水下机器人信息");
+ operationLog.setMessage("水下机器人信息");
robotService.save(robotInfo);
break;
case 0x02:
@@ -111,7 +145,7 @@
switch (planType) {
case 0x01:
String robotRegion = DecodeData.decodeRobotRegion(data);
- log.setMessage("算法结果:区域覆盖");
+ operationLog.setMessage("算法结果:区域覆盖");
RegionPlan regionPlan = new RegionPlan();
regionPlan.setPlanTime(TimeUtil.getCurrentTime());
regionPlan.setRegionResult(robotRegion);
@@ -119,7 +153,7 @@
break;
case 0x02:
String robotRoute = DecodeData.decodeRobotRoute(data);
- log.setMessage("算法结果:路径规划");
+ operationLog.setMessage("算法结果:路径规划");
RoutePlan routePlan = new RoutePlan();
routePlan.setRobotId(robotId);
routePlan.setPlanTime(TimeUtil.getCurrentTime());
@@ -139,41 +173,41 @@
switch (taskType) {
case 0x01:
String directedTask = DecodeData.decodeDirectedTask(data);
- log.setMessage("定向任务开始");
+ operationLog.setMessage("定向任务开始");
task.setTaskType("1");
task.setTaskData(directedTask);
taskService.save(task);
break;
case 0x02:
String routeTask = DecodeData.decodeTaskRoute(data);
- log.setMessage("航路点任务开始");
+ operationLog.setMessage("航路点任务开始");
task.setTaskType("2");
task.setTaskData(routeTask);
taskService.save(task);
break;
case 0x03:
String flightTask = DecodeData.decodeDirectFlightTask(data);
- log.setMessage("定深直航任务开始");
+ operationLog.setMessage("定深直航任务开始");
task.setTaskType("3");
task.setTaskData(flightTask);
taskService.save(task);
break;
case 0x04:
String resideTask = DecodeData.decodeResideTask(data);
- log.setMessage("驻留任务开始");
+ operationLog.setMessage("驻留任务开始");
task.setTaskType("4");
task.setTaskData(resideTask);
taskService.save(task);
break;
case 0x05:
String putTask = DecodeData.decodePutTask(data);
- log.setMessage("投放任务开始");
+ operationLog.setMessage("投放任务开始");
task.setTaskType("5");
task.setTaskData(putTask);
taskService.save(task);
break;
case 0x0F:
- log.setMessage("任务终止");
+ operationLog.setMessage("任务终止");
taskService.updateTaskById(robotId);
break;
default:
@@ -187,21 +221,20 @@
* 方舱通过Socket发送短信给203后台,然后203后台将短信内容加密之后用卫星发送给203自己的岸基软件,然后解密之后再传给西工大岸基软件
* */
String decodeSMS = DecodeData.decodeSMS(data);
- log.setMessage(decodeSMS);
- System.out.println("decodeSMS ===> " + decodeSMS);
+ operationLog.setMessage(decodeSMS);
+ log.info("decodeSMS ===> " + decodeSMS);
/**
- * 与卫星通信
+ * 数据加密之后再与卫星通信
* */
-
- /**
- * Socket返回数据给西工大
- * */
- ctx.write(EncodeData.encodeSMS(decodeSMS));
+ String test = "*RN";
+ if (serialPort.isConnected()) {
+ SerialPortManager.sendToPort(serialPort, test.getBytes(StandardCharsets.UTF_8));
+ }
break;
case 0x05:
String envRequest = DecodeData.decodeEnvRequest(data);
- log.setMessage("机器人请求环境数据");
+ operationLog.setMessage("机器人请求环境数据");
//{"hour":"12","lng":109.32222199129043,"lat":17.39223199775081}
JSONObject envJsonObject = JSON.parseObject(envRequest);
@@ -212,14 +245,14 @@
List typhoonList = typhoonService.currentTyphoonList();
String date = TimeUtil.getCurrentTime();
+ OceanDetailDTO oceanDetail = oceanService.oceanDetail(envLng, envLat, date, "0", hour);
Map objectMap;
if (typhoonList.isEmpty()) {
- objectMap = EncodeData.encodeEnvironment(envLng, envLat, null, date, "0", hour);
+ objectMap = EncodeData.encodeEnvironment(envLng, envLat, null, oceanDetail);
} else if (typhoonList.size() == 1) {
TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonList.get(0).getTyphoonId());
- objectMap = EncodeData.encodeEnvironment(envLng, envLat, detailDTO,
- date, "0", hour);
+ objectMap = EncodeData.encodeEnvironment(envLng, envLat, detailDTO, oceanDetail);
} else {
/**
* 如果有多个台风,只返回距离当前机器人或者方舱最近的台风信息
@@ -241,14 +274,13 @@
}
TyphoonDetailDTO detailDTO = typhoonService.typhoonDetail(typhoonList.get(pos).getTyphoonId());
- objectMap = EncodeData.encodeEnvironment(envLng, envLat, detailDTO,
- date, "0", hour);
+ objectMap = EncodeData.encodeEnvironment(envLng, envLat, detailDTO, oceanDetail);
}
ctx.writeAndFlush(JSON.toJSONString(objectMap));
break;
case 0x06:
String aisRequest = DecodeData.decodeAISRequest(data);
- log.setMessage("机器人请求AIS数据请求");
+ operationLog.setMessage("机器人请求AIS数据请求");
//{"radius":58,"lng":109.32222199129043,"lat":17.39223199775081,"age":12}
JSONObject aisJsonObject = JSON.parseObject(aisRequest);
@@ -273,13 +305,13 @@
break;
case 0x07:
ShelterPosition shelterPosition = DecodeData.decodeShelterPosition(data);
- log.setMessage("方舱位置");
+ operationLog.setMessage("方舱位置");
shelterPositionService.save(shelterPosition);
break;
default:
break;
}
}
- logService.save(log);
+ logService.save(operationLog);
}
}