hby100japp功能3
This commit is contained in:
@ -146,12 +146,6 @@
|
|||||||
<version>3.3.1</version>
|
<version>3.3.1</version>
|
||||||
</dependency>-->
|
</dependency>-->
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>ws.schild</groupId>
|
|
||||||
<artifactId>jave-all-deps</artifactId>
|
|
||||||
<version>3.1.1</version>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- skywalking 整合 logback -->
|
<!-- skywalking 整合 logback -->
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
|
|||||||
@ -137,7 +137,7 @@ public class AppDeviceHBY100JController extends BaseController {
|
|||||||
*/
|
*/
|
||||||
private Integer voiceStrobeAlarm;
|
private Integer voiceStrobeAlarm;
|
||||||
/**
|
/**
|
||||||
* 0 公安,1消防,2应急,3交警,4 市政,5 铁路,6 医疗,7部队,8 水利,9 语音
|
* 0 公安,1消防,2应急,3交警,4 市政,5 铁路,6 医疗,7语音
|
||||||
*/
|
*/
|
||||||
private Integer mode;
|
private Integer mode;
|
||||||
|
|
||||||
|
|||||||
@ -47,22 +47,25 @@ public class HttpTtsClient {
|
|||||||
/**
|
/**
|
||||||
* 使用HTTP POST方式调用阿里云TTS服务生成MP3格式语音
|
* 使用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 endpoint = "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts";
|
||||||
|
|
||||||
// 构建请求体
|
// 构建请求体
|
||||||
// String requestBody = String.format(
|
// String requestBody = String.format(
|
||||||
// "{\"appkey\":\"%s\",\"text\":\"%s\",\"voice\":\"zhifeng\",\"format\":\"MP3\",\"sample_rate\":24000,\"volume\":50,\"speech_rate\":0,\"pitch_rate\":0}",
|
// "{\"appkey\":\"%s\",\"text\":\"%s\",\"voice\":\"zhifeng\",\"format\":\"MP3\",\"sample_rate\":24000,\"volume\":50,\"speech_rate\":0,\"pitch_rate\":0}",
|
||||||
// appKey,
|
// appKey,
|
||||||
// text.replace("\"", "\\\"")
|
// text.replace("\"", "\\\"")zhide
|
||||||
// );
|
// );
|
||||||
|
|
||||||
String token = refreshAccessToken();
|
String token = refreshAccessToken();
|
||||||
String requestBody = " {\n" +
|
String requestBody = " {\n" +
|
||||||
" \"appkey\":\""+appKey+"\",\n" +
|
" \"appkey\":\""+appKey+"\",\n" +
|
||||||
|
" \"voice\":\"zhide\",\n" +
|
||||||
" \"text\":\""+text+"\",\n" +
|
" \"text\":\""+text+"\",\n" +
|
||||||
" \"token\":\""+token+"\",\n" +
|
" \"token\":\""+token+"\",\n" +
|
||||||
" \"format\":\"mp3\"\n" +
|
" \"volume\": 100,\n" +
|
||||||
|
" \"pitch_rate\": 0,\n" +
|
||||||
|
" \"format\":\""+fileSuffix+"\"\n" +
|
||||||
" }";
|
" }";
|
||||||
|
|
||||||
URL url = new URL(endpoint);
|
URL url = new URL(endpoint);
|
||||||
@ -119,7 +122,7 @@ public class HttpTtsClient {
|
|||||||
* 保存MP3到文件
|
* 保存MP3到文件
|
||||||
*/
|
*/
|
||||||
public String saveMp3ToFile(String text, String outputPath) throws IOException {
|
public String saveMp3ToFile(String text, String outputPath) throws IOException {
|
||||||
byte[] mp3Data = synthesizeTextToMp3(text);
|
byte[] mp3Data = synthesizeTextToMp3(text,"mp3");
|
||||||
|
|
||||||
try (FileOutputStream fos = new FileOutputStream(outputPath)) {
|
try (FileOutputStream fos = new FileOutputStream(outputPath)) {
|
||||||
fos.write(mp3Data);
|
fos.write(mp3Data);
|
||||||
|
|||||||
@ -19,8 +19,8 @@ public class HttpTtsExample {
|
|||||||
// 使用HTTP方式调用
|
// 使用HTTP方式调用
|
||||||
HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey);
|
HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey);
|
||||||
|
|
||||||
String text = "大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。";
|
String text = "前方拥堵,请绕道而行。";
|
||||||
String outputPath = "D:\\http_output9.mp3";
|
String outputPath = "D:\\http_output11.mp3";
|
||||||
|
|
||||||
String resultFile = httpClient.saveMp3ToFile(text, outputPath);
|
String resultFile = httpClient.saveMp3ToFile(text, outputPath);
|
||||||
System.out.println("MP3音频已保存至: " + resultFile);
|
System.out.println("MP3音频已保存至: " + resultFile);
|
||||||
|
|||||||
@ -454,7 +454,7 @@ public class AudioProcessService {
|
|||||||
// 使用HTTP方式调用
|
// 使用HTTP方式调用
|
||||||
HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey);
|
HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey);
|
||||||
//
|
//
|
||||||
byte[] mp3Data = httpClient.synthesizeTextToMp3(text);
|
byte[] mp3Data = httpClient.synthesizeTextToMp3(text,fileSuffix);
|
||||||
// byte[] mp3Data = alibabaTTSUtil.synthesizeTextToMp3(text);
|
// byte[] mp3Data = alibabaTTSUtil.synthesizeTextToMp3(text);
|
||||||
|
|
||||||
SysOssVo upload = ossService.upload(mp3Data, generateRandomFileName(fileSuffix));
|
SysOssVo upload = ossService.upload(mp3Data, generateRandomFileName(fileSuffix));
|
||||||
|
|||||||
@ -2,15 +2,23 @@ package com.fuyuanshen.global.mqtt.rule.hby100j;
|
|||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
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.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.NewMqttMessageRule;
|
||||||
import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX;
|
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<String, Object> payloadDict = context.getPayloadDict();
|
Map<String, Object> payloadDict = context.getPayloadDict();
|
||||||
if (payloadDict != null) {
|
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) {
|
} catch (Exception e) {
|
||||||
log.error("HBY100J获取设备位置信息失败", 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<String, Object> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,15 +2,21 @@ package com.fuyuanshen.global.mqtt.rule.hby100j;
|
|||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
|
import com.fuyuanshen.common.json.utils.JsonUtils;
|
||||||
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
import com.fuyuanshen.global.mqtt.base.NewMqttMessageRule;
|
import com.fuyuanshen.global.mqtt.base.NewMqttMessageRule;
|
||||||
import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
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_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());
|
log.info("HBY100J获取设备电源状态,消息负载:{}", context.getPayloadDict());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX +
|
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX);
|
||||||
context.getDeviceImei() + ":powerStatus";
|
// String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX +
|
||||||
|
// context.getDeviceImei() + ":powerStatus";
|
||||||
|
|
||||||
Map<String, Object> payloadDict = context.getPayloadDict();
|
Map<String, Object> payloadDict = context.getPayloadDict();
|
||||||
if (payloadDict != null) {
|
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<String, Object> 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) {
|
} catch (Exception e) {
|
||||||
log.error("HBY100J获取设备电源状态失败", e);
|
log.error("HBY100J获取设备电源状态失败", e);
|
||||||
|
|||||||
@ -21,7 +21,7 @@ public class FuncType6VoicePlay implements NewMqttMessageRule {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getCommandType() {
|
public String getCommandType() {
|
||||||
return "HBY100_9";
|
return "HBY100_6";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -44,6 +44,7 @@ public class FuncType12ForceAudioRequest {
|
|||||||
/**
|
/**
|
||||||
* 语音报警0关闭,1开启
|
* 语音报警0关闭,1开启
|
||||||
*/
|
*/
|
||||||
|
@JsonProperty("voice_strobe_alarm")
|
||||||
private Integer voiceStrobeAlarm;
|
private Integer voiceStrobeAlarm;
|
||||||
//语音模式0公安,1消防,2应急,3交警,4市政,5铁路,6医疗,7部队,8水利
|
//语音模式0公安,1消防,2应急,3交警,4市政,5铁路,6医疗,7部队,8水利
|
||||||
private Integer mode;
|
private Integer mode;
|
||||||
|
|||||||
@ -49,12 +49,14 @@ public class FuncType5UpdateVoiceRequest {
|
|||||||
* 2 - 紧急语音
|
* 2 - 紧急语音
|
||||||
* (具体含义需依据设备协议定义)
|
* (具体含义需依据设备协议定义)
|
||||||
*/
|
*/
|
||||||
|
@JsonProperty("voice_type")
|
||||||
private Integer voiceType;
|
private Integer voiceType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 语音资源URL(MP3等音频文件地址)
|
* 语音资源URL(MP3等音频文件地址)
|
||||||
* 示例:http://8.129.5.250:10001/voice/01.mp3
|
* 示例:http://8.129.5.250:10001/voice/01.mp3
|
||||||
*/
|
*/
|
||||||
|
@JsonProperty("voice_resource")
|
||||||
private String voiceResource;
|
private String voiceResource;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,6 +44,7 @@ public class FuncType6VoicePlayRequest {
|
|||||||
/**
|
/**
|
||||||
* 语音报警0关闭,1开启
|
* 语音报警0关闭,1开启
|
||||||
*/
|
*/
|
||||||
|
@JsonProperty("voice_broadcast")
|
||||||
private Integer voiceBroadcast;
|
private Integer voiceBroadcast;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,7 +52,5 @@ public class FunctionType3LocationReport {
|
|||||||
*/
|
*/
|
||||||
@JsonProperty("latitude")
|
@JsonProperty("latitude")
|
||||||
private Double latitude;
|
private Double latitude;
|
||||||
|
|
||||||
private String address;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -70,5 +70,8 @@ public class FunctionType4PowerStatusReport {
|
|||||||
*/
|
*/
|
||||||
@JsonProperty("12v_power")
|
@JsonProperty("12v_power")
|
||||||
private Integer twelveVPower;
|
private Integer twelveVPower;
|
||||||
|
|
||||||
|
@JsonProperty("battery_remaining_time")
|
||||||
|
private Integer batteryRemainingTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -97,6 +97,7 @@ public class DeviceBizService {
|
|||||||
} else {
|
} else {
|
||||||
item.setOnlineStatus(0);
|
item.setOnlineStatus(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX);
|
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX);
|
||||||
// 获取电量
|
// 获取电量
|
||||||
if (StringUtils.isNotBlank(deviceStatus)) {
|
if (StringUtils.isNotBlank(deviceStatus)) {
|
||||||
|
|||||||
@ -130,17 +130,21 @@ public class DeviceHBY100JBizService {
|
|||||||
} else {
|
} else {
|
||||||
vo.setOnlineStatus(0);
|
vo.setOnlineStatus(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX);
|
String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX);
|
||||||
// 获取电量
|
// 获取电量
|
||||||
if (StringUtils.isNotBlank(deviceStatus)) {
|
if (StringUtils.isNotBlank(deviceStatus)) {
|
||||||
JSONObject jsonObject = JSONObject.parseObject(deviceStatus);
|
JSONObject jsonObject = JSONObject.parseObject(deviceStatus);
|
||||||
vo.setBatteryPercentage(jsonObject.getString("level"));
|
vo.setBatteryPercentage(jsonObject.getInteger("batteryPercentage"));
|
||||||
vo.setChargeState(jsonObject.getString("charge"));
|
vo.setChargeState(jsonObject.getInteger("chargeState"));
|
||||||
|
vo.setBatteryRemainingTime(jsonObject.getInteger("batteryRemainingTime"));
|
||||||
} else {
|
} else {
|
||||||
vo.setBatteryPercentage("0");
|
vo.setBatteryPercentage(0);
|
||||||
|
vo.setBatteryRemainingTime(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
String reportStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + ":report");
|
String reportStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + ":report");
|
||||||
if (StringUtils.isNotBlank(reportStatus)) {
|
if (StringUtils.isNotBlank(reportStatus)) {
|
||||||
FuncType14StatusReport report = JSONObject.parseObject(reportStatus,FuncType14StatusReport.class);
|
FuncType14StatusReport report = JSONObject.parseObject(reportStatus,FuncType14StatusReport.class);
|
||||||
@ -160,33 +164,26 @@ public class DeviceHBY100JBizService {
|
|||||||
|
|
||||||
|
|
||||||
Integer voiceBroadcast = data.getVoiceBroadcast();
|
Integer voiceBroadcast = data.getVoiceBroadcast();
|
||||||
if(voiceBroadcast != null && voiceBroadcast == 1){
|
if(voiceBroadcast != null){
|
||||||
vo.setAlarmMode(9);
|
vo.setVoiceBroadcast(voiceBroadcast);
|
||||||
vo.setVoiceStrobeAlarm(1);
|
}
|
||||||
}else {
|
FuncType14StatusReport.SirenAlarm sirenAlarm = data.getSirenAlarm();
|
||||||
FuncType14StatusReport.SirenAlarm sirenAlarm = data.getSirenAlarm();
|
if(sirenAlarm != null){
|
||||||
if(sirenAlarm != null){
|
vo.setVoiceStrobeAlarm(sirenAlarm.getEnable());
|
||||||
vo.setVoiceStrobeAlarm(sirenAlarm.getEnable());
|
vo.setAlarmMode(sirenAlarm.getMode());
|
||||||
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<AppBusinessFile> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<AppBusinessFile> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("business_id", device.getId());
|
queryWrapper.eq("business_id", device.getId());
|
||||||
queryWrapper.eq("file_type", 3);
|
queryWrapper.eq("file_type", 3);
|
||||||
@ -217,9 +214,9 @@ public class DeviceHBY100JBizService {
|
|||||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||||
bo.getDeviceIds().forEach(deviceId -> {
|
bo.getDeviceIds().forEach(deviceId -> {
|
||||||
Device deviceObj = deviceMapper.selectById(deviceId);
|
Device deviceObj = deviceMapper.selectById(deviceId);
|
||||||
// if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
||||||
// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
||||||
// }
|
}
|
||||||
|
|
||||||
FuncType12ForceAudioRequest request = new FuncType12ForceAudioRequest();
|
FuncType12ForceAudioRequest request = new FuncType12ForceAudioRequest();
|
||||||
request.setRequestId(GenerateIdUtil.generateNumericId());
|
request.setRequestId(GenerateIdUtil.generateNumericId());
|
||||||
@ -245,9 +242,9 @@ public class DeviceHBY100JBizService {
|
|||||||
throw new ServiceException("文件不存在");
|
throw new ServiceException("文件不存在");
|
||||||
}
|
}
|
||||||
Device deviceObj = deviceMapper.selectById(appBusinessFileVo.getBusinessId());
|
Device deviceObj = deviceMapper.selectById(appBusinessFileVo.getBusinessId());
|
||||||
// if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
||||||
// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
||||||
// }
|
}
|
||||||
|
|
||||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||||
SysOssVo sysOssVo = sysOssMapper.selectVoById(appBusinessFileVo.getFileId());
|
SysOssVo sysOssVo = sysOssMapper.selectVoById(appBusinessFileVo.getFileId());
|
||||||
@ -282,9 +279,9 @@ public class DeviceHBY100JBizService {
|
|||||||
|
|
||||||
public void strobeMode(AppDeviceHBY100JController.HBY100JStrobeModeDto params) {
|
public void strobeMode(AppDeviceHBY100JController.HBY100JStrobeModeDto params) {
|
||||||
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
||||||
// if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
||||||
// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
||||||
// }
|
}
|
||||||
FuncType10StrobeModeRequest request = new FuncType10StrobeModeRequest();
|
FuncType10StrobeModeRequest request = new FuncType10StrobeModeRequest();
|
||||||
request.setRequestId(GenerateIdUtil.generateNumericId());
|
request.setRequestId(GenerateIdUtil.generateNumericId());
|
||||||
request.setImei(deviceObj.getDeviceImei());
|
request.setImei(deviceObj.getDeviceImei());
|
||||||
@ -301,9 +298,12 @@ public class DeviceHBY100JBizService {
|
|||||||
public void lightAdjustment(AppDeviceHBY100JController.HBY100JLightAdjustmentDto params) {
|
public void lightAdjustment(AppDeviceHBY100JController.HBY100JLightAdjustmentDto params) {
|
||||||
log.info("HBY100J灯光调节,请求参数:{}", params);
|
log.info("HBY100J灯光调节,请求参数:{}", params);
|
||||||
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
||||||
// if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
if (deviceObj == null) {
|
||||||
// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
throw new ServiceException("设备不存在");
|
||||||
// }
|
}
|
||||||
|
if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
||||||
|
throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
||||||
|
}
|
||||||
FuncType13BrightnessRequest request = new FuncType13BrightnessRequest();
|
FuncType13BrightnessRequest request = new FuncType13BrightnessRequest();
|
||||||
request.setRequestId(GenerateIdUtil.generateNumericId());
|
request.setRequestId(GenerateIdUtil.generateNumericId());
|
||||||
request.setImei(deviceObj.getDeviceImei());
|
request.setImei(deviceObj.getDeviceImei());
|
||||||
@ -320,9 +320,12 @@ public class DeviceHBY100JBizService {
|
|||||||
|
|
||||||
public void strobeFrequency(AppDeviceHBY100JController.HBY100JStrobeFrequencyDto params) {
|
public void strobeFrequency(AppDeviceHBY100JController.HBY100JStrobeFrequencyDto params) {
|
||||||
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
||||||
// if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
if (deviceObj == null) {
|
||||||
// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
throw new ServiceException("设备不存在");
|
||||||
// }
|
}
|
||||||
|
if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
||||||
|
throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
||||||
|
}
|
||||||
FuncType11FrequencyRequest request = new FuncType11FrequencyRequest();
|
FuncType11FrequencyRequest request = new FuncType11FrequencyRequest();
|
||||||
request.setRequestId(GenerateIdUtil.generateNumericId());
|
request.setRequestId(GenerateIdUtil.generateNumericId());
|
||||||
request.setImei(deviceObj.getDeviceImei());
|
request.setImei(deviceObj.getDeviceImei());
|
||||||
@ -337,9 +340,12 @@ public class DeviceHBY100JBizService {
|
|||||||
|
|
||||||
public void updateVolume(AppDeviceHBY100JController.HBY100JUpdateVolumeDto params) {
|
public void updateVolume(AppDeviceHBY100JController.HBY100JUpdateVolumeDto params) {
|
||||||
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
||||||
// if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
if (deviceObj == null) {
|
||||||
// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
throw new ServiceException("设备不存在");
|
||||||
// }
|
}
|
||||||
|
if (getDeviceStatus(deviceObj.getDeviceImei())) {
|
||||||
|
throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接");
|
||||||
|
}
|
||||||
FuncType9UpdateVolumeRequest request = new FuncType9UpdateVolumeRequest();
|
FuncType9UpdateVolumeRequest request = new FuncType9UpdateVolumeRequest();
|
||||||
request.setRequestId(GenerateIdUtil.generateNumericId());
|
request.setRequestId(GenerateIdUtil.generateNumericId());
|
||||||
request.setImei(deviceObj.getDeviceImei());
|
request.setImei(deviceObj.getDeviceImei());
|
||||||
@ -354,6 +360,12 @@ public class DeviceHBY100JBizService {
|
|||||||
|
|
||||||
public void voiceBroadcast(AppDeviceHBY100JController.HBY100JVoiceBroadcastDto params) {
|
public void voiceBroadcast(AppDeviceHBY100JController.HBY100JVoiceBroadcastDto params) {
|
||||||
Device deviceObj = deviceMapper.selectById(params.getDeviceId());
|
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();
|
FuncType6VoicePlayRequest request = new FuncType6VoicePlayRequest();
|
||||||
request.setRequestId(GenerateIdUtil.generateNumericId());
|
request.setRequestId(GenerateIdUtil.generateNumericId());
|
||||||
request.setImei(deviceObj.getDeviceImei());
|
request.setImei(deviceObj.getDeviceImei());
|
||||||
|
|||||||
@ -54,10 +54,16 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
|
|||||||
private String bluetoothName;
|
private String bluetoothName;
|
||||||
|
|
||||||
//电量百分比
|
//电量百分比
|
||||||
private String batteryPercentage;
|
/**
|
||||||
|
* 电量百分比
|
||||||
|
*/
|
||||||
|
private Integer batteryPercentage;
|
||||||
|
|
||||||
//充电状态(0没有充电,1正在充电,2为已充满)
|
//充电状态(0没有充电,1正在充电,2为已充满)
|
||||||
private String chargeState;
|
/**
|
||||||
|
* 充电状态(0没有充电,1正在充电,2为已充满)
|
||||||
|
*/
|
||||||
|
private Integer chargeState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在线状态(0离线,1在线)
|
* 在线状态(0离线,1在线)
|
||||||
@ -65,18 +71,33 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
|
|||||||
private Integer onlineStatus;
|
private Integer onlineStatus;
|
||||||
|
|
||||||
// 经度
|
// 经度
|
||||||
|
/**
|
||||||
|
* 经度
|
||||||
|
*/
|
||||||
private String longitude;
|
private String longitude;
|
||||||
|
|
||||||
// 纬度
|
// 纬度
|
||||||
|
/**
|
||||||
|
* 纬度
|
||||||
|
*/
|
||||||
private String latitude;
|
private String latitude;
|
||||||
|
|
||||||
// 逆解析地址
|
// 逆解析地址
|
||||||
|
/**
|
||||||
|
* 逆解析地址
|
||||||
|
*/
|
||||||
private String address;
|
private String address;
|
||||||
|
|
||||||
// 亮度
|
// 亮度
|
||||||
|
/**
|
||||||
|
* 亮度
|
||||||
|
*/
|
||||||
private Integer lightBrightness;
|
private Integer lightBrightness;
|
||||||
|
|
||||||
// 音量
|
// 音量
|
||||||
|
/**
|
||||||
|
* 音量
|
||||||
|
*/
|
||||||
private Integer volume;
|
private Integer volume;
|
||||||
|
|
||||||
|
|
||||||
@ -85,10 +106,16 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String voiceResource;
|
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;
|
private Integer alarmMode;
|
||||||
|
|
||||||
// 强制报警开关: 0 关闭, 1开启
|
// 强制报警开关: 0 关闭, 1开启
|
||||||
|
/**
|
||||||
|
* 强制报警开关: 0 关闭, 1开启
|
||||||
|
*/
|
||||||
private Integer voiceStrobeAlarm;
|
private Integer voiceStrobeAlarm;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -110,4 +137,9 @@ public class AppDeviceHBY100JDetailVo implements Serializable {
|
|||||||
* 语音播报0 关闭, 1开启
|
* 语音播报0 关闭, 1开启
|
||||||
*/
|
*/
|
||||||
private Integer voiceBroadcast;
|
private Integer voiceBroadcast;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 续航时间(分钟)
|
||||||
|
*/
|
||||||
|
private Integer batteryRemainingTime;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user