Commit ef8d2812dd30f5a4cb02cb921f2c4df195f2d6e3

Authored by 杨鸣坤
1 parent eb3917a1

feat: 新增同池设备拉取与同步功能

  1 +package com.iot.scheduler.service.chizhou;
  2 +
  3 +
  4 +import com.alibaba.fastjson.JSON;
  5 +import com.alibaba.fastjson.TypeReference;
  6 +import com.iot.scheduler.model.DeviceToken;
  7 +import com.iot.scheduler.model.QxDeviceInfo;
  8 +import com.iot.scheduler.model.QxDeviceInfoDetail;
  9 +import lombok.extern.slf4j.Slf4j;
  10 +import org.apache.commons.lang3.StringUtils;
  11 +import org.apache.http.Consts;
  12 +import org.apache.http.HttpEntity;
  13 +import org.apache.http.client.methods.CloseableHttpResponse;
  14 +import org.apache.http.client.methods.HttpPost;
  15 +import org.apache.http.entity.ContentType;
  16 +import org.apache.http.entity.StringEntity;
  17 +import org.apache.http.impl.client.CloseableHttpClient;
  18 +import org.apache.http.impl.client.HttpClients;
  19 +import org.apache.http.message.BasicHeader;
  20 +import org.springframework.beans.factory.annotation.Value;
  21 +import org.springframework.stereotype.Service;
  22 +import org.springframework.util.CollectionUtils;
  23 +
  24 +import java.io.ByteArrayOutputStream;
  25 +import java.io.IOException;
  26 +import java.io.InputStream;
  27 +import java.util.*;
  28 +
  29 +/**
  30 + * 同池设备同步
  31 + */
  32 +@Slf4j
  33 +@Service
  34 +public class TongChiDevicePullService {
  35 +
  36 + @Value("${tc.iot.organizeId:}")
  37 + private String iotOrganizeId;
  38 + @Value("${tc.iot.profileId}")
  39 + private String iotProfileId;
  40 + @Value("${tc.iot.deviceProfileId}")
  41 + private String iotDeviceProfileId;
  42 + @Value("${tc.iot.userName:}")
  43 + private String iotUserName;
  44 + @Value("${tc.iot.password:}")
  45 + private String iotPassword;
  46 + @Value("${tc.iot.tokenUrl}")
  47 + private String iotTokenUrl;
  48 + @Value("${tc.iot.infoUrl}")
  49 + private String iotDeviceInfoUrl;
  50 + @Value("${tc.iot.detailUrl}")
  51 + private String iotDeviceDetailUrl;
  52 +
  53 + public void pullCreateDeviceInfo() {
  54 + List<String> deviceIdList = Arrays.asList(
  55 + "组合机2", "组合机3", "组合机5", "组合机7",
  56 + "fog邦定机4", "fog邦定机5", "fog邦定机7", "fog邦定机8", "fog邦定机9",
  57 + "混胶机3", "混胶机4", "混胶机6",
  58 + "印刷机6", "印刷机7", "印刷机9",
  59 + "acf邦定机3", "acf邦定机4", "acf邦定机6", "acf邦定机8",
  60 + "雕刻机盛雄3", "雕刻机盛雄4", "雕刻机盛雄6", "雕刻机盛雄7",
  61 + "吉事达雕刻机3", "吉事达雕刻机4", "吉事达雕刻机6",
  62 + "点刮胶机2", "点刮胶机3", "点刮胶机5",
  63 + "数控模切机5", "数控模切机6", "数控模切机8", "数控模切机9",
  64 + "贴合机8", "贴合机9", "贴合机11", "贴合机12", "贴合机14",
  65 + "ccd异形切割机4", "ccd异形切割机5", "ccd异形切割机7", "ccd异形切割机9",
  66 + "双卫邦定机3", "双卫邦定机5", "双卫邦定机6", "双卫邦定机8",
  67 + "sca贴合机3", "sca贴合机4", "sca贴合机6",
  68 + "激光切割机3", "激光切割机5", "激光切割机7", "激光切割机9",
  69 + "对位贴合机2", "对位贴合机4", "对位贴合机6", "对位贴合机8",
  70 + "覆膜机4", "覆膜机5", "覆膜机7", "覆膜机9",
  71 + "卷膜机3", "卷膜机4", "卷膜机6",
  72 + "脱泡机5", "脱泡机6", "脱泡机8", "脱泡机9",
  73 + "翻板贴合03", "翻板贴合05", "翻板贴合07", "翻板贴合09",
  74 + "烤箱13", "烤箱14", "烤箱16", "烤箱18", "烤箱20",
  75 + "点胶刮胶一体机3", "点胶刮胶一体机4", "点胶刮胶一体机6",
  76 + "冲压机2", "冲压机4", "冲压机6", "冲压机8",
  77 + "开料机3", "开料机5", "开料机7",
  78 + "背光阻力机3", "背光阻力机4", "背光阻力机6",
  79 + "贴膜机2", "贴膜机4", "贴膜机6", "贴膜机8",
  80 + "全自动贴合线4", "全自动贴合线5",
  81 + "粒子检测机2", "粒子检测机3",
  82 + "等离子清洗机2",
  83 + "老化烤箱5", "老化烤箱6", "老化烤箱8",
  84 + "光学检测机3", "光学检测机4",
  85 + "全自动线5", "全自动线6", "全自动线8",
  86 + "华科力达贴合机2",
  87 + "胶层烘烤3", "胶层烘烤4",
  88 + "二次元机2",
  89 + "除尘机2",
  90 + "标签机2",
  91 + "预压机2",
  92 + "翻板压合2",
  93 + "清洗机2",
  94 + "邦定机6", "邦定机7", "邦定机9",
  95 + "测试机04", "测试机05", "测试机07",
  96 + "UV机04", "UV机05",
  97 + "切割机06", "切割机07", "切割机09",
  98 + "卷膜机02-2",
  99 + "覆膜机10",
  100 + "烤箱21", "烤箱22",
  101 + "组合机11", "组合机13",
  102 + "fog邦定机12", "fog邦定机14", "fog邦定机15",
  103 + "混胶机7", "混胶机9",
  104 + "印刷机11", "印刷机13",
  105 + "acf邦定机9", "acf邦定机11",
  106 + "雕刻机盛雄9", "雕刻机盛雄12",
  107 + "吉事达雕刻机7", "吉事达雕刻机9",
  108 + "点刮胶机6", "点刮胶机8",
  109 + "数控模切机11", "数控模切机13",
  110 + "贴合机15", "贴合机17", "贴合机19",
  111 + "ccd异形切割机11", "ccd异形切割机13",
  112 + "双卫邦定机9", "双卫邦定机11",
  113 + "sca贴合机7", "sca贴合机9",
  114 + "激光切割机11", "激光切割机13",
  115 + "对位贴合机9", "对位贴合机11",
  116 + "覆膜机11", "覆膜机13",
  117 + "卷膜机7", "卷膜机9",
  118 + "脱泡机11", "脱泡机13",
  119 + "翻板贴合11", "翻板贴合13",
  120 + "烤箱24", "烤箱26", "烤箱28",
  121 + "点胶刮胶一体机7", "点胶刮胶一体机9",
  122 + "冲压机9", "冲压机11",
  123 + "开料机8", "开料机11",
  124 + "背光阻力机7", "背光阻力机9",
  125 + "贴膜机9", "贴膜机11",
  126 + "全自动贴合线6",
  127 + "粒子检测机5",
  128 + "老化烤箱9"
  129 + );
  130 +
  131 + List<QxDeviceInfo> qxDeviceInfos = new ArrayList<>();
  132 + List<QxDeviceInfoDetail> qxAddDeviceInfoDetails = new ArrayList<>();
  133 + Random random = new Random();
  134 + for (int index = 0; index < deviceIdList.size(); index++) {
  135 + QxDeviceInfo qxDeviceInfo = new QxDeviceInfo();
  136 + qxDeviceInfo.setDeviceType("DIRECT_CONNECTION");
  137 + qxDeviceInfo.setTransportType("DEFAULT");
  138 + qxDeviceInfo.setOrganizationId(iotOrganizeId);
  139 + qxDeviceInfo.setDeviceProfileId(iotDeviceProfileId);
  140 + qxDeviceInfo.setProfileId(iotProfileId);
  141 + qxDeviceInfo.setLabel("生产设备");
  142 + String deviceName = deviceIdList.get(index);
  143 + qxDeviceInfo.setName(deviceName);
  144 + qxDeviceInfo.setBrand(deviceName);
  145 + String dtuSn = "ATC26518123" + String.format("%03d", index);
  146 + qxDeviceInfo.setSn(dtuSn);
  147 + DeviceToken deviceToken = new DeviceToken();
  148 + deviceToken.setCredentialsType("ACCESS_TOKEN");
  149 + deviceToken.setCredentialsId(dtuSn);
  150 + deviceToken.setCredentialsValue(dtuSn);
  151 + qxDeviceInfo.setDeviceToken(deviceToken);
  152 + qxDeviceInfos.add(qxDeviceInfo);
  153 + //有序列号直接获取灯信息
  154 + QxDeviceInfoDetail qxDeviceInfoDetail = new QxDeviceInfoDetail();
  155 + qxDeviceInfoDetail.setAlarm(false);
  156 + //灯状态(0:灭灯,1:红,2:黄,3:绿,4:蓝)
  157 +// Integer lampState = isWithinRange ? 3 : 0;
  158 + double r = random.nextDouble();
  159 + if (r < 0.05) {
  160 + qxDeviceInfoDetail.setStatus("OFF"); // 5% 状态0
  161 + } else if (r < 0.10) {
  162 + qxDeviceInfoDetail.setStatus("STAND"); // 5% 状态2(跳过状态1)
  163 + } else {
  164 + qxDeviceInfoDetail.setStatus("RUN"); // 90% 状态3
  165 + }
  166 +// switch (lampState) {
  167 +// case 0:
  168 +// qxDeviceInfoDetail.setStatus("OFF");
  169 +// break;
  170 +//// case 1:
  171 +//// qxDeviceInfoDetail.setStatus("ERROR");
  172 +//// qxDeviceInfoDetail.setAlarm(true);
  173 +// break;
  174 +// case 2:
  175 +// qxDeviceInfoDetail.setStatus("STAND");
  176 +// break;
  177 +// case 3:
  178 +// qxDeviceInfoDetail.setStatus("RUN");
  179 +// break;
  180 +// default:
  181 +// continue;
  182 +// }
  183 +
  184 + qxDeviceInfoDetail.setStartTime(new Date());
  185 + qxDeviceInfoDetail.setDtuSn(dtuSn);
  186 + qxAddDeviceInfoDetails.add(qxDeviceInfoDetail);
  187 + }
  188 +
  189 + //将数据同步到IOT平台
  190 + Map<String, String> qxParam = new HashMap<>(2);
  191 + qxParam.put("username", iotUserName);
  192 + qxParam.put("password", iotPassword);
  193 +
  194 + HttpPost qxHttpPost = new HttpPost(iotTokenUrl);
  195 + String qxResult = sendPost(qxHttpPost, JSON.toJSONString(qxParam));
  196 + if (StringUtils.isBlank(qxResult)) {
  197 + return;
  198 + }
  199 + Map<String, Object> qxRes = JSON.parseObject(qxResult, new TypeReference<Map<String, Object>>() {
  200 + });
  201 +
  202 + String qxAccessToken = (String) qxRes.get("token");
  203 + if (StringUtils.isBlank(qxAccessToken)) {
  204 + return;
  205 + }
  206 +
  207 + BasicHeader qxAuthorization = new BasicHeader("X-Authorization", "Bearer " + qxAccessToken);
  208 + if (!CollectionUtils.isEmpty(qxDeviceInfos)) {
  209 + HttpPost qxDeviceInfoPost = new HttpPost(iotDeviceInfoUrl);
  210 + qxDeviceInfoPost.addHeader(qxAuthorization);
  211 + for (QxDeviceInfo qxDeviceInfo : qxDeviceInfos) {
  212 + // todo
  213 + String syncDeviceInfo = sendPost(qxDeviceInfoPost, JSON.toJSONString(qxDeviceInfo));
  214 + //log.info("同步设备信息 syncDeviceInfo:{}", syncDeviceInfo);
  215 + }
  216 + }
  217 +
  218 + if (!CollectionUtils.isEmpty(qxAddDeviceInfoDetails)) {
  219 + for (QxDeviceInfoDetail qxDeviceInfoDetail : qxAddDeviceInfoDetails) {
  220 + String qxDeviceInfoDetailUrlStr = iotDeviceDetailUrl + qxDeviceInfoDetail.getDtuSn() + "/telemetry";
  221 + HttpPost qxDeviceInfoDetailPost = new HttpPost(qxDeviceInfoDetailUrlStr);
  222 + qxDeviceInfoDetailPost.addHeader(qxAuthorization);
  223 + String syncDeviceInfoDetail = sendPost(qxDeviceInfoDetailPost, JSON.toJSONString(qxDeviceInfoDetail));
  224 + }
  225 + }
  226 + }
  227 +
  228 + private String sendPost(HttpPost httpPost, String jsonData) {
  229 + CloseableHttpClient httpClient = HttpClients.createDefault();
  230 + StringEntity entity = new StringEntity(jsonData, ContentType.create("application/json", Consts.UTF_8));
  231 + httpPost.setEntity(entity);
  232 + String result = null;
  233 + try {
  234 + CloseableHttpResponse execute = httpClient.execute(httpPost);
  235 + HttpEntity res = execute.getEntity();
  236 + InputStream is = res.getContent();
  237 + int len;
  238 + byte[] buf = new byte[128];
  239 + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  240 + while ((len = is.read(buf)) != -1) {
  241 + byteArrayOutputStream.write(buf, 0, len);
  242 + }
  243 + result = byteArrayOutputStream.toString();
  244 + } catch (IOException e) {
  245 + e.printStackTrace();
  246 + }
  247 + return result;
  248 + }
  249 +}
... ...
1 1 package com.iot.scheduler.zone;
2 2
3 3 import com.iot.scheduler.service.chizhou.CzDeviceReportService;
  4 +import com.iot.scheduler.service.chizhou.TongChiDevicePullService;
4 5 import com.iot.scheduler.task.AbstractZoneScheduler;
5 6 import jakarta.annotation.Resource;
6 7 import lombok.extern.slf4j.Slf4j;
... ... @@ -16,12 +17,31 @@ public class ChiZoneScheduler extends AbstractZoneScheduler {
16 17
17 18 @Resource
18 19 private CzDeviceReportService czDeviceReportService;
  20 + @Resource
  21 + private TongChiDevicePullService tongChiDevicePullService;
19 22
20 23 @Override
21 24 protected String getZoneName() {
22 25 return "Chizhou (池州经开区)";
23 26 }
24 27
  28 + @Scheduled(cron = "${scheduler.chizhou.pull:0 0/10 * * * ?}")
  29 + public void pullDevicesFromThirdParty() {
  30 + String taskName = "Pull Devices (3rd Party -> IoT)";
  31 + logStart(taskName);
  32 + try {
  33 + // TODO: Implement actual logic
  34 + log.info("[{}] Simulating pulling devices...", getZoneName());
  35 + tongChiDevicePullService.pullCreateDeviceInfo();
  36 + Thread.sleep(1000);
  37 + } catch (Exception e) {
  38 + logError(taskName, e);
  39 + } finally {
  40 + logEnd(taskName);
  41 + }
  42 + }
  43 +
  44 +
25 45 @Scheduled(cron = "${scheduler.chizhou.push:0 0/10 * * * ?}")
26 46 public void pushJmDevicesToThirdParty() {
27 47 String taskName = "PJ Devices (IoT -> 3rd Party)";
... ...
... ... @@ -335,6 +335,17 @@ device:
335 335 detail:
336 336 url: "https://iotgc.cniot.vip/triColorLamp/dtuSnState"
337 337
  338 +tc:
  339 + iot:
  340 + organizeId: "eef879b9-45cd-41ec-a069-47ae6c511ca5"
  341 + profileId: "39b1d900-5264-11f1-9cb8-e3376d1e7978"
  342 + deviceProfileId: "39b1d900-5264-11f1-9cb8-e3376d1e7978"
  343 + userName: "tckj"
  344 + password: "Tckj@123.com"
  345 + tokenUrl: "https://iot.hzzlyun.com/api/auth/login"
  346 + infoUrl: "https://iot.hzzlyun.com/api/yt/device"
  347 + detailUrl: "https://iot.hzzlyun.com/api/v1/"
  348 +
338 349 xp:
339 350 third:
340 351 domain: "http://220.180.204.38:1803/report-property"
... ...