作者 钟来

开发U渔设备功能

正在显示 66 个修改的文件 包含 1910 行增加148 行删除
... ... @@ -31,11 +31,11 @@ public class SenserDataController {
@ApiImplicitParam(value = "数据类型",name = "type"),
@ApiImplicitParam(value = "日期(2024-06-05)",name = "day")
})
@GetMapping(value = "/oneDay/{deviceInfiId}/{type}/{day}")
@GetMapping(value = "/oneDay/{deviceInfoId}/{type}/{day}")
public AjaxResult oneDay(@PathVariable String deviceInfoId, @PathVariable String type, @PathVariable String day)
{
String table = TableUtil.getTableName(day,"ly_sensor_data","device_sensor_data",3);
List<Map<String,Object>> list = publicService.getObjectListBySQL("select creat_time,data_value from `"+table+"` where device_info_id='"+deviceInfoId+"' and data_type='"+type+"'");
List<Map<String,Object>> list = publicService.getObjectListBySQL("select DATE_FORMAT(FROM_UNIXTIME(creat_time), '%Y-%m-%d %H:%i:%s') `time`,data_value from `"+table.replace(".","`.`")+"` where device_info_id='"+deviceInfoId+"' and data_type='"+type+"'");
return AjaxResult.success(list);
}
... ...
package com.zhonglai.luhui.admin.controller.iot;
import com.google.gson.JsonObject;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.dto.CommandType;
import com.zhonglai.luhui.device.dto.DeviceCommand;
import com.zhonglai.luhui.rocketmq.service.RocketMqService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Api(tags = "设备控制")
@RestController
@RequestMapping("/iot/controlDevice")
public class ControlDeviceConreoller extends BaseController {
@Autowired
private RocketMqService rocketMqService;
@ApiOperation(value = "写指令",notes = "body参数描述:\r\n" +
"{\n" +
" \"0\":{\n" +
" \"rssi\": -43,\n" +
" \"firmware_version\": 1.2,\n" +
" \"longitude\": 0,\n" +
" \"latitude\": 0,\n" +
" \"summary\": {\n" +
" \t \"name\": \"wumei-smart\",\n" +
" \t \"chip\": \"esp8266\",\n" +
" \t \"author\": \"kerwincui\",\n" +
" \t \"version\": 1.2,\n" +
" \t \"createTime\": \"2022-06-06\"\n" +
" }\n" +
" },\n" +
" \"1\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" }\n" +
"}")
@ApiImplicitParams({
@ApiImplicitParam(value = "网关id",name = "deviceId"),
})
@PreAuthorize("@ss.hasPermi('iot:controlDevice:write')")
@Log(title = "写指令", businessType = BusinessType.WRITE)
@PostMapping("/write/{deviceId}")
public AjaxResult write(@PathVariable String deviceId, HttpServletRequest request) throws IOException {
byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream());
String body = new String(bodyBytes, request.getCharacterEncoding());
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setDeviceId(deviceId);
deviceCommand.setCommandType(CommandType.write);
deviceCommand.setData(GsonConstructor.get().fromJson(body,JsonObject.class));
return control(deviceCommand);
}
@ApiOperation("更新缓存模型")
@ApiImplicitParam(value = "产品id",name = "product_id")
@PreAuthorize("@ss.hasPermi('iot:controlDevice:upIotThingsModel')")
@Log(title = "更新缓存模型", businessType = BusinessType.CAHE)
@PostMapping("/upIotThingsModel/{product_id}")
public AjaxResult upIotThingsModel(@PathVariable Integer product_id) throws IOException {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setCommandType(CommandType.upIotThingsModel);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("product_id",product_id);
deviceCommand.setData(jsonObject);
return control(deviceCommand);
}
@ApiOperation("更新缓存翻译模型")
@ApiImplicitParam(value = "产品id",name = "product_id")
@PreAuthorize("@ss.hasPermi('iot:controlDevice:upIotThingsModelTranslate')")
@Log(title = "更新缓存翻译模型", businessType = BusinessType.CAHE)
@PostMapping("/upIotThingsModelTranslate/{product_id}")
public AjaxResult upIotThingsModelTranslate(@PathVariable Integer product_id) throws IOException {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setCommandType(CommandType.upIotThingsModelTranslate);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("product_id",product_id);
deviceCommand.setData(jsonObject);
return control(deviceCommand);
}
@ApiOperation("清除网关缓存")
@ApiImplicitParam(value = "网关id",name = "deviceId")
@PreAuthorize("@ss.hasPermi('iot:controlDevice:cleanDeviceHost')")
@Log(title = "清除网关缓存", businessType = BusinessType.CAHE)
@PostMapping("/cleanDeviceHost/{deviceId}")
public AjaxResult cleanDeviceHost(@PathVariable String deviceId) throws IOException {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setDeviceId(deviceId);
deviceCommand.setCommandType(CommandType.cleanDeviceHost);
return control(deviceCommand);
}
@ApiOperation("更新终端缓存")
@ApiImplicitParams({
@ApiImplicitParam(value = "网关id",name = "deviceId"),
@ApiImplicitParam(value = "终端编号",name = "sensor_number"),
})
@PreAuthorize("@ss.hasPermi('iot:controlDevice:cleanDeviceInfo')")
@Log(title = "更新终端缓存", businessType = BusinessType.CAHE)
@PostMapping("/cleanDeviceInfo/{deviceId}")
public AjaxResult cleanDeviceInfo(@PathVariable String deviceId,@PathVariable String sensor_number) {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setDeviceId(deviceId);
deviceCommand.setCommandType(CommandType.cleanDeviceInfo);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("sensor_number",sensor_number);
deviceCommand.setData(jsonObject);
return control(deviceCommand);
}
private AjaxResult control( DeviceCommand deviceCommand)
{
Message message = rocketMqService.send("deviceCommandListen",GsonConstructor.get().toJson(deviceCommand).getBytes());
if(message.getCode()==1)
{
return new AjaxResult(HttpStatus.SUCCESS, message.getMessage(), message.getData());
}
return new AjaxResult(HttpStatus.ERROR, message.getMessage(), message.getData());
}
}
... ...
... ... @@ -44,7 +44,11 @@
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-login</artifactId>
</dependency>
<!-- log -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-log</artifactId>
</dependency>
<!-- 其它模块 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
... ...
... ... @@ -10,6 +10,7 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
"com.ruoyi.common",
"com.ruoyi.system",
"com.ruoyi.framework",
"com.zhonglai.luhui.config",
"com.zhonglai.luhui.datasource",
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.sys",
... ... @@ -20,6 +21,7 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
"com.zhonglai.luhui.login.service",
"com.zhonglai.luhui.api",
"com.zhonglai.luhui.order.service",
"com.zhonglai.luhui.log.aspectj"
})
@EnableAspectJAutoProxy(proxyTargetClass=true)
@SpringBootApplication
... ...
... ... @@ -18,7 +18,7 @@ public class JwtAuthenticationTokenFilterImpl extends JwtAuthenticationTokenFilt
@Override
public BaseLoginUser getBaseLoginUser(HttpServletRequest request) {
return tokenService.getLoginUser(request);
return tokenService.getApiLoginUser(request);
}
@Override
... ...
package com.zhonglai.luhui.api.controller.iot;
import com.google.gson.JsonObject;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.dto.CommandType;
import com.zhonglai.luhui.device.dto.DeviceCommand;
import com.zhonglai.luhui.rocketmq.service.RocketMqService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Api(tags = "设备控制")
@RestController
@RequestMapping("/iot/controlDevice")
public class ControlDeviceConreoller extends BaseController {
@Autowired
private RocketMqService rocketMqService;
@ApiOperation(value = "写指令",notes = "body参数描述:\r\n" +
"{\n" +
" \"0\":{\n" +
" \"rssi\": -43,\n" +
" \"firmware_version\": 1.2,\n" +
" \"longitude\": 0,\n" +
" \"latitude\": 0,\n" +
" \"summary\": {\n" +
" \t \"name\": \"wumei-smart\",\n" +
" \t \"chip\": \"esp8266\",\n" +
" \t \"author\": \"kerwincui\",\n" +
" \t \"version\": 1.2,\n" +
" \t \"createTime\": \"2022-06-06\"\n" +
" }\n" +
" },\n" +
" \"1\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" }\n" +
"}")
@ApiImplicitParams({
@ApiImplicitParam(value = "网关id",name = "deviceId"),
})
@Log(title = "写指令", businessType = BusinessType.WRITE)
@PostMapping("/write/{deviceId}")
public AjaxResult write(@PathVariable String deviceId, HttpServletRequest request) throws IOException {
byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream());
String body = new String(bodyBytes, request.getCharacterEncoding());
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setDeviceId(deviceId);
deviceCommand.setCommandType(CommandType.write);
deviceCommand.setData(GsonConstructor.get().fromJson(body,JsonObject.class));
return control(deviceCommand);
}
@ApiOperation("更新缓存模型")
@ApiImplicitParam(value = "产品id",name = "product_id")
@Log(title = "更新缓存模型", businessType = BusinessType.CAHE)
@PostMapping("/upIotThingsModel/{product_id}")
public AjaxResult upIotThingsModel(@PathVariable Integer product_id) throws IOException {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setCommandType(CommandType.upIotThingsModel);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("product_id",product_id);
deviceCommand.setData(jsonObject);
return control(deviceCommand);
}
@ApiOperation("更新缓存翻译模型")
@ApiImplicitParam(value = "产品id",name = "product_id")
@Log(title = "更新缓存翻译模型", businessType = BusinessType.CAHE)
@PostMapping("/upIotThingsModelTranslate/{product_id}")
public AjaxResult upIotThingsModelTranslate(@PathVariable Integer product_id) throws IOException {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setCommandType(CommandType.upIotThingsModelTranslate);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("product_id",product_id);
deviceCommand.setData(jsonObject);
return control(deviceCommand);
}
@ApiOperation("清除网关缓存")
@ApiImplicitParam(value = "网关id",name = "deviceId")
@Log(title = "清除网关缓存", businessType = BusinessType.CAHE)
@PostMapping("/cleanDeviceHost/{deviceId}")
public AjaxResult cleanDeviceHost(@PathVariable String deviceId) throws IOException {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setDeviceId(deviceId);
deviceCommand.setCommandType(CommandType.cleanDeviceHost);
return control(deviceCommand);
}
@ApiOperation("更新终端缓存")
@ApiImplicitParams({
@ApiImplicitParam(value = "网关id",name = "deviceId"),
@ApiImplicitParam(value = "终端编号",name = "sensor_number"),
})
@Log(title = "更新终端缓存", businessType = BusinessType.CAHE)
@PostMapping("/cleanDeviceInfo/{deviceId}")
public AjaxResult cleanDeviceInfo(@PathVariable String deviceId,@PathVariable String sensor_number) {
DeviceCommand deviceCommand = new DeviceCommand();
deviceCommand.setDeviceId(deviceId);
deviceCommand.setCommandType(CommandType.cleanDeviceInfo);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("sensor_number",sensor_number);
deviceCommand.setData(jsonObject);
return control(deviceCommand);
}
private AjaxResult control( DeviceCommand deviceCommand)
{
Message message = rocketMqService.send("deviceCommandListen",GsonConstructor.get().toJson(deviceCommand).getBytes());
if(message.getCode()==1)
{
return new AjaxResult(HttpStatus.SUCCESS, message.getMessage(), message.getData());
}
return new AjaxResult(HttpStatus.ERROR, message.getMessage(), message.getData());
}
}
... ...
... ... @@ -43,7 +43,7 @@ public class IotTerminalController extends BaseController
{
startPage();
UserTerminalGroupRelation userTerminalGroupRelation = new UserTerminalGroupRelation();
userTerminalGroupRelation.setUser_info_id(SecurityUtils.getUserId().intValue());
userTerminalGroupRelation.setUser_info_id(Integer.parseInt(getLoginToken().getId()));
iotTerminal.setUserTerminalGroupRelation(userTerminalGroupRelation);
List<IotTerminal> list = iotTerminalService.selectIotTerminalListByUserId(iotTerminal);
return getDataTable(list);
... ...
package com.zhonglai.luhui.api.service;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DESUtil;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.security.dto.ApiLoginUser;
... ... @@ -33,6 +34,7 @@ public class ApiUserDetailsServiceImpl implements UserDetailsService {
log.info("登录用户:{} 已被停用.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
// yu2leUserLogin.setLoginPass(DESUtil.decode(yu2leUserLogin.getLoginPass(),yu2leUserLogin.getUserLoginPassKey())); //接码
return new ApiLoginUser(yu2leUserInfo, yu2leUserLogin);
}
}
... ...
... ... @@ -4,6 +4,8 @@ import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.http.analysis.analysis.topic.*;
import org.springframework.stereotype.Service;
public class ProtocolParserServiceImpl implements ProtocolParserFactory<JsonObject> {
... ... @@ -17,7 +19,25 @@ public class ProtocolParserServiceImpl implements ProtocolParserFactory<JsonObje
}
@Override
public JsonObject analysisPayload(Topic topic, JsonObject payload) {
return payload;
public AnalysisResult analysisPayload(Topic topic, JsonObject payload) {
switch (topic.getTopicType())
{
case "online":
return new Online().analysisPayload(payload);
case "ONLINE":
return new Online().analysisPayload(payload);
case "ALL_POST":
return new AllPost().analysisPayload(payload);
case "ADD_POST":
return new AddPost().analysisPayload(payload);
case "GET":
return new Get().analysisPayload(payload);
case "PUT_REQ":
return new PutReq().analysisPayload(payload);
case "READ_REQ":
return new ReadReq().analysisPayload(payload);
default:
return new AnalysisResult(false,false,null);
}
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class AddPost {
public AnalysisResult analysisPayload( JsonObject payload)
{
return new AnalysisResult(false,false,payload);
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class AllPost {
public AnalysisResult analysisPayload( JsonObject payload)
{
return new AnalysisResult(true,false,payload);
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class Get {
public AnalysisResult analysisPayload( JsonObject payload)
{
return new AnalysisResult(false,false,payload);
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.analysis.topic;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class Online {
public AnalysisResult analysisPayload( JsonObject payload)
{
return new AnalysisResult(false,false,payload);
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class PutReq {
public AnalysisResult analysisPayload( JsonObject payload)
{
return new AnalysisResult(false,true,payload);
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class ReadReq {
public AnalysisResult analysisPayload( JsonObject payload)
{
return new AnalysisResult(false,true,payload);
}
}
... ...
package com.zhonglai.luhui.device.protocol.modbus;
public class TopicConfig {
public static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}";
}
... ...
... ... @@ -4,19 +4,20 @@ import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.modbus.TopicConfig;
import com.zhonglai.luhui.device.protocol.modbus.dto.ModbusDto;
public class ModbusProtocolParserFactoryImpl implements ProtocolParserFactory<byte[]> {
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{imei}}/{{topicType}}";
@Override
public Topic analysisTopic(String topicStr) {
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
Topic topic = TopicUtil.initTopicFromModelStr(topicStr, TopicConfig.topicModel);
return topic;
}
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
ModbusDto modbusDto = new ModbusDto(payload);
String senserNumber = "1";
modbusDto.getCommdcode();
... ...
... ... @@ -11,6 +11,8 @@ import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory
import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.config.PluginsClassLoader;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.plugins.InitPlugins;
import com.zhonglai.luhui.device.protocol.factory.purification.DefaultProtocolPurificationFactoryImpl;
... ... @@ -50,10 +52,16 @@ public class ProtocolParserAndPurificationFactory<T> {
//通过解析服务获取到topic
Topic topic = protocolParserFactory.analysisTopic(topicStr);
//通过解析服务器将数据解析成键值对的形式存储到json对象里面,方便清洗
JsonObject jsonObject = protocolParserFactory.analysisPayload(topic,payload);
AnalysisResult analysisResult = protocolParserFactory.analysisPayload(topic,payload);
if(null == analysisResult.getJsonObject())
{
return null;
}
//通过模式对解析结果进行清洗,获得到的数据就是业务数据
ProtocolPurificationModel protocolPurificationModel = protocolPurificationFactory.purification(iotProduct.getId(),topic,jsonObject);
ProtocolPurificationModel protocolPurificationModel = protocolPurificationFactory.purification(iotProduct.getId(),topic,analysisResult);
protocolPurificationModel.setNoticeClien(analysisResult.isNoticeClien());
protocolPurificationModel.setNoticeMessage(analysisResult.getNoticeMessage());
return protocolPurificationModel;
}
... ...
... ... @@ -4,6 +4,8 @@ import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.topic.*;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import org.springframework.stereotype.Service;
public class DefaultProtocolParserFactoryImpl implements ProtocolParserFactory<byte[]>{
... ... @@ -16,8 +18,27 @@ public class DefaultProtocolParserFactoryImpl implements ProtocolParserFactory<b
}
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
return GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
switch (topic.getTopicType())
{
case "online":
return new Online().analysisPayload(payload);
case "ONLINE":
return new Online().analysisPayload(payload);
case "ALL_POST":
return new AllPost().analysisPayload(payload);
case "ADD_POST":
return new AddPost().analysisPayload(payload);
case "GET":
return new Get().analysisPayload(payload);
case "PUT_REQ":
return new PutReq().analysisPayload(payload);
case "READ_REQ":
return new ReadReq().analysisPayload(payload);
default:
return new AnalysisResult(false,false,null);
}
}
}
... ...
... ... @@ -2,6 +2,7 @@ package com.zhonglai.luhui.device.protocol.factory.analysis;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
/**
* 协议解析工厂
... ... @@ -9,5 +10,5 @@ import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
*/
public interface ProtocolParserFactory<T> {
Topic analysisTopic(String topicStr);
JsonObject analysisPayload(Topic topic, T payload);
AnalysisResult analysisPayload(Topic topic, T payload);
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class AddPost {
public AnalysisResult analysisPayload( byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return new AnalysisResult(false,false,jsonObject);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class AllPost {
public AnalysisResult analysisPayload( byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return new AnalysisResult(true,false,jsonObject);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class Get {
public AnalysisResult analysisPayload( byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return new AnalysisResult(false,false,jsonObject);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class Online {
public AnalysisResult analysisPayload( byte[] payload)
{
JsonObject jsonObject = new JsonObject();
JsonObject object = new JsonObject();
object.addProperty("online",new String(payload));
jsonObject.add("0",object);
return new AnalysisResult(false,false,jsonObject);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class PutReq {
public AnalysisResult analysisPayload(byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return new AnalysisResult(false,true,jsonObject);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public class ReadReq {
public AnalysisResult analysisPayload(byte[] payload)
{
JsonObject jsonObject = GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
return new AnalysisResult(false,true,jsonObject);
}
}
... ...
... ... @@ -30,7 +30,7 @@ public class DeviceCach {
log.info("超时清除>>>>>>>:{} ",s);
}
})
.expirationPolicy(ExpirationPolicy.CREATED).build();
.expirationPolicy(ExpirationPolicy.ACCESSED).build();
private static ExpiringMap<String, ParserDeviceHostDto> parserDeviceHostDtoMap = ExpiringMap.builder().maxSize(20000).expiration(60, TimeUnit.SECONDS)
.variableExpiration()
... ... @@ -40,17 +40,50 @@ public class DeviceCach {
log.info("超时清除>>>>>>>:{} ",s);
}
})
.expirationPolicy(ExpirationPolicy.CREATED).build();
.expirationPolicy(ExpirationPolicy.ACCESSED).build();
public static void putDeviceInfo(ParserDeviceInfoDto parserDeviceInfoDto,Long device_life)
{
parserDeviceInfoDtoMap.put(parserDeviceInfoDto.getId(),parserDeviceInfoDto,device_life,TimeUnit.SECONDS);
if (parserDeviceInfoDtoMap.containsKey(parserDeviceInfoDto.getId()))
{
parserDeviceInfoDtoMap.put(parserDeviceInfoDto.getId(),parserDeviceInfoDto);
}else{
parserDeviceInfoDtoMap.put(parserDeviceInfoDto.getId(),parserDeviceInfoDto,device_life*3,TimeUnit.SECONDS);
}
}
public static void putDeviceHost(ParserDeviceHostDto parserDeviceHostDto,Long device_life)
{
parserDeviceHostDtoMap.put(parserDeviceHostDto.getId(),parserDeviceHostDto,device_life,TimeUnit.SECONDS);
if(parserDeviceHostDtoMap.containsKey(parserDeviceHostDto.getId()))
{
parserDeviceHostDtoMap.put(parserDeviceHostDto.getId(),parserDeviceHostDto);
}else {
parserDeviceHostDtoMap.put(parserDeviceHostDto.getId(),parserDeviceHostDto,device_life*3,TimeUnit.SECONDS);
}
}
public static void cleanDeviceHost(String deviceId)
{
if (parserDeviceHostDtoMap.containsKey(deviceId))
{
parserDeviceHostDtoMap.remove(deviceId);
}
for (String key :parserDeviceInfoDtoMap.keySet())
{
if(key.startsWith(deviceId+"_"))
{
parserDeviceInfoDtoMap.remove(key);
}
}
}
public static void cleanDeviceInfo(String deviceInfoId)
{
if (parserDeviceInfoDtoMap.containsKey(deviceInfoId))
{
parserDeviceInfoDtoMap.remove(deviceInfoId);
}
}
public static ParserDeviceInfoDto getDeviceInfo(String deviceInfoId)
{
... ...
package com.zhonglai.luhui.device.protocol.factory.control;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
/**
* 指令通知服务工厂
*/
public interface ClienNoticeServiceFactory {
boolean sendMessage(NoticeMessageDto noticeMessageDomain);
}
... ...
package com.zhonglai.luhui.device.protocol.factory.control;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.clien.ClienConnection;
import com.zhonglai.luhui.device.analysis.comm.clien.impl.ClienConnectionImpl;
import com.zhonglai.luhui.device.analysis.comm.dto.ApiClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.dto.TerminalClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.config.PluginsClassLoader;
import com.zhonglai.luhui.device.protocol.factory.dto.DeviceCommand;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.service.IotThingsModelService;
import com.zhonglai.luhui.device.protocol.factory.service.PersistenceDBService;
import net.jodah.expiringmap.ExpirationListener;
import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
import org.apache.rocketmq.spring.core.RocketMQReplyListener;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 设备指令监听服务
*/
@Service
@RocketMQMessageListener(consumerGroup = "deviceCommand", topic = "deviceCommandListen",messageModel = MessageModel.BROADCASTING)
public class DeviceCommandListenService implements RocketMQReplyListener<MessageExt, Message> {
private static final Logger log = LoggerFactory.getLogger(DeviceCommandListenService.class);
private static ExpiringMap<String, ClienConnection> clienConnectionMap = ExpiringMap.builder().maxSize(20000).expiration(15, TimeUnit.SECONDS)
.asyncExpirationListener(new ExpirationListener<String, ClienConnection>() {
@Override
public void expired(String s, ClienConnection clienConnection) {
log.info("{} 通道消失了>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",s);
clienConnection.close();
}
})
.expirationPolicy(ExpirationPolicy.CREATED).build();
@Autowired
private PersistenceDBService persistenceDBService;
@Autowired
private ClienNoticeServiceFactory clienNoticeServiceFactory;
@Autowired
private IotThingsModelService iotThingsModelService;
@Value("${mqtt.client.operationTime}")
private long operationTime; //客户端操作时间
@Override
public Message onMessage(MessageExt messageExt) {
log.info("监听到消息{}",messageExt);
String str = new String(messageExt.getBody());
log.info("消息body{}",str);
DeviceCommand deviceCommand = GsonConstructor.get().fromJson(str, DeviceCommand.class);
ParserDeviceHostDto parserDeviceHostDto = DeviceCach.getDeviceHost(deviceCommand.getDeviceId());
if(null == parserDeviceHostDto)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"设备连接丢失,请稍后尝试");
}
if (clienConnectionMap.containsKey(deviceCommand.getDeviceId()))
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"有其他人在控制设备,请稍后重试!");
}
String classname = persistenceDBService.getClassnameFromIotProtocolClassId(parserDeviceHostDto.getIotProduct().getAnalysis_clas());
try {
;
ProtocolParserFactory protocolParserFactory = PluginsClassLoader.getJarClass(ProtocolParserFactory.class,classname);
String controlCls = classname.replace("analysis."+protocolParserFactory.getClass().getSimpleName(),"control.DeviceCommandListenServiceImpl");
DeviceCommandServiceFactory deviceCommandServiceFactory = PluginsClassLoader.getJarClass(DeviceCommandServiceFactory.class,controlCls);
if(null != deviceCommandServiceFactory)
{
switch (deviceCommand.getCommandType())
{
case read:
NoticeMessageDto noticeMessageDomain = deviceCommandServiceFactory.read(deviceCommand.getDeviceId(), deviceCommand.getData());
if(null == noticeMessageDomain)
{
new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备不支持读取功能");
}
return sendMessage(noticeMessageDomain);
case write:
noticeMessageDomain = deviceCommandServiceFactory.write(deviceCommand.getDeviceId(), deviceCommand.getData());
if(null == noticeMessageDomain)
{
new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备不支持写入功能");
}
return sendMessage(noticeMessageDomain);
case notice:
if(deviceCommandServiceFactory.notice(deviceCommand.getDeviceId(), deviceCommand.getData()))
{
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"指令发送成功");
}else {
return new Message(MessageCode.DEFAULT_FAIL_CODE,"指令发送失败");
}
case cleanDeviceHost:
DeviceCach.cleanDeviceHost(deviceCommand.getDeviceId());
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"指令发送成功");
case cleanDeviceInfo:
DeviceCach.cleanDeviceInfo(deviceCommand.getDeviceId()+"_"+deviceCommand.getData().get("sensor_number").getAsString());
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"指令发送成功");
case upIotThingsModel:
iotThingsModelService.upIotThingsModel(deviceCommand.getData().get("product_id").getAsInt());
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"指令发送成功");
case upIotThingsModelTranslate:
iotThingsModelService.upIotThingsModelTranslate(deviceCommand.getData().get("product_id").getAsInt());
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"指令发送成功");
default:
return new Message(MessageCode.DEFAULT_FAIL_CODE,"指令类型不存在,请联系管理员");
}
}else {
return new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备的控制服务异常,请联系管理员");
}
} catch (InterruptedException e) {
log.error("消息发送失败",e);
return new Message(MessageCode.DEFAULT_FAIL_CODE,"等待通知错误");
}
}
public Message sendMessage( NoticeMessageDto noticeMessageDomain) throws InterruptedException {
Topic topic = noticeMessageDomain.getTopic();
//设置通知渠道
ClienConnection clienConnection = new ClienConnectionImpl();
log.info("设置通知渠道 {} {}",topic.getClientid(),clienConnection);
clienConnectionMap.put(topic.getClientid(),clienConnection);
clienNoticeServiceFactory.sendMessage(noticeMessageDomain);
synchronized(clienConnection)
{
log.info("{}等待通知",topic.getClientid());
clienConnection.wait(operationTime*1000+3000l);
}
//清楚通道
clienConnectionMap.remove(topic.getClientid());
log.info("{}收到通知{}",topic.getClientid(),clienConnection.getReplyMessage());
Message message = clienConnection.getReplyMessage();
log.info("{}返回通知{}",topic.getClientid(),message);
return message;
}
public ClienConnection getClienConnection(String clientid)
{
return clienConnectionMap.get(clientid);
}
public static boolean hasClienConnection(String clientid)
{
return clienConnectionMap.containsKey(clientid);
}
private void log(Topic topic,JsonObject jsonObject)
{
// AddPostDto addPostDto = new AddPostDto();
// addPostDto.setData(JSON.parseObject(jsonObject.toString()));
// addPostDto.setIotTerminalList(new ArrayList<>());
// addPostDto.setDeviceSensorDataList(new ArrayList<>());
// addPostDto.setLogDeviceOperationList(new ArrayList<>());
// businessDataUpdateService.updataDta(BusinessDataUpdateService.Type.ADD,topic,addPostDto,"远程控制",true);
// cacheServiceImpl.updateCache(topic,addPostDto);
// addPostDto.setLogDeviceOperationList(logDeviceOperationList);
// dataPersistenceService.persistence(topic,addPostDto);
}
/**
* 通知给api操作端
* @param clientid
* @param apiClientRePlyDto
*/
public void replySendMessage(String clientid, ApiClientRePlyDto apiClientRePlyDto)
{
log.info("开始通知{},数据:{}",clientid,apiClientRePlyDto);
//判断有没有需要回复的客户端,如果有就回复
ClienConnection clienConnection = getClienConnection(clientid);
if(null != clienConnection)
{
synchronized(clienConnection)
{
log.info("正在通知{},通知结果{}",clientid,apiClientRePlyDto);
clienConnection.reply(apiClientRePlyDto);
}
}
log.info("结束通知{}",clientid);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.control;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
/**
* 设备指令服务工厂
*/
public interface DeviceCommandServiceFactory {
NoticeMessageDto read(String deviceId, JsonObject jsonObject);
NoticeMessageDto write(String deviceId, JsonObject jsonObject);
boolean notice(String deviceId, JsonObject jsonObject);
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.dto.ApiClientRePlyDto;
import lombok.Data;
/**
* 解析结果
*/
public class AnalysisResult {
/**
* 是否需要全部更新
*/
private boolean isAllUp;
/**
* 是否需要通知
*/
private boolean isNoticeClien;
/**
* 解析的数据
*/
private JsonObject jsonObject;
/**
* 通知消息
*/
private ApiClientRePlyDto noticeMessage;
public AnalysisResult(boolean isAllUp, boolean isNoticeClien, JsonObject jsonObject, ApiClientRePlyDto noticeMessage) {
this.isAllUp = isAllUp;
this.isNoticeClien = isNoticeClien;
this.jsonObject = jsonObject;
this.noticeMessage = noticeMessage;
}
public AnalysisResult(boolean isAllUp, boolean isNoticeClien, JsonObject jsonObject) {
this.isAllUp = isAllUp;
this.isNoticeClien = isNoticeClien;
this.jsonObject = jsonObject;
}
public AnalysisResult()
{
this.isAllUp = false;
this.isNoticeClien = false;
this.jsonObject = null;
this.noticeMessage = null;
}
public ApiClientRePlyDto getNoticeMessage() {
return noticeMessage;
}
public void setNoticeMessage(ApiClientRePlyDto noticeMessage) {
this.noticeMessage = noticeMessage;
}
public boolean isAllUp() {
return isAllUp;
}
public void setAllUp(boolean allUp) {
isAllUp = allUp;
}
public boolean isNoticeClien() {
return isNoticeClien;
}
public void setNoticeClien(boolean noticeClien) {
isNoticeClien = noticeClien;
}
public JsonObject getJsonObject() {
return jsonObject;
}
public void setJsonObject(JsonObject jsonObject) {
this.jsonObject = jsonObject;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
public enum CommandType {
read,
write,
notice,
cleanDeviceHost,
cleanDeviceInfo,
upIotThingsModel,
upIotThingsModelTranslate
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.google.gson.JsonObject;
import lombok.Data;
@Data
public class DeviceCommand {
private String deviceId;
private JsonObject data;
private CommandType commandType;
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
* 设备主机
* Created by zhonglai on 2017/5/24.
*/
@Data
public class DeviceHost {
private String id; // VARCHAR(50) NOT NULL COMMENT '设备IMEI号',
private String deviceName; // VARCHAR(50) NOT NULL COMMENT '设备名称',
private Integer userId; // INT(11) NOT NULL COMMENT '用户登录id',
private String userLoginName; // VARCHAR(50) NOT NULL COMMENT '用户登录名',
private String deviceModel; // VARCHAR(10) NOT NULL COMMENT '设备型号,(3,5,6_Y,6_P)',
private String online; // VARCHAR(11) DEFAULT '00' COMMENT '设备在线状态(00-不在线,01-在线)',
private Integer createTime; // INT(11) DEFAULT NULL COMMENT '添加时间',
private String alarmCode; // VARCHAR(2) DEFAULT '00' COMMENT '设备告警状态',
private Integer dataUpdateTime; // INT(11) DEFAULT NULL COMMENT '数据更新时间',
private String deviceServiceIp; // VARCHAR(50) DEFAULT NULL COMMENT '设备连接服务器ip地址',
private String data; // TEXT COMMENT '数据',
private String userNickname; // VARCHAR(50) DEFAULT NULL COMMENT '用户昵称',
private Integer alarmLastCreateTime; // int(11) DEFAULT NULL COMMENT '告警最后一次产生的时间',
private Integer state; //0失效,1有效
private String alDeviceSecret; //阿里云的设备密钥
private Integer isInsertAl; //是否加入阿里云
private BigDecimal longitude; //经度
private BigDecimal latitude; //纬度
private String provinceId; // varchar(50) DEFAULT NULL COMMENT '省id',
private String cityId; // varchar(50) DEFAULT NULL COMMENT '市id',
private String countyId; // varchar(50) DEFAULT NULL COMMENT '县id',
private String provinceName; // varchar(50) DEFAULT NULL COMMENT '省名称',
private String cityName; // varchar(50) DEFAULT NULL COMMENT '市名称',
private String countyName; // varchar(50) DEFAULT NULL COMMENT '县名称',
private String address; // varchar(50) DEFAULT NULL COMMENT '地址',
private String remoteAddress; //远程地址
private String addressId; //远程地址id
private Integer intervalTime; //数据更新离线间隔时间(单位s)
public String getTableName()
{
return "`liu_yu_le`.`device_host`";
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
/**
* 设备信息表
* @author Administrator
*
*/
public class DeviceInfo {
private String id; // varchar(50) NOT NULL COMMENT '设备编号,如:设备imei号_传感器编号',
private String deviceId; // varchar(50) NOT NULL COMMENT '设备IMEI号',
private String deviceName; // varchar(50) DEFAULT NULL COMMENT '设备名称',
private Integer userId; // int(11) DEFAULT NULL COMMENT '用户登录id',
private String userLoginName; // varchar(50) DEFAULT NULL COMMENT '用户登录名',
private Integer pondId; // int(11) DEFAULT NULL COMMENT '塘口id',
private String sensorNumber; // varchar(10) NOT NULL DEFAULT '01' COMMENT '传感器编号,默认01',
private String deviceModel; // varchar(10) NOT NULL COMMENT '设备型号,(3,5,6)',
private String deviceType; // varchar(10) DEFAULT NULL COMMENT '设备类型(0传感器,1开关控制器)',
private String online; // varchar(10) DEFAULT NULL COMMENT '设备在线状态(00-不在线,01-在线)',
private Integer createTime; // int(11) DEFAULT NULL COMMENT '添加时间',
private String alarmCode; // varchar(10) DEFAULT NULL COMMENT '设备告警状态',
private Integer dataUpdateTime; // int(11) DEFAULT NULL COMMENT '数据更新时间',
private String dataState; // text COMMENT '数据状态(json串)',
private String pondName; // varchar(50) DEFAULT NULL COMMENT '塘口名称',
private String userNickname; // varchar(50) DEFAULT NULL COMMENT '用户昵称',
private Integer alarmLastCreateTime; // int(11) DEFAULT NULL COMMENT '告警最后一次产生的时间',
private String deviceServiceIp; //设备链接服务器地址
private Integer alarmSqlApply; //告警sql规则申请(0-未申请,1-已申请)
private String deviceConfig; //设备配置
private Integer sensor_type; //传感器类型(0禹山,1北京的)
private Integer deviceClose; //是否关闭设备(0否,1是)
public Integer getDeviceClose() {
return deviceClose;
}
public void setDeviceClose(Integer deviceClose) {
this.deviceClose = deviceClose;
}
public Integer getSensor_type() {
return sensor_type;
}
public void setSensor_type(Integer sensor_type) {
this.sensor_type = sensor_type;
}
public Integer getAlarmSqlApply() {
return alarmSqlApply;
}
public String getDeviceConfig() {
return deviceConfig;
}
public void setDeviceConfig(String deviceConfig) {
this.deviceConfig = deviceConfig;
}
public void setAlarmSqlApply(Integer alarmSqlApply) {
this.alarmSqlApply = alarmSqlApply;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserLoginName() {
return userLoginName;
}
public void setUserLoginName(String userLoginName) {
this.userLoginName = userLoginName;
}
public Integer getPondId() {
return pondId;
}
public void setPondId(Integer pondId) {
this.pondId = pondId;
}
public String getSensorNumber() {
return sensorNumber;
}
public void setSensorNumber(String sensorNumber) {
this.sensorNumber = sensorNumber;
}
public String getDeviceModel() {
return deviceModel;
}
public void setDeviceModel(String deviceModel) {
this.deviceModel = deviceModel;
}
public String getDeviceType() {
return deviceType;
}
public void setDeviceType(String deviceType) {
this.deviceType = deviceType;
}
public String getOnline() {
return online;
}
public void setOnline(String online) {
this.online = online;
}
public Integer getCreateTime() {
return createTime;
}
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
public String getAlarmCode() {
return alarmCode;
}
public void setAlarmCode(String alarmCode) {
this.alarmCode = alarmCode;
}
public Integer getDataUpdateTime() {
return dataUpdateTime;
}
public void setDataUpdateTime(Integer dataUpdateTime) {
this.dataUpdateTime = dataUpdateTime;
}
public String getDataState() {
return dataState;
}
public void setDataState(String dataState) {
this.dataState = dataState;
}
public String getPondName() {
return pondName;
}
public void setPondName(String pondName) {
this.pondName = pondName;
}
public String getUserNickname() {
return userNickname;
}
public void setUserNickname(String userNickname) {
this.userNickname = userNickname;
}
public Integer getAlarmLastCreateTime() {
return alarmLastCreateTime;
}
public void setAlarmLastCreateTime(Integer alarmLastCreateTime) {
this.alarmLastCreateTime = alarmLastCreateTime;
}
public String getDeviceServiceIp() {
return deviceServiceIp;
}
public void setDeviceServiceIp(String deviceServiceIp) {
this.deviceServiceIp = deviceServiceIp;
}
public String getTableName()
{
return "`liu_yu_le`.`device_info`";
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
/**
* 通知消息
*/
public class NoticeMessageDto {
private Topic topic;
private String topicconfig;
private byte[] commd;
public Topic getTopic() {
return topic;
}
public void setTopic(Topic topic) {
this.topic = topic;
}
public byte[] getCommd() {
return commd;
}
public void setCommd(byte[] commd) {
this.commd = commd;
}
public String getTopicconfig() {
return topicconfig;
}
public void setTopicconfig(String topicconfig) {
this.topicconfig = topicconfig;
}
}
... ...
... ... @@ -36,10 +36,10 @@ public class ParserDeviceHostDto {
* 设备摘要,格式{{"name":"device"},{"chip":"esp8266"}}
*/
private JsonObject summary;
private Integer rssi; //信号
private boolean is_config_up;
private boolean is_data_up;
private boolean is_summary_up;
private String online;
private IotProduct iotProduct;
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.dto.ApiClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import lombok.Data;
... ... @@ -12,6 +13,14 @@ import java.util.List;
* 协议清洗模型
*/
public class ProtocolPurificationModel {
/**
* 通知消息
*/
private ApiClientRePlyDto noticeMessage;
/**
* 是否需要通知
*/
private boolean isNoticeClien;
private ParserDeviceHostDto parserDeviceHostDto = new ParserDeviceHostDto();
private List<ParserDeviceInfoDto> parserDeviceInfoDtoList = new ArrayList<>();
private List<DeviceSensorData> deviceSensorDataList = new ArrayList<>();
... ... @@ -48,4 +57,20 @@ public class ProtocolPurificationModel {
public void setLogDeviceOperationList(List<LogDeviceOperation> logDeviceOperationList) {
this.logDeviceOperationList = logDeviceOperationList;
}
public ApiClientRePlyDto getNoticeMessage() {
return noticeMessage;
}
public void setNoticeMessage(ApiClientRePlyDto noticeMessage) {
this.noticeMessage = noticeMessage;
}
public boolean isNoticeClien() {
return isNoticeClien;
}
public void setNoticeClien(boolean noticeClien) {
isNoticeClien = noticeClien;
}
}
... ...
... ... @@ -11,10 +11,7 @@ import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelItemB
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.dto.*;
import com.zhonglai.luhui.device.protocol.factory.service.IotThingsModelService;
import org.apache.commons.lang3.EnumUtils;
... ... @@ -27,7 +24,8 @@ import java.util.List;
public class DefaultProtocolPurificationFactoryImpl implements ProtocolPurificationFactory{
@Override
public ProtocolPurificationModel purification(Integer product_id,Topic topic, JsonObject protocolParserModel ) {
public ProtocolPurificationModel purification(Integer product_id,Topic topic, AnalysisResult analysisResult ) {
JsonObject protocolParserModel = analysisResult.getJsonObject();
if(null != protocolParserModel && protocolParserModel.size()!=0)
{
ProtocolPurificationModel protocolPurificationModel = new ProtocolPurificationModel();
... ... @@ -43,9 +41,10 @@ public class DefaultProtocolPurificationFactoryImpl implements ProtocolPurificat
private ParserDeviceHostDto analysisHost(Integer product_id,Topic topic, JsonObject data,List<DeviceSensorData> deviceSensorDataList )
{
int time = DateUtils.getNowTimeMilly();
if(data.has("0"))
{
JsonObject jsonObjectData = GsonConstructor.get().fromJson(GsonConstructor.get().toJson(data.get("0")),JsonObject.class);
JsonObject jsonObjectData = data.get("0").getAsJsonObject();
JsonObject summary = null;
//解析设备摘要
if(jsonObjectData.has("summary") && null != jsonObjectData.get("summary") && jsonObjectData.get("summary").isJsonObject())
... ... @@ -53,26 +52,46 @@ public class DefaultProtocolPurificationFactoryImpl implements ProtocolPurificat
summary = jsonObjectData.get("summary").getAsJsonObject();
jsonObjectData.remove("summary");
}
int time = DateUtils.getNowTimeMilly();
String online = null;
//解析在线状态
if(jsonObjectData.has("online") && null != jsonObjectData.get("online"))
{
online = jsonObjectData.get("online").getAsString();
jsonObjectData.remove("online");
}
//信号
Integer rssi = null;
if(jsonObjectData.has("rssi") && null != jsonObjectData.get("rssi"))
{
rssi = jsonObjectData.get("rssi").getAsInt();
jsonObjectData.remove("rssi");
}
ParserDeviceHostDto parserDeviceHostDto = null;
if(null != jsonObjectData && jsonObjectData.size() != 0)
{
parserDeviceHostDto = analysisJsonData(time,"0",product_id,topic,jsonObjectData).pushDeviceSensorData(deviceSensorDataList).toParserDeviceHostDto(topic.getClientid(),time);
}
if(null != summary && summary.size() != 0)
{
if(null == parserDeviceHostDto)
{
parserDeviceHostDto = new ParserDeviceHostDto();
parserDeviceHostDto.setId(topic.getClientid());
}
if(null != summary && summary.size() != 0)
{
parserDeviceHostDto.setSummary(summary);
}
parserDeviceHostDto.setOnline(online);
parserDeviceHostDto.setRssi(rssi);
parserDeviceHostDto.setUpdateTime(time);
return parserDeviceHostDto;
}
return null;
ParserDeviceHostDto parserDeviceHostDto = new ParserDeviceHostDto();
parserDeviceHostDto.setId(topic.getClientid());
parserDeviceHostDto.setUpdateTime(time);
return parserDeviceHostDto;
}
private List<ParserDeviceInfoDto> analysisDeviceInfo(Integer time,Integer product_id,Topic topic, JsonObject data,List<DeviceSensorData> deviceSensorDataList)
... ...
... ... @@ -2,11 +2,12 @@ package com.zhonglai.luhui.device.protocol.factory.purification;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
/**
* 协议清洗工厂
*/
public interface ProtocolPurificationFactory {
ProtocolPurificationModel purification(Integer product_id,Topic topic, JsonObject analysisObject );
ProtocolPurificationModel purification(Integer product_id,Topic topic, AnalysisResult analysisResult );
}
... ...
... ... @@ -2,6 +2,7 @@ package com.zhonglai.luhui.device.protocol.factory.service;
import com.zhonglai.luhui.device.protocol.factory.ProtocolParserAndPurificationFactory;
import com.zhonglai.luhui.device.protocol.factory.control.ControlFactory;
import com.zhonglai.luhui.device.protocol.factory.control.DeviceCommandListenService;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.sync.ProtocolSyncFactory;
... ... @@ -38,6 +39,9 @@ public abstract class BaseCallback<T> {
protected PersistenceDBService persistenceDBService;
@Autowired
protected DeviceCommandListenService deviceCommandListenService;
/**
* 数据处理的工作流
*/
... ... @@ -62,7 +66,11 @@ public abstract class BaseCallback<T> {
//同步
persistenceDBService.syncDB(protocolPurificationModel);
//返回
//通知
if(protocolPurificationModel.isNoticeClien())
{
deviceCommandListenService.replySendMessage(oldparserDeviceHostDto.getId(),protocolPurificationModel.getNoticeMessage());
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.specs.StringModelOutput;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
... ... @@ -26,6 +34,15 @@ public class DeviceCashUpService {
*/
public int upProtocolPurificationModel(ProtocolPurificationModel protocolPurificationModel,ParserDeviceHostDto oldparserDeviceHostDto )
{
if(null == protocolPurificationModel)
{
return 0;
}
if("0".equals(oldparserDeviceHostDto.getOnline())) //如果是离线消息
{
DeviceCach.cleanDeviceHost(oldparserDeviceHostDto.getId());
return 0;
}
//更新主机信息
int i = upParserDeviceHostDto(protocolPurificationModel,oldparserDeviceHostDto);
... ... @@ -42,8 +59,12 @@ public class DeviceCashUpService {
*/
private int upParserDeviceHostDto( ProtocolPurificationModel protocolPurificationModel , ParserDeviceHostDto oldparserDeviceHostDto)
{
if(null == protocolPurificationModel)
{
return 0;
}
ParserDeviceHostDto parserDeviceHostDto = protocolPurificationModel.getParserDeviceHostDto();
int i=0;
int i=1;
JsonObject oldData = oldparserDeviceHostDto.getData();
JsonObject newData = parserDeviceHostDto.getData();
if(null != newData)
... ... @@ -54,7 +75,7 @@ public class DeviceCashUpService {
i++;
oldparserDeviceHostDto.set_data_up(true);
}else {
if(newToOldJsonObject(oldData,newData))
if(newToOldJsonObject(oldparserDeviceHostDto.getId(),protocolPurificationModel,oldData,newData))
{
i++;
oldparserDeviceHostDto.set_data_up(true);
... ... @@ -72,7 +93,7 @@ public class DeviceCashUpService {
i++;
oldparserDeviceHostDto.set_config_up(true);
}else {
if(newToOldJsonObject(oldConfig,newConfig))
if(newToOldJsonObject(oldparserDeviceHostDto.getId(),protocolPurificationModel,oldConfig,newConfig))
{
i++;
oldparserDeviceHostDto.set_config_up(true);
... ... @@ -90,18 +111,22 @@ public class DeviceCashUpService {
i++;
oldparserDeviceHostDto.set_summary_up(true);
}else {
if(newToOldJsonObject(oldSummary,newSummary))
if(newToOldJsonObject(oldparserDeviceHostDto.getId(),protocolPurificationModel,oldSummary,newSummary))
{
i++;
oldparserDeviceHostDto.set_summary_up(true);
}
}
}
oldparserDeviceHostDto.setUpdateTime(parserDeviceHostDto.getUpdateTime());
oldparserDeviceHostDto.setOnline(parserDeviceHostDto.getOnline());
oldparserDeviceHostDto.setRssi(parserDeviceHostDto.getRssi());
oldparserDeviceHostDto.setSummary(parserDeviceHostDto.getSummary());
protocolPurificationModel.setParserDeviceHostDto(oldparserDeviceHostDto);
//更新主机缓存
DeviceCach.putDeviceHost(oldparserDeviceHostDto,oldparserDeviceHostDto.getDevice_life());
return i;
}
... ... @@ -126,7 +151,7 @@ public class DeviceCashUpService {
continue;
}
oldparserDeviceInfoDto.setUpdateTime(parserDeviceInfoDto.getUpdateTime());
i+=upParserDeviceInfoDto(parserDeviceInfoDto,oldparserDeviceInfoDto);
i+=upParserDeviceInfoDto(protocolPurificationModel,parserDeviceInfoDto,oldparserDeviceInfoDto);
oldParserDeviceInfoDtoList.add(oldparserDeviceInfoDto);
//更新缓存
... ... @@ -144,7 +169,7 @@ public class DeviceCashUpService {
* @param parserDeviceInfoDto
* @return
*/
private int upParserDeviceInfoDto( ParserDeviceInfoDto parserDeviceInfoDto , ParserDeviceInfoDto oldparserDeviceInfoDto)
private int upParserDeviceInfoDto(ProtocolPurificationModel protocolPurificationModel, ParserDeviceInfoDto parserDeviceInfoDto , ParserDeviceInfoDto oldparserDeviceInfoDto)
{
int i=0;
JsonObject oldData = oldparserDeviceInfoDto.getData();
... ... @@ -157,7 +182,7 @@ public class DeviceCashUpService {
i++;
oldparserDeviceInfoDto.set_data_up(true);
}else {
if(newToOldJsonObject(oldData,newData))
if(newToOldJsonObject(oldparserDeviceInfoDto.getId(),protocolPurificationModel,oldData,newData))
{
i++;
oldparserDeviceInfoDto.set_data_up(true);
... ... @@ -175,7 +200,7 @@ public class DeviceCashUpService {
i++;
oldparserDeviceInfoDto.set_conf_up(true);
}else {
if(newToOldJsonObject(oldConfig,newConfig))
if(newToOldJsonObject(oldparserDeviceInfoDto.getId(),protocolPurificationModel,oldConfig,newConfig))
{
i++;
oldparserDeviceInfoDto.set_conf_up(true);
... ... @@ -202,7 +227,7 @@ public class DeviceCashUpService {
}
private boolean newToOldJsonObject(JsonObject oldJson,JsonObject newJson)
private boolean newToOldJsonObject(String id, ProtocolPurificationModel protocolPurificationModel , JsonObject oldJson,JsonObject newJson)
{
boolean ischange = false;
for(String key:newJson.keySet())
... ... @@ -212,6 +237,30 @@ public class DeviceCashUpService {
oldJson.add(key,newJson.get(key));
ischange = true;
}
if (newJson.get(key).isJsonObject())
{
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(newJson.get(key).getAsJsonObject());
//记录操作
if(1==thingsModelItemBase.getIsMonitor())
{
if(ischange || protocolPurificationModel.isNoticeClien())
{
LogDeviceOperation logDeviceOperation = new LogDeviceOperation();
logDeviceOperation.setDeviceInfoId(id);
logDeviceOperation.setDeviceOldState(oldJson.get(key).toString());
logDeviceOperation.setDeviceNewState(newJson.get(key).toString());
logDeviceOperation.setDeviceOperationTime(DateUtils.getNowTimeMilly());
logDeviceOperation.setDeviceOperationType(-1);
logDeviceOperation.setIsStateChange(1);
logDeviceOperation.setOperationDescribe(thingsModelItemBase.getName()+(protocolPurificationModel.isNoticeClien()?"远程":"本地")+"设置"+thingsModelItemBase.getView());
logDeviceOperation.setOperationInstruction((protocolPurificationModel.isNoticeClien()?GsonConstructor.get().toJson(protocolPurificationModel.getNoticeMessage()):null));
protocolPurificationModel.getLogDeviceOperationList().add(logDeviceOperation);
}
}
}
}
return ischange;
}
... ...
... ... @@ -2,11 +2,14 @@ package com.zhonglai.luhui.device.protocol.factory.service;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.domain.IotProductTranslate;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
... ... @@ -17,9 +20,29 @@ public class IotThingsModelService {
private static Map<Integer, Map<String, IotThingsModel>> iotThingsModelMap = new HashMap<>();
private static Map<Integer, Map<String, String>> iotProductTranslateMap = new HashMap<>();
@Autowired
private PersistenceDBService persistenceDBService;
@PostConstruct
public void load()
{
List<IotProductTranslate> list = persistenceDBService.getIotProductTranslateList(null);
if(null == list || list.size() == 0)
{
for (IotProductTranslate iotProductTranslate:list)
{
Map<String, String> map = iotProductTranslateMap.get(iotProductTranslate.getProduct_id());
if(null == map)
{
map = new HashMap<>();
iotProductTranslateMap.put(iotProductTranslate.getProduct_id(),map);
}
map.put(iotProductTranslate.getModel_identifier(),iotProductTranslate.getTranslate_identifier());
}
}
}
public IotThingsModel getIotThingsModel(Integer product_id,String identifier)
{
... ... @@ -56,4 +79,31 @@ public class IotThingsModelService {
}
return iotThingsModelMap.get(product_id);
}
public Map<String, String> getIotProductTranslateMap(Integer product_id)
{
if(!iotProductTranslateMap.containsKey(product_id))
{
return null;
}
return iotProductTranslateMap.get(product_id);
}
public void upIotThingsModel(Integer product_id)
{
Map<String,IotThingsModel> map = persistenceDBService.getIotThingsModelMap(product_id);
if(null != map && map.size() > 0)
{
iotThingsModelMap.put(product_id,map);
}
}
public void upIotThingsModelTranslate(Integer product_id)
{
Map<String,String> map = persistenceDBService.getIotProductTranslateMap(product_id);
if(null != map && map.size() > 0)
{
iotProductTranslateMap.put(product_id,map);
}
}
}
... ...
... ... @@ -7,10 +7,7 @@ import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.domain.IotProtocolClass;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.domain.*;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
... ... @@ -32,6 +29,8 @@ public class PersistenceDBService {
private static Map<Integer, IotProtocolClass> iotProtocolClassMap = new HashMap<>();
@Autowired
private DefaultDbService defaultDbService;
@Autowired
private PersistenceDBService persistenceDBService;
/**
* 更新数据库
... ... @@ -62,16 +61,16 @@ public class PersistenceDBService {
public void syncDB(ProtocolPurificationModel protocolPurificationModel) throws ClassNotFoundException {
//主机
ParserDeviceHostDto parserDeviceHostDto = protocolPurificationModel.getParserDeviceHostDto();
if (parserDeviceHostDto.getIotProduct().getIs_sync_db()==1 && StringUtils.isNotEmpty(parserDeviceHostDto.getIotProduct().getSync_db()))
if (parserDeviceHostDto.getIotProduct().getIs_sync_db()==1 && null !=parserDeviceHostDto.getIotProduct().getSync_db() && 0!=parserDeviceHostDto.getIotProduct().getSync_db())
{
ProtocolSyncFactory protocolSyncFactory = getProtocolSyncService(parserDeviceHostDto.getIotProduct().getSync_db());
ProtocolSyncFactory protocolSyncFactory = getProtocolSyncService(persistenceDBService.getClassnameFromIotProtocolClassId(parserDeviceHostDto.getIotProduct().getSync_db()));
if(null != protocolSyncFactory)
{
protocolSyncFactory.updateParserDeviceHostDto(parserDeviceHostDto);
//终端
List<ParserDeviceInfoDto> parserDeviceInfoDtoList = protocolPurificationModel.getParserDeviceInfoDtoList();
protocolSyncFactory.updateParserDeviceInfoDtoList(parserDeviceInfoDtoList);
protocolSyncFactory.updateParserDeviceInfoDtoList(protocolPurificationModel.getParserDeviceHostDto().getIotProduct().getId(),parserDeviceInfoDtoList);
//传感器指标
List<DeviceSensorData> deviceSensorDataList = protocolPurificationModel.getDeviceSensorDataList();
... ... @@ -144,6 +143,26 @@ public class PersistenceDBService {
return null;
}
public Map<String,String> getIotProductTranslateMap(Integer product_id)
{
List<IotProductTranslate> list = defaultDbService.getIotProductTranslateList(product_id);
if(null != list && list.size() != 0 )
{
Map<String,String> map = new HashMap<>();
for (IotProductTranslate iotProductTranslate:list)
{
map.put(iotProductTranslate.getModel_identifier(),iotProductTranslate.getTranslate_identifier());
}
return map;
}
return null;
}
public List<IotProductTranslate> getIotProductTranslateList(Integer product_id)
{
return defaultDbService.getIotProductTranslateList(product_id);
}
/**
* 获取默认数据库的操作服务
* @return
... ...
... ... @@ -63,6 +63,16 @@ public class DefaultDbService {
return baseDao.find(iotThingsModel);
}
public List<IotProductTranslate> getIotProductTranslateList(Integer product_id)
{
IotProductTranslate iotProductTranslate = new IotProductTranslate();
if(null != product_id)
{
iotProductTranslate.setProduct_id(product_id);
}
return baseDao.find(iotProductTranslate,"product_id,model_identifier,translate_identifier");
}
public void insertIotTerminal(IotTerminal iotTerminal)
{
baseDao.insert(iotTerminal);
... ... @@ -106,6 +116,7 @@ public class DefaultDbService {
iotDevice.setClient_id(parserDeviceHostDto.getId());
iotDevice.setData_update_time(parserDeviceHostDto.getUpdateTime());
iotDevice.setListen_service_ip(SysParameter.service_ip);
iotDevice.setRssi(parserDeviceHostDto.getRssi());
if(parserDeviceHostDto.is_summary_up())
{
if(null != parserDeviceHostDto.getSummary() && parserDeviceHostDto.getSummary().size() != 0)
... ... @@ -130,6 +141,19 @@ public class DefaultDbService {
}
parserDeviceHostDto.set_config_up(false);
}
if(StringUtils.isNotEmpty(parserDeviceHostDto.getOnline()))
{
String online = parserDeviceHostDto.getOnline();
switch (online)
{
case "1":
iotDevice.setStatus(3);
break;
default:
iotDevice.setStatus(4);
break;
}
}
int i = baseDao.update(iotDevice);
return i;
... ...
package com.zhonglai.luhui.device.protocol.factory.sync;
import com.ruoyi.common.utils.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.protocol.factory.dto.DeviceHost;
import com.zhonglai.luhui.device.protocol.factory.dto.DeviceInfo;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import org.springframework.stereotype.Component;
import com.zhonglai.luhui.device.protocol.factory.service.IotThingsModelService;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class DefaultProtocolSyncFactoryImpl implements ProtocolSyncFactory{
private BaseDao lsy_baseDao = new BaseDao();
private BaseDao ly_baseDao = new BaseDao();
@Override
public void updateParserDeviceHostDto(ParserDeviceHostDto parserDeviceHostDto) {
DeviceHost deviceHost = new DeviceHost();
deviceHost.setId(parserDeviceHostDto.getId());
deviceHost.setDataUpdateTime(parserDeviceHostDto.getUpdateTime());
deviceHost.setDeviceServiceIp(SysParameter.service_ip);
deviceHost.setOnline("01");
JSONObject data = new JSONObject();
Map<String, String> translateMap = SpringUtils.getBean(IotThingsModelService.class).getIotProductTranslateMap(parserDeviceHostDto.getIotProduct().getId());
if(parserDeviceHostDto.is_summary_up())
{
if(null != parserDeviceHostDto.getSummary() && parserDeviceHostDto.getSummary().size() != 0)
{
for (String key:parserDeviceHostDto.getSummary().keySet())
{
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(parserDeviceHostDto.getSummary().get(key).getAsJsonObject());
data.put(key,translate(key,thingsModelItemBase.getSaveView(),translateMap));
}
}
}
if(parserDeviceHostDto.is_data_up())
{
if(null != parserDeviceHostDto.getData() && parserDeviceHostDto.getData().size() != 0)
{
for (String key:parserDeviceHostDto.getData().keySet())
{
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(parserDeviceHostDto.getData().get(key).getAsJsonObject());
data.put(key,translate(key,thingsModelItemBase.getSaveView(),translateMap));
}
}
}
if(parserDeviceHostDto.is_config_up())
{
if(null != parserDeviceHostDto.getConfig() && parserDeviceHostDto.getConfig().size() != 0)
{
for (String key:parserDeviceHostDto.getConfig().keySet())
{
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(parserDeviceHostDto.getConfig().get(key).getAsJsonObject());
data.put(key,translate(key,thingsModelItemBase.getSaveView(),translateMap));
}
}
}
if(data.size()>0)
{
deviceHost.setData(data.toString());
}
ly_baseDao.update(deviceHost);
}
@Override
public void updateParserDeviceInfoDtoList(List<ParserDeviceInfoDto> parserDeviceInfoDtoList) {
public void updateParserDeviceInfoDtoList(Integer productId, List<ParserDeviceInfoDto> parserDeviceInfoDtoList) {
if(null != parserDeviceInfoDtoList && parserDeviceInfoDtoList.size() != 0)
{
Map<String, String> translateMap = SpringUtils.getBean(IotThingsModelService.class).getIotProductTranslateMap(productId);
for (ParserDeviceInfoDto parserDeviceInfoDto:parserDeviceInfoDtoList)
{
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.setId(parserDeviceInfoDto.getId());
deviceInfo.setDataUpdateTime(parserDeviceInfoDto.getUpdateTime());
deviceInfo.setOnline("01");
if(parserDeviceInfoDto.is_data_up())
{
JSONObject data = new JSONObject();
for (String key:parserDeviceInfoDto.getData().keySet())
{
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(parserDeviceInfoDto.getConfig().get(key).getAsJsonObject());
data.put(key,translate(key,thingsModelItemBase.getSaveView(),translateMap));
}
deviceInfo.setDataState(data.toString());
}
if(parserDeviceInfoDto.is_conf_up())
{
JSONObject data = new JSONObject();
for (String key:parserDeviceInfoDto.getConfig().keySet())
{
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(parserDeviceInfoDto.getConfig().get(key).getAsJsonObject());
data.put(key,translate(key,thingsModelItemBase.getSaveView(),translateMap));
}
deviceInfo.setDeviceConfig(data.toString());
}
ly_baseDao.update(deviceInfo);
}
}
}
@Override
public void updateDeviceSensorDataList(List<DeviceSensorData> deviceSensorDataList) {
... ... @@ -34,4 +123,81 @@ public class DefaultProtocolSyncFactoryImpl implements ProtocolSyncFactory{
public void updateLogDeviceOperationList(List<LogDeviceOperation> logDeviceOperationList) {
}
private Object translate(String key,Object value ,Map<String, String> translateMap)
{
if (null == translateMap)
{
return value;
}
JSONObject temp = new JSONObject();
String translateKey = key;
if(translateMap.containsKey(key) )
{
translateKey = translateMap.get(key);
}
if(translateKey.equals("3l"))
{
byte[] old3l = new byte[]{(value+"").getBytes()[0],49};
if(null != temp && temp.containsKey("3") && null !=temp.get("3"))
{
byte[] bs = temp.getString("3").getBytes();
if(bs.length==2)
{
old3l[1] = bs[1];
}
}
translateKey = "3";
value = new String(old3l);
}else if(translateKey.equals("3r"))
{
byte[] old3r = new byte[]{49,(value+"").getBytes()[0]};
if(null != temp && temp.containsKey("3") && null !=temp.get("3"))
{
byte[] bs = temp.getString("3").getBytes();
if(bs.length==2)
{
old3r[0] = bs[0];
}
}
translateKey = "3";
value = new String(old3r);
}else{
String[] ss = translateKey.split(":");
switch (ss.length)
{
case 1:
break;
case 2:
translateKey = ss[0];
JSONObject jsonObject = new JSONObject();
if(null != temp && temp.containsKey(translateKey) && null !=temp.get(translateKey))
{
jsonObject = temp.getJSONObject(translateKey);
}
jsonObject.put(ss[1],value);
value = jsonObject;
break;
case 3:
translateKey = ss[0];
JSONObject jsonObject1 = new JSONObject();
if(null != temp && temp.containsKey(translateKey) && null !=temp.get(translateKey))
{
jsonObject1 = temp.getJSONObject(translateKey);
}
String translateKey2 = ss[1];
JSONObject jsonObject2 = new JSONObject();
if(null != jsonObject1 && jsonObject1.containsKey(translateKey2) && null !=jsonObject1.get(translateKey2))
{
jsonObject2 = jsonObject1.getJSONObject(translateKey2);
}
jsonObject2.put(ss[2],value);
jsonObject1.put(ss[1],jsonObject2);
value = jsonObject1;
break;
}
}
return value;
}
}
... ...
... ... @@ -12,7 +12,7 @@ public interface ProtocolSyncFactory {
void updateParserDeviceHostDto(ParserDeviceHostDto parserDeviceHostDto);
//终端
void updateParserDeviceInfoDtoList( List<ParserDeviceInfoDto> parserDeviceInfoDtoList);
void updateParserDeviceInfoDtoList(Integer productId, List<ParserDeviceInfoDto> parserDeviceInfoDtoList);
//传感器指标
void updateDeviceSensorDataList(List<DeviceSensorData> deviceSensorDataList);
... ...
... ... @@ -5,9 +5,14 @@ import com.ruoyi.common.utils.ByteUtil;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.analysis.topic.Online;
import com.zhonglai.luhui.device.protocol.factory.control.DeviceCommandListenService;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.uyu.analysis.topic.CkaDtSndR;
import com.zhonglai.luhui.device.protocol.uyu.analysis.topic.CkaDtSndS;
public class UyuProtocolParserFactoryImpl implements ProtocolParserFactory<byte[]> {
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{imei}}/{{topicType}}";
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{sorclientid}}";
@Override
public Topic analysisTopic(String topicStr) {
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
... ... @@ -15,40 +20,17 @@ public class UyuProtocolParserFactoryImpl implements ProtocolParserFactory<byte[
}
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
JsonObject jsonObject = new JsonObject();
int addres = 1; //应该用第3字节:地址(目前定为0x80),但是下位机没有用到 我们现在也不用就写死
JsonObject senserData = new JsonObject();
jsonObject.add(addres+"",senserData);
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
byte b5 = payload[4];
int dangwei = ByteUtil.getBitsValue(b5,0,3);
int kaiguan = ByteUtil.getBitValue(b5,7);
int zhuanshu = new Long(ByteUtil.bytesToLongDESC(payload,5,2)).intValue();
int dianliu = new Long(ByteUtil.bytesToLongDESC(payload,7,2)).intValue();
int dianya = new Long(ByteUtil.bytesToLongDESC(payload,9,2)).intValue();
int gonglv = new Long(ByteUtil.bytesToLongDESC(payload,11,2)).intValue();
//第14字节:故障码 (转成2进制对应下表)
byte b14 = payload[13];
int qianyabaoh = ByteUtil.getBitValue(b14,0);
int duanlubaohu = ByteUtil.getBitValue(b14,1);
int qidongyichangbaohu = ByteUtil.getBitValue(b14,2);
int guowenbaohu = ByteUtil.getBitValue(b14,2);
int qiexiangbaohu = ByteUtil.getBitValue(b14,2);
jsonObject.addProperty("106",dangwei);
jsonObject.addProperty("3",kaiguan);
jsonObject.addProperty("67",zhuanshu);
jsonObject.addProperty("61",dianliu);
jsonObject.addProperty("57",dianya);
jsonObject.addProperty("59",gonglv);
jsonObject.addProperty("107",qianyabaoh);
jsonObject.addProperty("108",duanlubaohu);
jsonObject.addProperty("109",qidongyichangbaohu);
jsonObject.addProperty("110",guowenbaohu);
jsonObject.addProperty("111",qiexiangbaohu);
return jsonObject;
switch (topic.getTopicType())
{
// case "CKA-DT-SND_R":
// return new CkaDtSndR().analysisPayload(payload);
case "CKA-DT-SND_S":
return new CkaDtSndS().analysisPayload( topic.getClientid(),payload);
case "online":
return new Online().analysisPayload(payload);
}
return null;
}
}
... ...
package com.zhonglai.luhui.device.protocol.uyu.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.ByteUtil;
import com.zhonglai.luhui.device.analysis.comm.dto.ApiClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import java.util.HashMap;
import java.util.Map;
public class CkaDtSndR {
public AnalysisResult analysisPayload(byte[] payload)
{
JsonObject jsonObject = new JsonObject();
int addres = 1; //应该用第3字节:地址(目前定为0x80),但是下位机没有用到 我们现在也不用就写死
JsonObject senserData = new JsonObject();
jsonObject.add(addres+"",senserData);
int kaiguan = payload[4];
int dangwei = payload[5]+1;
senserData.addProperty("106",dangwei);
senserData.addProperty("3",kaiguan);
Map<String,Object> map = new HashMap<>();
map.put("106",dangwei);
map.put("3",kaiguan);
Map<String,Object> wmap = new HashMap<>();
wmap.put("1",map);
return new AnalysisResult(false, true, jsonObject, new ApiClientRePlyDto() {
@Override
public void setReplyMessage(Message message) {
message.setCode(MessageCode.DEFAULT_SUCCESS_CODE);
message.setData(wmap);
}
});
}
}
... ...
package com.zhonglai.luhui.device.protocol.uyu.analysis.topic;
import com.google.gson.JsonObject;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.utils.ByteUtil;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.dto.ApiClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.protocol.factory.control.DeviceCommandListenService;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import java.util.Arrays;
import java.util.HashMap;
public class CkaDtSndS {
public AnalysisResult analysisPayload(String clientid, byte[] payload)
{
switch (payload[0])
{
case (byte) 0xA5:
return subData(clientid,payload);
case (byte) 0xA6:
return subSim(payload);
case (byte) 0xA7:
return subRssi(payload);
default:
return subData(clientid,payload);
}
}
private AnalysisResult subRssi(byte[] payload)
{
JsonObject data = new JsonObject();
data.addProperty("rssi",payload[1]);
JsonObject jsonObject = new JsonObject();
jsonObject.add("0",data);
return new AnalysisResult(false,false,jsonObject);
}
private AnalysisResult subSim(byte[] payload)
{
byte[] subPayload = Arrays.copyOfRange(payload, 1, payload.length-1);
JsonObject data = new JsonObject();
data.addProperty("sim",new String(subPayload));
JsonObject summary = new JsonObject();
summary.add("summary",data);
JsonObject jsonObject = new JsonObject();
jsonObject.add("0",summary);
return new AnalysisResult(false,false,jsonObject);
}
private AnalysisResult subData(String clientid, byte[] payload)
{
JsonObject jsonObject = new JsonObject();
int addres = 1; //应该用第3字节:地址(目前定为0x80),但是下位机没有用到 我们现在也不用就写死
JsonObject senserData = new JsonObject();
jsonObject.add(addres+"",senserData);
byte b5 = payload[4];
int dangwei = ByteUtil.getBitsValue(b5,0,3);
int kaiguan = ByteUtil.getBitValue(b5,7);
int zhuanshu = new Long(ByteUtil.bytesToLongDESC(payload,5,2)).intValue();
int dianliu = new Long(ByteUtil.bytesToLongDESC(payload,7,2)).intValue();
int dianya = new Long(ByteUtil.bytesToLongDESC(payload,9,2)).intValue();
int gonglv = new Long(ByteUtil.bytesToLongDESC(payload,11,2)).intValue();
//第14字节:故障码 (转成2进制对应下表)
byte b14 = payload[13];
int qianyabaoh = ByteUtil.getBitValue(b14,0);
int duanlubaohu = ByteUtil.getBitValue(b14,1);
int qidongyichangbaohu = ByteUtil.getBitValue(b14,2);
int guowenbaohu = ByteUtil.getBitValue(b14,2);
int qiexiangbaohu = ByteUtil.getBitValue(b14,2);
senserData.addProperty("106",dangwei);
senserData.addProperty("3",kaiguan);
senserData.addProperty("67",zhuanshu);
senserData.addProperty("61",dianliu);
senserData.addProperty("57",dianya);
senserData.addProperty("59",gonglv);
senserData.addProperty("107",qianyabaoh);
senserData.addProperty("108",duanlubaohu);
senserData.addProperty("109",qidongyichangbaohu);
senserData.addProperty("110",guowenbaohu);
senserData.addProperty("111",qiexiangbaohu);
if(DeviceCommandListenService.hasClienConnection(clientid))
{
return new AnalysisResult(true,true,jsonObject,new ApiClientRePlyDto() {
@Override
public void setReplyMessage(Message message) {
message.setCode(MessageCode.DEFAULT_SUCCESS_CODE);
message.setData(GsonConstructor.get().fromJson(jsonObject.toString(), HashMap.class));
}
});
}
return new AnalysisResult(true,false,jsonObject);
}
}
... ...
package com.zhonglai.luhui.device.protocol.uyu.control;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.control.DeviceCommandServiceFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
/**
* 指令控制监听实现
*/
public class DeviceCommandListenServiceImpl implements DeviceCommandServiceFactory {
private static final String topicconfig = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}";
private static final Logger log = LoggerFactory.getLogger(DeviceCommandListenServiceImpl.class);
@Override
public NoticeMessageDto read(String deviceId, JsonObject jsonObject) {
return null;
}
@Override
public NoticeMessageDto write(String deviceId, JsonObject jsonObject) {
ParserDeviceHostDto parserDeviceHostDto = DeviceCach.getDeviceHost(deviceId);
Topic topic = getWriteTopic(deviceId,parserDeviceHostDto.getIotProduct());
NoticeMessageDto noticeMessageDto = new NoticeMessageDto();
noticeMessageDto.setTopic(topic);
noticeMessageDto.setTopicconfig(topicconfig);
if (jsonObject.has("1"))
{
JsonObject data = jsonObject.get("1").getAsJsonObject();
if (data.has("3") && data.has("106"))
{
byte[] bytes = new byte[]{(byte) 0xA5, 0x07, 0x01, 0x20, (byte) data.get("3").getAsInt(), (byte) (data.get("106").getAsInt() - 1)};
bytes = Arrays.copyOf(bytes, bytes.length + 1);
bytes[bytes.length - 1] = ByteUtil.calculateChecksum(bytes);
noticeMessageDto.setCommd(bytes);
}
}
return noticeMessageDto;
}
@Override
public boolean notice(String deviceId, JsonObject jsonObject) {
return false;
}
private Topic getWriteTopic(String deviceId, IotProduct iotProduct)
{
Topic topic = new Topic();
if (deviceId.indexOf("_")>0)
{
topic.setTopicType("CKA-DT-SND_R/"+deviceId.split("_")[1]);
}else{
topic.setTopicType("CKA-DT-SND_R/"+deviceId);
}
topic.setClientid(deviceId);
topic.setRoleid(iotProduct.getRole_id()+"");
topic.setUsername(iotProduct.getMqtt_username());
topic.setPayloadtype("Bite16");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
return topic;
}
}
... ...
package com.zhonglai.luhui.device.protocol.uyu.control;
import com.zhonglai.luhui.device.protocol.factory.control.ControlFactory;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
import org.springframework.stereotype.Component;
@Component
@RocketMQMessageListener(consumerGroup = "lh-device-uyu", topic = "control-device-uyu",selectorType = SelectorType.TAG,selectorExpression = "1",messageModel = MessageModel.BROADCASTING)
public class UyuControlFactoryImpl extends ControlFactory {
@Override
protected String analysisMessageKey() {
return null;
}
@Override
protected Boolean transmitMessage(String str) {
return null;
}
@Override
protected long getOperationTime() {
return 10000;
}
}
... ... @@ -8,6 +8,7 @@ import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
... ... @@ -34,7 +35,7 @@ public class ProtocolParserServiceImpl implements ProtocolParserFactory<byte[]>
}
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
switch (topic.getTopicType())
{
case "pub_data":
... ...
... ... @@ -2,7 +2,8 @@ package com.zhonglai.luhui.device.protocol.xinjie.analysis;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
public interface ProtocolTopicParser<T> {
JsonObject analysisPayload(Topic topic, T payload);
AnalysisResult analysisPayload(Topic topic, T payload);
}
... ...
... ... @@ -4,6 +4,7 @@ import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.xinjie.analysis.ProtocolTopicParser;
import com.zhonglai.luhui.device.protocol.xinjie.dto.Variant;
import com.zhonglai.luhui.device.protocol.xinjie.dto.XinJieDto;
... ... @@ -11,7 +12,7 @@ import com.zhonglai.luhui.device.protocol.xinjie.dto.XinJieDto;
public class PubData implements ProtocolTopicParser<byte[]> {
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
String data = new String(payload);
XinJieDto xinJieDto = GsonConstructor.get().fromJson(data, XinJieDto.class);
if(null != xinJieDto.getVariant() && xinJieDto.getVariant().size()!=0)
... ... @@ -21,9 +22,9 @@ public class PubData implements ProtocolTopicParser<byte[]> {
analysisHost(rj,xinJieDto);
analysisDeviceInfo(rj,xinJieDto);
return rj;
return new AnalysisResult(false,false,rj);
}
return GsonConstructor.get().fromJson(data, JsonObject.class);
return new AnalysisResult(false,false,GsonConstructor.get().fromJson(data, JsonObject.class));
}
private void analysisHost(JsonObject rj,XinJieDto xinJieDto)
... ...
... ... @@ -2,11 +2,12 @@ package com.zhonglai.luhui.device.protocol.xinjie.analysis.topic;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.xinjie.analysis.ProtocolTopicParser;
public class WriteData implements ProtocolTopicParser<byte[]> {
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
return null;
}
}
... ...
... ... @@ -2,11 +2,12 @@ package com.zhonglai.luhui.device.protocol.xinjie.analysis.topic;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisResult;
import com.zhonglai.luhui.device.protocol.xinjie.analysis.ProtocolTopicParser;
public class WriteReply implements ProtocolTopicParser<byte[]> {
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
public AnalysisResult analysisPayload(Topic topic, byte[] payload) {
return null;
}
}
... ...
... ... @@ -27,7 +27,7 @@ public class LsyProtocolSyncFactoryImpl implements ProtocolSyncFactory {
}
@Override
public void updateParserDeviceInfoDtoList(List<ParserDeviceInfoDto> parserDeviceInfoDtoList) {
public void updateParserDeviceInfoDtoList(Integer productId, List<ParserDeviceInfoDto> parserDeviceInfoDtoList) {
if(null != parserDeviceInfoDtoList && parserDeviceInfoDtoList.size() != 0)
{
for (ParserDeviceInfoDto parserDeviceInfoDto:parserDeviceInfoDtoList)
... ...
... ... @@ -2,6 +2,7 @@ package com.zhonglai.luhui.http.service.proxy;
import com.zhonglai.luhui.device.analysis.comm.config.CacheConfig;
import com.zhonglai.luhui.device.analysis.comm.config.FastJson2JsonRedisSerializer;
import com.zhonglai.luhui.device.protocol.factory.control.DeviceCommandListenService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
... ... @@ -18,7 +19,7 @@ import org.springframework.context.annotation.FilterType;
"com.zhonglai.luhui.http.service.proxy"
},excludeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = {CacheConfig.class, FastJson2JsonRedisSerializer.class}
classes = {CacheConfig.class, FastJson2JsonRedisSerializer.class, DeviceCommandListenService.class}
) )
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class LhHttpServiceProxyApplication {
... ...
... ... @@ -80,7 +80,7 @@ public class LoginService {
yu2leUserInfo.setLastLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
yu2leUserInfo.setLastLoginTime(DateUtils.getNowTimeMilly());
publicService.updateObjectByTable(yu2leUserInfo,"id","`liu_yu_le`.`user_info`");
return tokenService.createToken(loginUser);
return tokenService.creatApiToken(loginUser);
}
public String openaiLoginByPass(String user,String pass) {
... ...
... ... @@ -31,7 +31,7 @@ public class MqttServiceListenApplication {
public static void main(String[] args) {
log.info("启动服务");
System.setProperty("RunInIDEA",checkRunInIDEA());
// System.setProperty("RunInIDEA",checkRunInIDEA());
SpringApplicationBuilder builder = new SpringApplicationBuilder(MqttServiceListenApplication.class);
builder.run( args);
... ...
... ... @@ -17,7 +17,7 @@ import org.springframework.stereotype.Component;
@Component
public class MqttCallback extends BaseCallback implements MqttCallbackExtended {
private static final String topicOnlineModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{imei}}/{{topicType}}";
private static final String topicOnlineModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}";
@Autowired
private TerminalService terminalService; //客户端服务
... ... @@ -47,12 +47,12 @@ public class MqttCallback extends BaseCallback implements MqttCallbackExtended {
try {
//过滤在线消息
if (s.endsWith("online"))
{
String state = new String(mqttMessage.getPayload());
deviceCashUpService.upOnline(state);
return ;
}
// if (s.endsWith("online"))
// {
// String state = new String(mqttMessage.getPayload());
// deviceCashUpService.upOnline(state);
// return ;
// }
messageArrived(baseTopic.getClientid(),s,mqttMessage.getPayload());
... ...
package com.zhonglai.luhui.mqtt.service.proxy.comm.service;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.dto.MessageCodeType;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.control.ClienNoticeServiceFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.NoticeMessageDto;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MqttClienNoticeServiceImpl implements ClienNoticeServiceFactory {
private static final Logger log = LoggerFactory.getLogger(MqttClienNoticeServiceImpl.class);
@Autowired
private TerminalService terminalService;
@Override
public boolean sendMessage( NoticeMessageDto noticeMessageDomain) {
if(null == noticeMessageDomain || null == noticeMessageDomain.getCommd())
{
return false;
}
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(noticeMessageDomain.getCommd());
try {
terminalService.publish(TopicUtil.generateSendMessageTopic(noticeMessageDomain.getTopic(),noticeMessageDomain.getTopicconfig()),mqttMessage);
return true;
} catch (MqttException e) {
log.error("转发消息异常",e);
}
return false;
}
}
... ...
... ... @@ -2,10 +2,15 @@ package com.zhonglai.luhui.mqtt.service.proxy.comm.service;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.service.impl.DefaultDbService;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -45,8 +50,8 @@ public class TerminalService {
private String username;
@Value("${mqtt.password}")
private String password;
@Value("${mqtt.textTopic:null}")
private String textTopic;
@Value("${mqtt.topics}")
private List<String> topics;
private MqttClient mqttclient;
... ... @@ -82,13 +87,13 @@ public class TerminalService {
public List<String> getCompletionTopics()
{
if ("1".equals(System.getProperty("RunInIDEA")) && StringUtils.isNotEmpty(textTopic))
{
List<String> list = new ArrayList<>();
list.add(textTopic);
return list;
}
return dbService.getTopicFromRole();
// if ("1".equals(System.getProperty("RunInIDEA")) && StringUtils.isNotEmpty(textTopic))
// {
// List<String> list = new ArrayList<>();
// list.add(textTopic);
// return list;
// }
return topics;
}
@PostConstruct
... ... @@ -112,4 +117,10 @@ public class TerminalService {
mqttclient.close();
}
}
public void publish(String topic, MqttMessage message) throws MqttException {
log.info("mqtt发送消息>>>>>>>:{} 《===============》 字符串:【{}】 十六进制:【{}】",topic,new String(message.getPayload()), ByteUtil.hexStringToSpace(ByteUtil.toHexString(message.getPayload())));
DeviceDataLog.info(TopicUtil.initTopic(topic).getClientid(), DataLogType.发送数据,topic,message);
mqttclient.publish(topic,message);
}
}
... ...
... ... @@ -28,4 +28,9 @@ mqtt:
client:
#客户端操作时间
operationTime: 10
textTopic: "/2/6_WP/866520067451609/#"
\ No newline at end of file
topics: /2/UY_ZYJ_V001/#
#rocketmq配置信息
rocketmq:
#nameservice服务器地址(多个以英文逗号隔开)
name-server: 47.115.144.179:9876
\ No newline at end of file
... ...
... ... @@ -377,7 +377,11 @@
<artifactId>lh-device-modbus</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-log</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.zhonglai</groupId>
<artifactId>ServiceDao</artifactId>
... ...