展连设备数据解析策略
This commit is contained in:
@ -0,0 +1,8 @@
|
||||
package com.fastbee.iot.strategy;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import java.util.List;
|
||||
public interface DeviceRealTimeDataStrategy {
|
||||
|
||||
List<JSONObject> getDeviceRealTimeData(String deviceId);
|
||||
}
|
@ -0,0 +1,130 @@
|
||||
package com.fastbee.iot.strategy.impl;
|
||||
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
||||
|
||||
|
||||
import com.fastbee.deviceData.api.devlink.service.ZhanLianConfig;
|
||||
import com.fastbee.iot.domain.Device;
|
||||
import com.fastbee.iot.mapper.DeviceMapper;
|
||||
import com.fastbee.iot.strategy.DeviceRealTimeDataStrategy;
|
||||
import com.fastbee.iot.zhanlian.ZhanLianAuthorizationService;
|
||||
import com.fastbee.iot.zhanlian.ZhanLianBaseService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class ZhanLianDeviceRealTimeDataStrategy implements DeviceRealTimeDataStrategy {
|
||||
|
||||
|
||||
|
||||
@Autowired
|
||||
private DeviceMapper deviceMapper;
|
||||
|
||||
@Override
|
||||
public List<JSONObject> getDeviceRealTimeData(String deviceId) {
|
||||
|
||||
//根据产品查询对应设备
|
||||
Device device = new LambdaQueryChainWrapper<>(deviceMapper)
|
||||
.select(Device::getDeviceId,Device::getSerialNumber,Device::getDevParams)
|
||||
.eq(Device::getSerialNumber,deviceId)
|
||||
.eq(Device::getDelFlag, 0)
|
||||
.one();
|
||||
if(device == null){
|
||||
throw new RuntimeException("展连设备不存在!设备id为:"+deviceId);
|
||||
}
|
||||
|
||||
//解析设备对接参数
|
||||
String devParams = device.getDevParams();
|
||||
if(StringUtils.isBlank(devParams)){
|
||||
throw new RuntimeException("展连设备对接参数为空!设备id为:"+device.getDeviceId());
|
||||
}
|
||||
JSONArray paramArray = JSONUtil.parseArray(devParams);
|
||||
//解析参数列表建立map
|
||||
Map<String, String> params = new HashMap<>();
|
||||
//解析参数列表建立map
|
||||
paramArray.forEach(paramObj->{
|
||||
JSONObject entries = JSONUtil.parseObj(paramObj);
|
||||
Object key = entries.get("key");
|
||||
Object value = entries.get("value");
|
||||
params.put(key.toString(),value.toString());
|
||||
});
|
||||
|
||||
|
||||
//获取请求地址
|
||||
String authEndpoint = ZhanLianAuthorizationService.getAuthEndpoint(ZhanLianConfig.builder()
|
||||
.ak(params.get("ak"))
|
||||
.sk(params.get("sk"))
|
||||
.authId( params.get("authId"))
|
||||
.endpoint("https://plat.developlink.cloud/prod-api/iot/data/forward")
|
||||
.build());
|
||||
|
||||
//请求参数构建
|
||||
HashMap<String, Object> reqBody = new HashMap<>();
|
||||
reqBody.put("method","get");
|
||||
reqBody.put("path","api/v1/product/device/run_status");
|
||||
Map<String,Object> param =new HashMap<>();
|
||||
param.put("id", deviceId);
|
||||
reqBody.put("params",params);
|
||||
|
||||
ZhanLianBaseService zhanLianBaseService = new ZhanLianBaseService();
|
||||
//请求设备
|
||||
JSONObject respObj = zhanLianBaseService.baseRequest(reqBody, authEndpoint);
|
||||
//解析设备实时数据
|
||||
Map<String, String> deviceRealTimeData = getDeviceRealTimeData(respObj, deviceId);
|
||||
//映射为数据存储对象
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据设备id请求数据并解析设备实时数据为易于存储的map键值对
|
||||
* @param deviceId 设备id
|
||||
* @return 实时数据
|
||||
*/
|
||||
public Map<String,String> getDeviceRealTimeData(JSONObject data ,String deviceId){
|
||||
|
||||
//获取设备状态
|
||||
JSONObject jsonObjectData = JSONUtil.parseObj(data);
|
||||
Object status = jsonObjectData.get("status");
|
||||
//获取设备属性以及实时数据值
|
||||
Object properties = jsonObjectData.get("properties");
|
||||
//获取数据上报时间
|
||||
String time = jsonObjectData.get("lastOnlineTime").toString();
|
||||
JSONArray propertiesArray = JSONUtil.parseArray(properties);
|
||||
//获取设备各项属性实时数据
|
||||
//设备属性与值建立map
|
||||
Map<String, String> propertiesMap = new HashMap<>();
|
||||
propertiesArray.forEach(p -> {
|
||||
Object property = JSONUtil.parseObj(p).get("property");
|
||||
JSONObject propertyMap = JSONUtil.parseObj(property);
|
||||
//属性名称
|
||||
String name = propertyMap.get("name").toString();
|
||||
//属性key
|
||||
String key = propertyMap.get("key").toString();
|
||||
//属性值
|
||||
Object value1 = JSONUtil.parseObj(p).get("value");
|
||||
String value="" ;
|
||||
if(value1!=null){
|
||||
value = value1.toString();
|
||||
}
|
||||
|
||||
//TODO 属性值历史数据,是否需要
|
||||
Object list = JSONUtil.parseObj(p).get("list");
|
||||
//建立属性-值映射关系
|
||||
propertiesMap.put(key,value);
|
||||
|
||||
});
|
||||
propertiesMap.put("status",status.toString());
|
||||
propertiesMap.put("deviceId",deviceId);
|
||||
propertiesMap.put("realTime",time);
|
||||
return propertiesMap;
|
||||
}
|
||||
|
||||
}
|
@ -1,28 +1,16 @@
|
||||
package com.fastbee.iot.timer;
|
||||
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.fastbee.deviceData.api.devlink.service.DevLinkMetDataService;
|
||||
import com.fastbee.deviceData.api.devlink.service.DevLinkMiaoQingDataService;
|
||||
import com.fastbee.deviceData.api.devlink.service.DevLinkMoistureDataService;
|
||||
import com.fastbee.deviceData.api.devlink.service.DevLinkPhotovoltaicDataService;
|
||||
import com.fastbee.deviceData.api.renke.constant.RenKeDeviceTypeConstant;
|
||||
import com.fastbee.deviceData.api.renke.service.RenKeAuthorizationService;
|
||||
import com.fastbee.deviceData.api.devlink.service.ZhanLianMetDataService;
|
||||
import com.fastbee.deviceData.api.devlink.service.ZhanLianMiaoQingDataService;
|
||||
import com.fastbee.deviceData.api.devlink.service.ZhanLianMoistureDataService;
|
||||
import com.fastbee.deviceData.api.devlink.service.ZhanLianPhotovoltaicDataService;
|
||||
import com.fastbee.deviceData.api.renke.service.RenkeDeviceDataService;
|
||||
import com.fastbee.deviceData.domain.*;
|
||||
|
||||
import com.fastbee.deviceData.mapper.*;
|
||||
import com.fastbee.deviceData.service.IDeviceRealtimedataWormsService;
|
||||
import com.fastbee.deviceData.service.impl.DeviceRealtimedataWormsServiceImpl;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import com.fastbee.iot.mapper.DeviceMapper;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
@ -38,6 +26,9 @@ public class DeviceDateTask {
|
||||
// @Autowired
|
||||
// private ThreadPoolTaskExecutor taskExecutor;
|
||||
|
||||
@Autowired
|
||||
private DeviceMapper deviceMapper;
|
||||
|
||||
@Autowired
|
||||
private DeviceRealtimedataWormsMapper deviceRealtimedataWormsMapper;
|
||||
|
||||
@ -57,16 +48,16 @@ public class DeviceDateTask {
|
||||
private RenkeDeviceDataService wormsService; //虫情设备数据获取
|
||||
|
||||
@Autowired
|
||||
private DevLinkMetDataService metDataService; //气象设备数据获取
|
||||
private ZhanLianMetDataService metDataService; //气象设备数据获取
|
||||
|
||||
@Autowired
|
||||
private DevLinkMoistureDataService moistureDataService; //墒情设备数据获取
|
||||
private ZhanLianMoistureDataService moistureDataService; //墒情设备数据获取
|
||||
|
||||
@Autowired
|
||||
private DevLinkPhotovoltaicDataService photovoltaicDataService; //光伏设备数据获取
|
||||
private ZhanLianPhotovoltaicDataService photovoltaicDataService; //光伏设备数据获取
|
||||
|
||||
@Autowired
|
||||
private DevLinkMiaoQingDataService miaoQingDataService; //苗情设备数据获取
|
||||
private ZhanLianMiaoQingDataService miaoQingDataService; //苗情设备数据获取
|
||||
|
||||
|
||||
|
||||
@ -76,6 +67,7 @@ public class DeviceDateTask {
|
||||
* 获取虫情设备实时数据并保存
|
||||
*/
|
||||
public void getWormsDeviceRealtimeData() throws Exception{
|
||||
|
||||
DeviceRealtimedataWorms deviceRealtimedataWorms = wormsService.setData("1017240042");
|
||||
int i = deviceRealtimedataWormsMapper.insert(deviceRealtimedataWorms);
|
||||
if (i<1){
|
||||
@ -87,7 +79,7 @@ public class DeviceDateTask {
|
||||
* 获取气象设备实时数据并保存
|
||||
*/
|
||||
public void getDevLinkMetDeviceRealtimeData() throws Exception{
|
||||
DeviceRealtimedataMeteorology deviceRealtimedataMeteorology = metDataService.setData(metDataService.getMetDeviceRealData("3269"));
|
||||
DeviceRealtimedataMeteorology deviceRealtimedataMeteorology = metDataService.setData(metDataService.getDeviceRealTimeData("3269"));
|
||||
int i = deviceRealtimedataMeteorologyMapper.insert(deviceRealtimedataMeteorology);
|
||||
if (i<1){
|
||||
System.out.println("插入数据失败!");
|
||||
@ -98,7 +90,7 @@ public class DeviceDateTask {
|
||||
* 获取墒情设备实时数据并保存
|
||||
*/
|
||||
public void getDevLinkMoistureDeviceRealtimeData() throws Exception{
|
||||
DeviceRealtimedataMoisture deviceRealtimedataMoisture = moistureDataService.setData(moistureDataService.getMetDeviceRealData("3270"));
|
||||
DeviceRealtimedataMoisture deviceRealtimedataMoisture = moistureDataService.setData(moistureDataService.getDeviceRealTimeData("3270"));
|
||||
int i = deviceRealtimedataMoistureMapper.insert(deviceRealtimedataMoisture);
|
||||
if (i<1)
|
||||
System.out.println("插入数据失败!");
|
||||
@ -108,7 +100,7 @@ public class DeviceDateTask {
|
||||
* 获取光伏设备实时数据并保存
|
||||
*/
|
||||
public void getDevLinkPhotovoltaicDeviceRealtimeData() throws Exception{
|
||||
DeviceRealtimedataPhotovoltaic deviceRealtimedataPhotovoltaic = photovoltaicDataService.setData(photovoltaicDataService.getMetDeviceRealData("3276"));
|
||||
DeviceRealtimedataPhotovoltaic deviceRealtimedataPhotovoltaic = photovoltaicDataService.setData(photovoltaicDataService.getDeviceRealTimeData("3276"));
|
||||
int i = deviceRealtimedataPhotovoltaicMapper.insert(deviceRealtimedataPhotovoltaic);
|
||||
if (i<1)
|
||||
System.out.println("插入数据失败!");
|
||||
@ -118,7 +110,7 @@ public class DeviceDateTask {
|
||||
* 获取苗情设备实时数据并保存
|
||||
*/
|
||||
public void getDevLinkMiaoqingDeviceRealtimeData() throws Exception{
|
||||
DeviceRealtimedataMiaoqing deviceRealtimedataMiaoqing = miaoQingDataService.setData(miaoQingDataService.getMetDeviceRealData("3275"));
|
||||
DeviceRealtimedataMiaoqing deviceRealtimedataMiaoqing = miaoQingDataService.setData(miaoQingDataService.getDeviceRealTimeData("3275"));
|
||||
int i = deviceRealtimedataMiaoqingMapper.insert(deviceRealtimedataMiaoqing);
|
||||
if (i<1)
|
||||
System.out.println("插入数据失败!");
|
||||
|
@ -0,0 +1,49 @@
|
||||
package com.fastbee.iot.zhanlian;
|
||||
|
||||
import com.fastbee.deviceData.api.devlink.service.ZhanLianConfig;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
|
||||
@Data
|
||||
public class ZhanLianAuthorizationService {
|
||||
|
||||
|
||||
public static String getAuthEndpoint(ZhanLianConfig zhanLianConfig){
|
||||
String ak = zhanLianConfig.getAk();
|
||||
String sk = zhanLianConfig.getSk();
|
||||
String authId = zhanLianConfig.getAuthId();
|
||||
String endpoint = zhanLianConfig.getEndpoint();
|
||||
String sign;
|
||||
long time = System.currentTimeMillis();
|
||||
String message = "ak=" + ak + "&authId=" + authId + "&time=" + time;
|
||||
try {
|
||||
SecretKeySpec keySpec = new SecretKeySpec(
|
||||
sk.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
|
||||
Mac mac = Mac.getInstance("HmacSHA256");
|
||||
mac.init(keySpec);
|
||||
byte[] rawHmac = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
|
||||
sign = DatatypeConverter.printHexBinary(rawHmac).toLowerCase();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("签名生成失败! : " + e.getMessage(), e);
|
||||
}
|
||||
return endpoint+"?ak="+ak+"&time="+time+"&sign="+sign+"&authId="+authId;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package com.fastbee.iot.zhanlian;
|
||||
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.fastbee.common.exception.ServiceException;
|
||||
import com.fastbee.deviceData.api.devlink.service.ZhanLianAuthorizationService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public class ZhanLianBaseService {
|
||||
|
||||
/**
|
||||
* 基本请求
|
||||
* @param body 请求负载
|
||||
* @return 请求结果 data
|
||||
*/
|
||||
public JSONObject baseRequest(Map<String,Object> body,String url){
|
||||
String jsonStr = JSONUtil.toJsonStr(body);
|
||||
String respStr = HttpUtil.post(url,jsonStr);
|
||||
JSONObject resp = JSONUtil.parseObj(respStr);
|
||||
if(!resp.get("code").toString().equals("200")){
|
||||
throw new ServiceException(resp.get("message").toString());
|
||||
}
|
||||
return resp.getJSONObject("data");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public BigDecimal toBigDecimalValue(String str) {
|
||||
if (str == null|| str.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return new BigDecimal(str);
|
||||
}
|
||||
public Long toLongValue(String str) {
|
||||
if (str == null|| str.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return Long.parseLong(str);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.fastbee.iot.zhanlian;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public class ZhanLianConfig {
|
||||
|
||||
private String ak;
|
||||
|
||||
private String sk;
|
||||
|
||||
private String authId;
|
||||
|
||||
private String endpoint;
|
||||
}
|
Reference in New Issue
Block a user