作者 钟来

开发工厂化代理

正在显示 99 个修改的文件 包含 3717 行增加289 行删除

要显示太多修改。

为保证性能只显示 99 of 99+ 个文件。

... ... @@ -137,7 +137,6 @@ public class PublicSQL {
{
Object object = map.get("object");
String tableName = changTableNameFromObject(object);
String primaryKey = (String) map.get("primaryKey");
if(map.containsKey("tableName"))
{
tableName = map.get("tableName").toString();
... ...
... ... @@ -16,6 +16,7 @@ public interface PublicMapper {
* 添加对象
*/
@InsertProvider(type = PublicSQL.class, method = "insert")
@Options(useGeneratedKeys=true, keyProperty="id")
int insert(Object object);
/**
... ... @@ -23,7 +24,7 @@ public interface PublicMapper {
*/
@InsertProvider(type = PublicSQL.class, method = "insertToTable")
@Options(useGeneratedKeys = true, keyProperty = "object.id")
int insertToTable(@Param("object") Object object,@Param("tableName") String tableName,@Param("primaryKey") String primaryKey);
int insertToTable(@Param("object") Object object,@Param("tableName") String tableName);
/**
* 添加对象集合
... ... @@ -63,7 +64,7 @@ public interface PublicMapper {
* @return
*/
@SelectProvider(type = PublicSQL.class, method = "getObject")
<T> T getObject(@Param("class") Class<?> clas, @Param("idName") String idName, @Param("values") String values);
Map<String,Object> getObject(@Param("class") Class<?> clas, @Param("idName") String idName, @Param("values") String values);
@SelectProvider(type = PublicSQL.class, method = "selectCountBySql")
Long selectCountBySql(@Param("sql") String sql);
... ...
... ... @@ -49,7 +49,7 @@ public interface PublicService {
* @param values
* @return
*/
<T> T getObject( Class<?> clas, String idName, String values);
<T> T getObject( Class<T> clas, String idName, String values);
/**
* 查询 通过条件查询
... ...
... ... @@ -29,12 +29,12 @@ public class PublicServiceImpl implements PublicService {
*/
public int insertToTable(Object object, String tableName)
{
return publicMapper.insertToTable(object,tableName,"id");
return publicMapper.insertToTable(object,tableName);
}
public int insertToTable(Object object, String tableName,String primaryKey)
{
return publicMapper.insertToTable(object,tableName,primaryKey);
return publicMapper.insertToTable(object,tableName);
}
/**
... ... @@ -89,9 +89,14 @@ public class PublicServiceImpl implements PublicService {
* @param values
* @return
*/
public <T> T getObject(Class<?> clas, String idName, String values)
public <T> T getObject(Class<T> clas, String idName, String values)
{
return publicMapper.getObject(clas,idName,values);
Object oj =publicMapper.getObject(clas,idName,values);
if(null != oj)
{
return JSONObject.parseObject(JSONObject.toJSONString(oj),clas);
}
return null;
}
/**
... ...
<?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>lh-common</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.luhui</groupId>
<artifactId>lh-service-dao</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
... ...
... ... @@ -31,6 +31,7 @@
<module>ruoyi-common-security</module>
<module>ruoyi-framework</module>
<module>ruoyi-generator</module>
<module>lh-service-dao</module>
</modules>
<packaging>pom</packaging>
... ...
package com.zhonglai.luhui.redis.listener;
public interface DataPersistenceService {
void offLine(String imei);
String getRedicDeviceKeyPath();
String getRedicTerminalKeyPath();
}
... ...
package com.zhonglai.luhui.redis.listener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Properties;
@Component
public class RedisAllKeyListener {
private String keyspaceNotificationsConfigParameter = "KEA";
@Autowired
private RedisDeleteListener redisDeleteListener ;
@Autowired
private RedisExpiredListener redisExpiredListener ;
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisConnection connection = connectionFactory.getConnection();
Properties config = connection.info("notify-keyspace-events");
if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) {
connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
}
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//监听所有key的删除事件
container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
//监听所有key的过期事件
container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
return container;
}
}
... ...
package com.zhonglai.luhui.device.analysis.comm.redis;
package com.zhonglai.luhui.redis.listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ...
package com.zhonglai.luhui.device.analysis.comm.redis;
package com.zhonglai.luhui.redis.listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ...
package com.zhonglai.luhui.device.analysis.comm.service;
package com.zhonglai.luhui.redis.listener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
... ... @@ -14,27 +14,26 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
@Autowired
private DataPersistenceService dtaPersistenceService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
// String expiredKey = message.toString();
//
// String devicePath = deviceService.getRedicDeviceKeyPath();
// String terminalPath = deviceService.getRedicTerminalKeyPath();
// if(expiredKey.startsWith(devicePath)) //如果是主机
// {
// String imei = expiredKey.replace(devicePath,"").replace(":","");
// dtaPersistenceService.offLine(imei);
// }
//
// if(expiredKey.startsWith(terminalPath)) //如果是终端
// {
// String imei = expiredKey.replace(devicePath,"").replace(":","");
// dtaPersistenceService.offLine(imei);
// }
String expiredKey = message.toString();
String devicePath = dtaPersistenceService.getRedicDeviceKeyPath();
String terminalPath = dtaPersistenceService.getRedicTerminalKeyPath();
if(expiredKey.startsWith(devicePath)) //如果是主机
{
String imei = expiredKey.replace(devicePath,"").replace(":","");
dtaPersistenceService.offLine(imei);
}
if(expiredKey.startsWith(terminalPath)) //如果是终端
{
String imei = expiredKey.replace(devicePath,"").replace(":","");
dtaPersistenceService.offLine(imei);
}
}
}
... ...
package com.zhonglai.luhui.device.analysis.comm.service.redis;
package com.zhonglai.luhui.redis.service;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
... ...
... ... @@ -160,6 +160,11 @@ public class Constants
public static final String LOOKUP_LDAPS = "ldaps:";
/**
* JSON 资源
*/
public static String CONTENT_TYPE = "application/json; charset=utf-8";
/**
* 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
*/
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
... ...
... ... @@ -26,5 +26,9 @@
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
... ... @@ -11,11 +11,20 @@ import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sql.SqlUtil;
import com.zhonglai.luhui.config.TokenConfig;
import com.zhonglai.luhui.dto.LoginToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.beans.PropertyEditorSupport;
import java.util.Date;
import java.util.List;
... ... @@ -29,6 +38,9 @@ public class BaseController
{
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
protected TokenConfig tokenConfig ;
/**
* 将前台传递过来的日期格式的字符串,自动转化为Date类型
*/
... ... @@ -46,6 +58,32 @@ public class BaseController
});
}
protected LoginToken getLoginToken()
{
HttpSession session = getSession();
if(null != session && null != session.getAttribute(tokenConfig.getLogin_token_key()))
{
return (LoginToken)session.getAttribute(tokenConfig.getLogin_token_key());
}
return null;
}
protected HttpSession getSession() {
return getRequest().getSession();
}
protected HttpServletRequest getRequest() {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
return attrs.getRequest();
}
protected HttpServletResponse getResponse() {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
return attrs.getResponse();
}
/**
* 设置请求分页数据
*/
... ...
package com.zhonglai.luhui.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Data
public class TokenConfig {
@Value("${token.header: loginToken}")
private String login_token_key;
@Value("${token.expireTime: 120}")
private Integer expireTime;
}
... ...
package com.zhonglai.luhui.dto;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import lombok.Data;
@Data
public class LoginToken {
/**
* 用户id
*/
private String id;
/**
* 时间戳
*/
private Integer startTime;
/**
* 过期时间
*/
private Integer endTime;
private static String key = "njlaikun.com";
private static String partition = "_";
public String toToken()
{
return new SymmetricCrypto(SymmetricAlgorithm.DES, key.getBytes()).encryptHex(id+partition+startTime+partition+endTime);
}
public static LoginToken forToken(String token)
{
try {
String decStr = new SymmetricCrypto(SymmetricAlgorithm.DES, key.getBytes()).decryptStr(token);
String[] strs = decStr.split(partition);
LoginToken loginToken = new LoginToken();
loginToken.setId(strs[0]);
loginToken.setStartTime(Integer.parseInt(strs[1]));
loginToken.setEndTime(Integer.parseInt(strs[2]));
return loginToken;
}catch (Exception e)
{
return null;
}
}
public static void main(String[] args) {
LoginToken loginToken = new LoginToken();
loginToken.setId("1");
loginToken.setStartTime(DateUtils.getNowTimeMilly());
loginToken.setEndTime(DateUtils.getNowTimeMilly());
String token = loginToken.toToken();
System.out.println(token);
System.out.println(GsonConstructor.get().toJson(forToken(token)));
}
}
... ...
... ... @@ -64,5 +64,6 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
... ... @@ -117,7 +117,7 @@ public class BaseDao {
* 指定表名插入对象集合
* @param objectList
*/
public void insertList(List<?> objectList ,String tableName)
public int insertList(List<?> objectList ,String tableName)
{
QueryRunner runner = new QueryRunner(dBFactory.getDataSource());
... ... @@ -133,10 +133,11 @@ public class BaseDao {
sql += tableName + msaicAttribute(object) + " values " +msaicValues(objectList,valueList);
try {
runner.update(sql,valueList.toArray());
return runner.update(sql,valueList.toArray());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
/**
... ... @@ -218,9 +219,9 @@ public class BaseDao {
* 以主键id更新对象
* @param object
*/
public void update(Object object)
public int update(Object object)
{
update(object,null);
return update(object,null);
}
/**
... ... @@ -228,7 +229,7 @@ public class BaseDao {
* @param object 传值对象
* @param whereFieldNames 条件(多个用,分割)
*/
public void update(Object object,String whereFieldNames)
public int update(Object object,String whereFieldNames)
{
QueryRunner runner = new QueryRunner(dBFactory.getDataSource());
... ... @@ -352,10 +353,11 @@ public class BaseDao {
}
try {
runner.update(sql,valueList.toArray());
return runner.update(sql,valueList.toArray());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
/**
... ...
... ... @@ -3,28 +3,20 @@ 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.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.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.redis.service.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 org.apache.commons.lang3.StringUtils;
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;
... ...
... ... @@ -2,7 +2,7 @@ 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.device.analysis.comm.service.redis.RedisService;
import com.zhonglai.luhui.redis.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
package com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels;
import com.google.gson.JsonElement;
import com.zhonglai.luhui.device.domain.IotThingsModel;
/**
* 物模型工厂
*/
public interface ThingsModelBase<T> {
void conversionThingsModel(IotThingsModel thingsModel);
void addValue(Object t);
// @JSONField(serialize=false)
String getView();
String getSaveView();
... ...
... ... @@ -7,19 +7,10 @@ import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.specs.*;
* 物模型数据类型,及对应显示解析方案
*/
public enum ThingsModelDataTypeEnum {
INTEGER(IntegerModelOutput.class),
DECIMAL(DecimalModelOutput.class),
STRING(StringModelOutput.class),
BOOL(BoolModelOutput.class),
ARRAY(ArrayModelOutput.class),
ENUM(EnumModelOutput.class);
private Class aClass;
ThingsModelDataTypeEnum(Class aClass) {
this.aClass = aClass;
}
public Class getaClass() {
return aClass;
}
INTEGER,
DECIMAL,
STRING,
BOOL,
ARRAY,
ENUM;
}
... ...
package com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.specs.*;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import lombok.Data;
... ... @@ -10,6 +15,86 @@ import lombok.Data;
@Data
public abstract class ThingsModelItemBase<T> implements ThingsModelBase<T>
{
public static ThingsModelItemBase newhingsModelItem(ThingsModelDataTypeEnum thingsModelDataTypeEnum,IotThingsModel thingsModel,JsonElement jsonElement)
{
if (!jsonElement.isJsonNull())
{
String specs = thingsModel.getSpecs();
if(StringUtils.isEmpty(specs))
{
specs = new JsonObject().toString();
}
ThingsModelItemBase thingsModelItemBase = GsonConstructor.get().fromJson(specs,StringModelOutput.class);
switch (thingsModelDataTypeEnum)
{
case STRING:
thingsModelItemBase.setValue(jsonElement.getAsString());
break;
case BOOL:
thingsModelItemBase = GsonConstructor.get().fromJson(specs,BoolModelOutput.class);
thingsModelItemBase.setValue(jsonElement.getAsBoolean());
break;
case ENUM:
thingsModelItemBase = GsonConstructor.get().fromJson(specs,EnumModelOutput.class);
thingsModelItemBase.setValue(jsonElement.getAsString());
break;
case ARRAY:
thingsModelItemBase = GsonConstructor.get().fromJson(specs,ArrayModelOutput.class);
thingsModelItemBase.setValue(jsonElement.getAsJsonArray());
break;
case DECIMAL:
thingsModelItemBase = GsonConstructor.get().fromJson(specs,DecimalModelOutput.class);
thingsModelItemBase.setValue(jsonElement.getAsBigDecimal());
break;
case INTEGER:
thingsModelItemBase = GsonConstructor.get().fromJson(specs,IntegerModelOutput.class);
thingsModelItemBase.setValue(jsonElement.getAsInt());
break;
}
thingsModelItemBase.conversionThingsModel(thingsModel);
return thingsModelItemBase;
}
return null;
}
public static ThingsModelItemBase newhingsModelItem(JsonObject jsonObject)
{
String type = "STRING";
if(jsonObject.has("type"))
{
type = jsonObject.get("type").getAsString();
}
ThingsModelItemBase thingsModelItemBase = new StringModelOutput();
ThingsModelDataTypeEnum thingsModelDataTypeEnum = Enum.valueOf(ThingsModelDataTypeEnum.class,type);
switch (thingsModelDataTypeEnum)
{
case STRING:
thingsModelItemBase = GsonConstructor.get().fromJson(jsonObject.toString(),StringModelOutput.class);
break;
case BOOL:
thingsModelItemBase = GsonConstructor.get().fromJson(jsonObject.toString(),BoolModelOutput.class);
break;
case ENUM:
thingsModelItemBase = GsonConstructor.get().fromJson(jsonObject.toString(),EnumModelOutput.class);
break;
case ARRAY:
thingsModelItemBase = GsonConstructor.get().fromJson(jsonObject.toString(),ArrayModelOutput.class);
break;
case DECIMAL:
thingsModelItemBase = GsonConstructor.get().fromJson(jsonObject.toString(),DecimalModelOutput.class);
break;
case INTEGER:
thingsModelItemBase = GsonConstructor.get().fromJson(jsonObject.toString(),IntegerModelOutput.class);
break;
}
return thingsModelItemBase;
}
/** 物模型唯一标识符 */
private String id;
/** 物模型名称 */
... ...
... ... @@ -2,18 +2,16 @@ package com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.specs;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.annotation.JSONField;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelItemBase;
import lombok.Data;
@Data
public class ArrayModelOutput extends ThingsModelItemBase<JSONArray>
public class ArrayModelOutput extends ThingsModelItemBase<JsonArray>
{
private String arrayType;
@Override
public void addValue(Object jsonArray) {
setValue((JSONArray) jsonArray);
}
@Override
public String getView() {
... ...
... ... @@ -9,10 +9,6 @@ public class BoolModelOutput extends ThingsModelItemBase<Boolean>
private String falseText;
private String trueText;
@Override
public void addValue(Object bl) {
setValue((Boolean) bl);
}
@Override
public String getView() {
... ...
... ... @@ -13,13 +13,6 @@ public class DecimalModelOutput extends ThingsModelItemBase<BigDecimal>
private BigDecimal step;
private String unit;
@Override
public void addValue(Object object) {
if(null != object)
{
setValue(new BigDecimal(object.toString()));
}
}
@Override
public String getView() {
... ...
... ... @@ -10,15 +10,11 @@ import java.util.Date;
import java.util.List;
@Data
public class EnumModelOutput extends ThingsModelItemBase<Object>
public class EnumModelOutput extends ThingsModelItemBase<String>
{
private String clas;
private List<EnumItemOutput> enumList;
@Override
public void addValue(Object object) {
setValue(object);
}
@Override
public String getView() {
... ... @@ -49,10 +45,6 @@ public class EnumModelOutput extends ThingsModelItemBase<Object>
return getValue()+"";
}
public static void main(String[] args) {
EnumModelOutput enumModelOutput = new EnumModelOutput();
System.out.println(enumModelOutput.getCmdView(1));
}
@Override
public Object getCmdView(Object object) {
... ...
package com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.specs;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
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.domain.IotThingsModel;
import lombok.Data;
import org.apache.commons.lang3.EnumUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
... ... @@ -22,14 +16,6 @@ public class IntegerModelOutput extends ThingsModelItemBase<Integer>
private String unit; //单位
private Integer acy; //精度
@Override
public void addValue(Object object) {
if(null == object)
{
return;
}
setValue(new Double(String.valueOf(object)).intValue());
}
@Override
public String getView() {
... ... @@ -85,63 +71,4 @@ public class IntegerModelOutput extends ThingsModelItemBase<Integer>
}
return false;
}
public static void main(String[] args) {
IotThingsModel thingsModel = JSONObject.parseObject("{\"@type\":\"com.zhonglai.luhui.device.domain.IotThingsModel\",\"ascription\":\"1\",\"create_by\":\"admin\",\"data_type\":\"integer\",\"identifier\":\"turbidity\",\"is_config\":0,\"is_monitor\":0,\"is_save_log\":1,\"is_top\":0,\"model_id\":395,\"model_name\":\"浊度\",\"mqtt_username\":\"6_WP\",\"product_id\":9,\"specs\":\"{\\\"acy\\\":10,\\\"max\\\":999999,\\\"min\\\":0,\\\"step\\\":0.1,\\\"unit\\\":\\\"NTU\\\"}\",\"type\":1}\n", IotThingsModel.class);
String data_type = thingsModel.getData_type().toUpperCase();
if (!EnumUtils.isValidEnum(ThingsModelDataTypeEnum.class, data_type)) {
data_type = ThingsModelDataTypeEnum.STRING.name();
}
Class<ThingsModelBase> aClass = Enum.valueOf(ThingsModelDataTypeEnum.class, data_type).getaClass();
ThingsModelBase thingsModelBase = JSON.parseObject(thingsModel.getSpecs(), aClass);
thingsModelBase.conversionThingsModel(thingsModel);
JSONObject jsData = JSONObject.parseObject("{\n" +
" \"id\": 1714026179,\n" +
" \"0\": {\n" +
" \"rssi\": 18,\n" +
" \"at\": 369,\n" +
" \"bar\": 107987\n" +
" },\n" +
" \"10_1\": {\n" +
" \"type\": 1,\n" +
" \"mode\": 0,\n" +
" \"state\": 0,\n" +
" \"map\": \"1_1\"\n" +
" },\n" +
" \"10_2\": {\n" +
" \"type\": 1,\n" +
" \"mode\": 0,\n" +
" \"state\": 0,\n" +
" \"map\": \"1_2\"\n" +
" },\n" +
" \"10_3\": {\n" +
" \"type\": 1,\n" +
" \"mode\": 0,\n" +
" \"state\": 0,\n" +
" \"map\": \"1_3\"\n" +
" },\n" +
" \"10_4\": {\n" +
" \"type\": 1,\n" +
" \"mode\": 0,\n" +
" \"state\": 0,\n" +
" \"map\": \"1_4\"\n" +
" },\n" +
" \"1_3\": {\n" +
" \"alarm\": 0,\n" +
" \"turbidity\": 69,\n" +
" \"wt\": 290\n" +
" }\n" +
"}", JSONObject.class);
thingsModelBase.addValue(jsData.get("turbidity"));
if (!thingsModelBase.checkValue()) {
System.out.println("校验通过");
ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase;
if(1==thingsModelItemBase.getIs_save_log() )
{
System.out.println("要记录日志");
}
}
}
}
... ...
... ... @@ -11,10 +11,6 @@ public class StringModelOutput extends ThingsModelItemBase<String>
{
private int maxLength;
@Override
public void addValue(Object object) {
setValue(null!=object?object+"":null);
}
@Override
public String getView() {
... ...
... ... @@ -56,9 +56,9 @@ public class BusinessDataUpdateService {
*/
public void updataDta(Type type, Topic topic, ServerDto serverDto, String operationType, boolean isLog)
{
logger.info("{} 开始更新数据",topic.getClientid());
// logger.info("{} 开始更新数据",topic.getClientid());
IotDevice olddevice = cacheService.getIotDevice(topic.getClientid());
logger.info("{} 老数据获取成",topic.getClientid());
// logger.info("{} 老数据获取成",topic.getClientid());
JSONObject data = new JSONObject();
switch (type)
{
... ... @@ -70,11 +70,11 @@ public class BusinessDataUpdateService {
break;
}
logger.info("{} 开始解析终端数据",topic.getClientid());
// logger.info("{} 开始解析终端数据",topic.getClientid());
for(String key:data.keySet())
{
Object o = data.get(key);
logger.info("开始解析{}终端的数据,数据类型{}",key,o.getClass());
// logger.info("开始解析{}终端的数据,数据类型{}",key,o.getClass());
if(o instanceof JSONObject)
{
... ... @@ -97,7 +97,7 @@ public class BusinessDataUpdateService {
iotDevice.setName(olddevice.getName());
serverDto.setIotDevice(iotDevice);
}else{ //终端
logger.info("{} 解析终端 {} 的数据",key,jsData.toJSONString());
// logger.info("{} 解析终端 {} 的数据",key,jsData.toJSONString());
IotTerminal iotTerminal = translateTerminal(type,key,olddevice,jsData,serverDto,operationType,isLog);
iotTerminal.setData_update_time(DateUtils.getNowTimeMilly());
if(null== iotTerminal.getOnline() || 1 == iotTerminal.getOnline() || 4==iotTerminal.getOnline())
... ...
... ... @@ -7,23 +7,17 @@ import com.zhonglai.luhui.device.analysis.comm.config.CacheConfig;
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.device.analysis.comm.service.redis.RedisService;
import com.zhonglai.luhui.redis.service.RedisService;
import com.zhonglai.luhui.device.analysis.comm.util.DateUtils;
import com.zhonglai.luhui.device.analysis.comm.redis.RedisDeleteListener;
import com.zhonglai.luhui.device.analysis.comm.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;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@Service
... ... @@ -46,7 +40,6 @@ public class CacheServiceImpl implements CacheService {
iotDevice.setStatus(3);
}
setIotDeviceToRedis(iotDevice);
log.info("缓存更新 {} ",iotDevice);
List<IotTerminal> list = serverDto.getIotTerminalList();
if(null != list && list.size() != 0 )
... ... @@ -56,7 +49,6 @@ public class CacheServiceImpl implements CacheService {
setIotTerminalToRedis(iotTerminal);
}
}
log.info("缓存更新 {} ",list);
return true;
}
... ... @@ -253,26 +245,6 @@ public class CacheServiceImpl implements CacheService {
return CacheConfig.FIELD+ CacheConfig.TERMINAL;
}
private String keyspaceNotificationsConfigParameter = "KEA";
@Autowired
private RedisDeleteListener redisDeleteListener ;
@Autowired
private RedisExpiredListener redisExpiredListener ;
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisConnection connection = connectionFactory.getConnection();
Properties config = connection.info("notify-keyspace-events");
if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) {
connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
}
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//监听所有key的删除事件
container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
//监听所有key的过期事件
container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
return container;
}
}
... ...
package com.zhonglai.luhui.device.analysis.comm.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
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;
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.util.DateUtils;
... ... @@ -66,8 +66,8 @@ public class DataModeAnalysisService {
JSONObject data = new JSONObject();
JSONObject config = new JSONObject();
for(String key:jsData.keySet())
JsonObject gsonData = GsonConstructor.get().fromJson(jsData.toJSONString(), JsonObject.class);
for(String key:gsonData.keySet())
{
IotThingsModel thingsModel = terminalDataThingsModeService.getIotThingsModel(userName,key);
if(null == thingsModel) //没有配置的 都按字符串处理
... ... @@ -89,24 +89,19 @@ public class DataModeAnalysisService {
{
data_type = ThingsModelDataTypeEnum.STRING.name();
}
Class<ThingsModelBase> aClass = Enum.valueOf(ThingsModelDataTypeEnum.class,data_type).getaClass();
ThingsModelBase thingsModelBase = JSON.parseObject(thingsModel.getSpecs(),aClass);
thingsModelBase.conversionThingsModel(thingsModel);
thingsModelBase.addValue(jsData.get(key));
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(Enum.valueOf(ThingsModelDataTypeEnum.class,data_type),thingsModel, gsonData.get(key));
if(!thingsModelBase.checkValue())
if(!thingsModelItemBase.checkValue())
{
continue;
}
ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase;
//记录数据日志
log.info("设备{}的数据{}记录日志,【条件{},{}】",id,key,thingsModelItemBase.getIs_save_log(),null != serverDto.getDeviceSensorDataList());
// log.info("设备{}的数据{}记录日志,【条件{},{}】",id,key,thingsModelItemBase.getIs_save_log(),null != serverDto.getDeviceSensorDataList());
if(1==thingsModelItemBase.getIs_save_log() && null != serverDto.getDeviceSensorDataList())
{
DeviceSensorData sensorData = new DeviceSensorData();
sensorData.setDataType(key);
sensorData.setDataValue(thingsModelBase.getSaveView());
sensorData.setDataValue(thingsModelItemBase.getSaveView());
sensorData.setCreatTime(DateUtils.getNowTimeMilly());
sensorData.setDeviceModel(userName);
sensorData.setDeviceInfoId(id);
... ... @@ -116,17 +111,17 @@ public class DataModeAnalysisService {
switch (thingsModel.getIs_config())
{
case 0:
data.put(key,thingsModelBase);
data.put(key,thingsModelItemBase);
break;
case 1:
config.put(key,thingsModelBase);
config.put(key,thingsModelItemBase);
break;
case 2:
config.put(key,thingsModelBase);
data.put(key,thingsModelBase);
config.put(key,thingsModelItemBase);
data.put(key,thingsModelItemBase);
break;
default:
data.put(key,thingsModelBase);
data.put(key,thingsModelItemBase);
break;
}
}
... ...
package com.zhonglai.luhui.mqtt.comm.util;
package com.zhonglai.luhui.device.analysis.util;
import com.zhonglai.luhui.device.analysis.comm.dto.MyException;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
... ... @@ -16,8 +16,13 @@ public class TopicUtil {
public static Topic initTopic(String topic)
{
topic = Optional.ofNullable(topic).orElseThrow(()->new MyException("topic为空"));
return initTopicFromModelStr(topic,SysParameter.topicconfig);
}
public static Topic initTopicFromModelStr(String topic,String modelStr)
{
String[] sts = topic.split("/");
String[] config = SysParameter.topicconfig.split("/");
String[] config = modelStr.split("/");
int number = sts.length;
if(number>config.length)
{
... ...
... ... @@ -127,6 +127,7 @@ public class IotDevice implements Serializable
@ApiModelProperty("数据更新时间")
private Integer data_update_time;
public Integer getData_update_time() {
return data_update_time;
}
... ...
... ... @@ -60,6 +60,49 @@ public class IotProduct implements Serializable
private String product_name;
@ApiModelProperty("是否需要同步数据库(0否,1是)")
private Integer is_sync_db;
@ApiModelProperty("需要同步数据库的名称")
private String sync_db;
@ApiModelProperty("解析服务")
private String analysis_clas; // varchar(100) DEFAULT 'com.zhonglai.luhui.device.protocol.factory.analysis.DefaultProtocolParserFactoryImpl' COMMENT '解析服务',
@ApiModelProperty("清洗服务")
private String purification_clas; // varchar(100) DEFAULT 'com.zhonglai.luhui.device.protocol.factory.purification.DefaultProtocolPurificationFactoryImpl' COMMENT '清洗服务',
public String getPurification_clas() {
return purification_clas;
}
public void setPurification_clas(String purification_clas) {
this.purification_clas = purification_clas;
}
public String getAnalysis_clas() {
return analysis_clas;
}
public void setAnalysis_clas(String analysis_clas) {
this.analysis_clas = analysis_clas;
}
public Integer getIs_sync_db() {
return is_sync_db;
}
public void setIs_sync_db(Integer is_sync_db) {
this.is_sync_db = is_sync_db;
}
public String getSync_db() {
return sync_db;
}
public void setSync_db(String sync_db) {
this.sync_db = sync_db;
}
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
... ...
<?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>lh-device-protocol-parser</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lh-device-http-public</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>
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-protocol-factory</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.analysis;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class ProtocolParserServiceImpl implements ProtocolParserFactory<JsonObject> {
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{imei}}/{{topicType}}";
@Override
public Topic analysisTopic(String topicStr) {
// /13/jiulin/476210165B365166812345678Userdata/Json/476210165B365166812345678/pub_data
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
return topic;
}
@Override
public JsonObject analysisPayload(Topic topic, JsonObject payload) {
return payload;
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.purification;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.purification.ProtocolPurificationFactory;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service("http_purification")
public class ProtocolPurificationServiceImpl implements ProtocolPurificationFactory {
@Override
public ProtocolPurificationModel purification(Integer product_id, Topic topic, JsonObject analysisObject ) {
return null;
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.service;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.protocol.http.analysis.service.db.LsyDBFactoryImp;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class LsyDbService {
private BaseDao lsy_baseDao = new BaseDao(new LsyDBFactoryImp());
public IotDevice getLsyDeviceById(String id)
{
List<Map<String,Object>> list = lsy_baseDao.findListBysql("SELECT order_dtu_imei,device_type FROM `order_dtu` WHERE order_dtu_imei='"+id+"'");
if(null != list && list.size() != 0)
{
Map<String,Object> map = list.get(0);
IotDevice iotDevice = new IotDevice();
iotDevice.setClient_id(id);
iotDevice.setMqtt_username(map.get("device_type")+"");
return iotDevice;
}
return null;
}
}
... ...
package com.zhonglai.luhui.device.protocol.http.analysis.service.db;
import com.zhonglai.luhui.device.analysis.comm.dao.DBFactory;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.util.Properties;
public class LsyDBFactoryImp implements DBFactory {
private static DataSource ds = null;
static {
try {
if(null==ds )
{
String dbPath = System.getProperty("dbPath");
String path = null != dbPath?dbPath:System.getProperty("user.dir")+"/configs/";
Properties p = new Properties();
System.out.println("》》》》》》》》》》》》》数据库配置文件地址:"+path+"lsy_dbcpconfig.properties");
p.load(new FileInputStream(path+"lsy_dbcpconfig.properties"));
// p.load(DBFactory.class
// .getClassLoader().getResourceAsStream("configs/dbcpconfig.properties"));
ds = BasicDataSourceFactory.createDataSource(p);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public DataSource getDataSource() {
return ds;
}
}
... ...
<?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>lh-device-protocol-parser</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lh-device-protocol-factory</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>
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-analysis</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
<description>
协议工厂
</description>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.device.protocol.factory;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.purification.ProtocolPurificationFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 协议解析工厂
*/
@Component
public class ProtocolParserAndPurificationFactory<T> {
/**
* 根据topic对payload数据进行解析和清洗
* @param topicStr 身份信息
* @param payload 数据信息
* @return
*/
public ProtocolPurificationModel analysisAndPurification(Integer product_id,String topicStr, T payload ,String analysis_clas,String purification_clas) throws ClassNotFoundException {
Topic baseTopic = TopicUtil.initTopicFromModelStr(topicStr,"/{{roleid}}/{{username}}"); //我们定义的topic
//根据产品类型找到对应的解析服务
ProtocolParserFactory protocolParserFactory = (ProtocolParserFactory) SpringUtils.getBean(Class.forName(analysis_clas));
//根据产品类型找到对应的清洗服务
ProtocolPurificationFactory protocolPurificationFactory = (ProtocolPurificationFactory) SpringUtils.getBean(Class.forName(purification_clas));
if(null != protocolParserFactory && null != protocolPurificationFactory) //需要解析服务和清除服务都存在业务才能进行下去
{
//通过解析服务获取到topic
Topic topic = protocolParserFactory.analysisTopic(topicStr);
//通过解析服务器将数据解析成键值对的形式存储到json对象里面,方便清洗
JsonObject jsonObject = protocolParserFactory.analysisPayload(topic,payload);
//通过模式对解析结果进行清洗,获得到的数据就是业务数据
ProtocolPurificationModel protocolPurificationModel = protocolPurificationFactory.purification(product_id,topic,jsonObject);
return protocolPurificationModel;
}
DeviceDataLog.error(baseTopic.getClientid(), DataLogType.解析消息,"没有找到可以解析的服务:"+baseTopic.getUsername());
return null;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import org.springframework.stereotype.Service;
@Service
public class DefaultProtocolParserFactoryImpl implements ProtocolParserFactory<byte[]>{
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{imei}}/{{topicType}}";
@Override
public Topic analysisTopic(String topicStr) {
// /13/jiulin/476210165B365166812345678Userdata/Json/476210165B365166812345678/pub_data
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
return topic;
}
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
return GsonConstructor.get().fromJson(new String(payload), JsonObject.class);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.analysis;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
/**
* 协议解析工厂
* @param <T>
*/
public interface ProtocolParserFactory<T> {
Topic analysisTopic(String topicStr);
JsonObject analysisPayload(Topic topic, T payload);
}
... ...
package com.zhonglai.luhui.device.protocol.factory.comm;
public enum DataLogType {
发送数据,
发来数据,
解析消息
}
... ...
package com.zhonglai.luhui.device.protocol.factory.comm;
import com.zhonglai.luhui.device.protocol.factory.ProtocolParserAndPurificationFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DeviceDataLog {
/**
* 自定义设备数据交付日志
*/
private static final Logger mylog = LoggerFactory.getLogger("myDatalog");
public static void info(String imei,DataLogType dataLogType,String topic,Object message)
{
mylog.info("【{}】【{}】【{}】【{}】",imei,dataLogType,topic,message);
}
public static void error(String imei,DataLogType dataLogType,Object message)
{
mylog.error("【{}】【{}】【{}】【{}】",imei,dataLogType,message);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.comm;
public enum DeviceType {
Json,
String,
bytes,
Int
}
... ...
package com.zhonglai.luhui.device.protocol.factory.config;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import net.jodah.expiringmap.ExpirationListener;
import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;
/**
* 用map管理内存中的设备信息
*/
public class DeviceCach {
private static Logger log = LoggerFactory.getLogger(DeviceCach.class);
// maxSize: 设置最大值,添加第11个entry时,会导致第1个立马过期(即使没到过期时间)
// expiration:设置每个key有效时间10s, 如果key不设置过期时间,key永久有效。
// variableExpiration: 允许更新过期时间值,如果不设置variableExpiration,不允许后面更改过期时间,一旦执行更改过期时间操作会抛异常UnsupportedOperationException
// policy:
// CREATED: 只在put和replace方法清零过期时间
// ACCESSED: 在CREATED策略基础上增加, 在还没过期时get方法清零过期时间。
// 清零过期时间也就是重置过期时间,重新计算过期时间.
private static ExpiringMap<String, ParserDeviceInfoDto> parserDeviceInfoDtoMap = ExpiringMap.builder().maxSize(20000).expiration(60, TimeUnit.SECONDS)
.variableExpiration()
.asyncExpirationListener(new ExpirationListener<String, ParserDeviceInfoDto>() {
@Override
public void expired(String s, ParserDeviceInfoDto parserDeviceInfoDto) {
log.info("超时清除>>>>>>>:{} ",s);
}
})
.expirationPolicy(ExpirationPolicy.CREATED).build();
private static ExpiringMap<String, ParserDeviceHostDto> parserDeviceHostDtoMap = ExpiringMap.builder().maxSize(20000).expiration(60, TimeUnit.SECONDS)
.variableExpiration()
.asyncExpirationListener(new ExpirationListener<String, ParserDeviceHostDto>() {
@Override
public void expired(String s, ParserDeviceHostDto parserDeviceHostDto) {
log.info("超时清除>>>>>>>:{} ",s);
}
})
.expirationPolicy(ExpirationPolicy.CREATED).build();
public static void putDeviceInfo(ParserDeviceInfoDto parserDeviceInfoDto,Long device_life)
{
parserDeviceInfoDtoMap.put(parserDeviceInfoDto.getId(),parserDeviceInfoDto,device_life,TimeUnit.SECONDS);
}
public static void putDeviceHost(ParserDeviceHostDto parserDeviceHostDto,Long device_life)
{
parserDeviceHostDtoMap.put(parserDeviceHostDto.getId(),parserDeviceHostDto,device_life,TimeUnit.SECONDS);
}
public static ParserDeviceInfoDto getDeviceInfo(String deviceInfoId)
{
return parserDeviceInfoDtoMap.get(deviceInfoId);
}
public static ParserDeviceHostDto getDeviceHost(String deviceId)
{
return parserDeviceHostDtoMap.get(deviceId);
}
public static void reDeviceInfo(String deviceInfoId)
{
parserDeviceInfoDtoMap.remove(deviceInfoId);
}
public static void reDeviceHost(String deviceId)
{
parserDeviceHostDtoMap.remove(deviceId);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import lombok.Data;
import java.util.List;
@Data
public class AnalysisDto {
private JsonObject things_model_value;
private JsonObject things_model_config;
private List<DeviceSensorData> deviceSensorDataList;
public AnalysisDto pushDeviceSensorData(List<DeviceSensorData> deviceSensorDataList)
{
if(null != deviceSensorDataList && null != this.deviceSensorDataList && this.deviceSensorDataList.size() != 0)
{
deviceSensorDataList.addAll(this.deviceSensorDataList);
}
return this;
}
public ParserDeviceHostDto toParserDeviceHostDto(String id)
{
ParserDeviceHostDto parserDeviceHostDto = new ParserDeviceHostDto();
parserDeviceHostDto.setData(things_model_value);
parserDeviceHostDto.setConfig(things_model_config);
parserDeviceHostDto.setId(id);
return parserDeviceHostDto;
}
public ParserDeviceInfoDto toParserDeviceInfoDto(String id)
{
ParserDeviceInfoDto parserDeviceInfoDto = new ParserDeviceInfoDto();
parserDeviceInfoDto.setData(things_model_value);
parserDeviceInfoDto.setConfig(things_model_config);
parserDeviceInfoDto.setId(id);
return parserDeviceInfoDto;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.google.gson.JsonObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ParserDeviceHostDto {
/**
* 主键id
*/
private String id;
/**
* 数据
*/
private JsonObject data;
/**
* 配置
*/
private JsonObject config;
/**
* 数据更新时间
*/
private Integer updateTime;
/**
* 生命周期
*/
private Long device_life;
/**
* 数据类型
*/
private String device_type;
/**
*同步数据的
*/
private String sync_db;
/**
*是否同步数据
*/
private boolean is_sync_db;
/**
*产品id
*/
private Integer product_id;
/**
* 解析服务
*/
private String analysis_clas;
/**
* 清洗服务
*/
private String purification_clas;
/**
* 设备摘要,格式{{"name":"device"},{"chip":"esp8266"}}
*/
private JsonObject summary;
private boolean is_config_up;
private boolean is_data_up;
private boolean is_summary_up;
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.google.gson.JsonObject;
import lombok.Data;
@Data
public class ParserDeviceInfoDto {
private String id;
private String deviceInfoName;
private JsonObject data;
private JsonObject config;
private Integer updateTime;
private boolean is_data_up;
private boolean is_conf_up;
}
... ...
package com.zhonglai.luhui.device.protocol.factory.dto;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 协议清洗模型
*/
public class ProtocolPurificationModel {
private ParserDeviceHostDto parserDeviceHostDto = new ParserDeviceHostDto();
private List<ParserDeviceInfoDto> parserDeviceInfoDtoList = new ArrayList<>();
private List<DeviceSensorData> deviceSensorDataList = new ArrayList<>();
private List<LogDeviceOperation> logDeviceOperationList = new ArrayList<>();
public ParserDeviceHostDto getParserDeviceHostDto() {
return parserDeviceHostDto;
}
public void setParserDeviceHostDto(ParserDeviceHostDto parserDeviceHostDto) {
this.parserDeviceHostDto = parserDeviceHostDto;
}
public List<ParserDeviceInfoDto> getParserDeviceInfoDtoList() {
return parserDeviceInfoDtoList;
}
public void setParserDeviceInfoDtoList(List<ParserDeviceInfoDto> parserDeviceInfoDtoList) {
this.parserDeviceInfoDtoList = parserDeviceInfoDtoList;
}
public List<DeviceSensorData> getDeviceSensorDataList() {
return deviceSensorDataList;
}
public void setDeviceSensorDataList(List<DeviceSensorData> deviceSensorDataList) {
this.deviceSensorDataList = deviceSensorDataList;
}
public List<LogDeviceOperation> getLogDeviceOperationList() {
return logDeviceOperationList;
}
public void setLogDeviceOperationList(List<LogDeviceOperation> logDeviceOperationList) {
this.logDeviceOperationList = logDeviceOperationList;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.purification;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
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.domain.IotThingsModel;
import com.zhonglai.luhui.device.protocol.factory.dto.AnalysisDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.service.IotThingsModelService;
import com.zhonglai.luhui.device.protocol.factory.service.PersistenceDBService;
import org.apache.commons.lang3.EnumUtils;
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("default_purification")
public class DefaultProtocolPurificationFactoryImpl implements ProtocolPurificationFactory{
@Autowired
private IotThingsModelService iotThingsModelService;
@Override
public ProtocolPurificationModel purification(Integer product_id,Topic topic, JsonObject protocolParserModel ) {
if(null != protocolParserModel && protocolParserModel.size()!=0)
{
ProtocolPurificationModel protocolPurificationModel = new ProtocolPurificationModel();
ParserDeviceHostDto parserDeviceHostDto = analysisHost(product_id,topic,protocolParserModel,protocolPurificationModel.getDeviceSensorDataList());
protocolPurificationModel.setParserDeviceHostDto(parserDeviceHostDto);
List<ParserDeviceInfoDto> parserDeviceInfoDtoList = analysisDeviceInfo(product_id,topic,protocolParserModel,protocolPurificationModel.getDeviceSensorDataList());
protocolPurificationModel.setParserDeviceInfoDtoList(parserDeviceInfoDtoList);
return protocolPurificationModel;
}
return null;
}
private ParserDeviceHostDto analysisHost(Integer product_id,Topic topic, JsonObject data,List<DeviceSensorData> deviceSensorDataList )
{
if(data.has("0"))
{
JsonObject jsonObjectData = GsonConstructor.get().fromJson(GsonConstructor.get().toJson(data.get("0")),JsonObject.class);
JsonObject summary = null;
//解析设备摘要
if(jsonObjectData.has("summary") && null != jsonObjectData.get("summary") && jsonObjectData.get("summary").isJsonObject())
{
summary = jsonObjectData.get("summary").getAsJsonObject();
jsonObjectData.remove("summary");
}
ParserDeviceHostDto parserDeviceHostDto = null;
if(null != jsonObjectData && jsonObjectData.size() != 0)
{
parserDeviceHostDto = analysisJsonData(product_id,topic,jsonObjectData).pushDeviceSensorData(deviceSensorDataList).toParserDeviceHostDto(topic.getClientid());
}
if(null != summary && summary.size() != 0)
{
if(null == parserDeviceHostDto)
{
parserDeviceHostDto = new ParserDeviceHostDto();
parserDeviceHostDto.setId(topic.getClientid());
}
parserDeviceHostDto.setSummary(summary);
}
return parserDeviceHostDto;
}
return null;
}
private List<ParserDeviceInfoDto> analysisDeviceInfo(Integer product_id,Topic topic, JsonObject data,List<DeviceSensorData> deviceSensorDataList)
{
List<ParserDeviceInfoDto> list = new ArrayList<>();
for (String key:data.keySet())
{
if(!key.equals("0") && data.get(key).isJsonObject())
{
ParserDeviceInfoDto parserDeviceInfoDto = analysisJsonData(product_id,topic,data.get(key).getAsJsonObject()).pushDeviceSensorData(deviceSensorDataList).toParserDeviceInfoDto(topic.getClientid()+"_"+key);
list.add(parserDeviceInfoDto);
}
}
return list;
}
private AnalysisDto analysisJsonData(Integer product_id,Topic topic, JsonObject jsonObjectData )
{
if(null != jsonObjectData && jsonObjectData.size() !=0)
{
AnalysisDto analysisDto = new AnalysisDto();
JsonObject things_model_value = new JsonObject(); //存放数据
analysisDto.setThings_model_value(things_model_value);
JsonObject things_model_config = new JsonObject(); //存放配置
analysisDto.setThings_model_config(things_model_config);
for (String key: jsonObjectData.keySet())
{
IotThingsModel thingsModel = iotThingsModelService.getIotThingsModel(product_id, key);
JsonElement jsonElement = jsonObjectData.get(key);
if(null != jsonElement && !jsonElement.isJsonNull() )
{
ThingsModelItemBase thingsModelItemBase = getThingsModelItemBase(thingsModel,jsonElement);
if(!thingsModelItemBase.checkValue())
{
continue;
}
switch (thingsModel.getIs_config())
{
case 0:
things_model_value.add(key,GsonConstructor.get().fromJson(JSONObject.toJSONString(thingsModelItemBase),JsonObject.class));
break;
case 1:
things_model_config.add(key,GsonConstructor.get().fromJson(JSONObject.toJSONString(thingsModelItemBase),JsonObject.class));
break;
case 2:
things_model_config.add(key,GsonConstructor.get().fromJson(JSONObject.toJSONString(thingsModelItemBase),JsonObject.class));
things_model_value.add(key,GsonConstructor.get().fromJson(JSONObject.toJSONString(thingsModelItemBase),JsonObject.class));
break;
default:
things_model_value.add(key,GsonConstructor.get().fromJson(JSONObject.toJSONString(thingsModelItemBase),JsonObject.class));
break;
}
//记录数据日志
if(1==thingsModelItemBase.getIs_save_log() )
{
List<DeviceSensorData> deviceSensorDataList = analysisDto.getDeviceSensorDataList();
if(null == deviceSensorDataList)
{
deviceSensorDataList = new ArrayList<>();
analysisDto.setDeviceSensorDataList(deviceSensorDataList);
}
deviceSensorDataList.add(getDeviceSensorData(topic,thingsModel,thingsModelItemBase));
}
}
}
return analysisDto;
}
return null;
}
private ThingsModelItemBase getThingsModelItemBase(IotThingsModel thingsModel,JsonElement jsonElement)
{
String data_type = thingsModel.getData_type().toUpperCase();
if(!EnumUtils.isValidEnum(ThingsModelDataTypeEnum.class,data_type))
{
data_type = ThingsModelDataTypeEnum.STRING.name();
}
return ThingsModelItemBase.newhingsModelItem(Enum.valueOf(ThingsModelDataTypeEnum.class,data_type),thingsModel, jsonElement);
}
private DeviceSensorData getDeviceSensorData(Topic topic,IotThingsModel thingsModel,ThingsModelItemBase thingsModelItemBase)
{
DeviceSensorData sensorData = new DeviceSensorData();
sensorData.setDataType(thingsModel.getIdentifier());
sensorData.setDataValue(thingsModelItemBase.getSaveView());
sensorData.setCreatTime(com.zhonglai.luhui.device.analysis.comm.util.DateUtils.getNowTimeMilly());
sensorData.setDeviceModel(topic.getUsername());
sensorData.setDeviceInfoId(topic.getClientid());
return sensorData;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.purification;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
/**
* 协议清洗工厂
*/
public interface ProtocolPurificationFactory {
ProtocolPurificationModel purification(Integer product_id,Topic topic, JsonObject analysisObject );
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import com.zhonglai.luhui.device.protocol.factory.ProtocolParserAndPurificationFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 数据业务层
* @param <T>
*/
public abstract class BaseCallback<T> {
/**
* 系统日志
*/
protected final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 数据处理工厂
*/
@Autowired
protected ProtocolParserAndPurificationFactory<T> protocolParserAndPurificationFactory;
/**
* 内存处理服务
*/
@Autowired
protected DeviceCashUpService deviceCashUpService;
/**
* 公共持久化服务
*/
@Autowired
protected PersistenceDBService persistenceDBService;
/**
* 数据处理的工作流
*/
protected void messageArrived(String imei,String s,T payload) throws ClassNotFoundException {
//判断网关是否存在
ParserDeviceHostDto oldparserDeviceHostDto = persistenceDBService.getOldParserDeviceHostDto(imei);
if(null == oldparserDeviceHostDto)
{
log.info("设备{}不存在",imei);
return;
}
//解析和清洗body
ProtocolPurificationModel protocolPurificationModel = protocolParserAndPurificationFactory.analysisAndPurification( oldparserDeviceHostDto.getProduct_id(),s,payload,oldparserDeviceHostDto.getAnalysis_clas(),oldparserDeviceHostDto.getPurification_clas());
//缓存更新
int i = deviceCashUpService.upProtocolPurificationModel(protocolPurificationModel,oldparserDeviceHostDto);
//持久化
persistenceDBService.upDB(protocolPurificationModel);
//同步
persistenceDBService.syncDB(protocolPurificationModel);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* 缓存更新
*/
@Service
public class DeviceCashUpService {
@Autowired
private PersistenceDBService persistenceDBService;
/**
* 更新清洗数据
* @param protocolPurificationModel
* @return
*/
public int upProtocolPurificationModel(ProtocolPurificationModel protocolPurificationModel,ParserDeviceHostDto oldparserDeviceHostDto )
{
//更新主机信息
int i = upParserDeviceHostDto(protocolPurificationModel,oldparserDeviceHostDto);
//更新终端信息
i += upParserDeviceInfoDtoList(protocolPurificationModel,oldparserDeviceHostDto);
return i;
}
/**
* 更新主机信息
* @param protocolPurificationModel
* @return
*/
private int upParserDeviceHostDto( ProtocolPurificationModel protocolPurificationModel , ParserDeviceHostDto oldparserDeviceHostDto)
{
ParserDeviceHostDto parserDeviceHostDto = protocolPurificationModel.getParserDeviceHostDto();
int i=0;
JsonObject oldData = oldparserDeviceHostDto.getData();
JsonObject newData = parserDeviceHostDto.getData();
if(null != newData)
{
if(null == oldData)
{
oldparserDeviceHostDto.setData(newData);
i++;
oldparserDeviceHostDto.set_data_up(true);
}else {
if(newToOldJsonObject(oldData,newData))
{
i++;
oldparserDeviceHostDto.set_data_up(true);
}
}
}
JsonObject oldConfig = oldparserDeviceHostDto.getConfig();
JsonObject newConfig = parserDeviceHostDto.getConfig();
if(null != newConfig)
{
if(null == oldConfig)
{
oldparserDeviceHostDto.setConfig(newConfig);
i++;
oldparserDeviceHostDto.set_config_up(true);
}else {
if(newToOldJsonObject(oldConfig,newConfig))
{
i++;
oldparserDeviceHostDto.set_config_up(true);
}
}
}
JsonObject oldSummary = oldparserDeviceHostDto.getSummary();
JsonObject newSummary = parserDeviceHostDto.getSummary();
if(null != newSummary)
{
if(null == oldSummary)
{
oldparserDeviceHostDto.setSummary(newSummary);
i++;
oldparserDeviceHostDto.set_summary_up(true);
}else {
if(newToOldJsonObject(oldSummary,newSummary))
{
i++;
oldparserDeviceHostDto.set_summary_up(true);
}
}
}
protocolPurificationModel.setParserDeviceHostDto(oldparserDeviceHostDto);
//更新主机缓存
DeviceCach.putDeviceHost(oldparserDeviceHostDto,oldparserDeviceHostDto.getDevice_life());
return i;
}
/**
* 批量更新终端
* @param protocolPurificationModel
* @param oldparserDeviceHostDto
* @return
*/
private int upParserDeviceInfoDtoList(ProtocolPurificationModel protocolPurificationModel, ParserDeviceHostDto oldparserDeviceHostDto)
{
List<ParserDeviceInfoDto> parserDeviceInfoDtoList = protocolPurificationModel.getParserDeviceInfoDtoList();
int i=0;
if(null != parserDeviceInfoDtoList && parserDeviceInfoDtoList.size()!=0)
{
List<ParserDeviceInfoDto> oldParserDeviceInfoDtoList = new ArrayList<>();
for (ParserDeviceInfoDto parserDeviceInfoDto:parserDeviceInfoDtoList)
{
ParserDeviceInfoDto oldparserDeviceInfoDto = persistenceDBService.getOldParserDeviceInfoDto(parserDeviceInfoDto.getId(),parserDeviceInfoDto.getDeviceInfoName(),oldparserDeviceHostDto);
if(null == oldparserDeviceInfoDto)
{
continue;
}
oldparserDeviceInfoDto.setUpdateTime(parserDeviceInfoDto.getUpdateTime());
i+=upParserDeviceInfoDto(parserDeviceInfoDto,oldparserDeviceInfoDto);
oldParserDeviceInfoDtoList.add(oldparserDeviceInfoDto);
//更新缓存
DeviceCach.putDeviceInfo(oldparserDeviceInfoDto,oldparserDeviceHostDto.getDevice_life());
}
protocolPurificationModel.setParserDeviceInfoDtoList(oldParserDeviceInfoDtoList);
}
return i;
}
/**
* 更新终端
* @param parserDeviceInfoDto
* @return
*/
private int upParserDeviceInfoDto( ParserDeviceInfoDto parserDeviceInfoDto , ParserDeviceInfoDto oldparserDeviceInfoDto)
{
int i=0;
JsonObject oldData = oldparserDeviceInfoDto.getData();
JsonObject newData = parserDeviceInfoDto.getData();
if(null != newData)
{
if(null == oldData)
{
oldparserDeviceInfoDto.setData(newData);
i++;
oldparserDeviceInfoDto.set_data_up(true);
}else {
if(newToOldJsonObject(oldData,newData))
{
i++;
oldparserDeviceInfoDto.set_data_up(true);
}
}
}
JsonObject oldConfig = oldparserDeviceInfoDto.getConfig();
JsonObject newConfig = parserDeviceInfoDto.getConfig();
if(null != newConfig)
{
if(null == oldConfig)
{
oldparserDeviceInfoDto.setConfig(newConfig);
i++;
oldparserDeviceInfoDto.set_conf_up(true);
}else {
if(newToOldJsonObject(oldConfig,newConfig))
{
i++;
oldparserDeviceInfoDto.set_conf_up(true);
}
}
}
return i;
}
public void upOnline(String state)
{
switch (state)
{
case "1":
return;
case "2":
return;
case "3":
return;
default:
return;
}
}
private boolean newToOldJsonObject(JsonObject oldJson,JsonObject newJson)
{
boolean ischange = false;
for(String key:newJson.keySet())
{
if(!newJson.get(key).equals(oldJson.get(key)))
{
oldJson.add(key,newJson.get(key));
ischange = true;
}
}
return ischange;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import com.google.gson.JsonObject;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 物模型业务
*/
@Service
public class IotThingsModelService {
private static Map<Integer, Map<String, IotThingsModel>> iotThingsModelMap = new HashMap<>();
@Autowired
private PersistenceDBService persistenceDBService;
public IotThingsModel getIotThingsModel(Integer product_id,String identifier)
{
Map<String, IotThingsModel> iotThingsModelMap = getIotThingsModelMap( product_id);
if(null == iotThingsModelMap || null == iotThingsModelMap.get(identifier)) //没有配置的 都按字符串处理
{
IotThingsModel thingsModel = new IotThingsModel();
thingsModel.setData_type(ThingsModelDataTypeEnum.STRING.name());
thingsModel.setIdentifier(identifier);
thingsModel.setModel_name(identifier);
thingsModel.setIs_top(0);
thingsModel.setIs_monitor(0);
thingsModel.setIs_save_log(0);
thingsModel.setIs_config(0);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("maxLength",255);
thingsModel.setSpecs(jsonObject.toString());
return thingsModel;
}
return iotThingsModelMap.get(identifier);
}
private Map<String, IotThingsModel> getIotThingsModelMap(Integer product_id)
{
if(!iotThingsModelMap.containsKey(product_id))
{
Map<String,IotThingsModel> map = persistenceDBService.getIotThingsModelMap(product_id);
if(null == map || map.size() == 0)
{
return null;
}
iotThingsModelMap.put(product_id,map);
}
return iotThingsModelMap.get(product_id);
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.protocol.factory.config.DeviceCach;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.service.impl.DefaultDbService;
import com.zhonglai.luhui.device.protocol.factory.sync.ProtocolSyncFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 和数据库有个的操作都在这里
*/
@Service
public class PersistenceDBService {
@Autowired
private DefaultDbService defaultDbService;
/**
* 更新数据库
* @param protocolPurificationModel
*/
public void upDB(ProtocolPurificationModel protocolPurificationModel)
{
//主机
ParserDeviceHostDto parserDeviceHostDto = protocolPurificationModel.getParserDeviceHostDto();
defaultDbService.updateParserDeviceHostDto(parserDeviceHostDto);
//终端
List<ParserDeviceInfoDto> parserDeviceInfoDtoList = protocolPurificationModel.getParserDeviceInfoDtoList();
defaultDbService.updateParserDeviceInfoDtoList(parserDeviceInfoDtoList);
//传感器指标
List<DeviceSensorData> deviceSensorDataList = protocolPurificationModel.getDeviceSensorDataList();
defaultDbService.updateDeviceSensorDataList(deviceSensorDataList);
//数据操作
List<LogDeviceOperation> logDeviceOperationList = protocolPurificationModel.getLogDeviceOperationList();
defaultDbService.updateLogDeviceOperationList(logDeviceOperationList);
}
/**
* 同步数据库
*/
public void syncDB(ProtocolPurificationModel protocolPurificationModel) throws ClassNotFoundException {
//主机
ParserDeviceHostDto parserDeviceHostDto = protocolPurificationModel.getParserDeviceHostDto();
if (parserDeviceHostDto.is_sync_db() && StringUtils.isNotEmpty(parserDeviceHostDto.getSync_db()))
{
ProtocolSyncFactory protocolSyncFactory = getProtocolSyncService(parserDeviceHostDto.getSync_db());
if(null != protocolSyncFactory)
{
protocolSyncFactory.updateParserDeviceHostDto(parserDeviceHostDto);
//终端
List<ParserDeviceInfoDto> parserDeviceInfoDtoList = protocolPurificationModel.getParserDeviceInfoDtoList();
protocolSyncFactory.updateParserDeviceInfoDtoList(parserDeviceInfoDtoList);
//传感器指标
List<DeviceSensorData> deviceSensorDataList = protocolPurificationModel.getDeviceSensorDataList();
protocolSyncFactory.updateDeviceSensorDataList(deviceSensorDataList);
//数据操作
List<LogDeviceOperation> logDeviceOperationList = protocolPurificationModel.getLogDeviceOperationList();
protocolSyncFactory.updateLogDeviceOperationList(logDeviceOperationList);
}
}
}
/**
* 获取老的终端数据
* @param id
* @param name
* @param oldparserDeviceHostDto
* @return
*/
public ParserDeviceInfoDto getOldParserDeviceInfoDto(String id,String name,ParserDeviceHostDto oldparserDeviceHostDto)
{
ParserDeviceInfoDto oldparserDeviceInfoDto = DeviceCach.getDeviceInfo(id);
if(null == oldparserDeviceInfoDto )
{
oldparserDeviceInfoDto = defaultDbService.getParserDeviceInfoDtoFromDb(id,name,oldparserDeviceHostDto);
if(null == oldparserDeviceInfoDto)
{
return null;
}
DeviceCach.putDeviceInfo(oldparserDeviceInfoDto,oldparserDeviceHostDto.getDevice_life());
}
return oldparserDeviceInfoDto;
}
/**
* 获取网关
* @param id
* @return
*/
public IotDevice getDeviceHostById(String id)
{
return defaultDbService.getDeviceById(id);
}
/**
* 获取产品
* @param id
* @return
*/
public IotProduct getIotProductById(Integer id)
{
return defaultDbService.getIotProductById(id);
}
public Map<String,IotThingsModel> getIotThingsModelMap(Integer product_id)
{
List<IotThingsModel> list = defaultDbService.getIotThingsModelList(product_id);
if(null != list && list.size() != 0 )
{
Map<String,IotThingsModel> map = new HashMap<>();
for (IotThingsModel iotThingsModel:list)
{
map.put(iotThingsModel.getIdentifier(),iotThingsModel);
}
return map;
}
return null;
}
/**
* 获取默认数据库的操作服务
* @return
*/
public DefaultDbService getDefaultDbService()
{
return SpringUtils.getBean(DefaultDbService.class);
}
/**
* 获取指定数据库的操作服务
* @return
*/
public ProtocolSyncFactory getProtocolSyncService(String clasname) throws ClassNotFoundException {
if(StringUtils.isEmpty(clasname))
{
return null;
}
return (ProtocolSyncFactory) SpringUtils.getBean(Class.forName(clasname));
}
/**
* 获取主机信息
* @param imei
* @return
*/
public ParserDeviceHostDto getOldParserDeviceHostDto(String imei)
{
ParserDeviceHostDto oldParserDeviceHostDto = DeviceCach.getDeviceHost(imei);
if(null == oldParserDeviceHostDto)
{
IotDevice iotDevice = getDeviceHostById(imei);
if(null == iotDevice)
{
return null;
}
if(iotDevice.getStatus()==2 || iotDevice.getStatus()==5)
{
return null;
}
oldParserDeviceHostDto = new ParserDeviceHostDto();
oldParserDeviceHostDto.setId(iotDevice.getClient_id());
if(StringUtils.isNotEmpty(iotDevice.getSummary()))
{
oldParserDeviceHostDto.setData(GsonConstructor.get().fromJson(iotDevice.getSummary(), JsonObject.class));
}
if(null == iotDevice.getDevice_life())
{
iotDevice.setDevice_life(60l);
}
IotProduct iotProduct = getIotProductById(iotDevice.getProduct_id());
oldParserDeviceHostDto.setDevice_life(iotDevice.getDevice_life());
oldParserDeviceHostDto.setDevice_type(iotDevice.getMqtt_username());
oldParserDeviceHostDto.set_sync_db(iotProduct.getIs_sync_db()==1);
oldParserDeviceHostDto.setSync_db(iotProduct.getSync_db());
oldParserDeviceHostDto.setProduct_id(iotDevice.getProduct_id());
oldParserDeviceHostDto.setAnalysis_clas(iotProduct.getAnalysis_clas());
oldParserDeviceHostDto.setPurification_clas(iotProduct.getPurification_clas());
//设置同步设备
// if("1".equals(iotProduct.getIs_sync_db()) && StringUtils.isNotEmpty(iotProduct.getSync_db()))
// {
// ParserDeviceHostDto parserDeviceHostDto = getSyncDeviceById(iotDevice.getClient_id(),iotProduct.getSync_db());
// if(null != parserDeviceHostDto)
// {
// if(StringUtils.isNull(parserDeviceHostDto.getDevice_life()))
// {
// parserDeviceHostDto.setDevice_life(iotDevice.getDevice_life());
// }
// parserDeviceHostDto.setId(iotProduct.getSync_db()+"|"+parserDeviceHostDto.getId());
// DeviceCach.putDeviceHost(parserDeviceHostDto,parserDeviceHostDto.getDevice_life());
// }
// }
}
return oldParserDeviceHostDto;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.service.impl;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
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.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class DefaultDbService {
private BaseDao baseDao = new BaseDao();
public List<String> getTopicFromRole()
{
List<String> rlist= new ArrayList<>();
List<Map> list = baseDao.findListBysql("SELECT id FROM `iot_role` WHERE id NOT IN(1,2,3,8,9,10)");
if(null != list && list.size() !=0)
{
for(Map map:list)
{
rlist.add("/"+map.get("id")+"/#");
}
}
return rlist;
}
public IotDevice getDeviceById(String id)
{
return (IotDevice) baseDao.get(IotDevice.class,"client_id='"+id+"'","`mqtt_broker`.`iot_device`");
}
public IotProduct getIotProductById(Integer id)
{
return (IotProduct) baseDao.get(IotProduct.class,"id='"+id+"'","`mqtt_broker`.`iot_product`");
}
public IotTerminal getDeviceInfoById(String id)
{
return (IotTerminal) baseDao.get(IotTerminal.class,"id='"+id+"'","`mqtt_broker`.`iot_terminal`");
}
public List<IotThingsModel> getIotThingsModelList(Integer product_id)
{
IotThingsModel iotThingsModel = new IotThingsModel();
iotThingsModel.setProduct_id(product_id);
return baseDao.find(iotThingsModel);
}
public void insertIotTerminal(IotTerminal iotTerminal)
{
baseDao.insert(iotTerminal);
}
public ParserDeviceHostDto getParserDeviceHostDtoFromDb(String id) {
IotDevice iotDevice = getDeviceById(id);
ParserDeviceHostDto parserDeviceHostDto = new ParserDeviceHostDto();
parserDeviceHostDto.setId(id);
if(StringUtils.isNotEmpty(iotDevice.getSummary()))
{
parserDeviceHostDto.setData(GsonConstructor.get().fromJson(iotDevice.getSummary(),JsonObject.class));
}
parserDeviceHostDto.setUpdateTime(iotDevice.getData_update_time());
parserDeviceHostDto.setDevice_life(iotDevice.getDevice_life());
parserDeviceHostDto.setDevice_type(iotDevice.getMqtt_username());
IotProduct iotProduct = getIotProductById(iotDevice.getProduct_id());
parserDeviceHostDto.setSync_db(iotProduct.getSync_db());
parserDeviceHostDto.setProduct_id(iotDevice.getProduct_id());
return parserDeviceHostDto;
}
public ParserDeviceInfoDto getParserDeviceInfoDtoFromDb(String id,String name, ParserDeviceHostDto oldparserDeviceHostDto) {
IotTerminal iotTerminal = (IotTerminal) baseDao.get(IotTerminal.class,id);
if(null == iotTerminal)
{
iotTerminal = new IotTerminal();
iotTerminal.setId(id);
iotTerminal.setDevice_id(oldparserDeviceHostDto.getId());
iotTerminal.setMqtt_username(oldparserDeviceHostDto.getDevice_type());
iotTerminal.setCreate_time(oldparserDeviceHostDto.getUpdateTime());
iotTerminal.setProduct_id(oldparserDeviceHostDto.getProduct_id());
if(StringUtils.isNotEmpty(name))
{
iotTerminal.setName(name);
}
baseDao.insert(iotTerminal);
}
ParserDeviceInfoDto oldparserDeviceInfoDto = new ParserDeviceInfoDto();
oldparserDeviceInfoDto.setId(id);
oldparserDeviceInfoDto.setDeviceInfoName(iotTerminal.getName());
if(StringUtils.isNotEmpty(iotTerminal.getThings_model_value()))
{
oldparserDeviceInfoDto.setData(GsonConstructor.get().fromJson(iotTerminal.getThings_model_value(),JsonObject.class));
}
if(StringUtils.isNotEmpty(iotTerminal.getThings_model_config()))
{
oldparserDeviceInfoDto.setConfig(GsonConstructor.get().fromJson(iotTerminal.getThings_model_config(),JsonObject.class));
}
return oldparserDeviceInfoDto;
}
public int updateParserDeviceHostDto(ParserDeviceHostDto parserDeviceHostDto)
{
IotDevice iotDevice = new IotDevice();
iotDevice.setClient_id(parserDeviceHostDto.getId());
iotDevice.setData_update_time(parserDeviceHostDto.getUpdateTime());
if(parserDeviceHostDto.is_summary_up())
{
if(null != parserDeviceHostDto.getSummary() && parserDeviceHostDto.getSummary().size() != 0)
{
iotDevice.setSummary(parserDeviceHostDto.getSummary().toString());
}
parserDeviceHostDto.set_summary_up(false);
}
if(parserDeviceHostDto.is_data_up())
{
if(null != parserDeviceHostDto.getData() && parserDeviceHostDto.getData().size() != 0)
{
iotDevice.setThings_model_value(parserDeviceHostDto.getData().toString());
}
parserDeviceHostDto.set_data_up(false);
}
if(parserDeviceHostDto.is_config_up())
{
if(null != parserDeviceHostDto.getConfig() && parserDeviceHostDto.getConfig().size() != 0)
{
iotDevice.setThings_model_config(parserDeviceHostDto.getConfig().toString());
}
parserDeviceHostDto.set_config_up(false);
}
int i = baseDao.update(iotDevice);
return i;
}
public int updateParserDeviceInfoDtoList(List<ParserDeviceInfoDto> parserDeviceInfoDtoList) {
int i=0;
if(null != parserDeviceInfoDtoList && parserDeviceInfoDtoList.size() != 0)
{
for (ParserDeviceInfoDto parserDeviceInfoDto:parserDeviceInfoDtoList)
{
IotTerminal iotTerminal = new IotTerminal();
iotTerminal.setId(parserDeviceInfoDto.getId());
iotTerminal.setData_update_time(parserDeviceInfoDto.getUpdateTime());
iotTerminal.setOnline(1);
if(parserDeviceInfoDto.is_data_up())
{
iotTerminal.setThings_model_value(parserDeviceInfoDto.getData().toString());
parserDeviceInfoDto.set_data_up(false);
}
if(parserDeviceInfoDto.is_conf_up())
{
iotTerminal.setThings_model_config(parserDeviceInfoDto.getConfig().toString());
parserDeviceInfoDto.set_conf_up(false);
}
i+=baseDao.update(iotTerminal);
}
}
return i;
}
public int updateDeviceSensorDataList(List<DeviceSensorData> deviceSensorDataList) {
if(null != deviceSensorDataList && deviceSensorDataList.size() != 0)
{
return baseDao.insertList(deviceSensorDataList, TableGenerateSqlEnum.DeviceSensorData.getNowTableName());
}
return 0;
}
public int updateLogDeviceOperationList(List<LogDeviceOperation> logDeviceOperationList) {
if(null != logDeviceOperationList && logDeviceOperationList.size() != 0 )
{
return baseDao.insertList(logDeviceOperationList, TableGenerateSqlEnum.LogDeviceOperation.getNowTableName());
}
return 0;
}
}
... ...
package com.zhonglai.luhui.device.protocol.factory.sync;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import java.util.List;
public interface ProtocolSyncFactory {
//主机
void updateParserDeviceHostDto(ParserDeviceHostDto parserDeviceHostDto);
//终端
void updateParserDeviceInfoDtoList( List<ParserDeviceInfoDto> parserDeviceInfoDtoList);
//传感器指标
void updateDeviceSensorDataList(List<DeviceSensorData> deviceSensorDataList);
//数据操作
void updateLogDeviceOperationList(List<LogDeviceOperation> logDeviceOperationList);
}
... ...
<?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>lh-device-protocol-parser</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-xinjie</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>
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-protocol-factory</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.device.protocol.xinjie.analysis;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.analysis.ProtocolParserFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.xinjie.dto.Variant;
import com.zhonglai.luhui.device.protocol.xinjie.dto.XinJieDto;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class ProtocolParserServiceImpl implements ProtocolParserFactory<byte[]> {
private static final String topicModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{imei}}/{{topicType}}";
@Override
public Topic analysisTopic(String topicStr) {
// /13/jiulin/476210165B365166812345678Userdata/Json/476210165B365166812345678/pub_data
Topic topic = TopicUtil.initTopicFromModelStr(topicStr,topicModel);
return topic;
}
@Override
public JsonObject analysisPayload(Topic topic, byte[] payload) {
String data = new String(payload);
XinJieDto xinJieDto = GsonConstructor.get().fromJson(data, XinJieDto.class);
if(null != xinJieDto.getVariant() && xinJieDto.getVariant().size()!=0)
{
JsonObject rj = new JsonObject();
analysisHost(rj,xinJieDto);
analysisDeviceInfo(rj,xinJieDto);
return rj;
}
return GsonConstructor.get().fromJson(data, JsonObject.class);
}
private void analysisHost(JsonObject rj,XinJieDto xinJieDto)
{
Variant variant = xinJieDto.getVariant().get(0);
JsonObject data = new JsonObject();
JsonObject summary = new JsonObject();
summary.addProperty("Unix",variant.getUnix());
summary.addProperty("Version",variant.getVersion());
data.add("summary",summary);
rj.add("0",data);
}
private void analysisDeviceInfo(JsonObject rj,XinJieDto xinJieDto )
{
Variant variant = xinJieDto.getVariant().get(0);
int i =1;
for (String key:variant.getPub_Data().keySet())
{
rj.add(ByteUtil.changerTwoStr(i+""),variant.getPub_Data().get(key).getAsJsonObject());
i++;
}
}
}
... ...
package com.zhonglai.luhui.device.protocol.xinjie.db;
import com.zhonglai.luhui.device.analysis.comm.dao.DBFactory;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.util.Properties;
public class LsyDBFactoryImp implements DBFactory {
private static DataSource ds = null;
static {
try {
if(null==ds )
{
String dbPath = System.getProperty("dbPath");
String path = null != dbPath?dbPath:System.getProperty("user.dir")+"/configs/";
Properties p = new Properties();
System.out.println("》》》》》》》》》》》》》数据库配置文件地址:"+path+"lsy_dbcpconfig.properties");
p.load(new FileInputStream(path+"lsy_dbcpconfig.properties"));
// p.load(DBFactory.class
// .getClassLoader().getResourceAsStream("configs/dbcpconfig.properties"));
ds = BasicDataSourceFactory.createDataSource(p);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public DataSource getDataSource() {
return ds;
}
}
... ...
package com.zhonglai.luhui.device.protocol.xinjie.dto;
/**
* 设备对象
* Created by zhonglai on 2016/12/15.
*/
public class DeviceInfo {
private String id;// varchar(50) NOT NULL COMMENT '设备主键ID(设备IMEI加编号)',
private String deviceName;// varchar(50) NOT NULL COMMENT '设备名称',
private Integer userId;// int(11) NOT NULL COMMENT '用户ID',
private String userLoginName;// varchar(50) NOT NULL COMMENT '用户登录名',
private Integer baseId;// int(11) NOT NULL COMMENT '基地ID',
private String baseName;// varchar(50) NOT NULL COMMENT '基地名称',
private Integer pondType;// int(11) NOT NULL COMMENT '塘口类型(0-外塘,1-水槽)',
private Integer pondId;// int(11) NOT NULL COMMENT '水槽或外塘ID',
private String pondName; // varchar(50) NOT NULL COMMENT '水槽或外塘名称',
private String deviceType;// int(11) DEFAULT NULL COMMENT '设备类型(0-PLC,1-鱼儿乐)',
private Integer deviceTerminalTypeKey;// int(11) DEFAULT NULL COMMENT '终端类型(0-排污,1-投饵,2-增氧,3-鱼儿乐,4-曝气,5-水流计量)',
private String deviceTerminalType;// varchar(50) DEFAULT NULL COMMENT '终端名称',
private String dataValue;// varchar(50) DEFAULT NULL COMMENT '数据值(json字符串)',
private String alarmCode;// varchar(50) DEFAULT '00' COMMENT '告警代码(00-正常)',
private Integer dataUpdateTime;// int(11) DEFAULT NULL COMMENT '更新时间',
private String deviceServiceIp;// varchar(100) DEFAULT NULL COMMENT '设备服务器IP',
private Integer createTime;// int(11) NOT NULL COMMENT '创建时间',
private String remark;// varchar(100) DEFAULT NULL COMMENT '备注',
private String online;
private Integer alarmUpdateTime; //告警更新时间
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserLoginName() {
return userLoginName;
}
public void setUserLoginName(String userLoginName) {
this.userLoginName = userLoginName;
}
public Integer getBaseId() {
return baseId;
}
public void setBaseId(Integer baseId) {
this.baseId = baseId;
}
public String getBaseName() {
return baseName;
}
public void setBaseName(String baseName) {
this.baseName = baseName;
}
public Integer getPondType() {
return pondType;
}
public void setPondType(Integer pondType) {
this.pondType = pondType;
}
public Integer getPondId() {
return pondId;
}
public void setPondId(Integer pondId) {
this.pondId = pondId;
}
public String getPondName() {
return pondName;
}
public void setPondName(String pondName) {
this.pondName = pondName;
}
public String getDeviceType() {
return deviceType;
}
public void setDeviceType(String deviceType) {
this.deviceType = deviceType;
}
public Integer getDeviceTerminalTypeKey() {
return deviceTerminalTypeKey;
}
public void setDeviceTerminalTypeKey(Integer deviceTerminalTypeKey) {
this.deviceTerminalTypeKey = deviceTerminalTypeKey;
}
public String getDeviceTerminalType() {
return deviceTerminalType;
}
public void setDeviceTerminalType(String deviceTerminalType) {
this.deviceTerminalType = deviceTerminalType;
}
public String getDataValue() {
return dataValue;
}
public void setDataValue(String dataValue) {
this.dataValue = dataValue;
}
public String getDeviceServiceIp() {
return deviceServiceIp;
}
public void setDeviceServiceIp(String deviceServiceIp) {
this.deviceServiceIp = deviceServiceIp;
}
public String getAlarmCode() {
return alarmCode;
}
public void setAlarmCode(String alarmCode) {
this.alarmCode = alarmCode;
}
public Integer getDataUpdateTime() {
return dataUpdateTime;
}
public void setDataUpdateTime(Integer dataUpdateTime) {
this.dataUpdateTime = dataUpdateTime;
}
public Integer getCreateTime() {
return createTime;
}
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getOnline() {
return online;
}
public void setOnline(String online) {
this.online = online;
}
public Integer getAlarmUpdateTime() {
return alarmUpdateTime;
}
public void setAlarmUpdateTime(Integer alarmUpdateTime) {
this.alarmUpdateTime = alarmUpdateTime;
}
}
... ...
package com.zhonglai.luhui.device.protocol.xinjie.dto;
import com.google.gson.JsonObject;
import lombok.Data;
@Data
public class Variant {
private String Unix;
private String Version;
private JsonObject Pub_Data;
}
... ...
package com.zhonglai.luhui.device.protocol.xinjie.dto;
import lombok.Data;
import java.util.List;
@Data
public class XinJieDto {
private List<Variant> Variant;
}
... ...
package com.zhonglai.luhui.device.protocol.xinjie.sync;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.device.analysis.comm.dto.thingsmodels.specs.*;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceInfoDto;
import com.zhonglai.luhui.device.protocol.factory.sync.ProtocolSyncFactory;
import com.zhonglai.luhui.device.protocol.xinjie.dto.DeviceInfo;
import com.zhonglai.luhui.device.protocol.xinjie.db.LsyDBFactoryImp;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class LsyProtocolSyncFactoryImpl implements ProtocolSyncFactory {
private BaseDao lsy_baseDao = new BaseDao(new LsyDBFactoryImp());
@Override
public void updateParserDeviceHostDto(ParserDeviceHostDto parserDeviceHostDto) {
}
@Override
public void updateParserDeviceInfoDtoList(List<ParserDeviceInfoDto> parserDeviceInfoDtoList) {
if(null != parserDeviceInfoDtoList && parserDeviceInfoDtoList.size() != 0)
{
for (ParserDeviceInfoDto parserDeviceInfoDto:parserDeviceInfoDtoList)
{
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.setId(parserDeviceInfoDto.getId());
deviceInfo.setDataUpdateTime(parserDeviceInfoDto.getUpdateTime());
deviceInfo.setOnline("1");
JsonObject datavalue = new JsonObject();
JsonObject parserDeviceInfoDtoJson = parserDeviceInfoDto.getData();
if(null != parserDeviceInfoDtoJson && parserDeviceInfoDtoJson.size() !=0)
{
for (String key:parserDeviceInfoDtoJson.keySet())
{
JsonObject jsonObject = parserDeviceInfoDtoJson.get(key).getAsJsonObject();
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(jsonObject);
datavalue.addProperty(key,thingsModelItemBase.getSaveView());
}
}
deviceInfo.setDataValue(datavalue.toString());
lsy_baseDao.update(deviceInfo);
}
}
}
@Override
public void updateDeviceSensorDataList(List<DeviceSensorData> deviceSensorDataList) {
}
@Override
public void updateLogDeviceOperationList(List<LogDeviceOperation> logDeviceOperationList) {
}
}
... ...
<?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>lh-modules</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-protocol-parser</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>
<packaging>pom</packaging>
<modules>
<module>lh-device-xinjie</module>
<module>lh-device-protocol-factory</module>
<module>lh-device-http-public</module>
</modules>
<description>
设备协议解析工厂
</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>lh-modules</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.luhui</groupId>
<artifactId>lh-http-service-proxy</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>
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- SpringWeb模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- servlet包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</dependency>
<!-- 文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--https://mvnrepository.com/artifact/io.swagger/swagger-models-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-models.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--&lt;!&ndash; https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui &ndash;&gt;-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-ui.version}</version>
</dependency>
<!-- 支持data -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--常用工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<!-- 通用工具-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-protocol-factory</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-http-public</artifactId>
</dependency>
</dependencies>
<build>
<finalName>lh-http-service-proxy</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<!--
生成的jar中,不要包含pom.xml和pom.properties这两个文件
-->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!--
是否要把第三方jar放到manifest的classpath中
-->
<addClasspath>true</addClasspath>
<!--
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.http.service.proxy.LhHttpServiceProxyApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- The configuration of maven-assembly-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.http.service.proxy;
import com.zhonglai.luhui.device.analysis.comm.config.CacheConfig;
import com.zhonglai.luhui.device.analysis.comm.config.FastJson2JsonRedisSerializer;
import 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;
import org.springframework.context.annotation.FilterType;
@ComponentScan(basePackages = {
"com.ruoyi.common.utils.spring",
"com.zhonglai.luhui.device.protocol",
"com.zhonglai.luhui.device.analysis.comm.config",
"com.zhonglai.luhui.http.service.proxy"
},excludeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = {CacheConfig.class, FastJson2JsonRedisSerializer.class}
) )
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class LhHttpServiceProxyApplication {
private static Logger log = LoggerFactory.getLogger(LhHttpServiceProxyApplication.class);
public static void main(String[] args) {
log.info("启动服务");
SpringApplicationBuilder builder = new SpringApplicationBuilder(LhHttpServiceProxyApplication.class);
builder.run( args);
}
}
... ...
package com.zhonglai.luhui.http.service.proxy.config;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
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;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:http协议服务监听")
// 描述
.description("描述:用于通过http发送指令控制终端端操作")
// 作者信息
.contact(new Contact("", null, null))
// 版本
.version("版本号:1.1.1" )
.build();
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.http.service.proxy.controller;
import com.google.gson.JsonObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.protocol.factory.ProtocolParserAndPurificationFactory;
import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.service.DeviceCashUpService;
import com.zhonglai.luhui.device.protocol.factory.service.PersistenceDBService;
import com.zhonglai.luhui.http.service.proxy.service.HttpCallback;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Api(tags = "数据提交")
@RestController
@RequestMapping("/httpDataProxy")
public class HttpDataProxyController {
@Autowired
private HttpCallback httpCallback;
@ApiOperation(value = "post提交数据",notes = "数据由body传值")
@ApiImplicitParams({
@ApiImplicitParam(value = "时间(时间戳单位毫秒)",name = "time"),
@ApiImplicitParam(value = "设备imei",name = "imei"),
@ApiImplicitParam(value = "产品id",name = "role"),
@ApiImplicitParam(value = "用户名",name = "username"),
})
@RequestMapping(value = "post/{role}/{username}/{imei}/{time}",method = RequestMethod.POST)
public AjaxResult post(@PathVariable String role, @PathVariable String username, @PathVariable String imei, @PathVariable Integer time, HttpServletRequest request) throws IOException {
byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream());
String body = new String(bodyBytes, request.getCharacterEncoding());
JsonObject jsonObject = GsonConstructor.get().fromJson(body,JsonObject.class);
DeviceDataLog.info(imei, DataLogType.发来数据,"/"+role+"/"+username+"/"+imei+"/Json/"+time,jsonObject);
httpCallback.messageArrived(role,username,imei,jsonObject);
return AjaxResult.success();
}
}
... ...
package com.zhonglai.luhui.http.service.proxy.manager;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 异步任务管理器
*
* @author ruoyi
*/
@Service
public class AsyncManager
{
/**
* 操作延迟10毫秒
*/
private final int OPERATE_DELAY_TIME = 10;
private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(100);
/**
* 执行任务
*
* @param task 任务
*/
public void execute(TimerTask task)
{
scheduler.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
}
/**
* 停止任务线程池
*/
public void shutdown()
{
Threads.shutdownAndAwaitTermination(scheduler);
}
}
... ...
package com.zhonglai.luhui.http.service.proxy.manager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PreDestroy;
import java.util.concurrent.ScheduledExecutorService;
/**
* 确保应用退出时能关闭后台线程
*
* @author ruoyi
*/
@Component
public class ShutdownManager
{
private static final Logger logger = LoggerFactory.getLogger(ShutdownManager.class);
@Autowired
private AsyncManager asyncManager;
@PreDestroy
public void destroy()
{
shutdownAsyncManager();
}
/**
* 停止异步执行任务
*/
private void shutdownAsyncManager()
{
try
{
logger.info("====关闭后台任务任务线程池====");
asyncManager.shutdown();
}
catch (Exception e)
{
logger.error(e.getMessage(), e);
}
}
}
... ...
package com.zhonglai.luhui.http.service.proxy.service;
import com.google.gson.JsonObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.device.protocol.factory.ProtocolParserAndPurificationFactory;
import com.zhonglai.luhui.device.protocol.factory.dto.ParserDeviceHostDto;
import com.zhonglai.luhui.device.protocol.factory.dto.ProtocolPurificationModel;
import com.zhonglai.luhui.device.protocol.factory.service.BaseCallback;
import com.zhonglai.luhui.device.protocol.factory.service.DeviceCashUpService;
import com.zhonglai.luhui.device.protocol.factory.service.PersistenceDBService;
import com.zhonglai.luhui.http.service.proxy.manager.AsyncManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.TimerTask;
@Service
public class HttpCallback extends BaseCallback<JsonObject> {
@Autowired
private AsyncManager asyncManager;
public void messageArrived(String role, String username, String imei, JsonObject data)
{
try {
HttpCallback.super.messageArrived(imei,"/"+role+"/"+username+"/"+imei+"/Json",data);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
// asyncManager.execute(new TimerTask() {
// @Override
// public void run() {
//
// }
// });
}
}
... ...
##服务器配置
server:
tomcat:
uri-encoding: UTF-8
port: 4886
servlet:
context-path: /
spring:
messages:
encoding: UTF-8
mvc:
#出现错误时, 直接抛出异常
throw-exception-if-no-handler-found: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
\ No newline at end of file
... ...
log4j.rootLogger=info,indicator,FILE
log4j.appender.indicator=org.apache.log4j.ConsoleAppender
log4j.appender.indicator.layout=org.apache.log4j.PatternLayout
log4j.appender.indicator.layout.ConversionPattern=%d{HH:mm:ss} [%p] %l -%m%n
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = logs/output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d{HH:mm:ss} [%p] %l -%m%n
log4j.logger.myDatalog= info, datalog
log4j.additivity.myDatalog = false
log4j.appender.datalog = org.apache.log4j.RollingFileAppender
log4j.appender.datalog.File = datalog/output.log
log4j.appender.datalog.MaxFileSize = 2000KB
log4j.appender.datalog.MaxBackupIndex = 5
log4j.appender.datalog.layout = org.apache.log4j.PatternLayout
log4j.appender.datalog.layout.ConversionPattern = %d{HH:mm:ss} [%p] %l -%m%n
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.basedir}\src\main\resources\configs</directory>
<outputDirectory>../configs</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,提出来 -->
<fileSet>
<directory>${project.basedir}\src\main\resources</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
</fileSet>
<!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
<fileSet>
<directory>${project.basedir}\bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>start.*</include>
<include>stop.*</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ 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>lh-modules</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.luhui</groupId>
<artifactId>lh-mqtt-service-listen</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>
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- SpringWeb模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- servlet包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</dependency>
<!-- 文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--https://mvnrepository.com/artifact/io.swagger/swagger-models-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-models.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--&lt;!&ndash; https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui &ndash;&gt;-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-ui.version}</version>
</dependency>
<!-- 支持data -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!--常用工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<!-- 通用工具-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-protocol-factory</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-xinjie</artifactId>
</dependency>
</dependencies>
<build>
<finalName>lh-mqtt-service-listen</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<!--
生成的jar中,不要包含pom.xml和pom.properties这两个文件
-->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!--
是否要把第三方jar放到manifest的classpath中
-->
<addClasspath>true</addClasspath>
<!--
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.mqtt.service.proxy.MqttServiceListenApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- The configuration of maven-assembly-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.mqtt.service.proxy;
import com.zhonglai.luhui.device.analysis.comm.config.CacheConfig;
import com.zhonglai.luhui.device.analysis.comm.config.FastJson2JsonRedisSerializer;
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;
import org.springframework.context.annotation.FilterType;
@ComponentScan(basePackages = {
"com.ruoyi.common.utils.spring",
"com.zhonglai.luhui.device.protocol",
"com.zhonglai.luhui.device.analysis.comm.config",
"com.zhonglai.luhui.mqtt.service.proxy",
},excludeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = {CacheConfig.class, FastJson2JsonRedisSerializer.class}
) )
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class MqttServiceListenApplication {
private static Logger log = LoggerFactory.getLogger(MqttServiceListenApplication.class);
public static void main(String[] args) {
log.info("启动服务");
SpringApplicationBuilder builder = new SpringApplicationBuilder(MqttServiceListenApplication.class);
builder.run( args);
}
}
... ...
package com.zhonglai.luhui.mqtt.service.proxy.comm.service;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
import com.zhonglai.luhui.device.analysis.comm.util.ByteUtil;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.protocol.factory.comm.DataLogType;
import com.zhonglai.luhui.device.protocol.factory.comm.DeviceDataLog;
import com.zhonglai.luhui.device.protocol.factory.service.BaseCallback;
import lombok.SneakyThrows;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MqttCallback extends BaseCallback implements MqttCallbackExtended {
private static final String topicOnlineModel = "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{imei}}/{{topicType}}";
@Autowired
private TerminalService terminalService; //客户端服务
@SneakyThrows
@Override
public void connectComplete(boolean b, String s) {
// 连接成功
log.info("连接成功");
terminalService.subscribe();
}
@Override
public void connectionLost(Throwable throwable) {
//连接丢失
log.error("连接丢失",throwable);
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) {
log.info("mqtt发来消息>>>>>>>:{} 《===============》 字符串:【{}】 十六进制:【{}】",s,mqttMessage.toString().replaceAll("\\n","").replaceAll("\\s", ""),ByteUtil.hexStringToSpace(ByteUtil.toHexString(mqttMessage.getPayload())));
Topic baseTopic = TopicUtil.initTopicFromModelStr(s,topicOnlineModel); //我们定义的topic
DeviceDataLog.info(baseTopic.getClientid(), DataLogType.发来数据,s,mqttMessage.toString().replaceAll("\\n","").replaceAll("\\s", ""));
try {
//过滤在线消息
if (s.endsWith("online"))
{
String state = new String(mqttMessage.getPayload());
deviceCashUpService.upOnline(state);
return ;
}
messageArrived(baseTopic.getClientid(),s,mqttMessage.getPayload());
}catch (Exception e)
{
log.error(s+"解析失败",e);
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
// 成功发出消息
try {
DeviceDataLog.info(iMqttDeliveryToken.getClient().getClientId(),DataLogType.发送数据,null,iMqttDeliveryToken.getMessage());
} catch (MqttException e) {
DeviceDataLog.info(iMqttDeliveryToken.getClient().getClientId(),DataLogType.发送数据,null,e.getMessage());
}
}
public MqttCallback binldTerminalService(TerminalService terminalService)
{
this.terminalService = terminalService;
return this;
}
}
... ...
package com.zhonglai.luhui.mqtt.service.proxy.comm.service;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.protocol.factory.service.impl.DefaultDbService;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 终端服务
*/
@Service
public class TerminalService {
private static final Logger log = LoggerFactory.getLogger(TerminalService.class);
@Autowired
private MqttCallback mqttCallback;
@Autowired
private DefaultDbService dbService;
@Autowired
private SysParameter sysParameter;
//业务处理异步线程池,线程池参数可以根据您的业务特点调整,或者您也可以用其他异步方式处理接收到的消息。
private final static ExecutorService executorService = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(),
Runtime.getRuntime().availableProcessors() * 2, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(50000));
@Value("${mqtt.broker}")
private String broker;
@Value("${mqtt.clientId}")
private String clientId;
@Value("${mqtt.username}")
private String username;
@Value("${mqtt.password}")
private String password;
private MqttClient mqttclient;
private MqttConnectOptions options;
private void init() throws MqttException {
if(null == mqttclient)
{
mqttclient = new MqttClient(broker, clientId, new MemoryPersistence());
}
options = new MqttConnectOptions();
options.setCleanSession(true);
options.setConnectionTimeout(15);
//设置断开后重新连接
options.setAutomaticReconnect(true);
mqttclient.setCallback(mqttCallback.binldTerminalService(this));
}
private void connect() throws MqttException {
options.setUserName(username);
options.setPassword(password.toCharArray());
mqttclient.connect(options);
}
public List<String> subscribe() throws MqttException {
List<String> ts = getCompletionTopics();
if(null != ts && ts.size() !=0)
{
mqttclient.subscribe(ts.toArray(new String[ts.size()]));
}
return ts;
}
public List<String> getCompletionTopics()
{
return dbService.getTopicFromRole();
}
@PostConstruct
public void startMqttListenerService() throws MqttException {
log.info("-----------开始启动mqtt监听服务--------------------");
init();
log.info("-----------启动参数{}--------------------",options);
sysParameter.inittopicconfig();
connect();
log.info("-----------mqtt连接服务器成功--------------------");
List<String> topics = subscribe();
log.info("-----------订阅{}成功--------------------",topics);
}
}
... ...
package com.zhonglai.luhui.mqtt.service.proxy.config;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
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;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:mqtt协议服务监听")
// 描述
.description("描述:用于通过mqtt发送指令控制终端端操作")
// 作者信息
.contact(new Contact("", null, null))
// 版本
.version("版本号:1.1.1" )
.build();
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.mqtt.service.proxy.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.util.IOUtils;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@Api(tags = "设备操作")
@Controller
@RequestMapping("/log")
public class LogController {
@ApiOperation("获取一天的日志")
@ApiImplicitParams({
@ApiImplicitParam(value = "时间(格式:20230114)",name = "time"),
@ApiImplicitParam(value = "设备imei",name = "imei"),
})
@RequestMapping(value = "getOneDateLog/{imei}/{time}",method = RequestMethod.GET)
public void getOneDateLog(HttpServletResponse response, @PathVariable String imei, @PathVariable String time) throws IOException {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type","text/html;charset=utf-8");
PrintWriter printWriter = response.getWriter();
String dateString = DateUtils.parseDateToStr("yyyyMMdd",new Date());
String fileName= imei+"_"+time+".log";
if(dateString.equals(time))
{
File logsFile = new File("logs/"+fileName);
if (!logsFile.exists())
{
printWriter.println(JSON.toJSONString(new Message(MessageCode.DEFAULT_FAIL_CODE,"文件"+logsFile.getPath()+"不存在")));
}
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(logsFile));
String line;
while((line = reader.readLine()) != null){
printWriter.println(line);
printWriter.println("<br/>");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.close(printWriter);
IOUtils.close(reader);
}
}
File logsFile = new File("zip/"+time+".zip");
BufferedReader reader = null;
try {
ZipFile zipFile = new ZipFile(logsFile);
reader = new BufferedReader(new InputStreamReader(zipFile.getInputStream(new ZipEntry(fileName))));
String line;
while((line = reader.readLine()) != null)
{
printWriter.println(line);
printWriter.println("<br/>");
}
} catch (IOException e) {
printWriter.println(JSON.toJSONString(new Message(MessageCode.DEFAULT_FAIL_CODE,e.getMessage())));
}finally {
IOUtils.close(printWriter);
IOUtils.close(reader);
}
}
}
... ...
##服务器配置
server:
tomcat:
uri-encoding: UTF-8
port: 4885
servlet:
context-path: /
spring:
messages:
encoding: UTF-8
mvc:
#出现错误时, 直接抛出异常
throw-exception-if-no-handler-found: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
mqtt:
#链接地址
broker: tcp://175.24.61.68:1883
#唯一标识
clientId: ${random.uuid}
topicconfig: "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{messageid}}"
username: sysuser
password: "!@#1qaz"
client:
#客户端操作时间
operationTime: 10
\ No newline at end of file
... ...
log4j.rootLogger=INFO,indicator,FILE
log4j.appender.indicator=org.apache.log4j.ConsoleAppender
log4j.appender.indicator.layout=org.apache.log4j.PatternLayout
log4j.appender.indicator.layout.ConversionPattern=%d{HH:mm:ss} [%p] %l -%m%n
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = logs/output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d{HH:mm:ss} [%p] %l -%m%n
log4j.logger.myDatalog= INFO, datalog
log4j.additivity.myDatalog = false
log4j.appender.datalog = org.apache.log4j.RollingFileAppender
log4j.appender.datalog.File = datalog/output.log
log4j.appender.datalog.MaxFileSize = 2000KB
log4j.appender.datalog.MaxBackupIndex = 5
log4j.appender.datalog.layout = org.apache.log4j.PatternLayout
log4j.appender.datalog.layout.ConversionPattern = %d{HH:mm:ss} [%p] %l -%m%n
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.basedir}\src\main\resources\configs</directory>
<outputDirectory>../configs</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,提出来 -->
<fileSet>
<directory>${project.basedir}\src\main\resources</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
</fileSet>
<!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
<fileSet>
<directory>${project.basedir}\bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>start.*</include>
<include>stop.*</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
... ...
package com.zhonglai.luhui.mqtt;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.device.analysis.comm.service.redis.RedisService;
import com.zhonglai.luhui.mqtt.comm.service.TerminalService;
import com.zhonglai.luhui.mqtt.service.ClienNoticeService;
import com.zhonglai.luhui.redis.service.RedisService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -12,10 +9,6 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
@ComponentScan(basePackages = {
"com.zhonglai.luhui.device.analysis",
... ... @@ -28,8 +21,6 @@ import java.util.Map;
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class MqttApplication {
private static Logger log = LoggerFactory.getLogger(MqttApplication.class);
@Autowired
private RedisService redisService ;
public static void main(String[] args) {
log.info("启动服务");
... ...
package com.zhonglai.luhui.mqtt;
import com.ruoyi.common.utils.GsonConstructor;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Jedis jedis = new Jedis("47.112.163.61",9527);
jedis.auth("Luhui586");
jedis.select(1);
// 连接Redis并检查连接状态
String pingResponse = jedis.ping();
System.out.println("Ping Response: " + pingResponse);
Map<String,String> map = new HashMap<>();
map.put("deviceName","SC-M8 号");
String key ="ly:x6:devices:866838067734877_1_1";
System.out.println(GsonConstructor.get().toJson(jedis.hmget(key,"deviceName")));;
jedis.hmset(key,map);
// // 更新Redis中的key-value数据
// jedis.set("key", "newValue");
//package com.zhonglai.luhui.mqtt;
//
// // 获取并输出更新后的值
// String value = jedis.get("key");
// System.out.println("Updated Value: " + value);
// 关闭连接
jedis.close();
}
}
//import com.ruoyi.common.utils.GsonConstructor;
//import redis.clients.jedis.Jedis;
//
//import java.util.HashMap;
//import java.util.Map;
//
//public class Test {
// public static void main(String[] args) {
// Jedis jedis = new Jedis("47.112.163.61",9527);
// jedis.auth("Luhui586");
// jedis.select(1);
//
// // 连接Redis并检查连接状态
// String pingResponse = jedis.ping();
// System.out.println("Ping Response: " + pingResponse);
//
// Map<String,String> map = new HashMap<>();
// map.put("deviceName","SC-M8 号");
// String key ="ly:x6:devices:866838067734877_1_1";
// System.out.println(GsonConstructor.get().toJson(jedis.hmget(key,"deviceName")));;
//
// jedis.hmset(key,map);
//// // 更新Redis中的key-value数据
//// jedis.set("key", "newValue");
////
//// // 获取并输出更新后的值
//// String value = jedis.get("key");
//// System.out.println("Updated Value: " + value);
//
// // 关闭连接
// jedis.close();
// }
//}
... ...
package com.zhonglai.luhui.mqtt.comm.rocketMq;
import com.alibaba.fastjson.JSON;
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.comm.service.MqttDeviceService;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
... ... @@ -18,7 +18,7 @@ import org.springframework.stereotype.Service;
@Service
@RocketMQMessageListener(consumerGroup = "deviceCommand", topic = "${rocketmq.send-topic:}",selectorType = SelectorType.TAG,selectorExpression = "${rocketmq.send-tag:}",messageModel = MessageModel.BROADCASTING)
@RocketMQMessageListener(consumerGroup = "deviceCommand3", topic = "${rocketmq.send-topic:}",selectorType = SelectorType.TAG,selectorExpression = "${rocketmq.send-tag:}",messageModel = MessageModel.BROADCASTING)
public class RocketMqService implements RocketMQReplyListener<MessageExt, Message> {
private static final Logger log = LoggerFactory.getLogger(RocketMqService.class);
... ... @@ -34,7 +34,9 @@ public class RocketMqService implements RocketMQReplyListener<MessageExt, Messag
log.info("消息body{}",str);
DeviceCommandApi deviceCommandApi = JSON.parseObject(str, DeviceCommandApi.class);
try {
return deviceCommandApi.invokeApi(deviceService);
Message message = deviceCommandApi.invokeApi(deviceService);
log.info("{} 指令执行完以后返回的结果{}",deviceCommandApi.getDeviceCommandApiParameter().getClient_id(),message);
return message;
} catch (Exception e) {
log.error("执行异常",e);
}
... ...
... ... @@ -11,7 +11,7 @@ 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.device.analysis.util.TopicUtil;
import com.zhonglai.luhui.device.analysis.comm.db.DeviceService;
import lombok.SneakyThrows;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
... ...
... ... @@ -2,6 +2,8 @@ package com.zhonglai.luhui.mqtt.comm.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.GsonConstructor;
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;
... ... @@ -110,6 +112,9 @@ public class MqttDeviceService extends DeviceService{
{
Object sendMap = map.get(key);
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(sendMap));
JsonObject gsonobject = GsonConstructor.get().fromJson(JSONObject.toJSONString(sendMap),JsonObject.class);
for(String skey:jsonObject.keySet())
{
IotThingsModel thingsModel = terminalDataThingsModeService.getIotThingsModel(topic.getUsername(),skey);
... ... @@ -128,18 +133,22 @@ public class MqttDeviceService extends DeviceService{
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);
// 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;
// ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase;
ThingsModelItemBase thingsModelItemBase = ThingsModelItemBase.newhingsModelItem(Enum.valueOf(ThingsModelDataTypeEnum.class,data_type),thingsModel,gsonobject.get(skey));
jsonObject.put(skey,thingsModelItemBase.getCmdView(object));
thingsModelBase.addValue(thingsModelItemBase.getCmdView(object));
thingsModelItemBase.setValue(thingsModelItemBase.getCmdView(object));
String id = clienid+"_"+key;
logDeviceOperationList.add(dviceLogService.newLogDeviceOperation(id,thingsModelItemBase.getSaveView(),null,"远程控制"+thingsModelItemBase.getName()+"为"+thingsModelItemBase.getView(),null));
}
... ...
... ... @@ -3,7 +3,7 @@ package com.zhonglai.luhui.mqtt.comm.service;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
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 com.zhonglai.luhui.device.analysis.util.TopicUtil;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
... ...
... ... @@ -8,7 +8,7 @@ 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 com.zhonglai.luhui.device.analysis.util.TopicUtil;
import net.jodah.expiringmap.ExpirationListener;
import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;
... ...
... ... @@ -12,7 +12,7 @@ import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
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;
import com.zhonglai.luhui.device.analysis.util.TopicUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
... ... @@ -28,6 +28,9 @@
<module>lh-http-service</module>
<module>lh-data-file-service</module>
<module>lh-lsy-plc-service</module>
<module>lh-http-service-proxy</module>
<module>lh-mqtt-service-listen</module>
<module>lh-device-protocol-parser</module>
</modules>
<properties>
... ...
... ... @@ -265,6 +265,13 @@
<version>${ruoyi.version}</version>
</dependency>
<!-- dbcp实现的公用dao趁层 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-service-dao</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 系统服务 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
... ... @@ -348,6 +355,24 @@
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-protocol-factory</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-xinjie</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-device-http-public</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.zhonglai</groupId>
<artifactId>ServiceDao</artifactId>
<version>1.4.3</version>
... ... @@ -367,6 +392,12 @@
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
<!-- 文档 -->
<dependency>
<groupId>io.springfox</groupId>
... ... @@ -461,12 +492,6 @@
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
... ... @@ -479,6 +504,11 @@
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.77.Final</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.14</version>
... ... @@ -533,6 +563,12 @@
<artifactId>influxdb-client-java</artifactId>
<version>6.12.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>
</dependencies>
... ...