From 3ec8adf602e9adc185873f024924b1b70b7564c9 Mon Sep 17 00:00:00 2001 From: lishuai Date: Fri, 17 Jan 2025 10:37:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=B1=BB=202025=E5=B9=B41?= =?UTF-8?q?=E6=9C=8817=E6=97=A510:37:07?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/thing/ShineMonitorOpenApi.java | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 application/src/main/java/com/thing/ShineMonitorOpenApi.java diff --git a/application/src/main/java/com/thing/ShineMonitorOpenApi.java b/application/src/main/java/com/thing/ShineMonitorOpenApi.java new file mode 100644 index 0000000..4114eef --- /dev/null +++ b/application/src/main/java/com/thing/ShineMonitorOpenApi.java @@ -0,0 +1,174 @@ +package com.thing; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.security.MessageDigest; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +/** + * @author: yu + * @date: 2024/12/21 12:05 + * @description: + */ +public class ShineMonitorOpenApi { + + private static String OPEN_API_URI = "http://api.shinemonitor.com/public/"; + + private static final Map CSLTokenCache = new HashMap<>(); + + /** 认证接口. */ + //获取token + public static String auth() throws UnsupportedEncodingException { + + String usr = "2022青原区村级电站"; /* 平台分配的账号, 密码, 厂家标识. */ + String pwd = "12345678"; + String companyKey = "wFeaA_Wd2R966GEQ"; + String source = "0"; + String _app_id_ = "com.demo.test"; + String _app_version_ = "3.6.2.1"; + String _app_client_ = "android"; + String salt = System.currentTimeMillis() + ""; /* 盐值. */ + String sha1Pwd = sha1ToLowerCase(pwd.getBytes()); /* SHA-1(pwd). */ + String action = "&action=auth&usr=" + URLEncoder.encode(usr, StandardCharsets.UTF_8.toString()) /* 注意: 中文需URLEncoder.encode. */ + "&company-key=" + companyKey + + "&source=" + source + "&_app_id_=" + _app_id_ + "&_app_version_=" + _app_version_ + "&_app_client_=" + _app_client_; + String sign = sha1ToLowerCase((salt + sha1Pwd + action).getBytes()); /* SHA-1(slat + SHA-1(pwd) + action). */ + String request = OPEN_API_URI + "?sign=" + sign + "&salt=" + salt + action; + System.out.println(request); + return request; + } + + + /** 注册电站业主账号接口. */ + private static void reg() + { + String usr = "plant-user-01"; + String pwd = "plant-user-01"; + String mobile = "15889700000"; + String email = "eybond@eybond.com"; + String pn = "0123456789ABCD"; + String sn = pn; + String companyKey = "0123456789ABCDEF"; + String source = "0"; + String _app_id_ = "com.demo.test"; + String _app_version_ = "3.6.2.1"; + String _app_client_ = "android"; + String salt = System.currentTimeMillis() + ""; /* 盐值. */ + String pwdSha1 = sha1ToLowerCase(pwd.getBytes()); /* SHA-1(PWD). */ + String pnSha1 = sha1ToLowerCase(pn.getBytes()); /* SHA-1(PN). */ + byte[] rc4 = rc4enc(pnSha1.getBytes(), pwdSha1.getBytes(), 0, pwdSha1.getBytes().length); /* RC4(SHA-1(PN), SHA-1(PWD)). */ + String action = "&action=reg&usr=" + usr /* 注意: 中文需URLEncoder.encode. */ + "&pwd=" + byte2HexStr(rc4, 0, rc4.length).toLowerCase(); + action += "&mobile=" + mobile + "&email=" + email + "&sn=" + sn + "&company-key=" + companyKey + "&source=" + + source + "&_app_id_=" + _app_id_ + "&_app_version_=" + _app_version_ + "&_app_client_=" + _app_client_; + String sign = sha1ToLowerCase((salt + pwdSha1 + action).getBytes()); + String request = OPEN_API_URI + "?sign=" + sign + "&salt=" + salt + action; + System.out.println(request); + } + + /** 认证通过后的业务API接口. */ + public static String authPassed(String act) + { + //String secret = CSLTokenCache.tokenMap.get("plantSecret"); /* 认证通过后的secret与token. */ + // String token = CSLTokenCache.tokenMap.get("plantToken"); + // + String secret = "8c8858760519b53426e7bd09d35412004ec46646"; /* 认证通过后的secret与token. */ + String token = "9bb029922c7bd51d07bf93535627b004ec6a29e3608bfce72aaf816e84183640"; + String source = "0"; + String _app_id_ = "com.demo.test"; + String _app_version_ = "3.6.2.1"; + String _app_client_ = "android"; + String salt = System.currentTimeMillis() + ""; /* 盐值. */ + String action = "&action="+ act + "&source=" + source + "&_app_id_=" + + _app_id_ + "&_app_version_=" + _app_version_ + "&_app_client_=" + _app_client_; + String sign = sha1ToLowerCase((salt + secret + token + action).getBytes()); /* SHA-1(slat + secret + token + action). */ + String request = OPEN_API_URI + "?sign=" + sign + "&salt=" + salt + "&token=" + token + action; + System.out.println(request); + return request; + } + + /** 将字节流转换成十六进制字符串(紧凑格式, 无空格). */ + private static String byte2HexStr(byte by[], int ofst, int len) + { + if (len < 1) + return ""; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(bos); + for (int i = ofst; i < ofst + len; i++) + ps.printf("%02X", by[i]); + return bos.toString(); + } + + /** SHA-1摘要算法. */ + private static String sha1ToLowerCase(byte[] by) + { + try + { + byte dat[] = MessageDigest.getInstance("SHA-1").digest(by); + return byte2HexStr(dat, 0, dat.length).toLowerCase(); + } catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + /** RC4加密. */ + public static byte[] rc4enc(byte key[], byte[] org, int ofst, int len) + { + try + { + Key k = new SecretKeySpec(key, "RC4"); + Cipher cip = Cipher.getInstance("RC4"); + cip.init(Cipher.ENCRYPT_MODE, k); + return cip.doFinal(org, ofst, len); + } catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public static void main(String[] args) throws UnsupportedEncodingException { + /* String auth = auth(); + String authUrl = HttpUtil.get(auth); + JSONObject jsonObject = JSONObject.parseObject(authUrl); + JSONObject jsonObject1 = jsonObject.getJSONObject("dat"); + String secret = jsonObject1.getString("secret"); + String token = jsonObject1.getString("token"); + + CSLTokenCache.put("plantSecret", secret); + CSLTokenCache.put("plantToken", token);*/ + + //电站 + String url1 = authPassed("queryPlants&orderBy=ascPlantName&page=0&pagesize=10"); + // 查询数采器 + String url2 = authPassed("queryCollectors&plantid=416002&page=0&pagesize=10"); + //数据采集器下的设备 + // String url3 = authPassed("queryCollectorDevices&pn=L0022362555526"); + //查询逆变器 + // String url4 = authPassed("queryDeviceRateActiveOutputPower&pn=L0022362555526&devcode=734&devaddr=2&sn=6T2289044210"); + //查询设备 + // String url = authPassed("queryDevices&plantid=425771&page=1&pagesize=10"); + String url = authPassed("queryDevices&page=0&plantid=416002&pn=L0022362347633&pagesize=10&devtype=0x0400"); + String url4 = authPassed("queryDeviceLastRawData&pn=L0022362347633&devcode=734&devaddr=1&sn=ES2280121217"); + String url54 = authPassed("queryDeviceEnergyTotal&pn=L0022362347633&devcode=734&devaddr=1&sn=ES2280121217"); + + String result = HttpUtil.get(url); + System.out.println(result); + + } +}