diff --git a/fys-admin/pom.xml b/fys-admin/pom.xml
index 26a0b0ee..bb8fe450 100644
--- a/fys-admin/pom.xml
+++ b/fys-admin/pom.xml
@@ -146,12 +146,6 @@
3.3.1
-->
-
- ws.schild
- jave-all-deps
- 3.1.1
- compile
-
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java
index 0053ce44..49963e3d 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java
@@ -137,7 +137,7 @@ public class AppDeviceHBY100JController extends BaseController {
*/
private Integer voiceStrobeAlarm;
/**
- * 0 公安,1消防,2应急,3交警,4 市政,5 铁路,6 医疗,7部队,8 水利,9 语音
+ * 0 公安,1消防,2应急,3交警,4 市政,5 铁路,6 医疗,7语音
*/
private Integer mode;
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java
index 413ab83d..c76c0664 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java
@@ -47,22 +47,25 @@ public class HttpTtsClient {
/**
* 使用HTTP POST方式调用阿里云TTS服务生成MP3格式语音
*/
- public byte[] synthesizeTextToMp3(String text) throws IOException {
+ public byte[] synthesizeTextToMp3(String text,String fileSuffix) throws IOException {
String endpoint = "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts";
// 构建请求体
// String requestBody = String.format(
// "{\"appkey\":\"%s\",\"text\":\"%s\",\"voice\":\"zhifeng\",\"format\":\"MP3\",\"sample_rate\":24000,\"volume\":50,\"speech_rate\":0,\"pitch_rate\":0}",
// appKey,
-// text.replace("\"", "\\\"")
+// text.replace("\"", "\\\"")zhide
// );
String token = refreshAccessToken();
String requestBody = " {\n" +
" \"appkey\":\""+appKey+"\",\n" +
+ " \"voice\":\"zhide\",\n" +
" \"text\":\""+text+"\",\n" +
" \"token\":\""+token+"\",\n" +
- " \"format\":\"mp3\"\n" +
+ " \"volume\": 100,\n" +
+ " \"pitch_rate\": 0,\n" +
+ " \"format\":\""+fileSuffix+"\"\n" +
" }";
URL url = new URL(endpoint);
@@ -119,7 +122,7 @@ public class HttpTtsClient {
* 保存MP3到文件
*/
public String saveMp3ToFile(String text, String outputPath) throws IOException {
- byte[] mp3Data = synthesizeTextToMp3(text);
+ byte[] mp3Data = synthesizeTextToMp3(text,"mp3");
try (FileOutputStream fos = new FileOutputStream(outputPath)) {
fos.write(mp3Data);
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java
index 5644474c..974afb69 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java
@@ -19,8 +19,8 @@ public class HttpTtsExample {
// 使用HTTP方式调用
HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey);
- String text = "大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。";
- String outputPath = "D:\\http_output9.mp3";
+ String text = "前方拥堵,请绕道而行。";
+ String outputPath = "D:\\http_output11.mp3";
String resultFile = httpClient.saveMp3ToFile(text, outputPath);
System.out.println("MP3音频已保存至: " + resultFile);
diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java
index d812dfd4..aa651624 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java
@@ -454,7 +454,7 @@ public class AudioProcessService {
// 使用HTTP方式调用
HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey);
//
- byte[] mp3Data = httpClient.synthesizeTextToMp3(text);
+ byte[] mp3Data = httpClient.synthesizeTextToMp3(text,fileSuffix);
// byte[] mp3Data = alibabaTTSUtil.synthesizeTextToMp3(text);
SysOssVo upload = ossService.upload(mp3Data, generateRandomFileName(fileSuffix));
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java
index e5563611..f67b24dc 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java
@@ -2,15 +2,23 @@ package com.fuyuanshen.global.mqtt.rule.hby100j;
import com.alibaba.fastjson2.JSONObject;
import com.fuyuanshen.common.core.constant.GlobalConstants;
+import com.fuyuanshen.common.core.utils.StringUtils;
+import com.fuyuanshen.common.json.utils.JsonUtils;
import com.fuyuanshen.common.redis.utils.RedisUtils;
+import com.fuyuanshen.equipment.utils.map.GetAddressFromLatUtil;
+import com.fuyuanshen.equipment.utils.map.LngLonUtil;
import com.fuyuanshen.global.mqtt.base.NewMqttMessageRule;
import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext;
+import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
+import com.fuyuanshen.global.mqtt.rule.hby100j.domin.FunctionType3LocationReport;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
+import java.util.LinkedHashMap;
import java.util.Map;
import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX;
+import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX;
/**
* 获取设备位置信息(设备下发返回响应数据、设备定时主动上报)
@@ -34,10 +42,167 @@ public class FuncType3Location implements NewMqttMessageRule {
Map payloadDict = context.getPayloadDict();
if (payloadDict != null) {
- RedisUtils.setCacheObject(redisKey, JSONObject.toJSONString(payloadDict));
+// RedisUtils.setCacheObject(redisKey, JSONObject.toJSONString(payloadDict));
+ String jsonString = JSONObject.toJSONString(payloadDict);
+ FunctionType3LocationReport data = JSONObject.parseObject(jsonString, FunctionType3LocationReport.class);
+ FunctionType3LocationReport.Data data1 = data.getData();
+ if (data1 != null) {
+ Double latitude = data1.getLatitude();
+ Double longitude = data1.getLongitude();
+ asyncSendLocationToRedisWithFuture(context.getDeviceImei(), latitude.toString(), longitude.toString());
+ }
}
} catch (Exception e) {
log.error("HBY100J获取设备位置信息失败", e);
}
}
+
+ /** 位置未发生明显变化的距离阈值(米),可通过配置中心动态调整 */
+ private final double MOVEMENT_THRESHOLD_METER = 10.0;
+
+ /**
+ * 异步发送位置信息到Redis(使用CompletableFuture)
+ *
+ * @param deviceImei 设备IMEI
+ * @param latitude 纬度
+ * @param longitude 经度
+ */
+ public void asyncSendLocationToRedisWithFuture(String deviceImei, String latitude, String longitude) {
+ try {
+ if (latitude == null || longitude == null) {
+ return;
+ }
+ if (StringUtils.isAnyBlank(deviceImei, latitude, longitude)) {
+ log.warn("位置上报参数为空,deviceImei={}", deviceImei);
+ return;
+ }
+ //log.info("位置上报,deviceImei={}, lat={}, lon={}", deviceImei, latitude, longitude);
+ // 1. 解析当前上报的经纬度
+ Double curLat = parseDoubleSafe(latitude.trim());
+ Double curLon = parseDoubleSafe(longitude.trim());
+ if (curLat == null || curLon == null) {
+ log.warn("经纬度格式错误,直接更新,deviceImei={}, lat={}, lon={}", deviceImei, latitude, longitude);
+// doSaveLocation(deviceImei, latitude, longitude);
+ return;
+ }
+
+ // 2. 读取 Redis 中缓存的上一次位置
+ String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + deviceImei + DEVICE_LOCATION_KEY_PREFIX;
+ String cachedJson = RedisUtils.getCacheObject(redisKey);
+
+ if (StringUtils.isNotBlank(cachedJson)) {
+ com.alibaba.fastjson2.JSONObject cachedObj = com.alibaba.fastjson2.JSONObject.parseObject(cachedJson);
+ String cachedWgs84Lat = cachedObj.getString("wgs84_latitude");
+ String cachedWgs84Lon = cachedObj.getString("wgs84_longitude");
+
+ Double oldLat = parseDoubleSafe(cachedWgs84Lat);
+ Double oldLon = parseDoubleSafe(cachedWgs84Lon);
+
+ if (oldLat != null && oldLon != null) {
+ double distance = haversine(oldLat, oldLon, curLat, curLon);
+ if (distance <= MOVEMENT_THRESHOLD_METER) {
+ log.info("位置未发生明显变化({}米 <= {}米),不更新 Redis,deviceImei={}, lat={}, lon={}",
+ distance, MOVEMENT_THRESHOLD_METER, deviceImei, latitude, longitude);
+ return;
+ }
+ }
+ }
+// String[] latArr = latitude.split("\\.");
+// String[] lonArr = longitude.split("\\.");
+// // 将位置信息存储到Redis中
+// String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + deviceImei + DEVICE_LOCATION_KEY_PREFIX;
+// String redisObj = RedisUtils.getCacheObject(redisKey);
+// JSONObject jsonOBj = JSONObject.parseObject(redisObj);
+// if(jsonOBj != null){
+// String str1 = latArr[0] +"."+ latArr[1].substring(0,4);
+// String str2 = lonArr[0] +"."+ lonArr[1].substring(0,4);
+//
+// String cacheLatitude = jsonOBj.getString("wgs84_latitude");
+// String cacheLongitude = jsonOBj.getString("wgs84_longitude");
+// String[] latArr1 = cacheLatitude.split("\\.");
+// String[] lonArr1 = cacheLongitude.split("\\.");
+//
+// String cacheStr1 = latArr1[0] +"."+ latArr1[1].substring(0,4);
+// String cacheStr2 = lonArr1[0] +"."+ lonArr1[1].substring(0,4);
+// if(str1.equals(cacheStr1) && str2.equals(cacheStr2)){
+// log.info("位置信息未发生变化: device={}, lat={}, lon={}", deviceImei, latitude, longitude);
+// return;
+// }
+// }
+
+ // 构造位置信息对象
+ Map locationInfo = new LinkedHashMap<>();
+ double[] doubles = LngLonUtil.gps84_To_Gcj02(Double.parseDouble(latitude), Double.parseDouble(longitude));
+ locationInfo.put("deviceImei", deviceImei);
+ locationInfo.put("latitude", doubles[0]);
+ locationInfo.put("longitude", doubles[1]);
+ locationInfo.put("wgs84_latitude", latitude);
+ locationInfo.put("wgs84_longitude", longitude);
+
+
+ String address = GetAddressFromLatUtil.getAdd(String.valueOf(doubles[1]), String.valueOf(doubles[0]));
+ locationInfo.put("address", address);
+ locationInfo.put("timestamp", System.currentTimeMillis());
+
+
+ String locationJson = JsonUtils.toJsonString(locationInfo);
+
+ // 存储到Redis
+ RedisUtils.setCacheObject(redisKey, locationJson);
+
+ // 存储到一个列表中,保留历史位置信息
+// String locationHistoryKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_LOCATION_HISTORY_KEY_PREFIX + deviceImei;
+// RedisUtils.addCacheList(locationHistoryKey, locationJson);
+// RedisUtils.expire(locationHistoryKey, Duration.ofDays(90));
+ storeDeviceTrajectoryWithSortedSet(deviceImei, locationJson);
+ log.info("位置信息已异步发送到Redis: device={}, lat={}, lon={}", deviceImei, latitude, longitude);
+ } catch (Exception e) {
+ log.error("异步发送位置信息到Redis时出错: device={}, error={}", deviceImei, e.getMessage(), e);
+ }
+ }
+ /** 安全解析 double,解析失败返回 null */
+ private Double parseDoubleSafe(String str) {
+ if (StringUtils.isBlank(str)) return null;
+ try {
+ return Double.parseDouble(str.trim());
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+ /** Haversine 公式计算两点球面距离(米) */
+ private double haversine(double lat1, double lon1, double lat2, double lon2) {
+ double dLat = Math.toRadians(lat2 - lat1);
+ double dLon = Math.toRadians(lon2 - lon1);
+ double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
+ Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
+ Math.sin(dLon / 2) * Math.sin(dLon / 2);
+ double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+ /** 地球平均半径(米) */
+ double EARTH_RADIUS = 6371_393.0;
+ return EARTH_RADIUS * c;
+ }
+
+ /**
+ * 存储设备30天历史轨迹到Redis (使用Sorted Set)
+ */
+ public void storeDeviceTrajectoryWithSortedSet(String deviceImei, String locationJson) {
+ try {
+ String trajectoryKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + deviceImei + DeviceRedisKeyConstants.DEVICE_LOCATION_HISTORY_KEY_PREFIX;
+// String trajectoryKey = "device:trajectory:zset:" + deviceImei;
+// String locationJson = JsonUtils.toJsonString(locationInfo);
+ long timestamp = System.currentTimeMillis();
+
+ // 添加到Sorted Set,使用时间戳作为score
+ RedisUtils.zAdd(trajectoryKey, locationJson, timestamp);
+
+// // 设置30天过期时间
+// RedisUtils.expire(trajectoryKey, Duration.ofDays(30));
+
+ // 清理30天前的数据(冗余保护)
+ long thirtyDaysAgo = System.currentTimeMillis() - (7L * 24 * 60 * 60 * 1000);
+ RedisUtils.zRemoveRangeByScore(trajectoryKey, 0, thirtyDaysAgo);
+ } catch (Exception e) {
+ log.error("存储设备轨迹到Redis(ZSet)失败: device={}, error={}", deviceImei, e.getMessage(), e);
+ }
+ }
}
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java
index 3cc5ede4..21252cbb 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java
@@ -2,15 +2,21 @@ package com.fuyuanshen.global.mqtt.rule.hby100j;
import com.alibaba.fastjson2.JSONObject;
import com.fuyuanshen.common.core.constant.GlobalConstants;
+import com.fuyuanshen.common.json.utils.JsonUtils;
import com.fuyuanshen.common.redis.utils.RedisUtils;
import com.fuyuanshen.global.mqtt.base.NewMqttMessageRule;
import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext;
+import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
+import com.fuyuanshen.global.mqtt.rule.hby100j.domin.FunctionType4PowerStatusReport;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
+import java.util.LinkedHashMap;
import java.util.Map;
+import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX;
+import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX;
/**
* 获取设备电源状态(设备下发返回响应数据、设备定时主动上报)
@@ -29,12 +35,32 @@ public class FuncType4PowerStatus implements NewMqttMessageRule {
log.info("HBY100J获取设备电源状态,消息负载:{}", context.getPayloadDict());
try {
- String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX +
- context.getDeviceImei() + ":powerStatus";
+ String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX);
+// String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX +
+// context.getDeviceImei() + ":powerStatus";
Map payloadDict = context.getPayloadDict();
if (payloadDict != null) {
- RedisUtils.setCacheObject(redisKey, JSONObject.toJSONString(payloadDict));
+
+ String str = JSONObject.toJSONString(payloadDict);
+ FunctionType4PowerStatusReport powerStatusReport =JSONObject.parseObject(str,FunctionType4PowerStatusReport.class);
+
+ FunctionType4PowerStatusReport.Data data = powerStatusReport.getData();
+ if(data != null){
+ // 构造设备状态信息对象
+ Map deviceInfo = new LinkedHashMap<>();
+ deviceInfo.put("batteryPercentage", data.getLevel());
+ deviceInfo.put("chargeState", data.getCharge());
+ deviceInfo.put("batteryRemainingTime", data.getBatteryRemainingTime());
+
+ // 将设备状态信息存储到Redis中
+ String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX;
+ String deviceInfoJson = JsonUtils.toJsonString(deviceInfo);
+
+ // 存储到Redis
+ RedisUtils.setCacheObject(deviceRedisKey, deviceInfoJson);
+ }
+
}
} catch (Exception e) {
log.error("HBY100J获取设备电源状态失败", e);
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java
index 75a53dca..15e36bdc 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java
@@ -21,7 +21,7 @@ public class FuncType6VoicePlay implements NewMqttMessageRule {
@Override
public String getCommandType() {
- return "HBY100_9";
+ return "HBY100_6";
}
@Override
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java
index 6623f83d..6bd08597 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java
@@ -44,6 +44,7 @@ public class FuncType12ForceAudioRequest {
/**
* 语音报警0关闭,1开启
*/
+ @JsonProperty("voice_strobe_alarm")
private Integer voiceStrobeAlarm;
//语音模式0公安,1消防,2应急,3交警,4市政,5铁路,6医疗,7部队,8水利
private Integer mode;
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java
index abf346a4..58bc0cef 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java
@@ -49,12 +49,14 @@ public class FuncType5UpdateVoiceRequest {
* 2 - 紧急语音
* (具体含义需依据设备协议定义)
*/
+ @JsonProperty("voice_type")
private Integer voiceType;
/**
* 语音资源URL(MP3等音频文件地址)
* 示例:http://8.129.5.250:10001/voice/01.mp3
*/
+ @JsonProperty("voice_resource")
private String voiceResource;
}
}
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java
index c125c728..d5bf3754 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java
@@ -44,6 +44,7 @@ public class FuncType6VoicePlayRequest {
/**
* 语音报警0关闭,1开启
*/
+ @JsonProperty("voice_broadcast")
private Integer voiceBroadcast;
}
}
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java
index ceda1f4a..eea9e849 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java
@@ -52,7 +52,5 @@ public class FunctionType3LocationReport {
*/
@JsonProperty("latitude")
private Double latitude;
-
- private String address;
}
}
diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java
index 6d6367e3..b74cb2ff 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java
@@ -70,5 +70,8 @@ public class FunctionType4PowerStatusReport {
*/
@JsonProperty("12v_power")
private Integer twelveVPower;
+
+ @JsonProperty("battery_remaining_time")
+ private Integer batteryRemainingTime;
}
}
diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java
index 09941325..8dfcdbbc 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java
@@ -97,6 +97,7 @@ public class DeviceBizService {
} else {
item.setOnlineStatus(0);
}
+
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX);
// 获取电量
if (StringUtils.isNotBlank(deviceStatus)) {
diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java
index c6654a98..8d312baf 100644
--- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java
+++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java
@@ -130,17 +130,21 @@ public class DeviceHBY100JBizService {
} else {
vo.setOnlineStatus(0);
}
+
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX);
// 获取电量
if (StringUtils.isNotBlank(deviceStatus)) {
JSONObject jsonObject = JSONObject.parseObject(deviceStatus);
- vo.setBatteryPercentage(jsonObject.getString("level"));
- vo.setChargeState(jsonObject.getString("charge"));
+ vo.setBatteryPercentage(jsonObject.getInteger("batteryPercentage"));
+ vo.setChargeState(jsonObject.getInteger("chargeState"));
+ vo.setBatteryRemainingTime(jsonObject.getInteger("batteryRemainingTime"));
} else {
- vo.setBatteryPercentage("0");
+ vo.setBatteryPercentage(0);
+ vo.setBatteryRemainingTime(0);
}
+
String reportStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + ":report");
if (StringUtils.isNotBlank(reportStatus)) {
FuncType14StatusReport report = JSONObject.parseObject(reportStatus,FuncType14StatusReport.class);
@@ -160,33 +164,26 @@ public class DeviceHBY100JBizService {
Integer voiceBroadcast = data.getVoiceBroadcast();
- if(voiceBroadcast != null && voiceBroadcast == 1){
- vo.setAlarmMode(9);
- vo.setVoiceStrobeAlarm(1);
- }else {
- FuncType14StatusReport.SirenAlarm sirenAlarm = data.getSirenAlarm();
- if(sirenAlarm != null){
- vo.setVoiceStrobeAlarm(sirenAlarm.getEnable());
- vo.setAlarmMode(sirenAlarm.getMode());
- }
+ if(voiceBroadcast != null){
+ vo.setVoiceBroadcast(voiceBroadcast);
+ }
+ FuncType14StatusReport.SirenAlarm sirenAlarm = data.getSirenAlarm();
+ if(sirenAlarm != null){
+ vo.setVoiceStrobeAlarm(sirenAlarm.getEnable());
+ vo.setAlarmMode(sirenAlarm.getMode());
}
}
// 获取经度纬度
- String locationKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX;
- String locationInfo = RedisUtils.getCacheObject(locationKey);
- if (StringUtils.isNotBlank(locationInfo)) {
- FunctionType3LocationReport locationReport = JSONObject.parseObject(locationInfo,FunctionType3LocationReport.class);
- if(locationReport != null){
- FunctionType3LocationReport.Data data = locationReport.getData();
- if(data != null){
- vo.setLongitude(data.getLongitude().toString());
- vo.setLatitude(data.getLatitude().toString());
- vo.setAddress(data.getAddress());
- }
- }
-
+
+ String location = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_LOCATION_KEY_PREFIX);
+ if (StringUtils.isNotBlank(location)) {
+ JSONObject jsonObject = JSONObject.parseObject(location);
+ vo.setLatitude(jsonObject.getString("latitude"));
+ vo.setLongitude(jsonObject.getString("longitude"));
+ vo.setAddress(jsonObject.getString("address"));
}
+
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("business_id", device.getId());
queryWrapper.eq("file_type", 3);
@@ -217,9 +214,9 @@ public class DeviceHBY100JBizService {
LoginUser loginUser = LoginHelper.getLoginUser();
bo.getDeviceIds().forEach(deviceId -> {
Device deviceObj = deviceMapper.selectById(deviceId);
-// if (getDeviceStatus(deviceObj.getDeviceImei())) {
-// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
-// }
+ if (getDeviceStatus(deviceObj.getDeviceImei())) {
+ throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
+ }
FuncType12ForceAudioRequest request = new FuncType12ForceAudioRequest();
request.setRequestId(GenerateIdUtil.generateNumericId());
@@ -245,9 +242,9 @@ public class DeviceHBY100JBizService {
throw new ServiceException("文件不存在");
}
Device deviceObj = deviceMapper.selectById(appBusinessFileVo.getBusinessId());
-// if (getDeviceStatus(deviceObj.getDeviceImei())) {
-// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
-// }
+ if (getDeviceStatus(deviceObj.getDeviceImei())) {
+ throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
+ }
LoginUser loginUser = LoginHelper.getLoginUser();
SysOssVo sysOssVo = sysOssMapper.selectVoById(appBusinessFileVo.getFileId());
@@ -282,9 +279,9 @@ public class DeviceHBY100JBizService {
public void strobeMode(AppDeviceHBY100JController.HBY100JStrobeModeDto params) {
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
-// if (getDeviceStatus(deviceObj.getDeviceImei())) {
-// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
-// }
+ if (getDeviceStatus(deviceObj.getDeviceImei())) {
+ throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
+ }
FuncType10StrobeModeRequest request = new FuncType10StrobeModeRequest();
request.setRequestId(GenerateIdUtil.generateNumericId());
request.setImei(deviceObj.getDeviceImei());
@@ -301,9 +298,12 @@ public class DeviceHBY100JBizService {
public void lightAdjustment(AppDeviceHBY100JController.HBY100JLightAdjustmentDto params) {
log.info("HBY100J灯光调节,请求参数:{}", params);
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
-// if (getDeviceStatus(deviceObj.getDeviceImei())) {
-// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
-// }
+ if (deviceObj == null) {
+ throw new ServiceException("设备不存在");
+ }
+ if (getDeviceStatus(deviceObj.getDeviceImei())) {
+ throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
+ }
FuncType13BrightnessRequest request = new FuncType13BrightnessRequest();
request.setRequestId(GenerateIdUtil.generateNumericId());
request.setImei(deviceObj.getDeviceImei());
@@ -320,9 +320,12 @@ public class DeviceHBY100JBizService {
public void strobeFrequency(AppDeviceHBY100JController.HBY100JStrobeFrequencyDto params) {
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
-// if (getDeviceStatus(deviceObj.getDeviceImei())) {
-// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
-// }
+ if (deviceObj == null) {
+ throw new ServiceException("设备不存在");
+ }
+ if (getDeviceStatus(deviceObj.getDeviceImei())) {
+ throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
+ }
FuncType11FrequencyRequest request = new FuncType11FrequencyRequest();
request.setRequestId(GenerateIdUtil.generateNumericId());
request.setImei(deviceObj.getDeviceImei());
@@ -337,9 +340,12 @@ public class DeviceHBY100JBizService {
public void updateVolume(AppDeviceHBY100JController.HBY100JUpdateVolumeDto params) {
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
-// if (getDeviceStatus(deviceObj.getDeviceImei())) {
-// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
-// }
+ if (deviceObj == null) {
+ throw new ServiceException("设备不存在");
+ }
+ if (getDeviceStatus(deviceObj.getDeviceImei())) {
+ throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
+ }
FuncType9UpdateVolumeRequest request = new FuncType9UpdateVolumeRequest();
request.setRequestId(GenerateIdUtil.generateNumericId());
request.setImei(deviceObj.getDeviceImei());
@@ -354,6 +360,12 @@ public class DeviceHBY100JBizService {
public void voiceBroadcast(AppDeviceHBY100JController.HBY100JVoiceBroadcastDto params) {
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
+ if (deviceObj == null) {
+ throw new ServiceException("设备不存在");
+ }
+ if (getDeviceStatus(deviceObj.getDeviceImei())) {
+ throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
+ }
FuncType6VoicePlayRequest request = new FuncType6VoicePlayRequest();
request.setRequestId(GenerateIdUtil.generateNumericId());
request.setImei(deviceObj.getDeviceImei());
diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java
index dddeb37a..14d4765b 100644
--- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java
+++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java
@@ -54,10 +54,16 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
private String bluetoothName;
//电量百分比
- private String batteryPercentage;
+ /**
+ * 电量百分比
+ */
+ private Integer batteryPercentage;
//充电状态(0没有充电,1正在充电,2为已充满)
- private String chargeState;
+ /**
+ * 充电状态(0没有充电,1正在充电,2为已充满)
+ */
+ private Integer chargeState;
/**
* 在线状态(0离线,1在线)
@@ -65,18 +71,33 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
private Integer onlineStatus;
// 经度
+ /**
+ * 经度
+ */
private String longitude;
// 纬度
+ /**
+ * 纬度
+ */
private String latitude;
// 逆解析地址
+ /**
+ * 逆解析地址
+ */
private String address;
// 亮度
+ /**
+ * 亮度
+ */
private Integer lightBrightness;
// 音量
+ /**
+ * 音量
+ */
private Integer volume;
@@ -85,10 +106,16 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
*/
private String voiceResource;
- // 报警模式 0公安,1 消防,2应急,3交警,4 市政,5 铁路,6 医疗,7 部队,8 水利
+ // 报警模式 0公安,1 消防,2应急,3交警,4 市政,5 铁路,6 医疗,7 自定义语音
+ /**
+ * 报警模式 0公安,1 消防,2应急,3交警,4 市政,5 铁路,6 医疗,7 自定义语音
+ */
private Integer alarmMode;
// 强制报警开关: 0 关闭, 1开启
+ /**
+ * 强制报警开关: 0 关闭, 1开启
+ */
private Integer voiceStrobeAlarm;
/**
@@ -110,4 +137,9 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
* 语音播报0 关闭, 1开启
*/
private Integer voiceBroadcast;
+
+ /**
+ * 续航时间(分钟)
+ */
+ private Integer batteryRemainingTime;
}