作者 钟来

模块整理

正在显示 93 个修改的文件 包含 2421 行增加466 行删除
... ... @@ -19,10 +19,6 @@
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
... ... @@ -36,5 +32,38 @@
<artifactId>lh-jar-device-service</artifactId>
<scope>compile</scope>
</dependency>
<!-- mqtt -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
</dependency>
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
</dependency>
<!-- 数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.mqtt.comm.config;
package com.zhonglai.luhui.device.analysis.comm.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
... ...
package com.zhonglai.luhui.mqtt.comm.config;
package com.zhonglai.luhui.device.analysis.comm.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
... ...
package com.zhonglai.luhui.mqtt.comm.config;
package com.zhonglai.luhui.device.analysis.comm.config;
import com.alibaba.fastjson.parser.ParserConfig;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
... ...
package com.zhonglai.luhui.mqtt.comm.config;
package com.zhonglai.luhui.device.analysis.comm.config;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.comm.util.http.HttpUtils;
... ...
package com.zhonglai.luhui.mqtt.comm.dao;
package com.zhonglai.luhui.device.analysis.comm.dao;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.annotation.PublicSQLConfig;
... ...
... ... @@ -4,7 +4,7 @@
* @author yushigui
* @date 2014-1-19
*/
package com.zhonglai.luhui.mqtt.comm.dao;
package com.zhonglai.luhui.device.analysis.comm.dao;
import javax.sql.DataSource;
... ...
... ... @@ -4,7 +4,7 @@
* @author yushigui
* @date 2014-1-19
*/
package com.zhonglai.luhui.mqtt.comm.dao;
package com.zhonglai.luhui.device.analysis.comm.dao;
import org.apache.commons.dbcp.BasicDataSourceFactory;
... ...
package com.zhonglai.luhui.mqtt.service.db;
package com.zhonglai.luhui.device.analysis.comm.db;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.comm.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.device.analysis.comm.service.CacheServiceImpl;
import com.zhonglai.luhui.device.analysis.comm.service.DataPersistenceServiceImpl;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelBase;
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.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.mqtt.comm.service.ClienNoticeService;
import com.zhonglai.luhui.mqtt.comm.service.DeviceLogService;
import com.zhonglai.luhui.mqtt.comm.service.redis.RedisService;
import com.zhonglai.luhui.device.analysis.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.device.analysis.comm.service.DeviceLogService;
import com.zhonglai.luhui.device.analysis.comm.service.redis.RedisService;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.dto.topic.AddPostDto;
import com.zhonglai.luhui.mqtt.service.CacheServiceImpl;
import com.zhonglai.luhui.mqtt.service.DataPersistenceServiceImpl;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
... ... @@ -37,11 +36,6 @@ import java.util.*;
public class DeviceService {
private static final Logger log = LoggerFactory.getLogger(DeviceService.class);
@Autowired
private ClienNoticeService clienNoticeService;
@Autowired
private TerminalDataThingsModeService terminalDataThingsModeService;
@Autowired
private CacheServiceImpl cacheServiceImpl;
... ... @@ -53,11 +47,6 @@ public class DeviceService {
private DeviceLogService dviceLogService;
private BaseDao baseDao = new BaseDao();
@Autowired
private DataPersistenceServiceImpl dataPersistenceService;
@Autowired
private BusinessDataUpdateService businessDataUpdateService ;
/**
* 根据id获取终端
... ... @@ -148,73 +137,8 @@ public class DeviceService {
cacheServiceImpl.deletRedisTerminal(terminalIds);
}
/**
* 控制发16进制指令
* @param clienid
* @param data
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message controlHex(String clienid, String data) throws MqttException, InterruptedException {
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("PUT");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
MqttMessage mqttMessage = new MqttMessage();
byte[] bs = hexStringToByte(data.trim().toUpperCase());
mqttMessage.setPayload(bs);
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
if(1==message.getCode())
{
List<LogDeviceOperation> list = new ArrayList<>();
list.add(dviceLogService.newLogDeviceOperation(clienid,null!=message.getData()?JSON.toJSONString(message.getData()):null,null,"远程操作控制设备","controlHex?"+data));
dviceLogService.saveOperationLog(list);
}
return message;
}
/**
* 读
* @param clienid
* @param map
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message read(String clienid,Map<String,Object> map) throws MqttException, InterruptedException {
log.info("api请求读取 {} 参数 {}",map);
if(null == map || map.size() ==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"参数验证失败");
}
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("READ");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
if(1==message.getCode())
{
List<LogDeviceOperation> list = new ArrayList<>();
list.add(dviceLogService.newLogDeviceOperation(clienid,JSON.toJSONString(message.getData()),null,"远程操作读取配置参数","read?"+JSON.toJSONString(map).trim()));
dviceLogService.saveOperationLog(list);
}
return message;
}
/**
* 更新主机
... ... @@ -252,25 +176,7 @@ public class DeviceService {
return new Message(MessageCode.DEFAULT_SUCCESS_CODE);
}
/**
* 强行断开链接
* @param clienid
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message closeSession(String clienid) throws MqttException, InterruptedException {
MqttMessage mqttMessage = new MqttMessage();
byte[] bs = hexStringToByte(clienid.trim().toUpperCase());
mqttMessage.setPayload(bs);
clienNoticeService.sendMessage("CLOSE",mqttMessage);
List<LogDeviceOperation> list = new ArrayList<>();
list.add(dviceLogService.newLogDeviceOperation(clienid,null,null,"远程操作强行断开链接","closeSession?"));
dviceLogService.saveOperationLog(list);
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"端口请求已发送");
}
/**
* 删除主机
... ... @@ -280,7 +186,6 @@ public class DeviceService {
* @throws InterruptedException
*/
public Message delIotDevice(String client_id) throws MqttException, InterruptedException {
closeSession(client_id); //强制下线
cacheServiceImpl.deletRedisDevice(client_id);
baseDao.updateBySql("delete from iot_device where client_id='"+client_id+"'");
baseDao.updateBySql("delete from iot_terminal where device_id='"+client_id+"'");
... ... @@ -301,7 +206,6 @@ public class DeviceService {
* @throws InterruptedException
*/
public Message delIotTerminal(String client_id,String number) throws MqttException, InterruptedException {
closeSession(client_id); //强制下线
cacheServiceImpl.deletRedisTerminal(client_id+"_"+number);
baseDao.updateBySql("delete from iot_terminal where id='"+client_id+"_"+number+"'");
baseDao.updateBySql("DELETE FROM `user_terminal_group_relation` WHERE iot_terminal_id = '"+client_id+"_"+number+"'");
... ... @@ -313,91 +217,6 @@ public class DeviceService {
}
/**
* 控制发json
* @param clienid
* @param map
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message control(String clienid,Map<String,Object> map) throws MqttException, InterruptedException {
if(null == map || map.size() ==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"参数验证失败");
}
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("PUT");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
StringBuffer stringBuffer = new StringBuffer("");
List<LogDeviceOperation> logDeviceOperationList = new ArrayList<>();
for(String key:map.keySet())
{
Object sendMap = map.get(key);
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(sendMap));
for(String skey:jsonObject.keySet())
{
IotThingsModel thingsModel = terminalDataThingsModeService.getIotThingsModel(topic.getUsername(),skey);
if(null == thingsModel) //没有配置的 都按字符串处理
{
thingsModel = new IotThingsModel();
thingsModel.setData_type(ThingsModelDataTypeEnum.STRING.name());
thingsModel.setIdentifier(key);
thingsModel.setModel_name(key);
thingsModel.setIs_top(0);
thingsModel.setIs_monitor(0);
thingsModel.setIs_save_log(0);
thingsModel.setIs_config(0);
JSONObject spes = new JSONObject();
spes.put("maxLength",255);
thingsModel.setSpecs(spes.toString());
}
String data_type = thingsModel.getData_type().toUpperCase();
Class<ThingsModelBase> aClass = Enum.valueOf(ThingsModelDataTypeEnum.class,data_type).getaClass();
ThingsModelBase thingsModelBase = JSON.parseObject(thingsModel.getSpecs(),aClass);
thingsModelBase.conversionThingsModel(thingsModel);
Object object = jsonObject.get(skey);
// Type clas = ((ParameterizedType)aClass.getGenericSuperclass()).getActualTypeArguments()[0];
// if(null != object && object.getClass()!=clas)
// {
// return new Message(MessageCode.DEFAULT_FAIL_CODE,skey+" 参数数据类型和模型数据类型("+clas+")不一致");
// }
ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase;
jsonObject.put(skey,thingsModelItemBase.getCmdView(object));
thingsModelBase.addValue(thingsModelItemBase.getCmdView(object));
String id = clienid+"_"+key;
logDeviceOperationList.add(dviceLogService.newLogDeviceOperation(id,thingsModelItemBase.getSaveView(),null,"远程控制"+thingsModelItemBase.getName()+"为"+thingsModelItemBase.getView(),null));
}
map.put(key,jsonObject);
}
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
if(1==message.getCode())
{
topic.setClientid(clienid);
AddPostDto addPostDto = new AddPostDto();
addPostDto.setData(JSON.parseObject(JSON.toJSONString(map)));
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);
}
return message;
}
/**
* 获取指定设备版本信息
* @param app_type
* @return
... ... @@ -413,7 +232,7 @@ public class DeviceService {
* @param clienid
* @return
*/
private Topic getTopicFromDb(String clienid)
public Topic getTopicFromDb(String clienid)
{
JSONArray jsonArray = baseDao.findBysql("SELECT b.`role_id` roleid,b.`mqtt_username` username,a.`client_id` clientid,a.`payload_type` payloadtype FROM `iot_device` a LEFT JOIN `iot_product` b ON a.`product_id`=b.`id` WHERE client_id='"+clienid+"'");
if(null == jsonArray || jsonArray.size()==0 || null == jsonArray.getJSONObject(0).get("username"))
... ... @@ -510,7 +329,7 @@ public class DeviceService {
* @param hex
* @return
*/
private byte[] hexStringToByte(String hex) {
public byte[] hexStringToByte(String hex) {
int len = (hex.length() / 2);
byte[] result = new byte[len];
char[] achar = hex.toCharArray();
... ...
package com.zhonglai.luhui.mqtt.service.db.mode;
package com.zhonglai.luhui.device.analysis.comm.db.mode;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.service.redis.RedisService;
import com.zhonglai.luhui.device.analysis.comm.service.redis.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
package com.zhonglai.luhui.mqtt.service.redis;
package com.zhonglai.luhui.device.analysis.comm.redis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ...
package com.zhonglai.luhui.mqtt.service.redis;
package com.zhonglai.luhui.device.analysis.comm.redis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.device.analysis.comm.service;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.dto.SaveDataDto;
... ... @@ -9,9 +11,6 @@ import com.zhonglai.luhui.device.analysis.dto.topic.AllPostDto;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.config.SysParameter;
import com.zhonglai.luhui.mqtt.service.CacheServiceImpl;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.device.analysis.comm.service;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
... ...
package com.zhonglai.luhui.mqtt.service;
package com.zhonglai.luhui.device.analysis.comm.service;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.config.RedisConfig;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.config.RedisConfig;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.CacheService;
import com.zhonglai.luhui.mqtt.comm.service.redis.RedisService;
import com.zhonglai.luhui.device.analysis.comm.service.redis.RedisService;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.mqtt.service.redis.RedisDeleteListener;
import com.zhonglai.luhui.mqtt.service.redis.RedisExpiredListener;
import com.zhonglai.luhui.device.analysis.comm.redis.RedisDeleteListener;
import com.zhonglai.luhui.device.analysis.comm.redis.RedisExpiredListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.device.analysis.comm.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelBase;
... ... @@ -11,8 +13,6 @@ import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.comm.util.StringUtils;
import com.zhonglai.luhui.device.analysis.dto.SaveDataDto;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import org.apache.commons.lang3.EnumUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.device.analysis.comm.service;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceAlarmInfo;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.comm.util.TableUtil;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.*;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import java.util.ArrayList;
... ...
package com.zhonglai.luhui.mqtt.service;
package com.zhonglai.luhui.device.analysis.comm.service;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
... ... @@ -6,8 +6,6 @@ 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.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.DataPersistenceService;
import com.zhonglai.luhui.mqtt.comm.service.DeviceLogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.device.analysis.comm.service;
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.TableGenerateSqlEnum;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import org.springframework.stereotype.Service;
import java.util.List;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.device.analysis.comm.service;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
... ... @@ -15,8 +14,6 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
@Autowired
private DataPersistenceService dtaPersistenceService;
@Autowired
private DeviceService deviceService ;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
... ...
package com.zhonglai.luhui.mqtt.comm.service.redis;
package com.zhonglai.luhui.device.analysis.comm.service.redis;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
... ...
... ... @@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.ruoyi.common.core.domain.ApiName;
import com.ruoyi.common.core.domain.DeviceCommandApi;
... ... @@ -33,8 +34,7 @@ public class IotDeviceServiceImpl implements IIotDeviceService
private IotDeviceMapper iotDeviceMapper;
@Autowired
private IIotProductService iIotProductService;
@Autowired
protected RocketMqService rocketMqService;
/**
* 查询null
*
... ... @@ -99,7 +99,7 @@ public class IotDeviceServiceImpl implements IIotDeviceService
Map<String,Object> map = JSONObject.parseObject(JSONObject.toJSONString(iotDevice), HashMap.class);
deviceCommandApiParameter.setMap(map);
deviceCommandApi.setDeviceCommandApiParameter(deviceCommandApiParameter);
Message clJs = rocketMqService.send(deviceCommandApi);
Message clJs = SpringUtils.getBean(RocketMqService.class).send(deviceCommandApi);
if(clJs.getCode()==1)
{
return 1;
... ...
... ... @@ -43,23 +43,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="latitude" column="latitude" />
<result property="location_way" column="location_way" />
<result property="longitude" column="longitude" />
<result property="name" column="name" />
<result property="name" column="d_name" />
<result property="network_address" column="network_address" />
<result property="network_ip" column="network_ip" />
<result property="remark" column="remark" />
<result property="rssi" column="rssi" />
<result property="status" column="status" />
<result property="summary" column="summary" />
<result property="things_model_value" column="things_model_value" />
<result property="things_model_value" column="d_things_model_value" />
<result property="update_by" column="update_by" />
<result property="update_time" column="update_time" />
<result property="product_id" column="product_id" />
<result property="mqtt_username" column="mqtt_username" />
<result property="payload_type" column="payload_type" />
<result property="things_model_config" column="things_model_config" />
<result property="things_model_config" column="d_things_model_config" />
<result property="listen_service_ip" column="listen_service_ip" />
<result property="device_life" column="device_life" />
<result property="data_update_time" column="data_update_time" />
<result property="data_update_time" column="d_data_update_time" />
</resultMap>
... ... @@ -86,7 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectIotTerminalListByUserId" parameterType="IotTerminal" resultMap="IotTerminalResult">
SELECT a.*,b.*,c.* FROM `iot_terminal` a LEFT JOIN `user_terminal_group_relation` b ON a.`id`=b.`iot_terminal_id` LEFT JOIN `iot_device` c ON c.client_id=a.`device_id`
SELECT a.*,b.*,c.*,c.`name` d_name,c.`things_model_value` d_things_model_value,c.`things_model_config` d_things_model_config,c.`data_update_time` d_data_update_time FROM `iot_terminal` a LEFT JOIN `user_terminal_group_relation` b ON a.`id`=b.`iot_terminal_id` LEFT JOIN `iot_device` c ON c.client_id=a.`device_id`
<where>
<if test="device_id !=null and device_id != ''">
and a.device_id = #{device_id}
... ...
... ... @@ -20,7 +20,7 @@ import org.springframework.context.annotation.ComponentScan;
"com.zhonglai.luhui.rocketmq",
"com.zhonglai.luhui.firewall",
"com.zhonglai.luhui.admin",
"com.zhonglai.luhui.mqtt.comm.service.redis",
"com.zhonglai.luhui.device.analysis.comm.service.redis",
"com.zhonglai.luhui.mqtt.service.db.mode"
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
... ...
... ... @@ -14,7 +14,7 @@ import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.service.IIotProductService;
import com.zhonglai.luhui.admin.dto.IotThingsModelAddApi;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.device.analysis.comm.db.mode.TerminalDataThingsModeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
... ...
package com.zhonglai.luhui.api.config;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.filter.JwtAuthenticationTokenFilter;
import com.zhonglai.luhui.security.service.TokenService;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class JwtAuthenticationTokenFilterImpl extends JwtAuthenticationTokenFilter {
@Autowired
private TokenService tokenService;
@Override
public BaseLoginUser getBaseLoginUser(HttpServletRequest request) {
return tokenService.getLoginUser(request);
}
@Override
public boolean verifyToken(BaseLoginUser baseLoginUser) {
if (StringUtils.isNotNull(baseLoginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
{
tokenService.verifyToken(baseLoginUser);
return true;
}
return false;
}
@Override
public UsernamePasswordAuthenticationToken getUsernamePasswordAuthenticationToken(BaseLoginUser loginUser) {
return new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
}
}
... ...
package com.zhonglai.luhui.api.controller.data;
import com.google.common.base.CaseFormat;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.DateUtils;
import com.zhonglai.luhui.api.controller.data.mapper.DeviceSensorDataMapper;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
@Service
public class DataService {
@Autowired
public PublicService publicService;
@Autowired
public DeviceSensorDataMapper deviceSensorDataMapper;
@DataSource(value = DataSourceType.SLAVE)
public Map<String,Object> getViewDataBeifen(Integer dateTime,String id,String data_type)
{
int beforTime = getBeforeDawnTimeMilly(dateTime);
String sql = "SELECT '"+id+"' device_info_id,"+data_type+" data_type,`value` data_value,`time` creat_time FROM `"+id+"-"+data_type+"` WHERE `time`>="+beforTime+" and `time`<="+(beforTime+24*60*60) ;
if("0".equals(data_type))
{
sql+=" AND (`value`+0.0)<50 ";
}
if("1".equals(data_type))
{
sql+=" AND (`value`+0.0)<30 ";
}
sql+=" AND CAST(`value` AS DECIMAL(3,1)) > 0 ORDER BY `time` ASC;";
List<Map<String, Object>> dataList = publicService.getObjectListBySQL(sql);
return getViewData(dataList,dateTime);
}
public Map<String,Object> getViewDataBase(Integer dateTime,String id,String data_type)
{
String tableName = TableGenerateSqlEnum.DeviceSensorData.getTableName(dateTime);
String sql = "SELECT device_info_id,data_type,data_value,creat_time FROM "+tableName+" WHERE device_info_id='"+id+"' AND data_type='"+data_type+"'" ;
if("0".equals(data_type))
{
sql+=" AND (data_value+0.0)<50 ";
}
if("1".equals(data_type))
{
sql+=" AND (data_value+0.0)<30 ";
}
sql+=" AND CAST(data_value AS DECIMAL(3,1)) > 0 ORDER BY creat_time ASC;";
List<Map<String, Object>> dataList = publicService.getObjectListBySQL(sql);
return getViewData(dataList,dateTime);
}
public Map<String,Object> getViewData(List<Map<String, Object>> dataList,Integer dateTime)
{
//两点时间绝对值
int deulftime = 10*60;
int alltime = (1*24*60*60);
return getViewData(dataList, dateTime,alltime, deulftime);
}
public Map<String,Object> getViewData(List<Map<String, Object>> dataList,Integer dateTime,int alltime,int deulftime)
{
int size = alltime/deulftime+1;
Object[] datas = new Object[size] ; //返回的参数
// int dateTime = 1470197532;
//要找的点x轴起点
int starttime = Integer.parseInt((DateUtils.dateTime(DateUtils.YYYY_MM_DD,DateUtils.dateTime(new Date(dateTime*1000l))).getTime()+"").substring(0, 10));
Map<Integer,Map<String, Object>> tempMap = new HashMap<Integer,Map<String, Object>>();
for(Map<String, Object> dataMap:dataList)
{
if(null != dataMap.get("creat_time")) //屏蔽错误数据
{
tempMap.put(Integer.parseInt(dataMap.get("creat_time")+""), dataMap);
}
}
dataList = null;
double totleVaule = 0.0;
int number = 0;
double maxVaule = 0.0;
double minVaule = 0.0;
for(int i=0;i<size;i++)
{
int tempTime = starttime + i*deulftime;
Object[] obs = new Object[2];
datas[i] = obs;
obs[0] = tempTime * 1000l;
for(int j=0;j<(deulftime/2);j++)
{
if(tempMap.containsKey(tempTime+j))
{
obs[1] = Double.parseDouble(tempMap.get(tempTime+j).get("data_value")+"");
obs[0] = (tempTime+j) * 1000l;
String type= tempMap.get(tempTime+j).get("data_type")+"";
if(type.equals("0") || type.equals("1"))
{
number++;
double data_value = Double.parseDouble(tempMap.get(tempTime+j).get("data_value")+"");
totleVaule += data_value;
if(number==1)
{
maxVaule = totleVaule;
minVaule = totleVaule;
}
if(data_value>maxVaule)
{
maxVaule = data_value;
}
if(data_value<minVaule)
{
minVaule = data_value;
}
}
break;
}else if(tempMap.containsKey(tempTime-j)){
obs[1] = Double.parseDouble(tempMap.get(tempTime-j).get("data_value")+"");
obs[0] = (tempTime+j) * 1000l;
String type= tempMap.get(tempTime-j).get("data_type")+"";
if(type.equals("0") || type.equals("1"))
{
number++;
double data_value = Double.parseDouble(tempMap.get(tempTime-j).get("data_value")+"");
totleVaule += data_value;
if(number==1)
{
maxVaule = totleVaule;
minVaule = totleVaule;
}
if(data_value>maxVaule)
{
maxVaule = data_value;
}
if(data_value<minVaule)
{
minVaule = data_value;
}
}
break;
}
}
}
Map<String,Object> map = new HashMap<String,Object>();
if(number != 0)
{
map.put("averageValue", totleVaule/number);
}
map.put("data",datas);
map.put("minVaule",minVaule);
map.put("maxVaule",maxVaule);
return map;
}
/**
* 获取连续数据
*/
public List<Map<String,Object>> getContinuousSensorData(
Integer starTime, Integer endTime, Integer interval,
String deviceInfoId, String dataType) {
String sql = "CALL get_sensor_data(" + starTime + "," + endTime + ","
+ interval + ",'" + deviceInfoId + "','" + dataType + "')";
return publicService.getObjectListBySQL(sql);
}
/**
* 获取数据曲线
*
* @param starTime
* @param endTime
* @param interval
* @param dataType
* @return
*/
public Map<String,Object> getDeviceData(Integer starTime,
Integer endTime, Integer interval, String deviceInfoId, String dataType) {
List<Map<String,Object>> rongyangMap = getContinuousSensorData( starTime, endTime, interval, deviceInfoId,dataType); // 溶氧
int dataNumb = (endTime - starTime) / interval; // 显示点数
Object[] rongyangs = new Object[dataNumb+1];
Double max = null;
Double min = null;
Double pingjun = 0.0;
if(null != rongyangMap && rongyangMap.size()>0)
{
Integer temptime = starTime;
Integer tempindex = Math.round((Float.parseFloat(rongyangMap.get(0).get("creat_time")+"")-Float.parseFloat(temptime+""))/interval);
temptime = Integer.parseInt(rongyangMap.get(0).get("creat_time")+"");
for (int i=0;i<rongyangMap.size();i++) {
Map<String, Object> map = rongyangMap.get(i);
tempindex = tempindex + Math.round((Float.parseFloat(map.get("creat_time")+"")-Float.parseFloat(temptime+""))/interval);
temptime=Integer.parseInt(map.get("creat_time")+"");
Double dataValue = Double.parseDouble(map.get("data_value")+"");
if(tempindex<dataNumb)
{
rongyangs[tempindex] = new Object[] {
map.get("create_time_view"), dataValue };
}
pingjun += dataValue / rongyangMap.size();
if (null == max) {
max = dataValue;
}
if (null == min) {
min = dataValue;
}
if (max < dataValue) {
max = dataValue;
}
if (min > dataValue) {
min = dataValue;
}
}
}
Map<String,Object> map = new HashMap<String,Object>();
map.put("min", min);
map.put("pingjun", pingjun);
map.put("max", max);
map.put("datas", rongyangs);
return map;
}
/**
* 获取设备历史数据
* @param response 返回会话
* @param startTime 开始时间(时间戳)
* @param endTime 结束时间(时间戳)
* @param interval 取点颗粒(单位分钟)
* @param deviceInfoId 设备信息表id
* @param dataType 数据类型
* @return
* @throws IOException
*/
public String getDeviceHistoryData(
HttpServletResponse response,int startTime,int endTime,int interval,String deviceInfoId,String dataType) throws IOException {
if(startTime>endTime)
{
response.setStatus(500);
return "开始时间不能大于结束时间";
}
if(interval<10 || interval%10 != 0)
{
response.setStatus(500);
return "取点颗粒必须是10的整数倍,并且不能小于10";
}
int nowTime = getBeforeDawnTimeMilly(DateUtils.getNowTimeMilly()); //当天凌晨时间
StringBuffer sb = new StringBuffer();
if(nowTime>startTime)
{
StringBuffer sb2after = getBeifeiDbDeviceHistoryData(deviceInfoId,dataType,startTime,endTime,interval*60); //天以前的数据
if(null != sb2after)
{
sb.append(sb2after);
}
}
if(endTime > nowTime)
{
StringBuffer sbafter = getDeviceTimeData(deviceInfoId,dataType,new Date(endTime*1000l),interval*60);
if(null != sbafter)
{
sb.append(sbafter);
}
}
return sb.toString();
}
/**
* 获取备份数据库的历史数据
* @param deviceInfoId
* @param dataType
* @return
*/
@DataSource(value = DataSourceType.SLAVE)
public StringBuffer getBeifeiDbDeviceHistoryData(String deviceInfoId,String dataType,int startTime,int endTime,int interval)
{
List<Map<String,Object>> list = publicService.getObjectListBySQL("SELECT count(*) ct FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='ly-device-data' and TABLE_NAME='"+deviceInfoId+"-"+dataType+"'");
if(null != list && list.size() !=0 && null != list.get(0) && null != list.get(0).get("ct") && (list.get(0).get("ct")+"").equals("1"))
{
list = publicService.getObjectListBySQL("select * from `ly-device-data`.`"+deviceInfoId+"-"+dataType+"` where (`time` % "+interval+")=0 and `time`>="+startTime+" and `time`<="+endTime+"");
if(null != list && list.size() !=0 )
{
StringBuffer sb = new StringBuffer();
for(Map<String,Object> map:list)
{
sb.append(map.get("time"));
sb.append(",");
sb.append(map.get("value"));
sb.append("\r\n");
}
return sb;
}
}
return null;
}
/**
* 获取数据指定天的数据
*
* @param deviceInfoId 设备id
* @param dataType 数据类型
* @param date 指定天数
* @return
*/
@DataSource(value = DataSourceType.SLAVE)
public StringBuffer getDeviceTimeData(String deviceInfoId, String dataType, Date date, int interval) {
String dataTypestr = dataType;
List<DeviceSensorData> deviceSensorDataList = deviceSensorDataMapper.getDeviceSensorDataList(getDeviceTimeDataSql(deviceInfoId,dataTypestr,date));
//间隔时间补全
String day = DateUtils.parseDateToStr("yyyyMMdd",date);
StringBuffer stringBuffer10 = SensorData.deviceSensorDataListToIntervalCompletion(deviceSensorDataList, Integer.parseInt(DateUtils.dateTime( "yyyyMMdd",day).getTime() / 1000 + ""), interval, day);
return stringBuffer10;
}
/**
* 获取数据指定天的数据查询语句
* @param deviceInfoId
* @param dataType
* @param date
* @return
*/
public String getDeviceTimeDataSql(String deviceInfoId, String dataType, Date date)
{
String sql = "select * from "+TableGenerateSqlEnum.DeviceSensorData.getTableName(date) + " where device_info_id='"+deviceInfoId+"'"
+" and data_type='"+dataType+"'";
switch (dataType)
{
case "0":
sql += " and data_value>-50 and data_value<60";
break;
case "1":
sql += " and data_value>0 and data_value<35";
break;
case "4":
sql += " and data_value>-50 and data_value<60";
break;
case "5":
sql += " and data_value>600 and data_value<1100";
break;
}
return sql;
}
/**
* 对象转查询结果
* @param cls
* @return
*/
public String objectToSelect(Class cls)
{
StringBuffer stringBuffer = new StringBuffer();
Field[] fields = cls.getDeclaredFields();
for(Field field:fields)
{
if(stringBuffer.length()!=0)
{
stringBuffer.append(",");
}
stringBuffer.append(changTableNameFromClassName(field.getName())+" as "+field.getName());
}
return stringBuffer.toString();
}
public static int getBeforeDawnTimeMilly(int now) {
int daySecond = 86400;
return now - (now + 28800) % daySecond;
}
public static String changTableNameFromClassName(String s) {
CaseFormat fromFormat = CaseFormat.LOWER_CAMEL;
CaseFormat toFormat = CaseFormat.LOWER_UNDERSCORE;
return fromFormat.to(toFormat, s);
}
}
... ...
package com.zhonglai.luhui.api.controller.data;
import lombok.Data;
@Data
public class DeviceSensorData {
private String deviceInfoId; //设备信息id
private String dataType; //数据类型
private String dataValue; //L数据值
private Integer creatTime; //创建时间
private String deviceModel; // VARCHAR(10) NOT NULL COMMENT '设备型号,(3,5,6)',
}
... ...
package com.zhonglai.luhui.api.controller.data;
import com.ruoyi.common.utils.DateUtils;
import java.util.List;
/**
* @类名 SensorData
* @描述 TODO
* @创建者 钟来
* @时间 18-10-12 下午12:01
* @版本 1.0
**/
public class SensorData {
public static StringBuffer deviceSensorDataListToIntervalCompletion(List<DeviceSensorData> deviceSensorDataList,int lastTime,int interval,String day)
{
int abs = interval;
String lastData = null;
StringBuffer stringBuffer10 = new StringBuffer(); //间隔时间补全
for(DeviceSensorData deviceSensorData:deviceSensorDataList)
{
//计算10分钟数据
int lc = lastTime - deviceSensorData.getCreatTime();
if(lc<0)
{
while (Math.abs(lc)>interval)
{
stringBuffer10.append(lastTime);
stringBuffer10.append(",");
stringBuffer10.append(lastData);
stringBuffer10.append("\r\n");
lastTime = lastTime+interval;
abs = interval;
lastData = null;
lc = lastTime - deviceSensorData.getCreatTime();
}
if(Math.abs(lc)<=abs)
{
abs = Math.abs(lc);
lastData = deviceSensorData.getDataValue();
}
}else if(lc==0){
stringBuffer10.append(lastTime);
stringBuffer10.append(",");
stringBuffer10.append(deviceSensorData.getDataValue());
stringBuffer10.append("\r\n");
lastTime = lastTime+interval;
abs = interval;
lastData = null;
}else{
if(Math.abs(lc)<=abs)
{
abs = Math.abs(lc);
lastData = deviceSensorData.getDataValue();
}
}
}
//设置最后一个
setStringBuffer(lastData,lastTime,stringBuffer10);
//补全后面的
int nowTIme = Integer.parseInt(DateUtils.dateTime("yyyyMMdd",day).getTime()/1000 + "");
while ((lastTime-nowTIme)<86400)
{
lastTime = lastTime+interval;
lastData = null;
stringBuffer10.append(lastTime);
stringBuffer10.append(",");
stringBuffer10.append(lastData);
stringBuffer10.append("\r\n");
}
return stringBuffer10;
}
public static StringBuffer deviceSensorDataListToInterval(List<DeviceSensorData> deviceSensorDataList,int lastTime,int interval)
{
int abs = interval;
String lastData = null;
StringBuffer stringBuffer = new StringBuffer(); //间隔时间
for(DeviceSensorData deviceSensorData:deviceSensorDataList)
{
//计算10分钟数据
int lc = lastTime - deviceSensorData.getCreatTime();
if(lc<0)
{
while (Math.abs(lc)>interval)
{
setStringBuffer(lastData,lastTime,stringBuffer);
lastTime = lastTime+interval;
abs = interval;
lastData = null;
lc = lastTime - deviceSensorData.getCreatTime();
}
if(Math.abs(lc)<=abs)
{
abs = Math.abs(lc);
lastData = deviceSensorData.getDataValue();
}
}else if(lc==0){
setStringBuffer(deviceSensorData.getDataValue(),lastTime,stringBuffer);
lastTime = lastTime+interval;
abs = interval;
lastData = null;
}else{
if(Math.abs(lc)<=abs)
{
abs = Math.abs(lc);
lastData = deviceSensorData.getDataValue();
}
}
}
//设置最后一个
setStringBuffer(lastData,lastTime,stringBuffer);
return stringBuffer;
}
private static void setStringBuffer(String lastData,Integer lastTime,StringBuffer stringBuffer)
{
if(null != lastData)
{
stringBuffer.append(lastTime);
stringBuffer.append(",");
stringBuffer.append(lastData);
stringBuffer.append("\r\n");
}
}
}
... ...
package com.zhonglai.luhui.api.controller.data;
import com.ruoyi.common.utils.DateUtils;
import com.zhonglai.luhui.api.controller.data.mapper.DeviceSensorDataMapper;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;
@Api(tags = "数据管理")
@RestController
@RequestMapping("/data/sensorData")
public class SensorDataController {
@Autowired
public DeviceSensorDataMapper deviceSensorDataMapper;
@Autowired
public DataService dataService;
@ApiOperation(value = "获取设备当天数据", notes = "当天数据曲线")
@ApiImplicitParams({
@ApiImplicitParam(name = "deviceInfoId", value = "设备信息表id"),
@ApiImplicitParam(name = "dataType", value = "数据类型"),
@ApiImplicitParam(name = "date", value = "时间yyyyMMdd"),
@ApiImplicitParam(name = "interval", value = "间隔时间")
})
@RequestMapping(value = "", method = RequestMethod.GET)
public String getDeviceTimeData(String deviceInfoId, String dataType, String date, int interval) {
String dataTypestr = dataType;
List<DeviceSensorData> deviceSensorDataList = deviceSensorDataMapper.getDeviceSensorDataList(getDeviceTimeDataSql(deviceInfoId,dataTypestr,DateUtils.dateTime("yyyyMMdd",date)));
//间隔时间补全
String day = date;
StringBuffer stringBuffer10 = SensorData.deviceSensorDataListToIntervalCompletion(deviceSensorDataList, Integer.parseInt(DateUtils.dateTime("yyyyMMdd",day).getTime() / 1000 + ""), interval, day);
return stringBuffer10.toString();
}
@ApiOperation(value = "获取设备历史数据", notes = "获取设备历史数据")
@RequestMapping(value = "getDeviceHistoryData", method = RequestMethod.GET)
public String getDeviceHistoryData(
@ApiParam(name = "startTime", value = "开始时间(时间戳)", required = true) @RequestParam(name = "startTime") int startTime,
@ApiParam(name = "endTime", value = "结束时间(时间戳)", required = true) @RequestParam(name = "endTime") int endTime,
@ApiParam(name = "interval", value = "取点颗粒(单位分钟)", required = true) @RequestParam(name = "interval") int interval,
@ApiParam(name = "deviceInfoId", value = "设备信息表id", required = true) @RequestParam(name = "deviceInfoId") String deviceInfoId,
@ApiParam(name = "dataType", value = "数据类型", required = true) @RequestParam(name = "dataType") String dataType,HttpServletResponse response) throws IOException {
return dataService.getDeviceHistoryData(response,startTime,endTime,interval,deviceInfoId,dataType);
}
/**
* 获取数据指定天的数据查询语句
* @param deviceInfoId
* @param dataType
* @param date
* @return
*/
private String getDeviceTimeDataSql(String deviceInfoId, String dataType, Date date)
{
String sql = "select * from "+TableGenerateSqlEnum.DeviceSensorData.getTableName(date) + " where device_info_id='"+deviceInfoId+"'"
+" and data_type='"+dataType+"'";
switch (dataType)
{
case "0":
sql += " and data_value>-50 and data_value<60";
break;
case "1":
sql += " and data_value>0 and data_value<35";
break;
case "4":
sql += " and data_value>-50 and data_value<60";
break;
case "5":
sql += " and data_value>600 and data_value<1100";
break;
}
return sql;
}
}
... ...
package com.zhonglai.luhui.api.controller.data;
import java.util.Date;
public enum TableGenerateSqlEnum {
//设备传感器数据
DeviceSensorData("设备传感器数据数据库","ly_sensor_data",
"device_sensor_data",
3,
"CREATE TABLE IF NOT EXISTS `device_sensor_data` ("+
"`device_info_id` varchar(50) NOT NULL COMMENT '设备信息id',"+
"`data_type` varchar(50) NOT NULL COMMENT '数据类型',"+
"`data_value` varchar(50) NOT NULL COMMENT '数据值',"+
"`creat_time` int(11) NOT NULL COMMENT '创建时间',"+
"`device_model` varchar(10) DEFAULT NULL COMMENT '设备型号,(3,5,6,6_P)',"+
"KEY `device_info_id` (`device_info_id`,`data_type`,`creat_time`)"+
") ENGINE=InnoDB DEFAULT CHARSET=utf8"
),
//管理员操作日志
LogSysUserOperation("管理员操作日志数据库","ly_sys_user_operation",
"log_sys_user_operation",
2,
"CREATE TABLE IF NOT EXISTS `log_sys_user_operation` (" +
" `operation_name` varchar(50) NOT NULL COMMENT '操作名称'," +
" `operation_ip` varchar(50) DEFAULT NULL COMMENT '操作ip'," +
" `operation_url` varchar(200) DEFAULT NULL COMMENT '操作连接'," +
" `operation_value` text COMMENT '操作值'," +
" `user_id` int(11) DEFAULT NULL COMMENT '用户id'," +
" `user_login_name` varchar(50) DEFAULT NULL COMMENT '用户名称'," +
" `user_nickname` varchar(50) DEFAULT NULL COMMENT '用户昵称'," +
" `create_time` int(11) NOT NULL COMMENT '创建时间'," +
" `module` varchar(50) DEFAULT NULL COMMENT '操作模块'" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8"
),
//设备操作日志
LogDeviceOperation("设备操作日志数据库","ly_log_device_operation",
"log_device_operation",
3,
"CREATE TABLE IF NOT EXISTS `log_device_operation` (" +
" `device_operation_id` int(11) NOT NULL AUTO_INCREMENT," +
" `device_info_id` varchar(50) NOT NULL COMMENT '设备id'," +
" `device_operation_time` int(11) NOT NULL COMMENT '设备操作时间'," +
" `operation_instruction` text COMMENT '设备操作指令'," +
" `operation_describe` varchar(50) DEFAULT NULL COMMENT '设备操作描述'," +
" `device_old_state` text COMMENT '设备操作前状态'," +
" `device_new_state` text COMMENT '设备操作后的状态'," +
" `device_operation_type` varchar(11) DEFAULT NULL COMMENT '设备操作类型'," +
" `sensor_or_controller` varchar(50) DEFAULT '00' COMMENT '传感器或控制器编号(控制器以00_开头)'," +
" `is_state_change` int(11) DEFAULT '0' COMMENT '是否有状态改变(0否,1是)'," +
" PRIMARY KEY (`device_operation_id`)" +
") ENGINE=InnoDB AUTO_INCREMENT=3677 DEFAULT CHARSET=utf8"
),
//用户登录日志
UserLoginLog("用户登录日志数据库","ly_user_login",
"user_login_log",
2,
"CREATE TABLE IF NOT EXISTS `user_login_log` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id'," +
" `user_id` int(11) NOT NULL COMMENT '用户id'," +
" `user_login_name` varchar(50) NOT NULL COMMENT '用户登录名'," +
" `user_nickname` varchar(50) NOT NULL COMMENT '用户姓名'," +
" `user_type` int(11) NOT NULL DEFAULT '0' COMMENT '用户类型,默认0-普通用户,1-管理员,2客服'," +
" `login_province_id` varchar(50) DEFAULT NULL COMMENT '登录省份id'," +
" `login_city_id` varchar(50) DEFAULT NULL COMMENT '登录城市id'," +
" `login_province_name` varchar(50) DEFAULT NULL COMMENT '登录省份名'," +
" `login_city_name` varchar(50) DEFAULT NULL COMMENT '登录城市名'," +
" `login_address` varchar(50) DEFAULT NULL COMMENT '登陆地址'," +
" `login_ip` varchar(50) DEFAULT NULL COMMENT '登录ip'," +
" `create_time` int(11) NOT NULL COMMENT '登陆时间'," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB AUTO_INCREMENT=916 DEFAULT CHARSET=utf8"
),
//管理员登录日志
SysUserLoginLog("管理员登录日志数据库","ly_sys_user_login",
"sys_user_login_log",
1,
"CREATE TABLE IF NOT EXISTS `sys_user_login_log` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id'," +
" `user_login_name` varchar(50) NOT NULL COMMENT '用户登录名'," +
" `user_phone` varchar(50) NOT NULL COMMENT '用户电话'," +
" `login_province_id` varchar(50) DEFAULT NULL COMMENT '登录省份id'," +
" `login_city_id` varchar(50) DEFAULT NULL COMMENT '登录城市id'," +
" `login_province_name` varchar(50) DEFAULT NULL COMMENT '登录省份名'," +
" `login_city_name` varchar(50) DEFAULT NULL COMMENT '登录城市名'," +
" `login_address` varchar(50) DEFAULT NULL COMMENT '登陆地址'," +
" `login_ip` varchar(50) DEFAULT NULL COMMENT '登录ip'," +
" `create_time` int(11) NOT NULL COMMENT '登陆时间'," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8"
),
//用户操作日志
LogUserOperation("用户操作日志数据库","ly_user_operation",
"log_user_operation",
3,
"CREATE TABLE IF NOT EXISTS `log_user_operation` (" +
" `operation_name` varchar(50) NOT NULL COMMENT '操作名称'," +
" `operation_ip` varchar(50) DEFAULT NULL COMMENT '操作ip'," +
" `operation_url` varchar(200) DEFAULT NULL COMMENT '操作连接'," +
" `operation_value` text COMMENT '操作值'," +
" `user_id` int(11) DEFAULT NULL COMMENT '用户id'," +
" `user_login_name` varchar(50) DEFAULT NULL COMMENT '用户名称'," +
" `user_nickname` varchar(50) DEFAULT NULL COMMENT '用户昵称'," +
" `create_time` int(11) NOT NULL COMMENT '创建时间'," +
" `module` varchar(50) DEFAULT NULL COMMENT '操作模块'," +
" `my_user_id` varchar(45) DEFAULT NULL COMMENT '我的用户id'," +
" `my_user_login_name` varchar(45) DEFAULT NULL COMMENT '我的用户名称'," +
" `my_user_nickname` varchar(45) DEFAULT NULL COMMENT '我的用户昵称'" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8"
),
//用户积分信息记录
UserIntegral("用户积分信息记录数据库","ly_user_integral",
"user_integral",
2,
"CREATE TABLE IF NOT EXISTS `user_integral` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id'," +
" `user_id` int(11) DEFAULT NULL COMMENT '用户id'," +
" `integral_before` int(11) DEFAULT NULL COMMENT '操作前积分数'," +
" `integral_end` int(11) DEFAULT NULL COMMENT '操作后积分数'," +
" `integral_number` int(11) DEFAULT NULL COMMENT '积分数量'," +
" `integral_type` int(11) DEFAULT NULL COMMENT '积分类型'," +
" `integral_type_name` varchar(50) DEFAULT NULL COMMENT '积分信息'," +
" `create_time` int(11) DEFAULT NULL COMMENT '创建时间'," +
" `remark` varchar(50) DEFAULT NULL COMMENT '备注'," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB AUTO_INCREMENT=4559 DEFAULT CHARSET=utf8"
),
//告警信息
DeviceAlarmInfo("告警信息数据库","ly_device_alarm_info",
"device_alarm_info",
3,
"CREATE TABLE IF NOT EXISTS `device_alarm_info` (" +
" `alarm_info_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id'," +
" `device_info_id` varchar(50) NOT NULL COMMENT '设备id'," +
" `alarm_code` varchar(50) NOT NULL COMMENT '告警代码'," +
" `alarm_time` int(11) DEFAULT NULL COMMENT '告警时间'," +
" `is_send_number` int(11) DEFAULT '0' COMMENT '发送次数'," +
" `alarm_state` int(11) DEFAULT '0' COMMENT '告警状态(1发生告警,0结束告警)'," +
" PRIMARY KEY (`alarm_info_id`)" +
") ENGINE=InnoDB AUTO_INCREMENT=399144 DEFAULT CHARSET=utf8"
),
//用户分享
UserShare("用户分享数据库","ly_user_share",
"user_share",
2,
"CREATE TABLE IF NOT EXISTS `user_share` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id'," +
" `user_id` int(11) NOT NULL COMMENT '用户id'," +
" `user_login_name` varchar(50) NOT NULL COMMENT '用户登录名称'," +
" `share_content` text COMMENT '分享内容'," +
" `share_time` int(11) NOT NULL COMMENT '分享时间'," +
" `share_type` int(11) NOT NULL COMMENT '分享类型(注:1-首页分享,2-曲线分享,3-病害报表分享,4-多天曲线分享)'," +
" `random_number` int(11) DEFAULT NULL COMMENT '随机数'," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB AUTO_INCREMENT=1301 DEFAULT CHARSET=utf8"
),
//用户等级记录
UserLevel("用户等级记录","ly_user_level",
"log_user_level",
2,
"CREATE TABLE IF NOT EXISTS `log_user_level` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id'," +
" `user_id` int(11) NOT NULL COMMENT '用户id'," +
" `user_login_name` varchar(50) NOT NULL COMMENT '用户登录名称'," +
" `operation` varchar(50) NOT NULL COMMENT '操作描述'," +
" `create_time` int(11) NOT NULL COMMENT '创建时间'," +
" `level` int(11) NOT NULL COMMENT '积分(可以为负数)'," +
" `use_type` int(11) NOT NULL COMMENT '使用类型'," +
" `order_id` int(11) NOT NULL COMMENT '关联支付表id'," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB AUTO_INCREMENT=1301 DEFAULT CHARSET=utf8"
),
//用户货币记录
UserCurrency("用户货币记录","ly_user_currency",
"log_user_currency",
2,
"CREATE TABLE IF NOT EXISTS `log_user_currency` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id'," +
" `user_id` int(11) NOT NULL COMMENT '用户id'," +
" `user_login_name` varchar(50) NOT NULL COMMENT '用户登录名称'," +
" `operation` varchar(50) NOT NULL COMMENT '操作描述'," +
" `create_time` int(11) NOT NULL COMMENT '创建时间'," +
" `currency` int(11) NOT NULL COMMENT '货币数(可以为负数)'," +
" `use_type` int(11) NOT NULL COMMENT '使用类型'," +
" `order_id` int(11) NOT NULL COMMENT '关联支付表id'," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB AUTO_INCREMENT=1301 DEFAULT CHARSET=utf8"
),
Device301Sensitivity("301传感器灵敏度数据","ly_device301_sensitivity","device301_sensitivity",
2,
"CREATE TABLE IF NOT EXISTS `device301_sensitivity` (" +
" `device_info_id` varchar(50) NOT NULL COMMENT '设备信息表id'," +
" `pump_current` varchar(10) DEFAULT NULL COMMENT '水泵电流'," +
" `leakage_current` varchar(10) DEFAULT NULL COMMENT '泄露电流'," +
" `magnification` varchar(10) DEFAULT NULL COMMENT '放大倍数'," +
" `sensor_sensitivity` varchar(10) DEFAULT NULL COMMENT '传感器灵敏度'," +
" `sensor_accuracy` varchar(10) DEFAULT NULL COMMENT '传感器准确度'," +
" `create_time` int(11) NOT NULL COMMENT '添加时间'" +
" ) ENGINE=InnoDB DEFAULT CHARSET=utf8"),
LogSyswebErr("系统运行错误日志","ly_sysweb_err","log_sysweb_err",2,
"CREATE TABLE IF NOT EXISTS `log_sysweb_err` (" +
" `create_time` int(11) DEFAULT NULL COMMENT '创建时间'," +
" `url` varchar(200) DEFAULT NULL COMMENT '请求链接'," +
" `parameter_value` text COMMENT '参数'," +
" `err_message` text COMMENT '错误信息'" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8")
;
public String alias; //别名
public String dateBaseName; //数据库名称
public String tableName; //表名
public String generateSql; //创建sql
public int accuracy; //表类型(1年表,2月表,3日表)
TableGenerateSqlEnum(String alias, String dateBaseName, String tableName, int accuracy, String generateSql)
{
this.alias = alias;
this.dateBaseName = dateBaseName;
this.tableName = tableName;
this.accuracy = accuracy;
this.generateSql = generateSql;
}
public String getTableName(Date date)
{
return TableUtil.getTableName(date, dateBaseName, tableName,accuracy);
}
public String getNowTableName()
{
return TableUtil.getNowTableName( dateBaseName, tableName,accuracy);
}
public String getTableName(String date)
{
return TableUtil.getTableName( date,dateBaseName, tableName,accuracy);
}
public String getTableName(Integer date)
{
return getTableName(new Date(date*1000l));
}
}
... ...
package com.zhonglai.luhui.api.controller.data;
import com.ruoyi.common.utils.DateUtils;
import java.util.Date;
public class TableUtil {
public TableUtil() {
}
public static String getNowTableName(String dateBase, String tableName, int accuracy) {
return getTableName(getTimeToString(), dateBase, tableName, accuracy);
}
public static String getTableName(Date date, String dateBase, String tableName, int accuracy) {
return getTableName(getTimeToString(date), dateBase, tableName, accuracy);
}
public static String getTableName(String date, String dateBase, String tableName, int accuracy) {
String[] datas = date.split("-");
dateBase = dateBase + "_" + datas[0];
if (0 == accuracy) {
tableName = tableName + "";
} else if (1 == accuracy) {
tableName = tableName + "_" + datas[0];
} else if (2 == accuracy) {
tableName = tableName + "_" + datas[0] + datas[1];
} else if (3 == accuracy) {
tableName = tableName + "_" + datas[0] + datas[1] + datas[2];
} else {
tableName = tableName + "_" + datas[0] + datas[1] + datas[2];
}
return dateBase + "." + tableName;
}
public static String getTimeToString(long dateValue) {
return DateUtils.parseDateToStr( "yyyy-MM-dd",new Date(dateValue));
}
public static String getTimeToString(int dateValue) {
return DateUtils.parseDateToStr("yyyy-MM-dd",new Date((long)dateValue * 1000L));
}
public static String getTimeToString(Date dateValue) {
return DateUtils.parseDateToStr( "yyyy-MM-dd",dateValue);
}
public static String getTimeToString() {
return DateUtils.parseDateToStr("yyyy-MM-dd",new Date());
}
}
... ...
package com.zhonglai.luhui.api.controller.data.mapper;
import com.zhonglai.luhui.api.controller.data.DeviceSensorData;
import com.zhonglai.luhui.dao.dto.PublicSQL;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.springframework.stereotype.Component;
import tk.mybatis.mapper.common.BaseMapper;
import java.util.List;
@Component(value = "DeviceSensorDataMapper")
public interface DeviceSensorDataMapper extends BaseMapper<DeviceSensorData> {
@SelectProvider(type = PublicSQL.class, method = "getObjectListBySQL")
List<DeviceSensorData> getDeviceSensorDataList(@Param("sql") String sql);
}
... ...
... ... @@ -12,10 +12,10 @@ spring:
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
enabled: true
url: jdbc:mysql://rm-wz9a3l0g7cjysv8054o.mysql.rds.aliyuncs.com:3306/ly-device-data?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: luhui
password: Luhui586
# 初始连接数
initialSize: 5
# 最小连接池数量
... ...
... ... @@ -14,7 +14,7 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
... ...
... ... @@ -25,21 +25,9 @@
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-sys-service</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-swagger</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-datasource</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-public-dao</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
... ... @@ -48,18 +36,13 @@
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-analysis</artifactId>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.zhonglai.luhui</groupId>-->
<!-- <artifactId>lh-jar-device-analysis</artifactId>-->
<!-- </dependency>-->
</dependencies>
<build>
... ... @@ -85,7 +68,7 @@
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.http.service.Main</mainClass>
<mainClass>com.zhonglai.luhui.http.service.LhHttpServiceApplication</mainClass>
</manifest>
</archive>
</configuration>
... ... @@ -98,7 +81,7 @@
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/package.xml</descriptor>
<descriptor>${project.parent.parent.basedir}/configs/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
... ...
package com.zhonglai.luhui.http.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.framework.config.ResourcesConfig;
import com.zhonglai.luhui.device.service.DeviceControlService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
@ComponentScan(basePackages = {
"com.ruoyi.common",
"com.ruoyi.framework",
"com.zhonglai.luhui.datasource",
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.device",
"com.zhonglai.luhui.redis",
"com.zhonglai.luhui.rocketmq",
"com.zhonglai.luhui.http.service",
}
)
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class})
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class LhHttpServiceApplication {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
logger.info("启动服务");
SpringApplication.run(LhHttpServiceApplication.class,args);
System.out.println("启动成功");
}
}
... ...
... ... @@ -8,6 +8,7 @@ import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
... ... @@ -23,19 +24,29 @@ public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("设备http服务器")
.apiInfo(
new ApiInfoBuilder().title("标题:设备http服务器")
.description("设备http服务器")
.contact(new Contact(ruoyiConfig.getName(), null, null))
.version("版本号:" + ruoyiConfig.getVersion())
.build()
)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:登陆服务")
// 描述
.description("描述:各种角色的登陆接口")
// 作者信息
.contact(new Contact(ruoyiConfig.getName(), null, null))
// 版本
.version("版本号:" + ruoyiConfig.getVersion())
.build();
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.http.service.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDtoClassNew;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreementFactory;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.service.CacheService;
import com.zhonglai.luhui.device.analysis.comm.service.DataPersistenceService;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.service.IIotDeviceService;
import com.zhonglai.luhui.http.service.util.HttpServletRequestUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
... ... @@ -15,10 +30,24 @@ import javax.servlet.http.HttpServletResponse;
@Api(tags = "设备操作")
@RestController
@RequestMapping("/device")
public class DeviceService {
public class DeviceServiceController {
private static final Logger log = LoggerFactory.getLogger(DeviceServiceController.class);
private static String authKey = "key";
@Autowired
private IIotDeviceService deviceService ;
@Autowired
private BusinessAgreementFactory businessAgreementFactory;
@Autowired
private CacheService cacheService; //数据缓存
@Autowired
private DataPersistenceService dataPersistenceService; //数据持久化
/**
* 添加校验
* @return
... ... @@ -30,19 +59,54 @@ public class DeviceService {
if(StringUtils.isNoneEmpty(key))
{
response.setStatus(403);
throw new ServiceException("验证失败");
}
}
@ApiOperation("更新指定设备的全部数据")
@RequestMapping(value = "putAllData/{deviceid}")
public AjaxResult putAllData(@PathVariable String deviceid)
@RequestMapping(value = "putAllData/{deviceid}/{messageid}")
public AjaxResult putDeviceAllData(@PathVariable String deviceid,@PathVariable String messageid,HttpServletRequest request) throws Exception {
String str = HttpServletRequestUtil.getAllParametersAsJSON(request);
if(StringUtils.isEmpty(str))
{
return AjaxResult.error("数据为空");
}
String imei = deviceid.split("_")[0];
IotDevice iotDevice = deviceService.selectIotDeviceByClient_id(imei);
Topic topic = new Topic();
topic.setRoleid(iotDevice.getProduct_id()+"");
topic.setUsername(iotDevice.getMqtt_username());
topic.setClientid(iotDevice.getClient_id());
topic.setTopicType("PUT");
topic.setMessageid(messageid);
topic.setPayloadtype("json");
//转化为协议对象
BusinessDto businessDto = BusinessDtoClassNew.newBean(topic.getPayloadtype(),str.getBytes()).analyticalModel(iotDevice.getThings_model_value());
BusinessAgreement businessAgreement = businessAgreementFactory.createBusinessAgreement(topic);
//解析为业务对象
ServerDto dto = businessAgreement.analysis(topic,businessAgreement.toData(businessDto));
if(null == dto)
{
return AjaxResult.error("没有业务解析方法");
}
log.info("{} 解析到的dto【{}】",dto);
//缓存数据
cacheService.updateCache(topic,dto);
//数据持久化
dataPersistenceService.persistence(topic,dto);
return AjaxResult.success();
}
@ApiOperation("更新指定设备的部分数据")
@RequestMapping(value = "putPartialData/{deviceid}")
public AjaxResult putPartialData(@PathVariable String deviceid)
public AjaxResult putDevicePartialData(@PathVariable String deviceid)
{
return AjaxResult.success();
}
... ...
package com.zhonglai.luhui.http.service.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class HttpServletRequestUtil {
public static String getAllParametersAsJSON(HttpServletRequest request) {
Map<String, String[]> parameters = request.getParameterMap();
Map<String, Object> allParameters = new HashMap<>();
// 将URL参数添加到参数Map中
for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
String key = entry.getKey();
String[] values = entry.getValue();
if (values.length == 1) {
allParameters.put(key, values[0]);
} else {
allParameters.put(key, values);
}
}
// 将请求体参数添加到参数Map中
try {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> requestBodyParameters = objectMapper.readValue(request.getInputStream(), Map.class);
allParameters.putAll(requestBodyParameters);
} catch (IOException e) {
e.printStackTrace();
}
// 将参数Map转化为JSON格式的字符串
ObjectMapper objectMapper = new ObjectMapper();
String json = "";
try {
json = objectMapper.writeValueAsString(allParameters);
} catch (IOException e) {
e.printStackTrace();
}
return json;
}
}
... ...
# 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8065 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/*
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8061 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true ##redic配置 redis: database: 1 # Redis服务器地址 写你的ip host: 47.112.163.61 # Redis服务器连接端口 port: 9527 # Redis服务器连接密码(默认为空) password: Luhui586 # 连接池最大连接数(使用负值表示没有限制 类似于mysql的连接池 jedis: pool: max-active: 200 # 连接池最大阻塞等待时间(使用负值表示没有限制) 表示连接池的链接拿完了 现在去申请需要等待的时间 max-wait: -1 # 连接池中的最大空闲连接 max-idle: 10 # 连接池中的最小空闲连接 min-idle: 0 # 连接超时时间(毫秒) 去链接redis服务端 timeout: 6000 # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.luhui.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /** redis: field: "lh:mqttservice:" isText: false # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-http-service-deviceCommand-test send-tags: 1
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
\ No newline at end of file
... ...
... ... @@ -73,7 +73,7 @@
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.login.LhLoginApplication</mainClass>
<mainClass>com.zhonglai.luhui.http.service.LhHttpServiceApplication</mainClass>
</manifest>
</archive>
</configuration>
... ...
... ... @@ -4,9 +4,9 @@ import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.login.service.LoginService;
import com.zhonglai.luhui.login.model.LoginBody;
import com.zhonglai.luhui.login.model.RegisterBody;
import com.zhonglai.luhui.login.service.LoginService;
import com.zhonglai.luhui.login.service.SysRegisterService;
import com.zhonglai.luhui.sys.service.ISysConfigService;
import io.swagger.annotations.Api;
... ...
... ... @@ -4,6 +4,7 @@ import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.login.service.LoginService;
import com.zhonglai.luhui.security.dto.LoginToken;
import com.zhonglai.luhui.security.dto.OpenAiLoginUser;
import com.zhonglai.luhui.security.dto.OpenAiUserInfo;
... ...
... ... @@ -82,39 +82,6 @@
<version>${swagger-ui.version}</version>
</dependency>
<!-- mqtt -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
</dependency>
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
</dependency>
<!-- 数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!-- 支持data -->
<dependency>
... ...
... ... @@ -3,6 +3,7 @@ package com.zhonglai.luhui.mqtt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
... ... @@ -16,7 +17,7 @@ import org.springframework.context.annotation.ComponentScan;
"com.zhonglai.luhui.mqtt.service",
"com.zhonglai.luhui.mqtt.controller",
})
@SpringBootApplication
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class MqttApplication {
private static Logger log = LoggerFactory.getLogger(MqttApplication.class);
... ...
package com.zhonglai.luhui.mqtt.comm.rocketMq;
import com.alibaba.fastjson.JSON;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceCommandApi;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import com.zhonglai.luhui.mqtt.comm.service.DeviceCommandApi;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import com.zhonglai.luhui.mqtt.comm.service.MqttDeviceService;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
... ... @@ -21,7 +22,7 @@ public class RocketMqService implements RocketMQReplyListener<MessageExt, Messag
private static final Logger log = LoggerFactory.getLogger(RocketMqService.class);
@Autowired
private DeviceService deviceService ;
private MqttDeviceService deviceService ;
@Override
public Message onMessage(MessageExt messageExt) {
... ...
package com.zhonglai.luhui.mqtt.comm.dto;
package com.zhonglai.luhui.mqtt.comm.service;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.dto.ApiName;
... ... @@ -7,7 +7,6 @@ import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import org.eclipse.paho.client.mqttv3.MqttException;
/**
... ... @@ -17,7 +16,7 @@ public class DeviceCommandApi {
private ApiName apiName; //指令接口名称
private DeviceCommandApiParameter deviceCommandApiParameter; //参数
public Message invokeApi(DeviceService deviceService) throws MqttException, InterruptedException {
public Message invokeApi(MqttDeviceService deviceService) throws InterruptedException, MqttException {
switch (apiName)
{
case read:
... ... @@ -29,8 +28,10 @@ public class DeviceCommandApi {
case closeSession:
return deviceService.closeSession(deviceCommandApiParameter.getClient_id());
case delIotDevice:
deviceService.closeSession(deviceCommandApiParameter.getClient_id()); //强制下线
return deviceService.delIotDevice(deviceCommandApiParameter.getClient_id());
case delIotTerminal:
deviceService.closeSession(deviceCommandApiParameter.getClient_id()); //强制下线
return deviceService.delIotTerminal(deviceCommandApiParameter.getClient_id(),deviceCommandApiParameter.getNumber());
case getFirmwareVersion:
return deviceService.getFirmwareVersion(deviceCommandApiParameter.getData());
... ...
... ... @@ -3,13 +3,15 @@ package com.zhonglai.luhui.mqtt.comm.service;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDtoClassNew;
import com.zhonglai.luhui.device.analysis.comm.service.CacheService;
import com.zhonglai.luhui.device.analysis.comm.service.DataPersistenceService;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreementFactory;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.util.TopicUtil;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import lombok.SneakyThrows;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import com.zhonglai.luhui.device.analysis.comm.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelBase;
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.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.service.*;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.dto.topic.AddPostDto;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.service.ClienNoticeService;
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;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class MqttDeviceService extends DeviceService{
private static final Logger log = LoggerFactory.getLogger(MqttDeviceService.class);
@Autowired
private ClienNoticeService clienNoticeService;
@Autowired
private DeviceLogService dviceLogService;
@Autowired
private CacheServiceImpl cacheServiceImpl;
@Autowired
private DataPersistenceServiceImpl dataPersistenceService;
@Autowired
private BusinessDataUpdateService businessDataUpdateService ;
@Autowired
private TerminalDataThingsModeService terminalDataThingsModeService;
/**
* 控制发16进制指令
* @param clienid
* @param data
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message controlHex(String clienid, String data) throws MqttException, InterruptedException {
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("PUT");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
MqttMessage mqttMessage = new MqttMessage();
byte[] bs = hexStringToByte(data.trim().toUpperCase());
mqttMessage.setPayload(bs);
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
if(1==message.getCode())
{
List<LogDeviceOperation> list = new ArrayList<>();
list.add(dviceLogService.newLogDeviceOperation(clienid,null!=message.getData()? JSON.toJSONString(message.getData()):null,null,"远程操作控制设备","controlHex?"+data));
dviceLogService.saveOperationLog(list);
}
return message;
}
/**
* 控制发json
* @param clienid
* @param map
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message control(String clienid, Map<String,Object> map) throws MqttException, InterruptedException {
if(null == map || map.size() ==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"参数验证失败");
}
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("PUT");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
StringBuffer stringBuffer = new StringBuffer("");
List<LogDeviceOperation> logDeviceOperationList = new ArrayList<>();
for(String key:map.keySet())
{
Object sendMap = map.get(key);
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(sendMap));
for(String skey:jsonObject.keySet())
{
IotThingsModel thingsModel = terminalDataThingsModeService.getIotThingsModel(topic.getUsername(),skey);
if(null == thingsModel) //没有配置的 都按字符串处理
{
thingsModel = new IotThingsModel();
thingsModel.setData_type(ThingsModelDataTypeEnum.STRING.name());
thingsModel.setIdentifier(key);
thingsModel.setModel_name(key);
thingsModel.setIs_top(0);
thingsModel.setIs_monitor(0);
thingsModel.setIs_save_log(0);
thingsModel.setIs_config(0);
JSONObject spes = new JSONObject();
spes.put("maxLength",255);
thingsModel.setSpecs(spes.toString());
}
String data_type = thingsModel.getData_type().toUpperCase();
Class<ThingsModelBase> aClass = Enum.valueOf(ThingsModelDataTypeEnum.class,data_type).getaClass();
ThingsModelBase thingsModelBase = JSON.parseObject(thingsModel.getSpecs(),aClass);
thingsModelBase.conversionThingsModel(thingsModel);
Object object = jsonObject.get(skey);
// Type clas = ((ParameterizedType)aClass.getGenericSuperclass()).getActualTypeArguments()[0];
// if(null != object && object.getClass()!=clas)
// {
// return new Message(MessageCode.DEFAULT_FAIL_CODE,skey+" 参数数据类型和模型数据类型("+clas+")不一致");
// }
ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase;
jsonObject.put(skey,thingsModelItemBase.getCmdView(object));
thingsModelBase.addValue(thingsModelItemBase.getCmdView(object));
String id = clienid+"_"+key;
logDeviceOperationList.add(dviceLogService.newLogDeviceOperation(id,thingsModelItemBase.getSaveView(),null,"远程控制"+thingsModelItemBase.getName()+"为"+thingsModelItemBase.getView(),null));
}
map.put(key,jsonObject);
}
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
if(1==message.getCode())
{
topic.setClientid(clienid);
AddPostDto addPostDto = new AddPostDto();
addPostDto.setData(JSON.parseObject(JSON.toJSONString(map)));
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);
}
return message;
}
/**
* 读
* @param clienid
* @param map
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message read(String clienid,Map<String,Object> map) throws MqttException, InterruptedException {
log.info("api请求读取 {} 参数 {}",map);
if(null == map || map.size() ==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"参数验证失败");
}
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("READ");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
if(1==message.getCode())
{
List<LogDeviceOperation> list = new ArrayList<>();
list.add(dviceLogService.newLogDeviceOperation(clienid,JSON.toJSONString(message.getData()),null,"远程操作读取配置参数","read?"+JSON.toJSONString(map).trim()));
dviceLogService.saveOperationLog(list);
}
return message;
}
/**
* 强行断开链接
* @param clienid
* @return
* @throws MqttException
* @throws InterruptedException
*/
public Message closeSession(String clienid) throws MqttException, InterruptedException {
MqttMessage mqttMessage = new MqttMessage();
byte[] bs = hexStringToByte(clienid.trim().toUpperCase());
mqttMessage.setPayload(bs);
clienNoticeService.sendMessage("CLOSE",mqttMessage);
List<LogDeviceOperation> list = new ArrayList<>();
list.add(dviceLogService.newLogDeviceOperation(clienid,null,null,"远程操作强行断开链接","closeSession?"));
dviceLogService.saveOperationLog(list);
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"端口请求已发送");
}
}
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.service.DataModeAnalysisService;
import com.zhonglai.luhui.mqtt.comm.util.TopicUtil;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttClient;
... ...
... ... @@ -3,7 +3,7 @@ package com.zhonglai.luhui.mqtt.comm.util;
import com.zhonglai.luhui.device.analysis.comm.dto.MyException;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.StringUtils;
import com.zhonglai.luhui.mqtt.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ...
... ... @@ -5,8 +5,9 @@ import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import com.zhonglai.luhui.device.analysis.comm.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.mqtt.comm.service.MqttDeviceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.eclipse.paho.client.mqttv3.MqttException;
... ... @@ -23,31 +24,36 @@ public class DeviceController {
@Autowired
private DeviceService deviceService ;
@Autowired
private MqttDeviceService mqttDeviceService ;
@Autowired
private TerminalDataThingsModeService terminalDataThingsModeService;
@ApiOperation("控制发16进制指令")
@RequestMapping(value = "controlHex/{clienid}",method = RequestMethod.POST)
public Message controlHex(@PathVariable String clienid, String data) throws MqttException, InterruptedException {
return deviceService.controlHex(clienid,data);
return mqttDeviceService.controlHex(clienid,data);
}
@ApiOperation("读")
@RequestMapping(value = "read/{clienid}",method = RequestMethod.POST)
public Message read(@PathVariable String clienid,@RequestBody Map<String,Object> map) throws MqttException, InterruptedException {
return deviceService.read(clienid,map);
return mqttDeviceService.read(clienid,map);
}
@ApiOperation("强行断开链接")
@RequestMapping(value = "closeSession/{clienid}",method = RequestMethod.POST)
public Message closeSession(@PathVariable String clienid) throws MqttException, InterruptedException {
return deviceService.closeSession(clienid);
return mqttDeviceService.closeSession(clienid);
}
@ApiOperation("删除主机")
@Transactional
@RequestMapping(value = "delIotDevice/{client_id}",method = RequestMethod.POST)
public Message delIotDevice(@PathVariable String client_id) throws MqttException, InterruptedException {
mqttDeviceService.closeSession(client_id); //强制下线
return deviceService.delIotDevice(client_id);
}
... ... @@ -55,13 +61,14 @@ public class DeviceController {
@Transactional
@RequestMapping(value = "delIotTerminal/{client_id}/{number}",method = RequestMethod.POST)
public Message delIotTerminal(@PathVariable String client_id,@PathVariable String number) throws MqttException, InterruptedException {
mqttDeviceService.closeSession(client_id); //强制下线
return deviceService.delIotTerminal(client_id,number);
}
@ApiOperation("控制发json")
@RequestMapping(value = "control/{clienid}",method = RequestMethod.POST)
public Message control(@PathVariable String clienid,@RequestBody Map<String,Object> map) throws MqttException, InterruptedException {
return deviceService.control(clienid,map);
return mqttDeviceService.control(clienid,map);
}
@ApiOperation("获取指定设备版本信息")
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.mqtt.service;
import com.zhonglai.luhui.device.analysis.comm.clien.ClienConnection;
import com.zhonglai.luhui.device.analysis.comm.clien.impl.ClienConnectionImpl;
... ... @@ -7,6 +7,7 @@ import com.zhonglai.luhui.device.analysis.comm.dto.TerminalClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.dto.Message;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.TerminalService;
import com.zhonglai.luhui.mqtt.comm.util.TopicUtil;
import net.jodah.expiringmap.ExpirationListener;
import net.jodah.expiringmap.ExpirationPolicy;
... ...
... ... @@ -5,7 +5,7 @@ import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.device.analysis.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.device.analysis.dto.topic.AddPostDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
... ... @@ -5,7 +5,7 @@ import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.device.analysis.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.device.analysis.dto.topic.AllPostDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
... ... @@ -3,13 +3,13 @@ package com.zhonglai.luhui.mqtt.service.topic;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.dto.TerminalClientRePlyDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.ClienNoticeService;
import com.zhonglai.luhui.mqtt.service.ClienNoticeService;
import com.zhonglai.luhui.device.analysis.comm.util.StringUtils;
import com.zhonglai.luhui.device.analysis.dto.topic.GetDto;
import com.zhonglai.luhui.mqtt.comm.util.TopicUtil;
... ...
... ... @@ -6,8 +6,8 @@ import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.dto.topic.OnlineDto;
import com.zhonglai.luhui.mqtt.service.CacheServiceImpl;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import com.zhonglai.luhui.device.analysis.comm.service.CacheServiceImpl;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
... ... @@ -5,7 +5,7 @@ import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.ClienNoticeService;
import com.zhonglai.luhui.mqtt.service.ClienNoticeService;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.dto.topic.PutReqDto;
import org.springframework.beans.factory.annotation.Autowired;
... ...
... ... @@ -9,10 +9,10 @@ import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelBase;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.analysis.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.ClienNoticeService;
import com.zhonglai.luhui.mqtt.service.ClienNoticeService;
import com.zhonglai.luhui.device.analysis.dto.MessageCode;
import com.zhonglai.luhui.device.analysis.dto.topic.ReadReqDto;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import com.zhonglai.luhui.device.analysis.comm.db.mode.TerminalDataThingsModeService;
import org.apache.commons.lang3.EnumUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
... ... @@ -13,7 +13,6 @@ import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.login.service.LocalLoginService;
import com.zhonglai.luhui.login.service.LoginService;
import com.zhonglai.luhui.security.dto.OpenAiUserInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
... ...
#!/bin/bash
APP_PATH="/path/to/your/application"
APP_JAR="yourapp.jar"
SERVICE_NAME="yourapp"
# 创建systemd服务文件
echo "[Unit]
Description=Your Java Application
After=network.target
[Service]
User=root
WorkingDirectory=$APP_PATH
ExecStart=/usr/bin/java -jar $APP_JAR
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
[Install]
WantedBy=multi-user.target
" > /etc/systemd/system/$SERVICE_NAME.service
# 重新加载systemd,使新的服务生效
systemctl daemon-reload
# 开启服务
systemctl start $SERVICE_NAME
# 设置服务开机自启
systemctl enable $SERVICE_NAME
echo "Service $SERVICE_NAME installed."
... ...
package com.zhonglai.luhui.smart.feeder.config.manager;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.common.utils.spring.SpringUtils;
import java.util.TimerTask;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 异步任务管理器
*
* @author ruoyi
*/
public class AsyncManager
{
/**
* 异步操作任务调度线程池
*/
private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
/**
* 单例模式
*/
private AsyncManager(){}
private static AsyncManager me = new AsyncManager();
public static AsyncManager me()
{
return me;
}
/**
* 停止任务线程池
*/
public void shutdown()
{
Threads.shutdownAndAwaitTermination(executor);
}
}
... ...
//package com.zhonglai.luhui.smart.feeder.config.manager;
//
//import com.zhonglai.luhui.smart.feeder.service.EhCacheService;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.PreDestroy;
//
///**
// * 确保应用退出时能关闭后台线程
// *
// * @author ruoyi
// */
//@Component
//public class ShutdownManager
//{
// private static final Logger logger = LoggerFactory.getLogger(ShutdownManager.class);
//
// @Autowired
// private EhCacheService ehCacheService;
//
// @PreDestroy
// public void destroy()
// {
// shutdownAsyncManager();
// ehCacheService.shutdown();
// }
//
// /**
// * 停止异步执行任务
// */
// private void shutdownAsyncManager()
// {
// try
// {
// logger.info("====关闭后台任务任务线程池111====");
// AsyncManager.me().shutdown();
// }
// catch (Exception e)
// {
// logger.error(e.getMessage(), e);
// }
// }
//}
... ...
... ... @@ -2,9 +2,9 @@ package com.zhonglai.luhui.smart.feeder.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.smart.feeder.config.WebSocketClien;
import com.zhonglai.luhui.smart.feeder.dto.SysConfig;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.VeiwType;
import com.zhonglai.luhui.smart.feeder.service.CameraService;
import com.zhonglai.luhui.smart.feeder.service.ConfigurationParameterService;
import com.zhonglai.luhui.smart.feeder.service.DeviceService;
import com.zhonglai.luhui.smart.feeder.service.FishGroupImageRecognitionService;
import io.swagger.annotations.Api;
... ... @@ -23,20 +23,15 @@ import java.io.IOException;
@RestController
@RequestMapping("/camera")
public class CameraController {
@Autowired
private CameraService cameraService;
@Autowired
private DeviceService deviceService;
@Autowired
private FishGroupImageRecognitionService fishGroupImageRecognitionService;
@ApiOperation("打开鱼群识别")
@GetMapping("/open")
public AjaxResult open()
{
fishGroupImageRecognitionService.start(VeiwType.html);
// fishGroupImageRecognitionService.start(VeiwType.html);
return AjaxResult.success();
}
... ... @@ -44,7 +39,7 @@ public class CameraController {
@GetMapping("/close")
public AjaxResult close()
{
fishGroupImageRecognitionService.stop();
// fishGroupImageRecognitionService.stop();
return AjaxResult.success();
}
... ... @@ -56,13 +51,6 @@ public class CameraController {
return AjaxResult.success();
}
@ApiOperation("设置摄像头usb口编号")
@GetMapping("/setNumber/{number}")
public AjaxResult setNumber(@PathVariable Integer number)
{
SysConfig.captureNumber = number;
return AjaxResult.success();
}
@ApiOperation("打开串口")
@ApiImplicitParams({
@ApiImplicitParam(value = "串口名称",name = "portName"),
... ... @@ -80,7 +68,6 @@ public class CameraController {
@ApiOperation("串口发送指令")
@GetMapping("/sendSerialData")
public AjaxResult sendSerialData(String hexStr) throws IOException {
;
return AjaxResult.success().put("data",deviceService.sendData(hexStr));
}
... ... @@ -89,4 +76,5 @@ public class CameraController {
public AjaxResult getAllSerial() {
return AjaxResult.success().put("data",deviceService.getAllSerial());
}
}
... ...
package com.zhonglai.luhui.smart.feeder.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.smart.feeder.dto.ConfigDto;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.VeiwType;
import com.zhonglai.luhui.smart.feeder.service.ConfigurationParameterService;
import com.zhonglai.luhui.smart.feeder.service.FishGroupImageRecognitionService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.ApiOperation;
import org.ehcache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Iterator;
@Api(tags = "配置")
@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowired
private ConfigurationParameterService configurationParameterService;
@ApiOperation("获取配置所有参数")
@GetMapping("/all")
public AjaxResult all()
{
AjaxResult ajaxResult = AjaxResult.success();
Cache<String, Object> cache = configurationParameterService.getAll();
Iterator<Cache.Entry<String, Object>> iterator = cache.iterator();
while (iterator.hasNext()) {
Cache.Entry<String, Object> entry = iterator.next();
String key = entry.getKey();
Object value = entry.getValue();
// Process the key and value as needed.
ajaxResult.put(key,value);
}
return ajaxResult;
}
@ApiOperation("参数配置")
@PostMapping("/set")
public AjaxResult set(@RequestBody ConfigDto configDto)
{
configurationParameterService.setConfig(configDto.getConfigurationParameter(),configDto.getValue());
return AjaxResult.success();
}
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import java.io.Serializable;
public class CacheConfigurationObject extends Object implements Serializable {
public CacheConfigurationObject()
{
}
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import lombok.Data;
@Data
public class ConfigDto {
private ConfigurationParameter configurationParameter;
private Object value;
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
public class ConfigurationParameter {
public Integer captureNumber; //摄像头编号
public Integer reflectionThreshold; //反光阈值
public Integer kernelSize; //去噪调整内核大小,用来消除小的物体或噪声
public Double maxValue; //最大反光阈值
import java.util.ArrayList;
import java.util.HashMap;
public enum ConfigurationParameter {
ifVeiw(false),//是否显示
captureNumber(0),//摄像头编号
reflectionThreshold(100),//反光阈值
kernelSize(3),//去噪调整内核大小,用来消除小的物体或噪声
maxValue(255.0), //最大反光阈值
gear_command (new HashMap<Integer,String>()), //档位对应的指令
absValue_command (new ArrayList<FishCurveControlCondition>()), //斜率范围对应的档位
VeiwDto_isFrame(false), //是否显示原图
VeiwDto_isBinaryImage(false), //是否显示临时图
VeiwDto_isSize(false), //是否显示面积
VeiwDto_isAbsValue(false), //是否显示斜率
absValue(0), //是否显示斜率
FishGroupImageRecognition(true), //鱼群图像识别是否开启
FeedingControl(true), //鱼群图像识别投料控制是否开启
SerialPortConfig(new SerialPortConfig().defaultSerialPortConfig()),//串口配置
;
private Object value;
ConfigurationParameter(Object value) {
this.value = value;
}
public Object getValue()
{
return value;
}
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
/**
* 斜率范围对应的档位
*/
public class FishCurveControlCondition {
private Integer sartAbsValue; //开始斜率
private Integer gear; //档位
public Integer getGear() {
return gear;
}
public void setGear(Integer gear) {
this.gear = gear;
}
public Integer getSartAbsValue() {
return sartAbsValue;
}
public void setSartAbsValue(Integer sartAbsValue) {
this.sartAbsValue = sartAbsValue;
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import org.ehcache.spi.serialization.Serializer;
import org.ehcache.spi.serialization.SerializerException;
import java.io.*;
import java.nio.ByteBuffer;
public class MyCustomSerializer implements Serializer<Object>{
private final ClassLoader classLoader;
public MyCustomSerializer(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public ByteBuffer serialize(Object object) throws SerializerException {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(object);
objectOutputStream.flush();
return ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
} catch (IOException e) {
throw new SerializerException(e);
}
}
@Override
public Object read(ByteBuffer byteBuffer) throws ClassNotFoundException, SerializerException {
try {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteBuffer.array());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return objectInputStream.readObject();
} catch (IOException e) {
throw new SerializerException(e);
}
}
@Override
public boolean equals(Object o, ByteBuffer byteBuffer) throws ClassNotFoundException, SerializerException {
return o.equals(read(byteBuffer));
}
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import lombok.Data;
import java.io.Serializable;
/**
* 串口配置
*/
@Data
public class SerialPortConfig implements Serializable {
private static final long serialVersionUID = 3608437294824852022L;
private String portName; // 串口名称
private Integer baudrate; // 波特率,用于指定每秒传输的位数。
private Integer dataBits; // 数据位,表示每个字节的位数。常见的值为 5、6、7、8。
private Integer stopBits; // 停止位,用于指定每个字节的停止位数。
private Integer parity; // 校验位,用于验证数据的正确性。常见的值有 NONE(无校验)、ODD(奇校验)、EVEN(偶校验)等。
public SerialPortConfig defaultSerialPortConfig()
{
portName = "COM6";
baudrate = 9600;
dataBits = 8;
stopBits = 0;
parity = 0;
return this;
}
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
public class SysConfig {
public static Integer captureNumber = 0; //摄像头编号
/**
* 反光阈值(reflectionThreshold)被设置为100。这意味着所有灰度值低于100的像素都会被设置为0(黑色),灰度值大于或等于100的像素都会被设置为255(白色)。如果你的图像中的对象或区域的灰度值接近或低于这个阈值,它们可能会被排除在二值图像之外。尝试调整这个阈值可能有助于改善结果
*/
public static int reflectionThreshold = 100; // 反光阈值
public static int kernelSize = 3; // 去噪调整内核大小,用来消除小的物体或噪声
public static double maxValue = 255; //最大反光阈值
}
... ... @@ -3,9 +3,10 @@ package com.zhonglai.luhui.smart.feeder.dto;
import org.opencv.core.Mat;
public class VeiwDto {
private Mat frame;
private Mat binaryImage;
private Integer size;
private Mat frame; //原始图像
private Mat binaryImage; //临时图像
private Integer size; //面积大小
private Double absValue; //变化的斜率
public VeiwDto(Mat frame, Integer size) {
this.frame = frame;
... ... @@ -18,6 +19,21 @@ public class VeiwDto {
this.size = size;
}
public VeiwDto(Mat frame, Mat binaryImage, Integer size, Double absValue) {
this.frame = frame;
this.binaryImage = binaryImage;
this.size = size;
this.absValue = absValue;
}
public Double getAbsValue() {
return absValue;
}
public void setAbsValue(Double absValue) {
this.absValue = absValue;
}
public VeiwDto() {
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
public class WebSocketVO {
private int size;
private String img;
import org.opencv.core.Mat;
public int getSize() {
import java.io.Serializable;
public class WebSocketVO implements Serializable {
private static final long serialVersionUID = 1L;
private String frame; //原始图像
private String binaryImage; //临时图像
private Integer size; //面积大小
private Double absValue; //变化的斜率
private String stateData; //运行数据json字符串
public String getStateData() {
return stateData;
}
public void setStateData(String stateData) {
this.stateData = stateData;
}
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
public String getBinaryImage() {
return binaryImage;
}
public void setBinaryImage(String binaryImage) {
this.binaryImage = binaryImage;
}
public Integer getSize() {
return size;
}
public void setSize(int size) {
public void setSize(Integer size) {
this.size = size;
}
public String getImg() {
return img;
public Double getAbsValue() {
return absValue;
}
public void setImg(String img) {
this.img = img;
public void setAbsValue(Double absValue) {
this.absValue = absValue;
}
}
... ...
... ... @@ -3,12 +3,15 @@ package com.zhonglai.luhui.smart.feeder.opencv;
import com.ruoyi.common.utils.DESUtil;
import com.zhonglai.luhui.smart.feeder.config.OpenCVConfig;
import com.zhonglai.luhui.smart.feeder.dto.VeiwDto;
import com.zhonglai.luhui.smart.feeder.service.CameraService;
import com.zhonglai.luhui.smart.feeder.service.impl.HtmllVeiwServiceImpl;
import com.zhonglai.luhui.smart.feeder.service.impl.JFrameVeiwServiceImpl;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.videoio.VideoCapture;
import org.opencv.imgproc.Imgproc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
... ... @@ -17,6 +20,7 @@ import java.util.List;
public class OpenCVUtil {
private static final Logger logger = LoggerFactory.getLogger(OpenCVUtil.class);
public static void main(String[] args) {
System.out.println(DESUtil.decode("5F06AAC657B2E2B287289D25D950A829", "EXU5RUhI1"));;
... ... @@ -50,12 +54,23 @@ public class OpenCVUtil {
public static VideoCapture readVideoCaptureForVideo(int i)
{
logger.info("初始化摄像头");
// 创建VideoCapture对象
VideoCapture videoCapture = new VideoCapture(i);
boolean isopen = videoCapture.isOpened();
System.out.println(isopen);
VideoCapture videoCapture = new VideoCapture();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
boolean isopen = videoCapture.open(i);
if(isopen)
{
logger.info("打开化摄像头"+i+"成功");
return videoCapture;
}
logger.info("打开化摄像头"+i+"失败");
return null;
}
public static VideoCapture readVideoCaptureForVideo(String videoPath )
{
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.zhonglai.luhui.smart.feeder.Main;
import com.zhonglai.luhui.smart.feeder.dto.SysConfig;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.opencv.OpenCVUtil;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -31,18 +29,46 @@ public class CameraService {
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@Autowired
private ConfigurationParameterService configurationParameterService;
/**
* 初始化摄像头
*/
private void openCapture()
{
videoCapture = OpenCVUtil.readVideoCaptureForVideo(SysConfig.captureNumber);
// videoCapture.set(Videoio.CAP_PROP_FRAME_WIDTH,640);
// videoCapture.set(Videoio.CAP_PROP_FRAME_HEIGHT,480);
// videoCapture.set(Videoio.CAP_PROP_FOURCC, 0x32595559);
// videoCapture.set(Videoio.CAP_PROP_FPS, 25);
videoCapture = OpenCVUtil.readVideoCaptureForVideo((Integer) configurationParameterService.getConfig(ConfigurationParameter.captureNumber));
monitorCapture();
logger.info("初始化摄像头");
// if (!videoIsOpen)
// {
// logger.info("摄像头打开失败尝试自动识别流程");
// int i=0;
// int j =0;
// while (!videoIsOpen && i<10)
// {
// logger.info("等待3秒");
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// throw new RuntimeException(e);
// }
// logger.info("开始尝试:"+i);
// videoCapture = OpenCVUtil.readVideoCaptureForVideo(i);
// monitorCapture();
// if(!videoIsOpen && j>=3)
// {
// j=0;
// i++;
// }
// j++;
// }
// if(!videoIsOpen)
// {
// logger.info("尝试0-10都没有成功退出尝试");
// }
//
// }
}
/**
... ... @@ -60,11 +86,11 @@ public class CameraService {
private void monitorCapture()
{
// 检查视频是否成功打开
if (videoCapture.isOpened()) {
if (null !=videoCapture && videoCapture.isOpened()) {
videoIsOpen = true;
return;
}
System.out.println("无法打开视频文件"+SysConfig.captureNumber);
System.out.println("无法打开视频文件"+ configurationParameterService.getConfig(ConfigurationParameter.captureNumber));
videoIsOpen = false;
}
... ... @@ -108,4 +134,9 @@ public class CameraService {
return videoCapture;
}
public Boolean getVideoIsOpen()
{
return videoIsOpen;
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import org.ehcache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* 配置参数
*/
@Service
public class ConfigurationParameterService {
@Autowired
private EhCacheService ehCacheService;
@PostConstruct
public void initConfigurationParameter()
{
for(ConfigurationParameter configurationParameter:ConfigurationParameter.values())
{
if(null ==ehCacheService.readFromCache( configurationParameter))
{
ehCacheService.writeToDiske(configurationParameter,configurationParameter.getValue());
}
}
}
public Cache<String, Object> getAll()
{
return ehCacheService.getMyCache();
}
public void setConfig(ConfigurationParameter configurationParameter,Object value)
{
ehCacheService.writeToDiske(configurationParameter,value);
}
public Object getConfig(ConfigurationParameter configurationParameter)
{
return ehCacheService.readFromCache(configurationParameter);
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.sun.deploy.net.HttpResponse;
import com.zhonglai.luhui.smart.feeder.util.serial.GlobalCache;
import com.zhonglai.luhui.smart.feeder.util.serial.SerialResquest;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.FishCurveControlCondition;
import com.zhonglai.luhui.smart.feeder.dto.SerialPortConfig;
import com.zhonglai.luhui.smart.feeder.util.serial.SerialTool;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.videoio.VideoCapture;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import purejavacomm.SerialPort;
import purejavacomm.SerialPortEvent;
import purejavacomm.SerialPortEventListener;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.Session;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 设备管理
... ... @@ -43,12 +41,57 @@ public class DeviceService {
private Double backSlope; //斜率
private Double slopeDifference; //斜率差值
public void controlDevice(double area)
private Double absValue; //斜率差值的绝对值
private Integer nowGear; //当前档位
@Autowired
private ConfigurationParameterService configurationParameterService;
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@Autowired
private EhCacheService ehCacheService;
@PostConstruct
public void run()
{
//投料控制
scheduledExecutorService.scheduleWithFixedDelay(() -> {
if (((Boolean)ehCacheService.readFromCache(ConfigurationParameter.FeedingControl))) {
Map<Integer,String> map = (Map<Integer, String>) ehCacheService.readFromCache(ConfigurationParameter.gear_command);
if(null != map && StringUtils.isNotEmpty( map.get(nowGear)))
{
send485SerialData(map.get(nowGear));
}
}
},1,1, TimeUnit.SECONDS);
}
public String getState()
{
Map<String,Object> map = new HashMap<>();
map.put("backArea",backArea);
map.put("slope",slope);
map.put("backSlope",backSlope);
map.put("slopeDifference",slopeDifference);
map.put("absValue",absValue);
map.put("nowGear",nowGear);
return GsonConstructor.get().toJson(map);
}
/**
* 根据面积计算斜率
* @param area
* @return
*/
public double controlDevice(double area)
{
if(null == backArea )
{
backArea = area;
return;
return 0;
}
slope = area-backArea;
... ... @@ -59,8 +102,57 @@ public class DeviceService {
slopeDifference = slope-backSlope;
double absValue = Math.abs(slopeDifference);
absValue = Math.abs(slopeDifference);
nowGear = getGearFromAbsValue();
return absValue;
}
private void send485SerialData(String commd)
{
if(null == serialPort)
{
openSerialPort();
}
try {
sendData(commd);
} catch (IOException e) {
logger.error("串口指令发送错误",e);
}
}
/**
* 根据斜率计算档位
* @return
*/
private Integer getGearFromAbsValue()
{
Integer gear = null;
List<FishCurveControlCondition> list = (List<FishCurveControlCondition>) ehCacheService.readFromCache(ConfigurationParameter.absValue_command);
if(null != list && list.size() != 0)
{
list.sort(Comparator.comparing(FishCurveControlCondition::getSartAbsValue));//以 sartAbsValue 升序排序
for(FishCurveControlCondition fishCurveControlCondition:list) //根据斜率找到档位
{
if(absValue>=fishCurveControlCondition.getSartAbsValue()) //向下查找
{
gear = fishCurveControlCondition.getGear();
}
}
}
return gear;
}
public void openSerialPort()
{
SerialPortConfig serialPortConfig = (SerialPortConfig) configurationParameterService.getConfig(ConfigurationParameter.SerialPortConfig);
try {
openSerialPort(serialPortConfig.getPortName(),serialPortConfig.getBaudrate(),serialPortConfig.getDataBits(),serialPortConfig.getStopBits(),serialPortConfig.getParity());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.CacheConfiguration;
import org.ehcache.config.ResourcePools;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ExpiryPolicyBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.units.MemoryUnit;
import org.ehcache.impl.serialization.PlainJavaSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
... ... @@ -36,6 +37,13 @@ public class EhCacheService {
cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File(cacheFilePath)))
.build(true);
if (cacheManager.getRuntimeConfiguration().getCacheConfigurations().containsKey(MY_CACHE))
{
// 缓存对象存在,直接读取
myCache = cacheManager.getCache(MY_CACHE, String.class, Object.class);
}else {
// 指定缓存的存储形式,采用多级缓存,并开启缓存持久化操作
ResourcePools resourcePools = ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(1, MemoryUnit.MB)
... ... @@ -44,22 +52,34 @@ public class EhCacheService {
// 封装缓存配置对象,指定了键值类型、指定了使用TTL与TTI联合的过期淘汰策略
CacheConfiguration<String, Object> cacheConfiguration =
CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Object.class, resourcePools)
.withValueSerializer(new PlainJavaSerializer<>(this.getClass().getClassLoader()))
.build();
// 使用给定的配置参数,创建指定名称的缓存对象
myCache = cacheManager.createCache(MY_CACHE, cacheConfiguration);
}
}
public void writeToCache(String key, Object value) {
myCache.put(key, value);
public void writeToCache(ConfigurationParameter key, Object value) {
myCache.put(key.name(), value);
}
public Object readFromCache(String key) {
return myCache.get(key);
public Object readFromCache(ConfigurationParameter key) {
return myCache.get(key.name());
}
public Object writeToDiske(String key, Object value) {
myCache.put(key, value);
return cacheManager.getCache(MY_CACHE,String.class,Object.class).get(key); // 强制将数据同步到磁盘
public Object writeToDiske(ConfigurationParameter key, Object value) {
myCache.put(key.name(), value);
return cacheManager.getCache(MY_CACHE,String.class,Object.class).get(key.name()); // 强制将数据同步到磁盘
}
public Cache<String, Object> getMyCache() {
return myCache;
}
public void shutdown() {
if (cacheManager != null) {
cacheManager.close();
}
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.zhonglai.luhui.smart.feeder.dto.SysConfig;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.VeiwDto;
import com.zhonglai.luhui.smart.feeder.dto.VeiwType;
import com.zhonglai.luhui.smart.feeder.opencv.OpenCVUtil;
import com.zhonglai.luhui.smart.feeder.service.impl.HtmllVeiwServiceImpl;
import com.zhonglai.luhui.smart.feeder.service.impl.JFrameVeiwServiceImpl;
import io.swagger.models.auth.In;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Scalar;
... ... @@ -17,6 +18,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
... ... @@ -35,35 +37,64 @@ public class FishGroupImageRecognitionService {
private DisplayVeiwService dsplayVeiwService;
private boolean isRun;
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@Autowired
private ConfigurationParameterService configurationParameterService;
@Autowired
private DeviceService deviceService;
@Autowired
private EhCacheService ehCacheService;
private static Boolean isRun = false;
@PostConstruct
public void run()
{
scheduledExecutorService.scheduleWithFixedDelay(() -> {
if (!isRun)
{
start(VeiwType.html);
}
},1,1,TimeUnit.SECONDS);
}
public void start(VeiwType veiwType)
{
if(cameraService.getVideoIsOpen()) //摄像头打开才能识别
{
isRun = true;
ehCacheService.writeToDiske(ConfigurationParameter.FishGroupImageRecognition,true);
switch (veiwType)
{
case html:
dsplayVeiwService = new HtmllVeiwServiceImpl();
dsplayVeiwService = new HtmllVeiwServiceImpl(configurationParameterService);
break;
case jfram:
dsplayVeiwService = new JFrameVeiwServiceImpl();
dsplayVeiwService = new JFrameVeiwServiceImpl(configurationParameterService);
break;
default:
dsplayVeiwService = new HtmllVeiwServiceImpl();
dsplayVeiwService = new HtmllVeiwServiceImpl(configurationParameterService);
break;
}
VideoCapture videoCapture = cameraService.getVideoCapture();
brightnessIdentifyFishRegion(videoCapture);
}else {
logger.info("摄像头未打开");
}
}
public void stop()
{
isRun = false;
ehCacheService.writeToDiske(ConfigurationParameter.FishGroupImageRecognition,false);
cameraService.close();
isRun = false;
}
/**
... ... @@ -73,7 +104,7 @@ public class FishGroupImageRecognitionService {
*/
private MatOfPoint getDefaultMatOfPoint(Mat previousFrame)
{
Mat firstBinaryImage = waterBybinary(previousFrame,SysConfig.reflectionThreshold);
Mat firstBinaryImage = waterBybinary(previousFrame,(Integer) configurationParameterService.getConfig(ConfigurationParameter.reflectionThreshold));
// 绘制白色区域的轮廓
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
... ... @@ -112,11 +143,11 @@ public class FishGroupImageRecognitionService {
// 逐帧处理视频
Mat frame = new Mat();
scheduledExecutorService.schedule(() -> {
while (isRun && videoCapture.read(frame)) {
scheduledExecutorService.scheduleWithFixedDelay(() -> {
if (((Boolean)ehCacheService.readFromCache(ConfigurationParameter.FishGroupImageRecognition)) && videoCapture.read(frame)) {
identify(frame,largestContour);
}
},0, TimeUnit.SECONDS);
},0,1, TimeUnit.SECONDS);
}
... ... @@ -152,9 +183,17 @@ public class FishGroupImageRecognitionService {
Imgproc.drawContours(frame, contours, -1, new Scalar(0, 0, 255), 2);
Imgproc.drawContours(frame, Arrays.asList(new MatOfPoint[]{largestContour}), 0, new Scalar(0, 255, 0), 2);
//计算斜率
double absValue = deviceService.controlDevice(area);
ehCacheService.writeToCache(ConfigurationParameter.absValue,absValue);
// 显示图像
// 在图像上显示结果
dsplayVeiwService.veiw(new VeiwDto(frame,binaryImage,new Double(area).intValue()));
if((Boolean)ehCacheService.readFromCache(ConfigurationParameter.ifVeiw))
{
dsplayVeiwService.veiw(new VeiwDto(frame,binaryImage,new Double(area).intValue(),absValue));
}
}
/**
... ... @@ -180,7 +219,6 @@ public class FishGroupImageRecognitionService {
if(-1 != maxAreaIndex)
{
double area = Imgproc.contourArea(contours.get(maxAreaIndex));
maxArea = maxArea-area;
contours.remove(maxAreaIndex);
}
... ... @@ -195,7 +233,7 @@ public class FishGroupImageRecognitionService {
* @param frame
* @return
*/
public static Mat waterBybinary(Mat frame,int reflectionThreshold) {
public Mat waterBybinary(Mat frame,int reflectionThreshold) {
// 将加载的图像转换为灰度图像,以便进行亮度或反光的分析
Mat grayImage = new Mat();
Imgproc.cvtColor(frame, grayImage, Imgproc.COLOR_BGR2GRAY);
... ... @@ -203,10 +241,10 @@ public class FishGroupImageRecognitionService {
// 检测反光
Mat binaryImage = new Mat();
Imgproc.threshold(grayImage, binaryImage, reflectionThreshold, SysConfig.maxValue, Imgproc.THRESH_BINARY);
Imgproc.threshold(grayImage, binaryImage, reflectionThreshold, (Double) configurationParameterService.getConfig(ConfigurationParameter.maxValue), Imgproc.THRESH_BINARY);
// 进行形态学操作,去除噪点
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(SysConfig.kernelSize, SysConfig.kernelSize));
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size((Integer) configurationParameterService.getConfig(ConfigurationParameter.kernelSize),(Integer) configurationParameterService.getConfig(ConfigurationParameter.kernelSize)));
Imgproc.morphologyEx(binaryImage, binaryImage, Imgproc.MORPH_OPEN, kernel);
return binaryImage;
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.smart.feeder.config.WebSocketClien;
import com.zhonglai.luhui.smart.feeder.dto.WebSocketVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
... ... @@ -22,9 +24,14 @@ import java.util.concurrent.CopyOnWriteArraySet;
public class WebSocketSever {
private static final Logger log = LoggerFactory.getLogger(WebSocketSever.class);
@Autowired
private DeviceService deviceService;
// 与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
private Boolean runState = false;
/**
* 建立WebSocket连接
*
... ... @@ -69,6 +76,16 @@ public class WebSocketSever {
@OnMessage
public void onMessage(String message) {
log.info("收到客户端发来的消息:{}", message);
if(StringUtils.isNotEmpty(message))
{
switch (message)
{
case "openRunState":
runState = true;
case "closeRunState":
runState = false;
}
}
}
/**
... ... @@ -93,6 +110,10 @@ public class WebSocketSever {
*/
public void sendWebSocketVO(WebSocketVO webSocketVO) {
try {
if(runState)
{
webSocketVO.setStateData(deviceService.getState());
}
session.getBasicRemote().sendText(GsonConstructor.get().toJson(webSocketVO));
} catch (IOException e) {
log.error("推送消息到指定用户发生错误:" + e.getMessage(), e);
... ...
... ... @@ -2,8 +2,10 @@ package com.zhonglai.luhui.smart.feeder.service.impl;
import com.ruoyi.common.utils.sign.Base64;
import com.zhonglai.luhui.smart.feeder.config.WebSocketClien;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.VeiwDto;
import com.zhonglai.luhui.smart.feeder.dto.WebSocketVO;
import com.zhonglai.luhui.smart.feeder.service.ConfigurationParameterService;
import com.zhonglai.luhui.smart.feeder.service.DisplayVeiwService;
import com.zhonglai.luhui.smart.feeder.service.WebSocketSever;
import org.apache.commons.lang3.ArrayUtils;
... ... @@ -20,7 +22,11 @@ import java.io.InputStream;
public class HtmllVeiwServiceImpl implements DisplayVeiwService {
private boolean isRun;
private ConfigurationParameterService configurationParameterService;
public HtmllVeiwServiceImpl(ConfigurationParameterService configurationParameterService) {
this.configurationParameterService = configurationParameterService;
}
/**
* Mat转换成BufferedImage
... ... @@ -123,10 +129,24 @@ public class HtmllVeiwServiceImpl implements DisplayVeiwService {
@Override
public void veiw(VeiwDto veiwDto) {
try {
String str = matToString(veiwDto.getFrame(),"jpg");
WebSocketVO webSocketVO = new WebSocketVO();
webSocketVO.setImg(str);
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isFrame))
{
webSocketVO.setFrame(matToString(veiwDto.getFrame(),"jpg"));
}
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isBinaryImage))
{
webSocketVO.setBinaryImage(matToString(veiwDto.getBinaryImage(),"jpg"));
}
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isSize))
{
webSocketVO.setSize(veiwDto.getSize());
}
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isAbsValue))
{
webSocketVO.setAbsValue(veiwDto.getAbsValue());
}
for (WebSocketSever webSocketSever:WebSocketClien.webSocketSet)
{
webSocketSever.sendWebSocketVO(webSocketVO);
... ...
package com.zhonglai.luhui.smart.feeder.service.impl;
import com.zhonglai.luhui.smart.feeder.draw.FishRegionPanel;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.VeiwDto;
import com.zhonglai.luhui.smart.feeder.service.ConfigurationParameterService;
import com.zhonglai.luhui.smart.feeder.service.DisplayVeiwService;
import com.zhonglai.luhui.smart.feeder.util.OpenCVUtils;
import org.opencv.core.Mat;
... ... @@ -11,6 +13,13 @@ import java.awt.*;
import java.awt.image.BufferedImage;
public class JFrameVeiwServiceImpl implements DisplayVeiwService {
private ConfigurationParameterService configurationParameterService;
public JFrameVeiwServiceImpl(ConfigurationParameterService configurationParameterService) {
this.configurationParameterService = configurationParameterService;
}
private static FishRegionPanel fishRegionPanel;
public JFrameVeiwServiceImpl()
... ... @@ -28,19 +37,23 @@ public class JFrameVeiwServiceImpl implements DisplayVeiwService {
@Override
public void veiw(VeiwDto veiwDto) {
if(null != veiwDto.getBinaryImage())
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isBinaryImage))
{
fishRegionPanel.getLblImage().setIcon(new ImageIcon(convertMatToImage(veiwDto.getBinaryImage())));
}
if(null != veiwDto.getFrame())
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isFrame))
{
fishRegionPanel.getSrcImage().setIcon(new ImageIcon(convertMatToImage(veiwDto.getFrame())));
}
if(null != veiwDto.getSize())
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isSize))
{
fishRegionPanel.getPnlGraph().getFishCountList().add(veiwDto.getSize());
fishRegionPanel.getPnlGraph().repaint();
}
if((boolean)configurationParameterService.getConfig(ConfigurationParameter.VeiwDto_isFrame))
{
}
fishRegionPanel.getFrame().repaint();
}
... ...
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/output.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/output.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>5</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
... ...
... ... @@ -45,12 +45,21 @@
}
ws1.onmessage = function(message){
console.log(message);
var data = JSON.parse(message.data);
$("#showVideo").attr("src", "data:image/jpg;base64," + data.img);
if('{}' != message.data && undefined != message.data)
{
var data = JSON.parse(message.data);
if('{}' != data.frame && undefined != data.frame)
{
$("#showVideo").attr("src", "data:image/jpg;base64," + data.frame);
}
if(null != data.size && undefined != data.size)
{
addData(data.size);
}
drawChart();
}
}
ws1.onclose = function (o) {
$("#result").textContent = "服务断开";
}
... ...
... ... @@ -11,6 +11,7 @@
<module>lh-common</module>
<module>lh-jar</module>
<module>lh-modules</module>
<module>zl-modules</module>
</modules>
<packaging>pom</packaging>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>Luhui</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>zl-modules</artifactId>
<modules>
<module>zl-email-forwarding</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<packaging>pom</packaging>
<description>
zl-modules 个人业务模块
</description>
</project>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>zl-modules</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>zl-email-forwarding</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
\ No newline at end of file
... ...
package com.zhonglai.zl;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
... ...