ShzzDevicePullService.java
11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
package com.iot.scheduler.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.iot.scheduler.model.DeviceToken;
import com.iot.scheduler.model.QxDeviceInfo;
import com.iot.scheduler.model.QxDeviceInfoDetail;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalTime;
import java.util.*;
/**
* 双龙应用数据同步
*/
@Slf4j
@Service
public class ShzzDevicePullService {
@Value("${shzz.iot.organizeId:}")
private String iotOrganizeId;
@Value("${shzz.iot.profileId}")
private String iotProfileId;
@Value("${shzz.iot.deviceProfileId}")
private String iotDeviceProfileId;
@Value("${shzz.iot.userName:}")
private String iotUserName;
@Value("${shzz.iot.password:}")
private String iotPassword;
@Value("${shzz.iot.tokenUrl}")
private String iotTokenUrl;
@Value("${shzz.iot.infoUrl}")
private String iotDeviceInfoUrl;
@Value("${shzz.iot.detailUrl}")
private String iotDeviceDetailUrl;
@Resource
private RedisTemplate<String, String> redisTemplate;
public void pullDeviceAndPushToIot() {
LocalTime currentTime = LocalTime.now();
LocalTime startTime = LocalTime.of(8, 0, 0); // 08:00:00
LocalTime endTime = LocalTime.of(18, 0, 0); // 18:00:00
boolean isWithinRange =
!currentTime.isBefore(startTime) &&
currentTime.isBefore(endTime);
if (!isWithinRange) {
return;
}
JSONArray deviceInfoList = getDeviceInfo();
List<QxDeviceInfo> qxDeviceInfos = new ArrayList<>();
List<QxDeviceInfoDetail> qxAddDeviceInfoDetails = new ArrayList<>();
Map<String, QxDeviceInfoDetail> qxDeviceInfoDetailMap = new HashMap<>();
for (Object o : deviceInfoList) {
JSONObject deviceInfoJson = (JSONObject) o;
QxDeviceInfo qxDeviceInfo = new QxDeviceInfo();
qxDeviceInfo.setDeviceType("DIRECT_CONNECTION");
qxDeviceInfo.setTransportType("DEFAULT");
qxDeviceInfo.setOrganizationId(iotOrganizeId);
qxDeviceInfo.setDeviceProfileId(iotDeviceProfileId);
qxDeviceInfo.setProfileId(iotProfileId);
// //项目状态(1:在线,2:离线,3:报警)
// Integer projectState = deviceInfoJson.getInteger("projectState");
// if (projectState != null) {
// qxDeviceInfo.setDescription(String.valueOf(projectState));
// }
//项目类型
qxDeviceInfo.setLabel("生产设备");
//设备名称
String deviceName = deviceInfoJson.getString("deviceName");
qxDeviceInfo.setName(deviceName);
qxDeviceInfo.setBrand(deviceName);
//序列号
String dtuSn = deviceInfoJson.getString("dtuSn");
qxDeviceInfo.setSn(dtuSn);
DeviceToken deviceToken = new DeviceToken();
deviceToken.setCredentialsType("ACCESS_TOKEN");
deviceToken.setCredentialsId(dtuSn);
deviceToken.setCredentialsValue(dtuSn);
qxDeviceInfo.setDeviceToken(deviceToken);
qxDeviceInfos.add(qxDeviceInfo);
QxDeviceInfoDetail qxDeviceInfoDetail = new QxDeviceInfoDetail();
qxDeviceInfoDetail.setAlarm(false);
//灯状态(0:灭灯,1:红,2:黄,3:绿,4:蓝)
Integer lampState = deviceInfoJson.getInteger("lampState");
switch (lampState) {
case 0:
qxDeviceInfoDetail.setStatus("OFF");
break;
case 1:
qxDeviceInfoDetail.setStatus("ERROR");
qxDeviceInfoDetail.setAlarm(true);
break;
case 2:
qxDeviceInfoDetail.setStatus("STAND");
break;
case 3:
qxDeviceInfoDetail.setStatus("RUN");
//先从缓存里面拿token信息
String totalCapacity = getTotalCapacity("gh_total_capacity_" + dtuSn, deviceInfoJson.getDouble("production"));
qxDeviceInfoDetail.setCumulativeOutput(Double.valueOf(totalCapacity));
break;
default:
continue;
}
qxDeviceInfoDetail.setStartTime(new Date());
qxDeviceInfoDetail.setDtuSn(dtuSn);
qxDeviceInfoDetailMap.put(dtuSn, qxDeviceInfoDetail);
qxAddDeviceInfoDetails.add(qxDeviceInfoDetail);
}
//将数据同步到IOT平台
Map<String, String> qxParam = new HashMap<>(2);
qxParam.put("username", iotUserName);
qxParam.put("password", iotPassword);
HttpPost qxHttpPost = new HttpPost(iotTokenUrl);
String qxResult = sendPost(qxHttpPost, JSON.toJSONString(qxParam));
if (StringUtils.isBlank(qxResult)) {
return;
}
Map<String, Object> qxRes = JSON.parseObject(qxResult, new TypeReference<>() {
});
String qxAccessToken = (String) qxRes.get("token");
if (StringUtils.isBlank(qxAccessToken)) {
return;
}
BasicHeader qxAuthorization = new BasicHeader("X-Authorization", "Bearer " + qxAccessToken);
if (!CollectionUtils.isEmpty(qxDeviceInfos)) {
HttpPost qxDeviceInfoPost = new HttpPost(iotDeviceInfoUrl);
qxDeviceInfoPost.addHeader(qxAuthorization);
for (QxDeviceInfo qxDeviceInfo : qxDeviceInfos) {
// todo
String syncDeviceInfo = sendPost(qxDeviceInfoPost, JSON.toJSONString(qxDeviceInfo));
//log.info("同步设备信息 syncDeviceInfo:{}", syncDeviceInfo);
}
}
if (!CollectionUtils.isEmpty(qxAddDeviceInfoDetails)) {
for (QxDeviceInfoDetail qxDeviceInfoDetail : qxAddDeviceInfoDetails) {
String qxDeviceInfoDetailUrlStr = iotDeviceDetailUrl + qxDeviceInfoDetail.getDtuSn() + "/telemetry";
HttpPost qxDeviceInfoDetailPost = new HttpPost(qxDeviceInfoDetailUrlStr);
qxDeviceInfoDetailPost.addHeader(qxAuthorization);
String syncDeviceInfoDetail = sendPost(qxDeviceInfoDetailPost, JSON.toJSONString(qxDeviceInfoDetail));
}
}
}
private JSONArray getDeviceInfo() {
List<String> deviceNameList = Arrays.asList(
"新发现KSJ-160智能纸杯机7oz-1", "新发现KSJ-160智能纸杯机7oz-2", "新发现KSJ-160智能纸杯机6.5oz", "新发现KSJ-160智能纸杯机8oz-1",
"新发现KSJ-160智能纸杯机8oz-2", "新发现PJJ-III型纸容器品检机6.5oz/7oz", "新发现PJJ-III型纸容器品检机7.5oz/8oz",
"新发现PJJ-I-02型纸容器品检机7.5oz/8oz", "新发现PJJ-I-02型纸容器品检机7.5oz/12oz", "新发现KSJ-160智能快速纸杯机7.5oz-1",
"新发现KSJ-160智能快速纸杯机7.5oz-2", "新发现KSJ-160智能快速纸杯机12oz", "智能中速纸杯机JBZ-22D-1",
"智能中速纸杯机JBZ-22D-2", "智能中速纸杯机JBZ-22D-3", "智能中速纸杯机JBZ-22D-4", "智能中速纸杯机JBZ-22D-5", "智能中速纸杯机JBZ-22D-6",
"智能中速纸杯机JBZ-22D-7", "智能中速纸杯机JBZ-22D-8", "智能中速纸杯机JBZ-22D-9", "智能中速纸杯机JBZ-22S-1", "智能中速纸杯机JBZ-22S-2",
"高速智能纸杯机DEBAO-100S", "纸机杯XC-L12齿轮340-B型-1", "纸机杯XC-L12齿轮340-B型-2", "中速外贴机SM100-KT490(12oz)",
"中速外贴机SM100-KT491(4oz)", "中速外贴机SM100-KY373", "中速外贴机SM100-KT489(16oz)", "外贴机8oz", "外贴机12oz", "模切机1",
"模切机2", "模切机3", "模切机4", "模切机5");
JSONArray jsonArray = new JSONArray();
List<JSONObject> jsonObjectList = new ArrayList<>(38);
for (int index = 0; index < deviceNameList.size(); index++) {
Map<String, Object> map = new HashMap<>(3);
map.put("deviceName", deviceNameList.get(index));
map.put("dtuSn", "SGH20250123" + String.format("%03d", index));
map.put("lampState", 3);
if (index < 11) {
map.put("production", 130D);
} else if (index == 11) {
map.put("production", 120D);
} else if (index < 23) {
map.put("production", 80D);
} else if (index == 23) {
map.put("production", 110D);
} else if (index < 26) {
map.put("production", 50D);
} else if (index < 30) {
map.put("production", 120D);
} else {
map.put("production", 80D);
}
JSONObject jsonObject = new JSONObject();
jsonObject.putAll(map);
jsonObjectList.add(jsonObject);
}
jsonArray.addAll(jsonObjectList);
return jsonArray;
}
private String getTotalCapacity(String key, Double production) {
String totalCapacity = redisTemplate.opsForValue().get(key);
Double totalCapacityD = 0D;
if (StringUtils.isEmpty(totalCapacity)) {
totalCapacityD = production;
} else {
totalCapacityD = Double.parseDouble(totalCapacity) + production;
}
redisTemplate.opsForValue().set(key, String.valueOf(totalCapacityD));
return String.valueOf(totalCapacityD);
}
private String sendPost(HttpPost httpPost, String jsonData) {
CloseableHttpClient httpClient = HttpClients.createDefault();
StringEntity entity = new StringEntity(jsonData, ContentType.create("application/json", Consts.UTF_8));
httpPost.setEntity(entity);
String result = null;
try {
CloseableHttpResponse execute = httpClient.execute(httpPost);
HttpEntity res = execute.getEntity();
InputStream is = res.getContent();
int len;
byte[] buf = new byte[128];
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
while ((len = is.read(buf)) != -1) {
byteArrayOutputStream.write(buf, 0, len);
}
result = byteArrayOutputStream.toString();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}