3459f1da496bd3dd6d51cc0459109c634fd615c8.svn-base 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package com.iamberry.app.api.util;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.net.URL;
  5. import java.util.Iterator;
  6. import java.util.Set;
  7. import java.util.TreeMap;
  8. import javax.net.ssl.HostnameVerifier;
  9. import javax.net.ssl.HttpsURLConnection;
  10. import javax.net.ssl.SSLSession;
  11. import org.apache.commons.lang3.StringUtils;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import com.fasterxml.jackson.databind.ObjectMapper;
  15. import com.iamberry.app.tool.dto.TuyaDTO;
  16. import com.iamberry.app.tool.dto.TuyaHistoryRawDTO;
  17. import com.iamberry.app.tool.dto.TuyaHistoryResultDTO;
  18. import com.iamberry.app.tool.util.TuyaMD5Util;
  19. public class TuyaConnector {
  20. private final static String CLIENT_ID = "5kkyurvvtt58bbuxueee";
  21. private final static String SECRET_KEY = "rhj6na6u3y6uhy6qrbb3944mg5uqqpbb";
  22. private static Logger logger = LoggerFactory.getLogger(TuyaConnector.class);
  23. // 调试环境
  24. // private final static String DOMAIN_NAME =
  25. // "https://a1.mb.cn.wgine.com/api.json";
  26. // 国内生产环境
  27. private final static String DOMAIN_NAME = "https://a1.mb.airtakeapp.com/api.json";
  28. // private final static String DOMAIN_NAME = "https://a1.mb.cn.wgine.com/api.json";
  29. // 国外环境
  30. // private final static String DOMAIN_NAME = "https://a1.tuyaus.com/api.json";
  31. public static void main(String[] args) {
  32. TuyaSyncConnect("aa", "bcc");
  33. }
  34. /**
  35. * 将用户信息注册到涂鸦中
  36. */
  37. public static void TuyaSyncConnect(String encryptUsername, String userCode) {
  38. userCode = TuyaMD5Util.getMD5(userCode);
  39. TuyaDTO tuyaDTO = setTuyaDTO();
  40. /**
  41. **?*
  42. */
  43. // 换成这个 tuya.cloud.user.uid.sync
  44. tuyaDTO.setApi("tuya.cloud.user.uid.sync");
  45. tuyaDTO.setData("{\"countryCode\":\"86\",\"uid\":\"" + encryptUsername + "\",\"passwd\":\"" + userCode + "\"}");
  46. String s = getSign(tuyaDTO, SECRET_KEY);
  47. String sign = TuyaMD5Util.getMD5(s.getBytes());
  48. String url = DOMAIN_NAME + "?a=" + tuyaDTO.getApi() + "&appVersion=" + tuyaDTO.getAppVersion() + "&clientId="
  49. + CLIENT_ID + "&deviceId=" + tuyaDTO.getDeviceid() + "&lang=" + tuyaDTO.getLang() + "&os="
  50. + tuyaDTO.getOs() + "&postData=" + tuyaDTO.getData() + "&sid=" + tuyaDTO.getSession() + "&time="
  51. + tuyaDTO.getT() + "&ttid=" + tuyaDTO.getTtid() + "&v=" + tuyaDTO.getApiVersion() + "&sign=" + sign;
  52. try {
  53. logger.info("tuya.cloud.user.uid.sync start:" + url);
  54. trustAllHttpsCertificates();
  55. HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  56. @Override
  57. public boolean verify(String hostname, SSLSession session) {
  58. return true;
  59. }
  60. });
  61. String result = sendPost(url);
  62. logger.info("tuya.cloud.user.uid.sync end:" + result);
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. public static TuyaHistoryResultDTO TuyaHistoryConnect(long startTime, long endTime, String offset, int limit) {
  68. ObjectMapper mapper = new ObjectMapper();
  69. TuyaHistoryRawDTO tuyaData = null;
  70. TuyaDTO tuyaDTO = setTuyaDTO();
  71. tuyaDTO.setApi("tuya.cloud.dp.history.get");
  72. /**
  73. * 正式环境
  74. * 4Ic6GgKI0vUG65Jd
  75. */
  76. tuyaDTO.setData("{\"productId\":\"" + "4Ic6GgKI0vUG65Jd" + "\",\"dpId\":\"" + 12 + "\",\"startTime\":"
  77. + startTime + ",\"endTime\":" + endTime + ",\"offset\":\"" + offset + "\",\"limit\":" + limit + "}");
  78. String s = getSign(tuyaDTO, SECRET_KEY);
  79. String sign = TuyaMD5Util.getMD5(s.getBytes());
  80. String url = DOMAIN_NAME + "?a=" + tuyaDTO.getApi() + "&appVersion=" + tuyaDTO.getAppVersion() + "&clientId="
  81. + CLIENT_ID + "&deviceId=" + tuyaDTO.getDeviceid() + "&lang=" + tuyaDTO.getLang() + "&os="
  82. + tuyaDTO.getOs() + "&postData=" + tuyaDTO.getData() + "&sid=" + tuyaDTO.getSession() + "&time="
  83. + tuyaDTO.getT() + "&ttid=" + tuyaDTO.getTtid() + "&v=" + tuyaDTO.getApiVersion() + "&sign=" + sign;
  84. try {
  85. logger.info("tuya.cloud.dp.history.get start:" + url);
  86. trustAllHttpsCertificates();
  87. HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  88. @Override
  89. public boolean verify(String hostname, SSLSession session) {
  90. return true;
  91. }
  92. });
  93. String result = sendPost(url);
  94. tuyaData = mapper.readValue(result, TuyaHistoryRawDTO.class);
  95. logger.info("tuya.cloud.dp.history.get end:" + result);
  96. } catch (Exception e) {
  97. e.printStackTrace();
  98. }
  99. return tuyaData != null ? tuyaData.getResult() : null;
  100. }
  101. private static TuyaDTO setTuyaDTO() {
  102. TuyaDTO tuyaDTO = new TuyaDTO();
  103. tuyaDTO.setApiVersion("1.0");
  104. tuyaDTO.setLang("cn");
  105. tuyaDTO.setDeviceid("cloud");
  106. tuyaDTO.setAppVersion("1.0");
  107. tuyaDTO.setTtid("ios");
  108. tuyaDTO.setOs("ios");
  109. tuyaDTO.setClientId(CLIENT_ID);
  110. tuyaDTO.setT(String.valueOf(System.currentTimeMillis() / 1000));
  111. tuyaDTO.setSession("abcededdddd");
  112. return tuyaDTO;
  113. }
  114. private static TreeMap<String, String> paramsBuild(TuyaDTO tuyaDTO) {
  115. TreeMap<String, String> params = new TreeMap<String, String>();
  116. params.put("a", tuyaDTO.getApi());
  117. params.put("v", tuyaDTO.getApiVersion());
  118. params.put("lang", tuyaDTO.getLang());
  119. params.put("deviceId", tuyaDTO.getDeviceid());
  120. params.put("appVersion", tuyaDTO.getAppVersion());
  121. params.put("ttid", tuyaDTO.getTtid());
  122. params.put("os", tuyaDTO.getOs());
  123. params.put("clientId", tuyaDTO.getClientId());
  124. params.put("time", tuyaDTO.getT());
  125. if (StringUtils.isNotBlank(tuyaDTO.getSession())) {
  126. params.put("sid", tuyaDTO.getSession());
  127. }
  128. if (StringUtils.isNotBlank(tuyaDTO.getData())) {
  129. params.put("postData", tuyaDTO.getData());
  130. }
  131. return params;
  132. }
  133. private static String signAssembly(TreeMap<String, String> params, String secretKey) {
  134. StringBuilder str = new StringBuilder();
  135. str.append(secretKey);
  136. Set<String> keySet = params.keySet();
  137. Iterator<String> iter = keySet.iterator();
  138. while (iter.hasNext()) {
  139. String key = iter.next();
  140. if (StringUtils.isBlank(params.get(key))) {
  141. continue;
  142. }
  143. str.append(key);
  144. str.append("=");
  145. str.append(params.get(key));
  146. str.append("|");
  147. }
  148. String strValue = str.toString();
  149. strValue = strValue.substring(0, (strValue.length() - 1));
  150. // System.out.println(strValue);
  151. return strValue;
  152. }
  153. private static String getSign(TuyaDTO tuyaDTO, String secretKey) {
  154. TreeMap<String, String> params = paramsBuild(tuyaDTO);
  155. String signString = signAssembly(params, secretKey);
  156. return signString;
  157. }
  158. public static boolean signValidate(TuyaDTO tuyaDTO) {
  159. String secretKey = tuyaDTO.getHashKey();
  160. String signString = getSign(tuyaDTO, secretKey);
  161. String sign = TuyaMD5Util.getMD5(signString.getBytes());
  162. if (tuyaDTO.getOpenSign() && !sign.equals(tuyaDTO.getSign().trim())) {
  163. return false;
  164. }
  165. return true;
  166. }
  167. private static String sendPost(String url) throws Exception {
  168. // 处理+号
  169. URL obj = new URL(url.replace("+", "%2B"));
  170. HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
  171. con.setRequestMethod("POST");
  172. con.setRequestProperty("Content-Type", "application/json");
  173. con.setRequestProperty("accept", "*/*");
  174. con.setRequestProperty("connection", "Keep-Alive");
  175. con.setDoOutput(true);
  176. con.setDoInput(true);
  177. int responseCode = con.getResponseCode();
  178. BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
  179. String inputLine;
  180. StringBuffer response = new StringBuffer();
  181. while ((inputLine = in.readLine()) != null) {
  182. response.append(inputLine);
  183. }
  184. in.close();
  185. // System.out.println("\nSending 'POST' request to URL : " + url);
  186. // System.out.println("Response Code : " + responseCode);
  187. // System.out.println("response: " + response.toString());
  188. return response.toString();
  189. }
  190. private static void trustAllHttpsCertificates() throws Exception {
  191. javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
  192. javax.net.ssl.TrustManager tm = new miTM();
  193. trustAllCerts[0] = tm;
  194. javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
  195. sc.init(null, trustAllCerts, null);
  196. javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  197. }
  198. static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
  199. public java.security.cert.X509Certificate[] getAcceptedIssuers() {
  200. return null;
  201. }
  202. public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
  203. return true;
  204. }
  205. public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
  206. return true;
  207. }
  208. public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
  209. throws java.security.cert.CertificateException {
  210. return;
  211. }
  212. public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
  213. throws java.security.cert.CertificateException {
  214. return;
  215. }
  216. }
  217. }