diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
new file mode 100644
index 0000000..b8805c5
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
@@ -0,0 +1,33 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
+
+import java.time.format.DateTimeFormatter;
+
+public class SentinelOnlineRequestFrame extends BirmmBaseFrame {
+
+ private final String DEV_TYPE = "Tube";
+ private final String MESSAGE_TYPE = "OnlineRequest";
+ private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
+
+ @Override
+ public JSONObject toJSON() {
+ JSONObject json = super.toJSON();
+ json.put("devType", DEV_TYPE);
+ json.put("mType", MESSAGE_TYPE);
+
+ JSONObject body = new JSONObject();
+ body.put("bType", BIZ_TYPE);
+ body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) {
+ SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0);
+ body.put("softwareVersion", tag.getVersion());
+ }
+
+ json.put("mBody", body);
+
+ return json;
+ }
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
new file mode 100644
index 0000000..b8805c5
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
@@ -0,0 +1,33 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
+
+import java.time.format.DateTimeFormatter;
+
+public class SentinelOnlineRequestFrame extends BirmmBaseFrame {
+
+ private final String DEV_TYPE = "Tube";
+ private final String MESSAGE_TYPE = "OnlineRequest";
+ private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
+
+ @Override
+ public JSONObject toJSON() {
+ JSONObject json = super.toJSON();
+ json.put("devType", DEV_TYPE);
+ json.put("mType", MESSAGE_TYPE);
+
+ JSONObject body = new JSONObject();
+ body.put("bType", BIZ_TYPE);
+ body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) {
+ SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0);
+ body.put("softwareVersion", tag.getVersion());
+ }
+
+ json.put("mBody", body);
+
+ return json;
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
new file mode 100644
index 0000000..21d9025
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
@@ -0,0 +1,42 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.enums.BirmmOperationTypeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import com.casic.missiles.frame.tag.ota.NeedOTATag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SentinelOnlineResponseFrame extends BirmmBaseFrame {
+
+ @Override
+ public void replyPduType() {
+ StringBuilder pduType;
+
+ int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16);
+ pduType = new StringBuilder(Integer.toHexString(pduValue));
+ while (pduType.length() != 4) {
+ pduType.insert(0, "0");
+ }
+
+ this.setPduType(pduType.toString());
+ }
+
+ @Override
+ public void replyBizTag() {
+ // 无需升级 回复NeedOTATag
+ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag
+ // TODO-LIST
+ // 暂时回复不用升级
+ Map> tagList = new HashMap<>();
+ NeedOTATag needTag = new NeedOTATag();
+ needTag.setNeed(false);
+ List needTags = new ArrayList<>();
+ needTags.add(needTag);
+ tagList.put(NeedOTATag.class.getSimpleName(), needTags);
+ super.setTagList(tagList);
+ }
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
new file mode 100644
index 0000000..b8805c5
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
@@ -0,0 +1,33 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
+
+import java.time.format.DateTimeFormatter;
+
+public class SentinelOnlineRequestFrame extends BirmmBaseFrame {
+
+ private final String DEV_TYPE = "Tube";
+ private final String MESSAGE_TYPE = "OnlineRequest";
+ private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
+
+ @Override
+ public JSONObject toJSON() {
+ JSONObject json = super.toJSON();
+ json.put("devType", DEV_TYPE);
+ json.put("mType", MESSAGE_TYPE);
+
+ JSONObject body = new JSONObject();
+ body.put("bType", BIZ_TYPE);
+ body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) {
+ SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0);
+ body.put("softwareVersion", tag.getVersion());
+ }
+
+ json.put("mBody", body);
+
+ return json;
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
new file mode 100644
index 0000000..21d9025
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
@@ -0,0 +1,42 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.enums.BirmmOperationTypeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import com.casic.missiles.frame.tag.ota.NeedOTATag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SentinelOnlineResponseFrame extends BirmmBaseFrame {
+
+ @Override
+ public void replyPduType() {
+ StringBuilder pduType;
+
+ int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16);
+ pduType = new StringBuilder(Integer.toHexString(pduValue));
+ while (pduType.length() != 4) {
+ pduType.insert(0, "0");
+ }
+
+ this.setPduType(pduType.toString());
+ }
+
+ @Override
+ public void replyBizTag() {
+ // 无需升级 回复NeedOTATag
+ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag
+ // TODO-LIST
+ // 暂时回复不用升级
+ Map> tagList = new HashMap<>();
+ NeedOTATag needTag = new NeedOTATag();
+ needTag.setNeed(false);
+ List needTags = new ArrayList<>();
+ needTags.add(needTag);
+ tagList.put(NeedOTATag.class.getSimpleName(), needTags);
+ super.setTagList(tagList);
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
new file mode 100644
index 0000000..e22140c
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
@@ -0,0 +1,6 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public class SentinelSetResponseFrame extends BirmmBaseFrame {
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
new file mode 100644
index 0000000..b8805c5
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
@@ -0,0 +1,33 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
+
+import java.time.format.DateTimeFormatter;
+
+public class SentinelOnlineRequestFrame extends BirmmBaseFrame {
+
+ private final String DEV_TYPE = "Tube";
+ private final String MESSAGE_TYPE = "OnlineRequest";
+ private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
+
+ @Override
+ public JSONObject toJSON() {
+ JSONObject json = super.toJSON();
+ json.put("devType", DEV_TYPE);
+ json.put("mType", MESSAGE_TYPE);
+
+ JSONObject body = new JSONObject();
+ body.put("bType", BIZ_TYPE);
+ body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) {
+ SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0);
+ body.put("softwareVersion", tag.getVersion());
+ }
+
+ json.put("mBody", body);
+
+ return json;
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
new file mode 100644
index 0000000..21d9025
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
@@ -0,0 +1,42 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.enums.BirmmOperationTypeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import com.casic.missiles.frame.tag.ota.NeedOTATag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SentinelOnlineResponseFrame extends BirmmBaseFrame {
+
+ @Override
+ public void replyPduType() {
+ StringBuilder pduType;
+
+ int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16);
+ pduType = new StringBuilder(Integer.toHexString(pduValue));
+ while (pduType.length() != 4) {
+ pduType.insert(0, "0");
+ }
+
+ this.setPduType(pduType.toString());
+ }
+
+ @Override
+ public void replyBizTag() {
+ // 无需升级 回复NeedOTATag
+ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag
+ // TODO-LIST
+ // 暂时回复不用升级
+ Map> tagList = new HashMap<>();
+ NeedOTATag needTag = new NeedOTATag();
+ needTag.setNeed(false);
+ List needTags = new ArrayList<>();
+ needTags.add(needTag);
+ tagList.put(NeedOTATag.class.getSimpleName(), needTags);
+ super.setTagList(tagList);
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
new file mode 100644
index 0000000..e22140c
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
@@ -0,0 +1,6 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public class SentinelSetResponseFrame extends BirmmBaseFrame {
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
index bc97b1a..cfb0cf1 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
@@ -1,14 +1,13 @@
package com.casic.missiles.frame.sentinel;
+import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.enums.BirmmDataBizTypeEnums;
import com.casic.missiles.enums.BirmmTagTypeEnums;
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.base.BirmmBaseTag;
-import com.casic.missiles.frame.tag.biz.CellTag;
-import com.casic.missiles.frame.tag.biz.DateTag;
-import com.casic.missiles.frame.tag.biz.SensorStateTag;
-import com.casic.missiles.frame.tag.biz.UploadTag;
+import com.casic.missiles.frame.tag.biz.*;
import com.casic.missiles.frame.tag.signal.PCITag;
import com.casic.missiles.frame.tag.signal.RSRPTag;
import com.casic.missiles.frame.tag.signal.SNRTag;
@@ -26,7 +25,7 @@
private List bizDataList;
- private final String DEV_TYPE = "Sentinel";
+ private final String DEV_TYPE = "Tube";
private final String MESSAGE_TYPE = "Data";
private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
@@ -43,6 +42,10 @@
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
body.put("cell", cellTag.getCellVal());
}
+ if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ body.put("cell", NumberUtil.round(voltageTag.getPercent(), 2));
+ }
if (getTagList().containsKey(PCITag.class.getSimpleName())) {
PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0);
body.put("pci", pciTag.getPci());
@@ -60,6 +63,11 @@
if (bizDataList != null) {
JSONArray datas = new JSONArray();
for (SentinelBizData bizData : bizDataList) {
+ // TODO-LIST
+ // 暂时过滤掉温度值 待sink修改后放开
+ if (bizData.getBizType() == BirmmDataBizTypeEnums.TYPE_TEMPERATURE.getValue()) {
+ continue;
+ }
datas.add(bizData.toJSON());
}
body.put("datas", datas);
@@ -89,6 +97,9 @@
if (getTagList().containsKey(CellTag.class.getSimpleName())) {
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
bizData.setCell(cellTag.getCellVal());
+ } else if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ bizData.setCell(NumberUtil.toBigDecimal(voltageTag.getPercent()).intValue());
}
// 信号质量
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
new file mode 100644
index 0000000..b8805c5
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
@@ -0,0 +1,33 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
+
+import java.time.format.DateTimeFormatter;
+
+public class SentinelOnlineRequestFrame extends BirmmBaseFrame {
+
+ private final String DEV_TYPE = "Tube";
+ private final String MESSAGE_TYPE = "OnlineRequest";
+ private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
+
+ @Override
+ public JSONObject toJSON() {
+ JSONObject json = super.toJSON();
+ json.put("devType", DEV_TYPE);
+ json.put("mType", MESSAGE_TYPE);
+
+ JSONObject body = new JSONObject();
+ body.put("bType", BIZ_TYPE);
+ body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) {
+ SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0);
+ body.put("softwareVersion", tag.getVersion());
+ }
+
+ json.put("mBody", body);
+
+ return json;
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
new file mode 100644
index 0000000..21d9025
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
@@ -0,0 +1,42 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.enums.BirmmOperationTypeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import com.casic.missiles.frame.tag.ota.NeedOTATag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SentinelOnlineResponseFrame extends BirmmBaseFrame {
+
+ @Override
+ public void replyPduType() {
+ StringBuilder pduType;
+
+ int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16);
+ pduType = new StringBuilder(Integer.toHexString(pduValue));
+ while (pduType.length() != 4) {
+ pduType.insert(0, "0");
+ }
+
+ this.setPduType(pduType.toString());
+ }
+
+ @Override
+ public void replyBizTag() {
+ // 无需升级 回复NeedOTATag
+ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag
+ // TODO-LIST
+ // 暂时回复不用升级
+ Map> tagList = new HashMap<>();
+ NeedOTATag needTag = new NeedOTATag();
+ needTag.setNeed(false);
+ List needTags = new ArrayList<>();
+ needTags.add(needTag);
+ tagList.put(NeedOTATag.class.getSimpleName(), needTags);
+ super.setTagList(tagList);
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
new file mode 100644
index 0000000..e22140c
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
@@ -0,0 +1,6 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public class SentinelSetResponseFrame extends BirmmBaseFrame {
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
index bc97b1a..cfb0cf1 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
@@ -1,14 +1,13 @@
package com.casic.missiles.frame.sentinel;
+import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.enums.BirmmDataBizTypeEnums;
import com.casic.missiles.enums.BirmmTagTypeEnums;
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.base.BirmmBaseTag;
-import com.casic.missiles.frame.tag.biz.CellTag;
-import com.casic.missiles.frame.tag.biz.DateTag;
-import com.casic.missiles.frame.tag.biz.SensorStateTag;
-import com.casic.missiles.frame.tag.biz.UploadTag;
+import com.casic.missiles.frame.tag.biz.*;
import com.casic.missiles.frame.tag.signal.PCITag;
import com.casic.missiles.frame.tag.signal.RSRPTag;
import com.casic.missiles.frame.tag.signal.SNRTag;
@@ -26,7 +25,7 @@
private List bizDataList;
- private final String DEV_TYPE = "Sentinel";
+ private final String DEV_TYPE = "Tube";
private final String MESSAGE_TYPE = "Data";
private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
@@ -43,6 +42,10 @@
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
body.put("cell", cellTag.getCellVal());
}
+ if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ body.put("cell", NumberUtil.round(voltageTag.getPercent(), 2));
+ }
if (getTagList().containsKey(PCITag.class.getSimpleName())) {
PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0);
body.put("pci", pciTag.getPci());
@@ -60,6 +63,11 @@
if (bizDataList != null) {
JSONArray datas = new JSONArray();
for (SentinelBizData bizData : bizDataList) {
+ // TODO-LIST
+ // 暂时过滤掉温度值 待sink修改后放开
+ if (bizData.getBizType() == BirmmDataBizTypeEnums.TYPE_TEMPERATURE.getValue()) {
+ continue;
+ }
datas.add(bizData.toJSON());
}
body.put("datas", datas);
@@ -89,6 +97,9 @@
if (getTagList().containsKey(CellTag.class.getSimpleName())) {
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
bizData.setCell(cellTag.getCellVal());
+ } else if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ bizData.setCell(NumberUtil.toBigDecimal(voltageTag.getPercent()).intValue());
}
// 信号质量
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
index a7094dd..8cc826c 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
@@ -2,10 +2,7 @@
import com.casic.missiles.enums.BirmmTagTypeEnums;
import com.casic.missiles.frame.base.BirmmBaseTag;
-import com.casic.missiles.frame.tag.biz.CellTag;
-import com.casic.missiles.frame.tag.biz.DateTag;
-import com.casic.missiles.frame.tag.biz.SensorStateTag;
-import com.casic.missiles.frame.tag.biz.UploadTag;
+import com.casic.missiles.frame.tag.biz.*;
import com.casic.missiles.frame.tag.config.*;
import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
import com.casic.missiles.frame.tag.signal.PCITag;
@@ -62,6 +59,9 @@
case CELL_TAG:
return new CellTag();
+ case VOLTAGE_TAG:
+ return new VoltageTag();
+
case SOFTWARE_VERSION_TAG:
return new SoftwareVersionTag();
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
new file mode 100644
index 0000000..b8805c5
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
@@ -0,0 +1,33 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
+
+import java.time.format.DateTimeFormatter;
+
+public class SentinelOnlineRequestFrame extends BirmmBaseFrame {
+
+ private final String DEV_TYPE = "Tube";
+ private final String MESSAGE_TYPE = "OnlineRequest";
+ private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
+
+ @Override
+ public JSONObject toJSON() {
+ JSONObject json = super.toJSON();
+ json.put("devType", DEV_TYPE);
+ json.put("mType", MESSAGE_TYPE);
+
+ JSONObject body = new JSONObject();
+ body.put("bType", BIZ_TYPE);
+ body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) {
+ SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0);
+ body.put("softwareVersion", tag.getVersion());
+ }
+
+ json.put("mBody", body);
+
+ return json;
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
new file mode 100644
index 0000000..21d9025
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
@@ -0,0 +1,42 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.enums.BirmmOperationTypeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import com.casic.missiles.frame.tag.ota.NeedOTATag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SentinelOnlineResponseFrame extends BirmmBaseFrame {
+
+ @Override
+ public void replyPduType() {
+ StringBuilder pduType;
+
+ int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16);
+ pduType = new StringBuilder(Integer.toHexString(pduValue));
+ while (pduType.length() != 4) {
+ pduType.insert(0, "0");
+ }
+
+ this.setPduType(pduType.toString());
+ }
+
+ @Override
+ public void replyBizTag() {
+ // 无需升级 回复NeedOTATag
+ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag
+ // TODO-LIST
+ // 暂时回复不用升级
+ Map> tagList = new HashMap<>();
+ NeedOTATag needTag = new NeedOTATag();
+ needTag.setNeed(false);
+ List needTags = new ArrayList<>();
+ needTags.add(needTag);
+ tagList.put(NeedOTATag.class.getSimpleName(), needTags);
+ super.setTagList(tagList);
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
new file mode 100644
index 0000000..e22140c
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
@@ -0,0 +1,6 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public class SentinelSetResponseFrame extends BirmmBaseFrame {
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
index bc97b1a..cfb0cf1 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
@@ -1,14 +1,13 @@
package com.casic.missiles.frame.sentinel;
+import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.enums.BirmmDataBizTypeEnums;
import com.casic.missiles.enums.BirmmTagTypeEnums;
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.base.BirmmBaseTag;
-import com.casic.missiles.frame.tag.biz.CellTag;
-import com.casic.missiles.frame.tag.biz.DateTag;
-import com.casic.missiles.frame.tag.biz.SensorStateTag;
-import com.casic.missiles.frame.tag.biz.UploadTag;
+import com.casic.missiles.frame.tag.biz.*;
import com.casic.missiles.frame.tag.signal.PCITag;
import com.casic.missiles.frame.tag.signal.RSRPTag;
import com.casic.missiles.frame.tag.signal.SNRTag;
@@ -26,7 +25,7 @@
private List bizDataList;
- private final String DEV_TYPE = "Sentinel";
+ private final String DEV_TYPE = "Tube";
private final String MESSAGE_TYPE = "Data";
private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
@@ -43,6 +42,10 @@
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
body.put("cell", cellTag.getCellVal());
}
+ if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ body.put("cell", NumberUtil.round(voltageTag.getPercent(), 2));
+ }
if (getTagList().containsKey(PCITag.class.getSimpleName())) {
PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0);
body.put("pci", pciTag.getPci());
@@ -60,6 +63,11 @@
if (bizDataList != null) {
JSONArray datas = new JSONArray();
for (SentinelBizData bizData : bizDataList) {
+ // TODO-LIST
+ // 暂时过滤掉温度值 待sink修改后放开
+ if (bizData.getBizType() == BirmmDataBizTypeEnums.TYPE_TEMPERATURE.getValue()) {
+ continue;
+ }
datas.add(bizData.toJSON());
}
body.put("datas", datas);
@@ -89,6 +97,9 @@
if (getTagList().containsKey(CellTag.class.getSimpleName())) {
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
bizData.setCell(cellTag.getCellVal());
+ } else if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ bizData.setCell(NumberUtil.toBigDecimal(voltageTag.getPercent()).intValue());
}
// 信号质量
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
index a7094dd..8cc826c 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
@@ -2,10 +2,7 @@
import com.casic.missiles.enums.BirmmTagTypeEnums;
import com.casic.missiles.frame.base.BirmmBaseTag;
-import com.casic.missiles.frame.tag.biz.CellTag;
-import com.casic.missiles.frame.tag.biz.DateTag;
-import com.casic.missiles.frame.tag.biz.SensorStateTag;
-import com.casic.missiles.frame.tag.biz.UploadTag;
+import com.casic.missiles.frame.tag.biz.*;
import com.casic.missiles.frame.tag.config.*;
import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
import com.casic.missiles.frame.tag.signal.PCITag;
@@ -62,6 +59,9 @@
case CELL_TAG:
return new CellTag();
+ case VOLTAGE_TAG:
+ return new VoltageTag();
+
case SOFTWARE_VERSION_TAG:
return new SoftwareVersionTag();
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/biz/VoltageTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/biz/VoltageTag.java
new file mode 100644
index 0000000..a494b44
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/biz/VoltageTag.java
@@ -0,0 +1,27 @@
+package com.casic.missiles.frame.tag.biz;
+
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class VoltageTag extends BirmmBaseTag {
+
+ final String VOLTAGE_TAG_OID = "60000030";
+
+ int volVal;
+ double percent;
+
+ @Override
+ public String toString() {
+ return super.toString() + "[value: " + volVal + "]";
+ }
+
+ @Override
+ public void setValueStr(String valueStr) {
+ super.setValueStr(valueStr);
+ volVal = Integer.parseInt(valueStr, 16);
+ percent = (float) volVal / 255.0 * 100;
+ }
+}
diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
index b3facd0..2a7b5b4 100644
--- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
+++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/SubscribeStoreMapper.java
@@ -9,6 +9,7 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import java.util.Map;
/**
*
@@ -24,4 +25,5 @@
@Param("request") SubscribeListDTO request,
@Param("dataScope")DataScope dataScope);
+ Map getFlumeConfig(@Param("ssId")Long ssid);
}
diff --git a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
index 415a670..87ab37e 100644
--- a/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
+++ b/casic-iot-dao/src/main/resources/mapper/SubscribeStoreMapper.xml
@@ -58,4 +58,8 @@
order by create_time desc
+
+
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
index 9890ba6..8bc8fad 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java
@@ -26,6 +26,8 @@
Page listPage(Page page, DeviceListRequest request, DataScope dataScope) throws Exception;
+ Device getDeviceByDeviceCode(String deviceCode);
+
ReturnDTO addDevice(Device deviceGroup);
ReturnDTO updateDevice(Device deviceGroup);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
index 1dd5694..5ffbd3e 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/ISubscribeStoreService.java
@@ -9,6 +9,7 @@
import com.casic.missiles.model.SubscribeStore;
import java.util.List;
+import java.util.Map;
/**
*
@@ -22,6 +23,10 @@
Page listPage(Page page, SubscribeListDTO request, DataScope dataScope)throws Exception;
+ List getSubscribeListByProduct(Long groupId);
+
+ Map getFlumeConfig(Long sseId);
+
ReturnDTO addStore(SubscribeStore subscribeStore);
ReturnDTO updateStore(SubscribeStore subscribeStore);
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
index 102f9fc..f8c8532 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java
@@ -84,6 +84,13 @@
}
@Override
+ public Device getDeviceByDeviceCode(String deviceCode) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("devcode", deviceCode);
+ return getOne(query);
+ }
+
+ @Override
public ReturnDTO addDevice(Device device) {
AuthUser shiroUser = ShiroKit.getUser();
device.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
index 92ac3d0..ef3d09b 100644
--- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
+++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/SubscribeStoreServiceImpl.java
@@ -1,5 +1,6 @@
package com.casic.missiles.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.datascope.DataScope;
@@ -22,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.Map;
/**
*
@@ -45,6 +47,18 @@
}
@Override
+ public List getSubscribeListByProduct(Long groupId) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("group_id", groupId);
+ return list(query);
+ }
+
+ @Override
+ public Map getFlumeConfig(Long ssId) {
+ return this.baseMapper.getFlumeConfig(ssId);
+ }
+
+ @Override
public ReturnDTO addStore(SubscribeStore subscribeStore) {
AuthUser shiroUser = ShiroKit.getUser();
subscribeStore.setCreateUserName(shiroUser.getName());
diff --git a/casic-iot-web/pom.xml b/casic-iot-web/pom.xml
index 971cc61..6b84382 100644
--- a/casic-iot-web/pom.xml
+++ b/casic-iot-web/pom.xml
@@ -8,7 +8,6 @@
../pom.xml
1.0.0-SNAPSHOT
- com.casic
casic-iot-web
1.0.0-SNAPSHOT
casic-iot-web
diff --git a/pom.xml b/pom.xml
index 03cc680..64a4687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.casic
casic-iot
1.0.0-SNAPSHOT
casic-iot
@@ -29,7 +28,7 @@
UTF-8
UTF-8
1.8
- 1.0.0-SNAPSHOT
+ ${project.version}
2.0.0.alpha
2.3.0
@@ -51,6 +50,7 @@
2.5.4
2.5.6
1.2.83
+ 5.8.31
2.0.0.alpha
@@ -75,12 +75,6 @@
${fastjson.version}
-
-
-
-
-
-
org.projectlombok
lombok
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 5c91fc7..02136bc 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -38,26 +38,10 @@
0.5.8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
cn.hutool
hutool-all
- 5.7.16
+ ${hutool.version}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
index 0c29281..031a9ef 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java
@@ -1,9 +1,6 @@
package com.casic.missiles.controller;
-import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.casic.missiles.dto.device.DeviceCtnbDTO;
import com.casic.missiles.frame.base.BirmmBaseFrame;
@@ -61,16 +58,9 @@
// 保存日志
Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes);
- // TODO-LIST
// 推送
- // 封装到service钟 异步推送
-// ThreadUtil.execAsync(() -> {
-// String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
-// .contentType("application/json")
-// .body(birmmFrame.toJSON().toJSONString())
-// .executeAsync().body();
-// log.info("发送到接口:{}", body);
-// });
+ // 需要异步推送
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
index 9a92013..838ae44 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java
@@ -4,7 +4,7 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.model.DeviceBizData;
import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.service.GeneralServiceImpl;
+import com.casic.missiles.service.impl.GeneralServiceImpl;
import com.casic.missiles.service.IDeviceBizDataService;
import com.casic.missiles.service.IDeviceFrameLogService;
import com.casic.missiles.service.IGeneralService;
@@ -70,11 +70,9 @@
frameLog.setLogtime(birmmFrame.getLogTime());
frameLogService.save(frameLog);
- String body = HttpUtil.createPost("http://139.198.19.235:22006/guanstare-gas/data/recv")
- .contentType("application/json")
- .body(birmmFrame.toJSON().toJSONString())
- .execute().body();
- log.info("发送到接口:{}", body);
+ // 推送
+ // 需要异步推
+ defaultService.pushMessage(birmmFrame);
// 保存业务数据
if (birmmFrame.isBizDataFrame()) {
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
deleted file mode 100644
index e2a7d16..0000000
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/GeneralServiceImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.casic.missiles.service;
-
-import com.casic.missiles.enums.BirmmDeviceTypeEnums;
-import com.casic.missiles.enums.BirmmFrameAttributeEnums;
-import com.casic.missiles.frame.base.BirmmBaseFrame;
-import com.casic.missiles.frame.BirmmFrameBuilderFactory;
-import com.casic.missiles.model.DeviceBizData;
-import com.casic.missiles.model.DeviceFrameLog;
-import com.casic.missiles.parser.BirmmProtocolParser;
-import com.casic.missiles.parser.safe.SafeStrategy;
-import com.casic.missiles.parser.safe.impl.Sm4;
-import com.casic.missiles.parser.safe.impl.TeaUtilsX;
-import com.casic.missiles.util.SnowflakeUtil;
-import com.casic.missiles.util.SpringContextUtil;
-import com.casic.missiles.frame.base.BirmmBaseTag;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.buf.HexUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class GeneralServiceImpl implements IGeneralService {
-
- @Resource
- BirmmProtocolParser protocol;
-
- @Resource
- IDeviceFrameLogService frameLogService;
-
- @Resource
- IDeviceBizDataService bizDataService;
-
- byte[] keyByte = {
- 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
- };
-
- @Override
- public BirmmBaseFrame doFrameParse(byte[] frame) {
- boolean frameValid = protocol.preCheckFrame(frame);
- if (frameValid) {
- // 解析长度
- int length = protocol.getLength(frame);
-
- // 解析得到设备编号
- String devCode = protocol.getDevCode(frame);
-
- // 解析通信方式
- String commType = protocol.getCommunicationType(frame);
-
- // 解析目标节点地址
- String destAddr = protocol.getDestinationAddr(frame);
-
- // 解析得到PDUType
- String pduType = protocol.getPDUType(frame);
- byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
- String deviceType = protocol.getDeviceType(pduTypeBytes);
- String operaType = protocol.getOperaType(pduTypeBytes);
-
- // 解析序号
- String seq = protocol.getSequence(frame);
-
- // 加密后的业务字段
- String tagListStr = protocol.getTagListString(frame);
-
- log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
-
- // 解密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] plainBytes = safeStrategy.decryption(tagListStr);
- String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
-
- log.info("上行业务字段:{}", plainTagListStr);
-
- // 获得业务字段tagList
- Map> tagList = protocol.getTagList(plainBytes);
-
- // 创建Frame
- BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
- if (birmmFrame != null) {
- birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
- birmmFrame.setDevCode(devCode);
- birmmFrame.setCommunicationType(commType);
- birmmFrame.setDestinationAddr(destAddr);
- birmmFrame.setSequence(seq);
- birmmFrame.setDeviceType(deviceType);
- birmmFrame.setOperationType(operaType);
- birmmFrame.setRawBizFrameString(plainTagListStr);
- birmmFrame.setTagList(tagList);
-
- return birmmFrame;
- }
- }
-
- return null;
- }
-
- @Override
- public void doParseBizTag(BirmmBaseFrame baseFrame) {
- baseFrame.doParseBizTag();
- }
-
- @Override
- public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
- DeviceFrameLog frameLog = new DeviceFrameLog();
- frameLog.setId(new SnowflakeUtil().nextId());
- frameLog.setDevcode(baseFrame.getDevCode());
- frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
- frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
- frameLog.setDataJson(baseFrame.toJSON().toJSONString());
- frameLog.setLogtime(baseFrame.getLogTime());
- frameLogService.save(frameLog);
-
- return frameLog.getId();
- }
-
- @Override
- public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
- List bizDataList = baseFrame.convertToBizDataList();
- for (DeviceBizData bizData : bizDataList) {
- // 设置其他的属性
- bizData.setId(new SnowflakeUtil().nextId());
- bizData.setFrameLogId(frameLogId); // 关联日志记录id
- bizData.setDevcode(baseFrame.getDevCode());
- bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
- bizData.setLogtime(baseFrame.getLogTime());
- }
-
- // 批量保存
- bizDataService.saveBatch(bizDataList);
- }
-
- @Override
- public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
- BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
-
- if (null != configFrame) {
- configFrame.setDevCode(uploadFrame.getDevCode());
- configFrame.setCommunicationType(uploadFrame.getCommunicationType());
- configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
- configFrame.setSequence(uploadFrame.getSequence());
-
- configFrame.setDeviceType(uploadFrame.getDeviceType());
- configFrame.replyPduType();
-
- // TODO-LIST
- // 查询数据库找到待下发的内容
-
- configFrame.replyBizTag();
- }
-
- return configFrame;
- }
-
- @Override
- public String replyMessage(BirmmBaseFrame configFrame) {
- StringBuilder frame = new StringBuilder();
-
- // A320
- frame.append(configFrame.getPRE_CODE());
- frame.append(configFrame.getVERSION());
-
- // 处理tag
- String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
- log.info("下行业务字段:{}", plainTagListStr);
-
- // 计算长度
- int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
- BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
- BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
- BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
- BirmmFrameAttributeEnums.SEQ.getLength() +
- plainTagListStr.length() / 2;
- // 两个字节的长度
- frame.append(String.format("%04x", length));
-
- log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
- length, configFrame.getDevCode(), configFrame.getCommunicationType(),
- configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
-
- // 设备编号 - PDUType字段
- frame.append(configFrame.getDevCode());
- frame.append(configFrame.getCommunicationType());
- frame.append(configFrame.getDestinationAddr());
- frame.append(configFrame.getPduType());
- frame.append(configFrame.getSequence());
-
- // 加密
- // TODO-LIST
- // 密钥根据设备编号获取
- SafeStrategy safeStrategy;
- if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
- configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
- safeStrategy = SpringContextUtil.getBean(Sm4.class);
- } else {
- safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
- }
-
- byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
- frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
-
- // 计算CRC校验码
- frame.append(protocol.calculateCRC(frame.toString()));
-
- return frame.toString();
- }
-}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
index e374e46..cb5ab89 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java
@@ -16,6 +16,8 @@
Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes);
void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId);
+ void pushMessage(BirmmBaseFrame birmmFrame);
+
/**
* 创建配置帧
* @param uploadFrame 收到的消息帧
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
new file mode 100644
index 0000000..d4ca463
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IPushService.java
@@ -0,0 +1,8 @@
+package com.casic.missiles.service;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public interface IPushService {
+
+ void doPush(BirmmBaseFrame birmmFrame);
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
new file mode 100644
index 0000000..9b1353d
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java
@@ -0,0 +1,279 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.casic.missiles.enums.BirmmDeviceTypeEnums;
+import com.casic.missiles.enums.BirmmFrameAttributeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.BirmmFrameBuilderFactory;
+import com.casic.missiles.model.Device;
+import com.casic.missiles.model.DeviceBizData;
+import com.casic.missiles.model.DeviceFrameLog;
+import com.casic.missiles.model.SubscribeStore;
+import com.casic.missiles.parser.BirmmProtocolParser;
+import com.casic.missiles.parser.safe.SafeStrategy;
+import com.casic.missiles.parser.safe.impl.Sm4;
+import com.casic.missiles.parser.safe.impl.TeaUtilsX;
+import com.casic.missiles.service.*;
+import com.casic.missiles.util.SnowflakeUtil;
+import com.casic.missiles.util.SpringContextUtil;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class GeneralServiceImpl implements IGeneralService {
+
+ @Resource
+ BirmmProtocolParser protocol;
+
+ @Resource
+ IDeviceFrameLogService frameLogService;
+
+ @Resource
+ IDeviceBizDataService bizDataService;
+
+ @Resource
+ IDeviceService deviceService;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ byte[] keyByte = {
+ 0x24, (byte) 0xad, 0x18, 0x25, 0x07, 0x47, (byte) 0x9a, 0x5d, (byte) 0xa3, (byte) 0xad, (byte) 0x94, (byte) 0xd9, (byte) 0xd7, (byte) 0x8e, (byte) 0xa2, 0x03
+ };
+
+ @Override
+ public BirmmBaseFrame doFrameParse(byte[] frame) {
+ boolean frameValid = protocol.preCheckFrame(frame);
+ if (frameValid) {
+ // 解析长度
+ int length = protocol.getLength(frame);
+
+ // 解析得到设备编号
+ String devCode = protocol.getDevCode(frame);
+
+ // 解析通信方式
+ String commType = protocol.getCommunicationType(frame);
+
+ // 解析目标节点地址
+ String destAddr = protocol.getDestinationAddr(frame);
+
+ // 解析得到PDUType
+ String pduType = protocol.getPDUType(frame);
+ byte[] pduTypeBytes = protocol.getPDUTypeBytes(frame);
+ String deviceType = protocol.getDeviceType(pduTypeBytes);
+ String operaType = protocol.getOperaType(pduTypeBytes);
+
+ // 解析序号
+ String seq = protocol.getSequence(frame);
+
+ // 加密后的业务字段
+ String tagListStr = protocol.getTagListString(frame);
+
+ log.debug("上行帧结构字段解析结果:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", length, devCode, commType, destAddr, pduType, seq);
+
+ // 解密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ deviceType.equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] plainBytes = safeStrategy.decryption(tagListStr);
+ String plainTagListStr = HexUtils.toHexString(plainBytes).toUpperCase();
+
+ log.info("上行业务字段:{}", plainTagListStr);
+
+ // 获得业务字段tagList
+ Map> tagList = protocol.getTagList(plainBytes);
+
+ // 创建Frame
+ BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType);
+ if (birmmFrame != null) {
+ birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间
+ birmmFrame.setDevCode(devCode);
+ birmmFrame.setCommunicationType(commType);
+ birmmFrame.setDestinationAddr(destAddr);
+ birmmFrame.setSequence(seq);
+ birmmFrame.setDeviceType(deviceType);
+ birmmFrame.setOperationType(operaType);
+ birmmFrame.setRawBizFrameString(plainTagListStr);
+ birmmFrame.setTagList(tagList);
+
+ return birmmFrame;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void doParseBizTag(BirmmBaseFrame baseFrame) {
+ baseFrame.doParseBizTag();
+ }
+
+ @Override
+ public Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes) {
+ DeviceFrameLog frameLog = new DeviceFrameLog();
+ frameLog.setId(new SnowflakeUtil().nextId());
+ frameLog.setDevcode(baseFrame.getDevCode());
+ frameLog.setRawFrame(HexUtils.toHexString(frameBytes).toUpperCase());
+ frameLog.setRawBizFrame(baseFrame.getRawBizFrameString());
+ frameLog.setDataJson(baseFrame.toJSON().toJSONString());
+ frameLog.setLogtime(baseFrame.getLogTime());
+ frameLogService.save(frameLog);
+
+ return frameLog.getId();
+ }
+
+ @Override
+ public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) {
+ List bizDataList = baseFrame.convertToBizDataList();
+ for (DeviceBizData bizData : bizDataList) {
+ // 设置其他的属性
+ bizData.setId(new SnowflakeUtil().nextId());
+ bizData.setFrameLogId(frameLogId); // 关联日志记录id
+ bizData.setDevcode(baseFrame.getDevCode());
+ bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType()));
+ bizData.setLogtime(baseFrame.getLogTime());
+ }
+
+ // 批量保存
+ bizDataService.saveBatch(bizDataList);
+ }
+
+ @Override
+ public void pushMessage(BirmmBaseFrame birmmFrame) {
+ Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode());
+ if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) {
+ List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId());
+ for (SubscribeStore ss : ssList) {
+ if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) {
+ IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId());
+
+ // 执行推送动作
+ pushService.doPush(birmmFrame);
+ }
+ }
+ }
+ }
+
+ @Override
+ public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) {
+ BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType());
+
+ if (null != configFrame) {
+ configFrame.setDevCode(uploadFrame.getDevCode());
+ configFrame.setCommunicationType(uploadFrame.getCommunicationType());
+ configFrame.setDestinationAddr(uploadFrame.getDestinationAddr());
+ configFrame.setSequence(uploadFrame.getSequence());
+
+ configFrame.setDeviceType(uploadFrame.getDeviceType());
+ configFrame.replyPduType();
+
+ // TODO-LIST
+ // 查询数据库找到待下发的内容
+
+ configFrame.replyBizTag();
+ }
+
+ return configFrame;
+ }
+
+ @Override
+ public String replyMessage(BirmmBaseFrame configFrame) {
+ StringBuilder frame = new StringBuilder();
+
+ // A320
+ frame.append(configFrame.getPRE_CODE());
+ frame.append(configFrame.getVERSION());
+
+ // 处理tag
+ String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList());
+ log.info("下行业务字段:{}", plainTagListStr);
+
+ // 计算长度
+ int length = BirmmFrameAttributeEnums.DEVICE_CODE.getLength() +
+ BirmmFrameAttributeEnums.COMM_TYPE.getLength() +
+ BirmmFrameAttributeEnums.DEST_ADDR.getLength() +
+ BirmmFrameAttributeEnums.PDU_TYPE.getLength() +
+ BirmmFrameAttributeEnums.SEQ.getLength() +
+ plainTagListStr.length() / 2;
+ // 两个字节的长度
+ frame.append(String.format("%04x", length));
+
+ log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]",
+ length, configFrame.getDevCode(), configFrame.getCommunicationType(),
+ configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence());
+
+ // 设备编号 - PDUType字段
+ frame.append(configFrame.getDevCode());
+ frame.append(configFrame.getCommunicationType());
+ frame.append(configFrame.getDestinationAddr());
+ frame.append(configFrame.getPduType());
+ frame.append(configFrame.getSequence());
+
+ // 加密
+ // TODO-LIST
+ // 密钥根据设备编号获取
+ SafeStrategy safeStrategy;
+ if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) ||
+ configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) {
+ safeStrategy = SpringContextUtil.getBean(Sm4.class);
+ } else {
+ safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class);
+ }
+
+ byte[] tagBytes = safeStrategy.encryption(plainTagListStr);
+ frame.append(HexUtils.toHexString(tagBytes).toUpperCase());
+
+ // 计算CRC校验码
+ frame.append(protocol.calculateCRC(frame.toString()));
+
+ return frame.toString();
+ }
+
+ private IPushService initPushImpl(int pushType, Long ssId) {
+ IPushService object = null;
+ switch (pushType) {
+ case 1:
+ // via http
+ object = SpringContextUtil.getBean(PushServiceImplHttp.class);
+ break;
+
+ case 2:
+ // via tcp
+ break;
+
+ case 3:
+ // via rabbit mq
+
+ case 4:
+ // via kafka
+ object = SpringContextUtil.getBean(PushServiceImplKafka.class);
+ break;
+
+ case 5:
+ // via flume
+ object = SpringContextUtil.getBean(PushServiceImplFlume.class);
+ ((PushServiceImplFlume) object).initFlumeConfig(ssId);
+ break;
+
+ default:
+ break;
+ }
+
+ return object;
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
new file mode 100644
index 0000000..26c13ec
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java
@@ -0,0 +1,98 @@
+package com.casic.missiles.service.impl;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import com.casic.missiles.service.ISubscribeStoreService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.CharsetUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+@Slf4j
+@Component("tcpPusher")
+public class PushServiceImplFlume implements IPushService {
+
+ private String serverHost;
+ private Integer serverPort;
+
+ @Resource
+ ISubscribeStoreService subscribeService;
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ if (StrUtil.isNotEmpty(this.serverHost)) {
+ startSocketClient(birmmFrame.toJSON().toJSONString());
+ }
+ }
+
+ public void initFlumeConfig(Long extId) {
+ Map tcpConfig = subscribeService.getFlumeConfig(extId);
+
+ if (tcpConfig.containsKey("SERVER_HOST") && tcpConfig.containsKey("SERVER_PORT")) {
+ this.serverHost = (String) tcpConfig.get("SERVER_HOST");
+ this.serverPort = (Integer) tcpConfig.get("SERVER_PORT");
+ }
+ }
+
+ private void startSocketClient(Object msg) {
+ EventLoopGroup group = new NioEventLoopGroup();
+ ClientHandler handler = new ClientHandler();
+ handler.setMsg(StrUtil.toString(msg));
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(group)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .handler(handler);
+
+ // 连接到服务器并发送
+ ChannelFuture future = b.connect(serverHost, serverPort).sync();
+ future.channel().closeFuture().sync();
+ } catch (Exception ex) {
+ log.error("创建连接失败[{}:{}]", serverHost, serverPort);
+ } finally {
+ // 优雅的关闭
+ group.shutdownGracefully();
+ }
+ }
+}
+
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+class ClientHandler extends ChannelInboundHandlerAdapter {
+ private String msg;
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ ByteBuf buf = (ByteBuf) msg;
+ String message = buf.toString(CharsetUtil.UTF_8);
+ log.info("收到接收端返回的消息[{}]", message.trim());
+
+ ThreadUtil.safeSleep(1000);
+ ctx.channel().close();
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ msg += "\r\n";
+ ByteBuf buff = Unpooled.buffer();
+ buff.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
+ ctx.channel().writeAndFlush(buff);
+
+ log.info("通过Tcp推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
new file mode 100644
index 0000000..a4a8cc2
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplHttp.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("httpPusher")
+public class PushServiceImplHttp implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+ log.info("通过Http接口推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
new file mode 100644
index 0000000..d854e1f
--- /dev/null
+++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplKafka.java
@@ -0,0 +1,18 @@
+package com.casic.missiles.service.impl;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.service.IPushService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("kafkaPusher")
+public class PushServiceImplKafka implements IPushService {
+
+ @Override
+ public void doPush(BirmmBaseFrame birmmFrame) {
+
+
+ log.info("通过Kafka推送消息[{}]", birmmFrame.toJSON().toJSONString());
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
index 7ff7c2c..339e604 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java
@@ -4,7 +4,6 @@
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.methane.MethaneGetRequestFrame;
import com.casic.missiles.frame.methane.MethaneGetResponseFrame;
-import com.casic.missiles.frame.methane.MethaneOnlineResponseFrame;
public class SentinelFrameBuilderFactory {
@@ -18,11 +17,11 @@
case UP_TRAP_REQUEST:
return new SentinelTrapRequestFrame();
-// case UP_ONLINE_REQUEST:
-// return new MethaneOnlineRequestFrame();
-//
-// case UP_SET_RESPONSE:
-// return new MethaneSetResponseFrame();
+ case UP_ONLINE_REQUEST:
+ return new SentinelOnlineRequestFrame();
+
+ case UP_SET_RESPONSE:
+ return new SentinelSetResponseFrame();
default:
return null;
@@ -46,7 +45,7 @@
case UP_ONLINE_REQUEST:
// ONLINE_REQUEST消息回复ONLINE_RESPONSE
- return new MethaneOnlineResponseFrame();
+ return new SentinelOnlineResponseFrame();
default:
return null;
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
new file mode 100644
index 0000000..b8805c5
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java
@@ -0,0 +1,33 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
+
+import java.time.format.DateTimeFormatter;
+
+public class SentinelOnlineRequestFrame extends BirmmBaseFrame {
+
+ private final String DEV_TYPE = "Tube";
+ private final String MESSAGE_TYPE = "OnlineRequest";
+ private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
+
+ @Override
+ public JSONObject toJSON() {
+ JSONObject json = super.toJSON();
+ json.put("devType", DEV_TYPE);
+ json.put("mType", MESSAGE_TYPE);
+
+ JSONObject body = new JSONObject();
+ body.put("bType", BIZ_TYPE);
+ body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) {
+ SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0);
+ body.put("softwareVersion", tag.getVersion());
+ }
+
+ json.put("mBody", body);
+
+ return json;
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
new file mode 100644
index 0000000..21d9025
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java
@@ -0,0 +1,42 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.enums.BirmmOperationTypeEnums;
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import com.casic.missiles.frame.tag.ota.NeedOTATag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SentinelOnlineResponseFrame extends BirmmBaseFrame {
+
+ @Override
+ public void replyPduType() {
+ StringBuilder pduType;
+
+ int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16);
+ pduType = new StringBuilder(Integer.toHexString(pduValue));
+ while (pduType.length() != 4) {
+ pduType.insert(0, "0");
+ }
+
+ this.setPduType(pduType.toString());
+ }
+
+ @Override
+ public void replyBizTag() {
+ // 无需升级 回复NeedOTATag
+ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag
+ // TODO-LIST
+ // 暂时回复不用升级
+ Map> tagList = new HashMap<>();
+ NeedOTATag needTag = new NeedOTATag();
+ needTag.setNeed(false);
+ List needTags = new ArrayList<>();
+ needTags.add(needTag);
+ tagList.put(NeedOTATag.class.getSimpleName(), needTags);
+ super.setTagList(tagList);
+ }
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
new file mode 100644
index 0000000..e22140c
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java
@@ -0,0 +1,6 @@
+package com.casic.missiles.frame.sentinel;
+
+import com.casic.missiles.frame.base.BirmmBaseFrame;
+
+public class SentinelSetResponseFrame extends BirmmBaseFrame {
+}
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
index bc97b1a..cfb0cf1 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java
@@ -1,14 +1,13 @@
package com.casic.missiles.frame.sentinel;
+import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.casic.missiles.enums.BirmmDataBizTypeEnums;
import com.casic.missiles.enums.BirmmTagTypeEnums;
import com.casic.missiles.frame.base.BirmmBaseFrame;
import com.casic.missiles.frame.base.BirmmBaseTag;
-import com.casic.missiles.frame.tag.biz.CellTag;
-import com.casic.missiles.frame.tag.biz.DateTag;
-import com.casic.missiles.frame.tag.biz.SensorStateTag;
-import com.casic.missiles.frame.tag.biz.UploadTag;
+import com.casic.missiles.frame.tag.biz.*;
import com.casic.missiles.frame.tag.signal.PCITag;
import com.casic.missiles.frame.tag.signal.RSRPTag;
import com.casic.missiles.frame.tag.signal.SNRTag;
@@ -26,7 +25,7 @@
private List bizDataList;
- private final String DEV_TYPE = "Sentinel";
+ private final String DEV_TYPE = "Tube";
private final String MESSAGE_TYPE = "Data";
private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE;
@@ -43,6 +42,10 @@
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
body.put("cell", cellTag.getCellVal());
}
+ if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ body.put("cell", NumberUtil.round(voltageTag.getPercent(), 2));
+ }
if (getTagList().containsKey(PCITag.class.getSimpleName())) {
PCITag pciTag = (PCITag) getTagList().get(PCITag.class.getSimpleName()).get(0);
body.put("pci", pciTag.getPci());
@@ -60,6 +63,11 @@
if (bizDataList != null) {
JSONArray datas = new JSONArray();
for (SentinelBizData bizData : bizDataList) {
+ // TODO-LIST
+ // 暂时过滤掉温度值 待sink修改后放开
+ if (bizData.getBizType() == BirmmDataBizTypeEnums.TYPE_TEMPERATURE.getValue()) {
+ continue;
+ }
datas.add(bizData.toJSON());
}
body.put("datas", datas);
@@ -89,6 +97,9 @@
if (getTagList().containsKey(CellTag.class.getSimpleName())) {
CellTag cellTag = (CellTag) getTagList().get(CellTag.class.getSimpleName()).get(0);
bizData.setCell(cellTag.getCellVal());
+ } else if (getTagList().containsKey(VoltageTag.class.getSimpleName())) {
+ VoltageTag voltageTag = (VoltageTag) getTagList().get(VoltageTag.class.getSimpleName()).get(0);
+ bizData.setCell(NumberUtil.toBigDecimal(voltageTag.getPercent()).intValue());
}
// 信号质量
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
index a7094dd..8cc826c 100644
--- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java
@@ -2,10 +2,7 @@
import com.casic.missiles.enums.BirmmTagTypeEnums;
import com.casic.missiles.frame.base.BirmmBaseTag;
-import com.casic.missiles.frame.tag.biz.CellTag;
-import com.casic.missiles.frame.tag.biz.DateTag;
-import com.casic.missiles.frame.tag.biz.SensorStateTag;
-import com.casic.missiles.frame.tag.biz.UploadTag;
+import com.casic.missiles.frame.tag.biz.*;
import com.casic.missiles.frame.tag.config.*;
import com.casic.missiles.frame.tag.ota.SoftwareVersionTag;
import com.casic.missiles.frame.tag.signal.PCITag;
@@ -62,6 +59,9 @@
case CELL_TAG:
return new CellTag();
+ case VOLTAGE_TAG:
+ return new VoltageTag();
+
case SOFTWARE_VERSION_TAG:
return new SoftwareVersionTag();
diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/biz/VoltageTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/biz/VoltageTag.java
new file mode 100644
index 0000000..a494b44
--- /dev/null
+++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/biz/VoltageTag.java
@@ -0,0 +1,27 @@
+package com.casic.missiles.frame.tag.biz;
+
+import com.casic.missiles.frame.base.BirmmBaseTag;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class VoltageTag extends BirmmBaseTag {
+
+ final String VOLTAGE_TAG_OID = "60000030";
+
+ int volVal;
+ double percent;
+
+ @Override
+ public String toString() {
+ return super.toString() + "[value: " + volVal + "]";
+ }
+
+ @Override
+ public void setValueStr(String valueStr) {
+ super.setValueStr(valueStr);
+ volVal = Integer.parseInt(valueStr, 16);
+ percent = (float) volVal / 255.0 * 100;
+ }
+}
diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java
index 02d7888..365e940 100644
--- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java
+++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java
@@ -30,6 +30,7 @@
SENSOR_STATE_4_TAG("6000000C", 1),
SENSOR_STATE_5_TAG("6000000D", 1),
CELL_TAG("60000020", 1),
+ VOLTAGE_TAG("60000030", 1),
SOFTWARE_VERSION_TAG("60000500", -1),
PCI_TAG("60000511", 2),
RSRP_TAG("60000513", 2),