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),