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