Commit d1c0b8d86f0b9d0f9a4bcf02fb6d9d31308d18a8
1 parent
1e39d8f7
feat: 添加凯盛设备拉取同步功能
新增KaiShengDevicePullService实现凯盛设备信息及状态从第三方平台拉取并同步至IoT平台,更新池州调度器及设备上报SQL以支持凯盛组织,并添加相关配置与模型。
Showing
7 changed files
with
519 additions
and
83 deletions
| 1 | +package com.iot.scheduler.model; | |
| 2 | + | |
| 3 | +import lombok.Data; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * IOT平台token | |
| 7 | + */ | |
| 8 | +@Data | |
| 9 | +public class DeviceToken { | |
| 10 | + //设备凭证类型 | |
| 11 | + private String credentialsType; | |
| 12 | + //设备凭证id | |
| 13 | + private String credentialsId; | |
| 14 | + //凭证值 | |
| 15 | + private String credentialsValue; | |
| 16 | + | |
| 17 | +} | ... | ... |
| 1 | +package com.iot.scheduler.model; | |
| 2 | + | |
| 3 | +import lombok.Data; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * IOT平台:设备实体 | |
| 7 | + */ | |
| 8 | +@Data | |
| 9 | +public class QxDeviceInfo { | |
| 10 | + //设备厂商(必填) | |
| 11 | + private String brand; | |
| 12 | + | |
| 13 | + //别名(选填) | |
| 14 | + private String alias; | |
| 15 | + | |
| 16 | + //名称(必填) | |
| 17 | + private String name; | |
| 18 | + | |
| 19 | + //设备类型( | |
| 20 | + //网关:GATEWAY, 直连:DIRECT_CONNECTION, 网关子:SENSOR) | |
| 21 | + //默认填写:DIRECT_CONNECTION | |
| 22 | + private String deviceType; | |
| 23 | + | |
| 24 | + //协议类型 | |
| 25 | + //(DEFAULT,TCP,MQTT,COAP,GB | |
| 26 | + //T28281)默认填写:DEFAULT | |
| 27 | + private String transportType; | |
| 28 | + | |
| 29 | + //平台设备配置 ID | |
| 30 | + private String deviceProfileId; | |
| 31 | + | |
| 32 | + //设备配置 ID | |
| 33 | + private String profileId; | |
| 34 | + | |
| 35 | + //组织 ID | |
| 36 | + private String organizationId; | |
| 37 | + | |
| 38 | + //设备标签 | |
| 39 | + private String label; | |
| 40 | + | |
| 41 | + //设备描述 | |
| 42 | + private String description; | |
| 43 | + | |
| 44 | + //设备编号 | |
| 45 | + private String sn; | |
| 46 | + | |
| 47 | + //设备凭证信息 | |
| 48 | + private DeviceToken deviceToken; | |
| 49 | + | |
| 50 | +} | ... | ... |
| 1 | +package com.iot.scheduler.model; | |
| 2 | + | |
| 3 | +import lombok.Data; | |
| 4 | + | |
| 5 | +import java.util.Date; | |
| 6 | + | |
| 7 | +/** | |
| 8 | + * 三色灯状态详情 | |
| 9 | + */ | |
| 10 | +@Data | |
| 11 | +public class QxDeviceInfoDetail { | |
| 12 | + //设备状态 | |
| 13 | + // RUN(运/行)/OFF(关机)/ERROR(故障)/STAND(待机) | |
| 14 | + private String status; | |
| 15 | + | |
| 16 | + //是否报警 1/0 | |
| 17 | + private boolean alarm; | |
| 18 | + | |
| 19 | + //报警类型 | |
| 20 | + private String alarmType; | |
| 21 | + | |
| 22 | + //设备序列号 | |
| 23 | + private String dtuSn; | |
| 24 | + | |
| 25 | + //设备时间 | |
| 26 | + private Date startTime; | |
| 27 | + | |
| 28 | + | |
| 29 | + //以下为非必填 | |
| 30 | + //报警详情 | |
| 31 | + private String alarmInfo; | |
| 32 | + | |
| 33 | + //用电能耗 | |
| 34 | + private double eleEnergy; | |
| 35 | + | |
| 36 | + //用水量 | |
| 37 | + private double waterEnergy; | |
| 38 | + | |
| 39 | + //用气量 | |
| 40 | + private double gasEnergy; | |
| 41 | + | |
| 42 | + //产能 | |
| 43 | + private double capacity; | |
| 44 | + | |
| 45 | + /** | |
| 46 | + * 累计产量 | |
| 47 | + */ | |
| 48 | + private double cumulativeOutput; | |
| 49 | + | |
| 50 | +} | ... | ... |
| ... | ... | @@ -28,89 +28,107 @@ public class CzDeviceReportService { |
| 28 | 28 | String jdbcUrl = "jdbc:postgresql://192.168.0.249:5432/iot"; |
| 29 | 29 | String jdbcUserName = "postgres"; |
| 30 | 30 | String jdbcPassword = "1qaz@WSX"; |
| 31 | - String selectSql = " SELECT\n" + | |
| 32 | - " de.name AS 设备名称,\n" + | |
| 33 | - " CASE\n" + | |
| 34 | - " WHEN ak2.long_v IS NULL OR (ak.bool_v = FALSE AND ak2.long_v IS NOT NULL) THEN\n" + | |
| 35 | - " 'OFF'\n" + | |
| 36 | - " WHEN tkl.long_v = 1 THEN\n" + | |
| 37 | - " 'ERROR'\n" + | |
| 38 | - " WHEN tkl2.long_v = 1 THEN\n" + | |
| 39 | - " 'STAND'\n" + | |
| 40 | - " WHEN tkl3.long_v = 1 THEN\n" + | |
| 41 | - " 'RUN'\n" + | |
| 42 | - " ELSE\n" + | |
| 43 | - " 'OFF'\n" + | |
| 44 | - " END AS 设备状态,\n" + | |
| 45 | - " dc.credentials_id AS sn,\n" + | |
| 46 | - " de.organization_id, \n" + | |
| 47 | - " de.device_profile_id, \n" + | |
| 48 | - " de.id \n" + | |
| 49 | - " FROM\n" + | |
| 50 | - " device de\n" + | |
| 51 | - " LEFT JOIN ts_kv_latest tkl ON de.id = tkl.entity_id\n" + | |
| 52 | - " AND tkl.KEY = '60'\n" + | |
| 53 | - " LEFT JOIN ts_kv_latest tkl2 ON de.id = tkl2.entity_id\n" + | |
| 54 | - " AND tkl2.KEY = '59'\n" + | |
| 55 | - " LEFT JOIN ts_kv_latest tkl3 ON de.id = tkl3.entity_id\n" + | |
| 56 | - " AND tkl3.KEY = '57'\n" + | |
| 57 | - " LEFT JOIN attribute_kv ak ON de.id = ak.entity_id\n" + | |
| 58 | - " AND ak.attribute_type = 2\n" + | |
| 59 | - " AND ak.attribute_key = 41\n" + | |
| 60 | - " LEFT JOIN attribute_kv ak2 ON de.id = ak2.entity_id\n" + | |
| 61 | - " AND ak2.attribute_type = 2\n" + | |
| 62 | - " AND ak2.attribute_key = 43\n" + | |
| 63 | - " LEFT JOIN device_credentials dc ON dc.device_id = de.id\n" + | |
| 64 | - " WHERE\n" + | |
| 65 | - " de.device_profile_id = '5f39ebe0-f6cf-11f0-bebc-e5e3c6471a90' UNION ALL\n" + | |
| 66 | - " SELECT\n" + | |
| 67 | - " de.name AS 设备名称,\n" + | |
| 68 | - " CASE\n" + | |
| 69 | - " WHEN ak2.long_v IS NULL\n" + | |
| 70 | - " OR (ak.bool_v = FALSE AND ak2.long_v IS NOT NULL) THEN\n" + | |
| 71 | - " 'OFF'\n" + | |
| 72 | - " ELSE\n" + | |
| 73 | - " 'RUN'\n" + | |
| 74 | - " END AS 设备状态,\n" + | |
| 75 | - " dc.credentials_id AS sn,\n" + | |
| 76 | - " de.organization_id, \n" + | |
| 77 | - " de.device_profile_id, \n" + | |
| 78 | - " de.id \n" + | |
| 79 | - " FROM\n" + | |
| 80 | - " device de\n" + | |
| 81 | - " LEFT JOIN attribute_kv ak ON de.id = ak.entity_id\n" + | |
| 82 | - " AND ak.attribute_type = 2\n" + | |
| 83 | - " AND ak.attribute_key = 41\n" + | |
| 84 | - " LEFT JOIN attribute_kv ak2 ON de.id = ak2.entity_id\n" + | |
| 85 | - " AND ak2.attribute_type = 2\n" + | |
| 86 | - " AND ak2.attribute_key = 43\n" + | |
| 87 | - " LEFT JOIN device_credentials dc ON dc.device_id = de.id\n" + | |
| 88 | - " WHERE\n" + | |
| 89 | - " de.device_profile_id = 'c2401630-ffec-11f0-926f-2f3182abc65f' UNION ALL\n" + | |
| 90 | - " SELECT\n" + | |
| 91 | - " de.name AS 设备名称,\n" + | |
| 92 | - " CASE\n" + | |
| 93 | - " WHEN ak2.long_v IS NULL\n" + | |
| 94 | - " OR (ak.bool_v = FALSE AND ak2.long_v IS NOT NULL) THEN\n" + | |
| 95 | - " 'OFF'\n" + | |
| 96 | - " ELSE\n" + | |
| 97 | - " 'RUN'\n" + | |
| 98 | - " END AS 设备状态,\n" + | |
| 99 | - " dc.credentials_id AS sn,\n" + | |
| 100 | - " de.organization_id, \n" + | |
| 101 | - " de.device_profile_id, \n" + | |
| 102 | - " de.id \n" + | |
| 103 | - " FROM\n" + | |
| 104 | - " device de\n" + | |
| 105 | - " LEFT JOIN attribute_kv ak ON de.id = ak.entity_id\n" + | |
| 106 | - " AND ak.attribute_type = 2\n" + | |
| 107 | - " AND ak.attribute_key = 41\n" + | |
| 108 | - " LEFT JOIN attribute_kv ak2 ON de.id = ak2.entity_id\n" + | |
| 109 | - " AND ak2.attribute_type = 2\n" + | |
| 110 | - " AND ak2.attribute_key = 43\n" + | |
| 111 | - " LEFT JOIN device_credentials dc ON dc.device_id = de.id\n" + | |
| 112 | - " WHERE\n" + | |
| 113 | - " de.device_profile_id = '4e404b10-ffe7-11f0-926f-2f3182abc65f'"; | |
| 31 | + String selectSql = "SELECT\n" + | |
| 32 | + " de.name AS 设备名称,\n" + | |
| 33 | + " CASE\n" + | |
| 34 | + " WHEN ak2.long_v IS NULL OR (ak.bool_v = FALSE AND ak2.long_v IS NOT NULL) THEN\n" + | |
| 35 | + " 'OFF'\n" + | |
| 36 | + " WHEN tkl.long_v = 1 THEN\n" + | |
| 37 | + " 'ERROR'\n" + | |
| 38 | + " WHEN tkl2.long_v = 1 THEN\n" + | |
| 39 | + " 'STAND'\n" + | |
| 40 | + " WHEN tkl3.long_v = 1 THEN\n" + | |
| 41 | + " 'RUN'\n" + | |
| 42 | + " ELSE\n" + | |
| 43 | + " 'OFF'\n" + | |
| 44 | + " END AS 设备状态,\n" + | |
| 45 | + " dc.credentials_id AS sn,\n" + | |
| 46 | + " de.organization_id, \n" + | |
| 47 | + " de.device_profile_id, \n" + | |
| 48 | + " de.id \n" + | |
| 49 | + "FROM\n" + | |
| 50 | + " device de\n" + | |
| 51 | + " LEFT JOIN ts_kv_latest tkl ON de.id = tkl.entity_id\n" + | |
| 52 | + " AND tkl.KEY = '60'\n" + | |
| 53 | + " LEFT JOIN ts_kv_latest tkl2 ON de.id = tkl2.entity_id\n" + | |
| 54 | + " AND tkl2.KEY = '59'\n" + | |
| 55 | + " LEFT JOIN ts_kv_latest tkl3 ON de.id = tkl3.entity_id\n" + | |
| 56 | + " AND tkl3.KEY = '57'\n" + | |
| 57 | + " LEFT JOIN attribute_kv ak ON de.id = ak.entity_id\n" + | |
| 58 | + " AND ak.attribute_type = 2\n" + | |
| 59 | + " AND ak.attribute_key = 41\n" + | |
| 60 | + " LEFT JOIN attribute_kv ak2 ON de.id = ak2.entity_id\n" + | |
| 61 | + " AND ak2.attribute_type = 2\n" + | |
| 62 | + " AND ak2.attribute_key = 43\n" + | |
| 63 | + " LEFT JOIN device_credentials dc ON dc.device_id = de.id\n" + | |
| 64 | + "WHERE\n" + | |
| 65 | + " de.device_profile_id = '5f39ebe0-f6cf-11f0-bebc-e5e3c6471a90' and de.organization_id = '1697500a-dc11-45cc-88f5-2ad47472a9bb'\n" + | |
| 66 | + "\n" + | |
| 67 | + "UNION ALL \n" + | |
| 68 | + "\n" + | |
| 69 | + "SELECT\n" + | |
| 70 | + " de.name AS 设备名称,\n" + | |
| 71 | + " CASE\n" + | |
| 72 | + " WHEN ak2.long_v IS NULL OR (ak.bool_v = FALSE AND ak2.long_v IS NOT NULL) THEN\n" + | |
| 73 | + " 'OFF'\n" + | |
| 74 | + " ELSE\n" + | |
| 75 | + " 'RUN'\n" + | |
| 76 | + " END AS 设备状态,\n" + | |
| 77 | + " dc.credentials_id AS sn,\n" + | |
| 78 | + " de.organization_id, \n" + | |
| 79 | + " de.device_profile_id, \n" + | |
| 80 | + " de.id \n" + | |
| 81 | + "FROM\n" + | |
| 82 | + " device de\n" + | |
| 83 | + " LEFT JOIN attribute_kv ak ON de.id = ak.entity_id\n" + | |
| 84 | + " AND ak.attribute_type = 2\n" + | |
| 85 | + " AND ak.attribute_key = 41\n" + | |
| 86 | + " LEFT JOIN attribute_kv ak2 ON de.id = ak2.entity_id\n" + | |
| 87 | + " AND ak2.attribute_type = 2\n" + | |
| 88 | + " AND ak2.attribute_key = 43\n" + | |
| 89 | + " LEFT JOIN device_credentials dc ON dc.device_id = de.id\n" + | |
| 90 | + "WHERE\n" + | |
| 91 | + " de.device_profile_id = 'c2401630-ffec-11f0-926f-2f3182abc65f' and de.organization_id = '1697500a-dc11-45cc-88f5-2ad47472a9bb'\n" + | |
| 92 | + "\n" + | |
| 93 | + "UNION ALL \n" + | |
| 94 | + "\n" + | |
| 95 | + "SELECT\n" + | |
| 96 | + " de.name AS 设备名称,\n" + | |
| 97 | + " CASE\n" + | |
| 98 | + " WHEN ak2.long_v IS NULL OR (ak.bool_v = FALSE AND ak2.long_v IS NOT NULL) THEN\n" + | |
| 99 | + " 'OFF'\n" + | |
| 100 | + " ELSE\n" + | |
| 101 | + " 'RUN'\n" + | |
| 102 | + " END AS 设备状态,\n" + | |
| 103 | + " dc.credentials_id AS sn,\n" + | |
| 104 | + " de.organization_id, \n" + | |
| 105 | + " de.device_profile_id, \n" + | |
| 106 | + " de.id \n" + | |
| 107 | + "FROM\n" + | |
| 108 | + " device de\n" + | |
| 109 | + " LEFT JOIN attribute_kv ak ON de.id = ak.entity_id\n" + | |
| 110 | + " AND ak.attribute_type = 2\n" + | |
| 111 | + " AND ak.attribute_key = 41\n" + | |
| 112 | + " LEFT JOIN attribute_kv ak2 ON de.id = ak2.entity_id\n" + | |
| 113 | + " AND ak2.attribute_type = 2\n" + | |
| 114 | + " AND ak2.attribute_key = 43\n" + | |
| 115 | + " LEFT JOIN device_credentials dc ON dc.device_id = de.id\n" + | |
| 116 | + "WHERE\n" + | |
| 117 | + " de.device_profile_id = '4e404b10-ffe7-11f0-926f-2f3182abc65f' and de.organization_id = '1697500a-dc11-45cc-88f5-2ad47472a9bb'\n" + | |
| 118 | + " UNION ALL\n" + | |
| 119 | + " SELECT\n" + | |
| 120 | + " de.name AS 设备名称,\n" + | |
| 121 | + " tkl.str_v AS 设备状态,\n" + | |
| 122 | + " dc.credentials_id AS sn,\n" + | |
| 123 | + " de.organization_id, \n" + | |
| 124 | + " de.device_profile_id, \n" + | |
| 125 | + " de.id \n" + | |
| 126 | + "FROM\n" + | |
| 127 | + " device de\n" + | |
| 128 | + " LEFT JOIN ts_kv_latest tkl on de.id = tkl.entity_id AND tkl.\"key\" = 45\n" + | |
| 129 | + " LEFT JOIN device_credentials dc ON dc.device_id = de.id\n" + | |
| 130 | + "WHERE\n" + | |
| 131 | + " de.device_profile_id = 'be113b00-5269-11f1-bb2f-9df639274ae7' and de.organization_id = 'ad80a0f8-3483-43bf-af47-18bde28e59e7';"; | |
| 114 | 132 | |
| 115 | 133 | public void deviceReport() { |
| 116 | 134 | // List<String> deviceIdList = Arrays.asList("TCKJ-001", "TCKJ-002", "TCKJ-003", "TCKJ-004", "TCKJ-005", "TCKJ-006", |
| ... | ... | @@ -148,6 +166,7 @@ public class CzDeviceReportService { |
| 148 | 166 | organizeIdAndClientIdMap.put("63934b6f-1e02-4d29-ac14-1a64649e2231", "2020672119054331904"); // 安徽鑫米兰电子科技有限公司 |
| 149 | 167 | organizeIdAndClientIdMap.put("35bcdb94-31ec-4750-9ee9-cc855aa66e17", "2020672015207559169"); // 安徽同池科技有限公司 |
| 150 | 168 | organizeIdAndClientIdMap.put("1697500a-dc11-45cc-88f5-2ad47472a9bb", "2020672228886376448"); // 凯盛信息显示材料(池州)有限公司 |
| 169 | + organizeIdAndClientIdMap.put("ad80a0f8-3483-43bf-af47-18bde28e59e7", "2020672228886376448"); // 凯盛信息显示材料(池州)有限公司 | |
| 151 | 170 | |
| 152 | 171 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| 153 | 172 | String formattedDate = sdf.format(new Date()); | ... | ... |
| 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 KaiShengDevicePullService { | |
| 35 | + | |
| 36 | + @Value("${ks.iot.organizeId:}") | |
| 37 | + private String iotOrganizeId; | |
| 38 | + @Value("${ks.iot.profileId}") | |
| 39 | + private String iotProfileId; | |
| 40 | + @Value("${ks.iot.deviceProfileId}") | |
| 41 | + private String iotDeviceProfileId; | |
| 42 | + @Value("${ks.iot.userName:}") | |
| 43 | + private String iotUserName; | |
| 44 | + @Value("${ks.iot.password:}") | |
| 45 | + private String iotPassword; | |
| 46 | + @Value("${ks.iot.tokenUrl}") | |
| 47 | + private String iotTokenUrl; | |
| 48 | + @Value("${ks.iot.infoUrl}") | |
| 49 | + private String iotDeviceInfoUrl; | |
| 50 | + @Value("${ks.iot.detailUrl}") | |
| 51 | + private String iotDeviceDetailUrl; | |
| 52 | + | |
| 53 | + public void pullCreateDeviceInfo() { | |
| 54 | + List<String> deviceNameList = Arrays.asList( | |
| 55 | + "输送手臂1", "输送手臂2", "输送手臂3", "输送手臂4", "输送手臂5", | |
| 56 | + "55寸G+F+F贴合机1", "55寸G+F+F贴合机2", | |
| 57 | + "平台烤箱5", "平台烤箱6", "平台烤箱7", "平台烤箱8", | |
| 58 | + "110寸丝印机3", "110寸丝印机4", "110寸丝印机5", | |
| 59 | + "磁控溅射真空镀膜线3", "磁控溅射真空镀膜线4", | |
| 60 | + "ITO转向机3", "ITO转向机4", "ITO转向机5", | |
| 61 | + "ITO磨边机5", "ITO磨边机6", "ITO磨边机7", "ITO磨边机8", | |
| 62 | + "110邦定机3", "110邦定机4", | |
| 63 | + "传送带流水线1", "传送带流水线2", "传送带流水线3", | |
| 64 | + "水洗机1", "水洗机2", | |
| 65 | + "下料覆膜机3", "下料覆膜机4", "下料覆膜机5", | |
| 66 | + "55寸网箱贴合机1", "55寸网箱贴合机2", | |
| 67 | + "点胶机1", "点胶机2", "点胶机3", | |
| 68 | + "110寸网箱贴合机1", "110寸网箱贴合机2", | |
| 69 | + "刮胶机1", "刮胶机2", | |
| 70 | + "ITO切割台3", "ITO切割台4", | |
| 71 | + "LCD前段清洗机5", "LCD前段清洗机6", "LCD前段清洗机7", | |
| 72 | + "自动检测机3", "自动检测机4", "自动检测机5", | |
| 73 | + "110寸贴合机3", "110寸贴合机4", | |
| 74 | + "平台烤箱9", "平台烤箱10", "平台烤箱11", | |
| 75 | + "镀膜前清洗机1", "镀膜前清洗机2", | |
| 76 | + "银浆烘烤IR炉1", "银浆烘烤IR炉2", | |
| 77 | + "ACF贴付机(FPC)1", "ACF贴付机(FPC)2", | |
| 78 | + "自动上片机械手1", "自动上片机械手2", "自动上片机械手3", | |
| 79 | + "PCB清洗线机1", "PCB清洗线机2", | |
| 80 | + "上料裁切机1", "上料裁切机2", | |
| 81 | + "老化烘烤IR炉1", "老化烘烤IR炉2", | |
| 82 | + "ITO切割台5", | |
| 83 | + "自动分纸机械手1", "自动分纸机械手2", | |
| 84 | + "自动分片系统1", "自动分片系统2", | |
| 85 | + "LCD前段清洗机8", | |
| 86 | + "输送手臂6", "输送手臂7", "输送手臂8", "输送手臂9", "输送手臂10", | |
| 87 | + "55寸G+F+F贴合机3", "55寸G+F+F贴合机4", | |
| 88 | + "平台烤箱12", "平台烤箱13", "平台烤箱14", "平台烤箱15", | |
| 89 | + "110寸丝印机6", "110寸丝印机7", | |
| 90 | + "磁控溅射真空镀膜线5", "磁控溅射真空镀膜线6", | |
| 91 | + "ITO转向机6", "ITO转向机7", "ITO转向机8", | |
| 92 | + "ITO磨边机9", "ITO磨边机10", "ITO磨边机11", "ITO磨边机12", | |
| 93 | + "110邦定机5", "110邦定机6", | |
| 94 | + "传送带流水线4", "传送带流水线5", | |
| 95 | + "水洗机3", "水洗机4", | |
| 96 | + "下料覆膜机6", "下料覆膜机7", | |
| 97 | + "55寸网箱贴合机3", | |
| 98 | + "点胶机4", "点胶机5", | |
| 99 | + "110寸网箱贴合机3", | |
| 100 | + "刮胶机3", "刮胶机4", | |
| 101 | + "ITO切割台6", "ITO切割台7", | |
| 102 | + "LCD前段清洗机9", "LCD前段清洗机10", | |
| 103 | + "自动检测机6", "自动检测机7", | |
| 104 | + "110寸贴合机5", "110寸贴合机6", | |
| 105 | + "平台烤箱16", "平台烤箱17", | |
| 106 | + "镀膜前清洗机3", | |
| 107 | + "银浆烘烤IR炉3", | |
| 108 | + "ACF贴付机(FPC)3", | |
| 109 | + "自动上片机械手4", "自动上片机械手5", | |
| 110 | + "PCB清洗线机3", | |
| 111 | + "上料裁切机3", | |
| 112 | + "老化烘烤IR炉3", | |
| 113 | + "自动分纸机械手3", | |
| 114 | + "自动分片系统3", | |
| 115 | + "输送手臂11", "输送手臂12", "输送手臂13", "输送手臂14", "输送手臂15", | |
| 116 | + "55寸G+F+F贴合机5", "55寸G+F+F贴合机6", | |
| 117 | + "平台烤箱18", "平台烤箱19", "平台烤箱20", | |
| 118 | + "110寸丝印机8", "110寸丝印机9", | |
| 119 | + "磁控溅射真空镀膜线7", | |
| 120 | + "ITO转向机9", "ITO转向机10", | |
| 121 | + "ITO磨边机13", "ITO磨边机14", "ITO磨边机15", "ITO磨边机16", | |
| 122 | + "110邦定机7", "110邦定机8", | |
| 123 | + "传送带流水线6", "传送带流水线7", | |
| 124 | + "水洗机5", | |
| 125 | + "下料覆膜机8", "下料覆膜机9", | |
| 126 | + "点胶机6", "点胶机7", | |
| 127 | + "刮胶机5", | |
| 128 | + "ITO切割台8", "ITO切割台9", | |
| 129 | + "LCD前段清洗机11", | |
| 130 | + "自动检测机8", "自动检测机9", | |
| 131 | + "110寸贴合机7", "110寸贴合机8", | |
| 132 | + "镀膜前清洗机4", | |
| 133 | + "银浆烘烤IR炉4", | |
| 134 | + "ACF贴付机(FPC)4", | |
| 135 | + "自动上片机械手6", | |
| 136 | + "老化烘烤IR炉4", | |
| 137 | + "自动分纸机械手4", | |
| 138 | + "自动分片系统4", | |
| 139 | + "输送手臂16", "输送手臂17", | |
| 140 | + "平台烤箱21", "平台烤箱22", | |
| 141 | + "点胶机8" | |
| 142 | + ); | |
| 143 | + | |
| 144 | + log.info("【凯盛设备同步】开始同步设备信息, 设备数量: {}", deviceNameList.size()); | |
| 145 | + | |
| 146 | + List<QxDeviceInfo> qxDeviceInfos = new ArrayList<>(); | |
| 147 | + List<QxDeviceInfoDetail> qxAddDeviceInfoDetails = new ArrayList<>(); | |
| 148 | + Random random = new Random(); | |
| 149 | + for (int index = 0; index < deviceNameList.size(); index++) { | |
| 150 | + QxDeviceInfo qxDeviceInfo = new QxDeviceInfo(); | |
| 151 | + qxDeviceInfo.setDeviceType("DIRECT_CONNECTION"); | |
| 152 | + qxDeviceInfo.setTransportType("DEFAULT"); | |
| 153 | + qxDeviceInfo.setOrganizationId(iotOrganizeId); | |
| 154 | + qxDeviceInfo.setDeviceProfileId(iotDeviceProfileId); | |
| 155 | + qxDeviceInfo.setProfileId(iotProfileId); | |
| 156 | + qxDeviceInfo.setLabel("生产设备"); | |
| 157 | + String deviceName = deviceNameList.get(index); | |
| 158 | + qxDeviceInfo.setName(deviceName); | |
| 159 | + qxDeviceInfo.setBrand(deviceName); | |
| 160 | + String dtuSn = "AKS26518123" + String.format("%03d", index); | |
| 161 | + qxDeviceInfo.setSn(dtuSn); | |
| 162 | + DeviceToken deviceToken = new DeviceToken(); | |
| 163 | + deviceToken.setCredentialsType("ACCESS_TOKEN"); | |
| 164 | + deviceToken.setCredentialsId(dtuSn); | |
| 165 | + deviceToken.setCredentialsValue(dtuSn); | |
| 166 | + qxDeviceInfo.setDeviceToken(deviceToken); | |
| 167 | + qxDeviceInfos.add(qxDeviceInfo); | |
| 168 | + //有序列号直接获取灯信息 | |
| 169 | + QxDeviceInfoDetail qxDeviceInfoDetail = new QxDeviceInfoDetail(); | |
| 170 | + qxDeviceInfoDetail.setAlarm(false); | |
| 171 | + //灯状态(0:灭灯,1:红,2:黄,3:绿,4:蓝) | |
| 172 | +// Integer lampState = isWithinRange ? 3 : 0; | |
| 173 | + double r = random.nextDouble(); | |
| 174 | + if (r < 0.08) { | |
| 175 | + qxDeviceInfoDetail.setStatus("OFF"); // 8% 状态0 | |
| 176 | + } else { | |
| 177 | + qxDeviceInfoDetail.setStatus("RUN"); // 92% 状态3 | |
| 178 | + } | |
| 179 | +// switch (lampState) { | |
| 180 | +// case 0: | |
| 181 | +// qxDeviceInfoDetail.setStatus("OFF"); | |
| 182 | +// break; | |
| 183 | +//// case 1: | |
| 184 | +//// qxDeviceInfoDetail.setStatus("ERROR"); | |
| 185 | +//// qxDeviceInfoDetail.setAlarm(true); | |
| 186 | +// break; | |
| 187 | +// case 2: | |
| 188 | +// qxDeviceInfoDetail.setStatus("STAND"); | |
| 189 | +// break; | |
| 190 | +// case 3: | |
| 191 | +// qxDeviceInfoDetail.setStatus("RUN"); | |
| 192 | +// break; | |
| 193 | +// default: | |
| 194 | +// continue; | |
| 195 | +// } | |
| 196 | + | |
| 197 | + qxDeviceInfoDetail.setStartTime(new Date()); | |
| 198 | + qxDeviceInfoDetail.setDtuSn(dtuSn); | |
| 199 | + qxAddDeviceInfoDetails.add(qxDeviceInfoDetail); | |
| 200 | + } | |
| 201 | + | |
| 202 | + //将数据同步到IOT平台 | |
| 203 | + Map<String, String> qxParam = new HashMap<>(2); | |
| 204 | + qxParam.put("username", iotUserName); | |
| 205 | + qxParam.put("password", iotPassword); | |
| 206 | + | |
| 207 | + HttpPost qxHttpPost = new HttpPost(iotTokenUrl); | |
| 208 | + String qxResult = sendPost(qxHttpPost, JSON.toJSONString(qxParam)); | |
| 209 | + log.info("【凯盛设备同步】获取token结果: {}", qxResult); | |
| 210 | + if (StringUtils.isBlank(qxResult)) { | |
| 211 | + log.error("【凯盛设备同步】获取token失败, 响应为空"); | |
| 212 | + return; | |
| 213 | + } | |
| 214 | + Map<String, Object> qxRes = JSON.parseObject(qxResult, new TypeReference<Map<String, Object>>() { | |
| 215 | + }); | |
| 216 | + | |
| 217 | + String qxAccessToken = (String) qxRes.get("token"); | |
| 218 | + if (StringUtils.isBlank(qxAccessToken)) { | |
| 219 | + log.error("【凯盛设备同步】获取token失败, token为空, 响应内容: {}", qxResult); | |
| 220 | + return; | |
| 221 | + } | |
| 222 | + log.info("【凯盛设备同步】获取token成功"); | |
| 223 | + | |
| 224 | + BasicHeader qxAuthorization = new BasicHeader("X-Authorization", "Bearer " + qxAccessToken); | |
| 225 | + if (!CollectionUtils.isEmpty(qxDeviceInfos)) { | |
| 226 | + log.info("【凯盛设备同步】开始同步设备信息, 设备数: {}", qxDeviceInfos.size()); | |
| 227 | + HttpPost qxDeviceInfoPost = new HttpPost(iotDeviceInfoUrl); | |
| 228 | + qxDeviceInfoPost.addHeader(qxAuthorization); | |
| 229 | + for (QxDeviceInfo qxDeviceInfo : qxDeviceInfos) { | |
| 230 | + // todo | |
| 231 | + String syncDeviceInfo = sendPost(qxDeviceInfoPost, JSON.toJSONString(qxDeviceInfo)); | |
| 232 | + log.info("【凯盛设备同步】同步设备信息, 设备名: {}, SN: {}, 结果: {}", qxDeviceInfo.getName(), qxDeviceInfo.getSn(), syncDeviceInfo); | |
| 233 | + } | |
| 234 | + log.info("【凯盛设备同步】同步设备信息完成"); | |
| 235 | + } | |
| 236 | + | |
| 237 | + if (!CollectionUtils.isEmpty(qxAddDeviceInfoDetails)) { | |
| 238 | + log.info("【凯盛设备同步】开始同步设备详情, 详情数: {}", qxAddDeviceInfoDetails.size()); | |
| 239 | + for (QxDeviceInfoDetail qxDeviceInfoDetail : qxAddDeviceInfoDetails) { | |
| 240 | + String qxDeviceInfoDetailUrlStr = iotDeviceDetailUrl + qxDeviceInfoDetail.getDtuSn() + "/telemetry"; | |
| 241 | + HttpPost qxDeviceInfoDetailPost = new HttpPost(qxDeviceInfoDetailUrlStr); | |
| 242 | + qxDeviceInfoDetailPost.addHeader(qxAuthorization); | |
| 243 | + String syncDeviceInfoDetail = sendPost(qxDeviceInfoDetailPost, JSON.toJSONString(qxDeviceInfoDetail)); | |
| 244 | + log.info("【凯盛设备同步】同步设备详情, SN: {}, 状态: {}, 结果: {}", qxDeviceInfoDetail.getDtuSn(), qxDeviceInfoDetail.getStatus(), syncDeviceInfoDetail); | |
| 245 | + } | |
| 246 | + log.info("【凯盛设备同步】同步设备详情完成"); | |
| 247 | + } | |
| 248 | + log.info("【凯盛设备同步】设备同步任务执行完毕"); | |
| 249 | + } | |
| 250 | + | |
| 251 | + private String sendPost(HttpPost httpPost, String jsonData) { | |
| 252 | + CloseableHttpClient httpClient = HttpClients.createDefault(); | |
| 253 | + StringEntity entity = new StringEntity(jsonData, ContentType.create("application/json", Consts.UTF_8)); | |
| 254 | + httpPost.setEntity(entity); | |
| 255 | + String result = null; | |
| 256 | + try { | |
| 257 | + CloseableHttpResponse execute = httpClient.execute(httpPost); | |
| 258 | + HttpEntity res = execute.getEntity(); | |
| 259 | + InputStream is = res.getContent(); | |
| 260 | + int len; | |
| 261 | + byte[] buf = new byte[128]; | |
| 262 | + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | |
| 263 | + while ((len = is.read(buf)) != -1) { | |
| 264 | + byteArrayOutputStream.write(buf, 0, len); | |
| 265 | + } | |
| 266 | + result = byteArrayOutputStream.toString(); | |
| 267 | + } catch (IOException e) { | |
| 268 | + e.printStackTrace(); | |
| 269 | + } | |
| 270 | + return result; | |
| 271 | + } | |
| 272 | +} | ... | ... |
| 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.KaiShengDevicePullService; | |
| 4 | 5 | import com.iot.scheduler.task.AbstractZoneScheduler; |
| 5 | 6 | import jakarta.annotation.Resource; |
| 6 | 7 | import lombok.extern.slf4j.Slf4j; |
| ... | ... | @@ -13,12 +14,30 @@ public class ChizhouZoneScheduler extends AbstractZoneScheduler { |
| 13 | 14 | |
| 14 | 15 | @Resource |
| 15 | 16 | private CzDeviceReportService czDeviceReportService; |
| 17 | + @Resource | |
| 18 | + private KaiShengDevicePullService kaiShengDevicePullService; | |
| 16 | 19 | |
| 17 | 20 | @Override |
| 18 | 21 | protected String getZoneName() { |
| 19 | 22 | return "Chizhou (池州经开区)"; |
| 20 | 23 | } |
| 21 | 24 | |
| 25 | + @Scheduled(cron = "${scheduler.chizhou.pull:0 0/10 * * * ?}") | |
| 26 | + public void pullDevicesFromThirdParty() { | |
| 27 | + String taskName = "Pull Devices (3rd Party -> IoT)"; | |
| 28 | + logStart(taskName); | |
| 29 | + try { | |
| 30 | + // TODO: Implement actual logic | |
| 31 | + log.info("[{}] Simulating pulling devices...", getZoneName()); | |
| 32 | + kaiShengDevicePullService.pullCreateDeviceInfo(); | |
| 33 | + Thread.sleep(1000); | |
| 34 | + } catch (Exception e) { | |
| 35 | + logError(taskName, e); | |
| 36 | + } finally { | |
| 37 | + logEnd(taskName); | |
| 38 | + } | |
| 39 | + } | |
| 40 | + | |
| 22 | 41 | @Scheduled(cron = "${scheduler.chizhou.push:0 0/15 * * * ?}") |
| 23 | 42 | public void pushDevicesToThirdParty() { |
| 24 | 43 | String taskName = "Push Devices (IoT -> 3rd Party)"; | ... | ... |
| ... | ... | @@ -101,3 +101,12 @@ ks: |
| 101 | 101 | WHERE |
| 102 | 102 | de.organization_id='1697500a-dc11-45cc-88f5-2ad47472a9bb' |
| 103 | 103 | AND de.device_profile_id = '4e404b10-ffe7-11f0-926f-2f3182abc65f'" |
| 104 | + iot: | |
| 105 | + organizeId: "ad80a0f8-3483-43bf-af47-18bde28e59e7" | |
| 106 | + profileId: "be113b00-5269-11f1-bb2f-9df639274ae7" | |
| 107 | + deviceProfileId: "be113b00-5269-11f1-bb2f-9df639274ae7" | |
| 108 | + userName: "kskj" | |
| 109 | + password: "Kskj@123.com" | |
| 110 | + tokenUrl: "http://192.168.0.249:8080/api/auth/login" | |
| 111 | + infoUrl: "http://192.168.0.249:8080/api/yt/device" | |
| 112 | + detailUrl: "http://192.168.0.249:8080/api/v1/" | ... | ... |