From 12a6d3ed5e98ab9e727237cc987f6292c969d81b Mon Sep 17 00:00:00 2001 From: 18650502300 <18650502300@163.com> Date: Sat, 18 Nov 2023 00:22:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=AE=BE=E5=A4=87=E6=97=B6?= =?UTF-8?q?=E4=B8=8B=E5=8F=91=E5=91=BD=E4=BB=A4=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=8F=82=E6=95=B0=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 14 ++ .../com/ruoyi/common/constant/HttpStatus.java | 63 ++++++ .../ruoyi/common/constant/IotConstants.java | 79 ++++++++ .../ruoyi/common/utils/http/HttpUtils.java | 72 +++++++ .../com/ruoyi/common/utils/onenet/Token.java | 87 +++++++++ AutoSprout-ui/src/api/device/device.js | 4 +- .../src/views/device/device/index.vue | 93 ++++----- .../device/controller/AsDeviceController.java | 6 +- .../ruoyi/device/domain/AsWateringRecord.java | 2 + .../device/service/IAsDeviceService.java | 2 +- .../service/impl/AsDeviceServiceImpl.java | 182 +++++++++++++++--- 11 files changed, 525 insertions(+), 79 deletions(-) create mode 100644 AutoSprout-common/src/main/java/com/ruoyi/common/constant/IotConstants.java create mode 100644 AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java diff --git a/AutoSprout-admin/src/main/resources/application.yml b/AutoSprout-admin/src/main/resources/application.yml index da23a3c..1415f2a 100644 --- a/AutoSprout-admin/src/main/resources/application.yml +++ b/AutoSprout-admin/src/main/resources/application.yml @@ -15,6 +15,20 @@ ruoyi: # 验证码类型 math 数字计算 char 字符验证 captchaType: math +watering: + iotUrl: https://iot-api.heclouds.com/datapoint + # 产品id 浇花器 + productId: 50dd83E8zQ + # 版本号 签名算法版本 + version: 2020-05-29 + # 用户资源信息 用户id + resourceName: userid/143831 + # iot秘钥 + accessKey: dJqF0qYhUbK/o1Pr9I5qxNoP14FlJLC+BFK2ZTjUX+lnKwoNYvBYsM/7Xu1ERIzSkUoxVkP/N1RMvGlBKMoBtA== + # 超时响应时间(秒) + timeout: 10 + # token过期时间 + daysToExpire: 100 # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 diff --git a/AutoSprout-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java b/AutoSprout-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java index a983c77..ea40401 100644 --- a/AutoSprout-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java +++ b/AutoSprout-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java @@ -91,4 +91,67 @@ public class HttpStatus * 系统警告消息 */ public static final int WARN = 601; + + /**----------------------------IOT错误码start----------------------------*/ + + /** + * 成功 + */ + public static final String IOT_SUCCESS = "0"; + /** + * 错误码 新增设备失败:设备已存在 + */ + public static final String ERROR_CODE_DEVICE_ALREADY_EXISTS = "10406"; + + /** + * 错误码 设备不存在 + */ + public static final String ERROR_CODE_DEVICE_NON_EXISTENT = "10410"; + /** + * 错误码 设备属性设置失败 + */ + public static final String ERROR_CODE_DEVICE_ATTRIBUTE_SET_FAIL = "10411"; + /** + * 错误码 设备属性期望设置失败 + */ + public static final String ERROR_CODE_DEVICE_ATTRIBUTE_DESIRE_SET_FAIL = "10412"; + /** + * 错误码 设备属性期望查询失败 + */ + public static final String ERROR_CODE_DEVICE_ATTRIBUTE_DESIRE_QUERY_FAIL = "10413"; + /** + * 错误码 设备属性获取失败 + */ + public static final String ERROR_CODE_DEVICE_ATTRIBUTE_DESIRE_GET_FAIL = "10414"; + /** + * 错误码 设备服务调用失败 + */ + public static final String ERROR_CODE_DEVICE_SERVICE_CALL_FAIL = "10415"; + /** + * 错误码 设备属性期望删除失败 + */ + public static final String ERROR_CODE_DEVICE_ATTRIBUTE_DESIRE_DALETE_FAIL = "10416"; + /** + * 错误码 设备最新数据查询失败 + */ + public static final String ERROR_CODE_DEVIE_NEW_DATA_QUERY_FAIL = "10417"; + /** + * 错误码 设备属性历史数据查询失败 + */ + public static final String ERROR_CODE_DEVICE_ATTRIBUTE_HISTORY_QUERY_FAIL = "10418"; + /** + * 错误码 设备事件历史数据查询失败 + */ + public static final String ERROR_CODE_DEVICE_EVENT_HISTORY_DATA_QUERY_FAIL = "10419"; + /** + * 错误码 设备操作记录查询失败 + */ + public static final String ERROR_CODE_DEVICE_OPERATE_RECORD_QUERY_FAIL = "10420"; + /** + * 错误码 设备不在线 + */ + public static final String ERROR_CODE_DEVICE_NOT_ONLINE = "10421"; + + /**----------------------------IOT错误码end----------------------------*/ + } diff --git a/AutoSprout-common/src/main/java/com/ruoyi/common/constant/IotConstants.java b/AutoSprout-common/src/main/java/com/ruoyi/common/constant/IotConstants.java new file mode 100644 index 0000000..0b6e3a6 --- /dev/null +++ b/AutoSprout-common/src/main/java/com/ruoyi/common/constant/IotConstants.java @@ -0,0 +1,79 @@ +package com.ruoyi.common.constant; + + +/** + * iot常量信息 + * + * @author ruoyi + */ +public class IotConstants { + + /** + * 时间单位 分钟 + */ + public static final String TIME_MIN = "min"; + + /** + * 时间单位 小时 + */ + public static final String TIME_HOUR = "hour"; + /** + * 命令分隔符 @ + */ + public static final String COMMAND_SEPARATOR = "@"; + + /**----------------------------地址start----------------------------*/ + /** + * 命令下发地址 + */ + public static final String ADDS_COMMAND = "/synccmds"; + + /** + * 设备数据点地址 + */ + public static final String ADDS_HISTORY_DATAPOINTS = "/history-datapoints"; + + /** + * 设备数据点地址 + */ + public static final String ADDS_CURRENT_DATAPOINTS = "/current-datapoints"; + + /**----------------------------地址end----------------------------*/ + + /**----------------------------命令start----------------------------*/ + /** + * 命令 打开 + */ + public static final String COMMAND_OPEN = "open"; + + /** + * 命令 关闭 + */ + public static final String COMMAND_CLOSE = "close"; + + /**----------------------------命令end----------------------------*/ + + + /**----------------------------启动模式start----------------------------*/ + /** + * 启动模式 0-手动模式;;2-土壤湿度低启动 + */ + public static final String START_MODE_MANUAL = "0"; + + /** + * 启动模式 1-定时模式 + */ + public static final String START_MODE_REGULAR = "1"; + + /** + * 启动模式 2-土壤湿度低启动 + */ + public static final String START_MODE_HUMIDITY = "2"; + + + /**----------------------------启动模式end----------------------------*/ + + + + +} diff --git a/AutoSprout-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java index f85c82c..dd727e6 100644 --- a/AutoSprout-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java +++ b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -188,6 +188,78 @@ public class HttpUtils } return result.toString(); } + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPostWithToken(String url, String param, String token) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setRequestProperty("Authorization", token); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } public static String sendSSLPost(String url, String param) { diff --git a/AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java new file mode 100644 index 0000000..0d95fa8 --- /dev/null +++ b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java @@ -0,0 +1,87 @@ +package com.ruoyi.common.utils.onenet; + +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.http.HttpUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + + +public class Token { + + // IP地址查询 + public static final String URL = "http://iot-api.heclouds.com/datapoint/history-datapoints"; + public static final String synccmdsUrl = "http://iot-api.heclouds.com/datapoint/synccmds?product_id=50dd83E8zQ&device_name=4827E2945C54&timeout=10"; + + public static String assembleToken(String version, String resourceName, String expirationTime, String signatureMethod, String accessKey) + throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { + StringBuilder sb = new StringBuilder(); + String res = URLEncoder.encode(resourceName, "UTF-8"); + String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8"); + sb.append("version=") + .append(version) + .append("&res=") + .append(res) + .append("&et=") + .append(expirationTime) + .append("&method=") + .append(signatureMethod) + .append("&sign=") + .append(sig); + return sb.toString(); + } + + public static String generatorSignature(String version, String resourceName, String expirationTime, String accessKey, String signatureMethod) + throws NoSuchAlgorithmException, InvalidKeyException { + String encryptText = expirationTime + "\n" + signatureMethod + "\n" + resourceName + "\n" + version; + String signature; + byte[] bytes = HmacEncrypt(encryptText, accessKey, signatureMethod); + signature = Base64.getEncoder().encodeToString(bytes); + return signature; + } + + public static byte[] HmacEncrypt(String data, String key, String signatureMethod) + throws NoSuchAlgorithmException, InvalidKeyException { + //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称 + SecretKeySpec signinKey = null; + signinKey = new SecretKeySpec(Base64.getDecoder().decode(key), + "Hmac" + signatureMethod.toUpperCase()); + + //生成一个指定 Mac 算法 的 Mac 对象 + Mac mac = null; + mac = Mac.getInstance("Hmac" + signatureMethod.toUpperCase()); + + //用给定密钥初始化 Mac 对象 + mac.init(signinKey); + + //完成 Mac 操作 + return mac.doFinal(data.getBytes()); + } + + public enum SignatureMethod { + SHA1, MD5, SHA256; + } + + public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { + String version = "2020-05-29";//签名算法版本 + String resourceName = "userid/143831";//用户id + String expirationTime = System.currentTimeMillis() / 1000 + 100 * 24 * 60 * 60 + "";//过期时间 + String signatureMethod = SignatureMethod.SHA256.name().toLowerCase();//签名方式 + String accessKey = "dJqF0qYhUbK/o1Pr9I5qxNoP14FlJLC+BFK2ZTjUX+lnKwoNYvBYsM/7Xu1ERIzSkUoxVkP/N1RMvGlBKMoBtA=="; + String token = assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey); + System.out.println("Authorization:" + token); + + String rspStr = HttpUtils.sendGet(URL, token, Constants.UTF8); + HttpUtils.sendPostWithToken(synccmdsUrl,"",token); + + +// HttpUtils.sendGet() + + } + +} diff --git a/AutoSprout-ui/src/api/device/device.js b/AutoSprout-ui/src/api/device/device.js index 13b6016..7039814 100644 --- a/AutoSprout-ui/src/api/device/device.js +++ b/AutoSprout-ui/src/api/device/device.js @@ -17,9 +17,9 @@ export function getDevice(deviceId) { }) } // 手动浇水 -export function watering(deviceId) { +export function watering(deviceId,wateringSwitch) { return request({ - url: '/device/device/watering/' + deviceId, + url: '/device/device/watering/' + deviceId+"/"+wateringSwitch, method: 'get' }) } diff --git a/AutoSprout-ui/src/views/device/device/index.vue b/AutoSprout-ui/src/views/device/device/index.vue index d52bc15..de287cd 100644 --- a/AutoSprout-ui/src/views/device/device/index.vue +++ b/AutoSprout-ui/src/views/device/device/index.vue @@ -140,13 +140,6 @@ @click="handleUpdate(scope.row)" v-hasPermi="['device:device:edit']" >修改 - 手动浇水
按照间隔时间进行定时浇水
- 浇水间隔时间: + 启动时间: - + - +
- 浇水时间: + 喷洒时间: - + - +
单次浇水时间不可超过20分钟,防止电机过度发热,浇水量大可缩短浇水间隔时间 @@ -287,14 +280,14 @@
开启脉冲将会浇水停止相互循环
- 浇水时间: + 喷洒时间:
- 停止时间: + 间隔时间: - +
@@ -312,6 +305,7 @@ + @@ -325,9 +319,15 @@ - - + + + @@ -336,8 +336,6 @@ - -