Files
hb_roma/src/main/java/com/njcn/roma/controller/SendCommandController.java
2024-08-16 17:16:47 +08:00

219 lines
8.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.njcn.roma.controller;
import cn.hutool.crypto.digest.DigestUtil;
import com.njcn.roma.pojo.CommandDTO;
import com.njcn.roma.pojo.UpSendPojo;
import lombok.RequiredArgsConstructor;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Objects;
/**
* roma
*
* @author cdf
* @date 2024/6/25
*/
@RestController
@RequestMapping("send")
@RequiredArgsConstructor
public class SendCommandController {
@Value("${roma.acceptIp}")
private String acceptIp;
@Value("${roma.sendIp}")
private String sendIp;
@Value("${roma.appId}")
private String appId;
@Value("${roma.appKey}")
private String appKey;
private final RestTemplate restTemplate;
/**
* 测试下发程序
* @author cdf
* @date 2024/6/25
*/
@GetMapping("up")
public String sendToDev(@RequestParam("serviceId")String serviceId,@RequestParam("method")String method,@RequestParam(value = "deviceId",defaultValue = "D2899233167kupZT")String deviceId){
org.json.JSONObject commandContent = new JSONObject();
commandContent.put("status", "on");
try {
deviceCommands(deviceId,serviceId,method,commandContent);
} catch (IOException e) {
System.out.println("IOException---------------------------");
e.printStackTrace();
return e.getMessage();
} catch (NoSuchAlgorithmException e) {
System.out.println("NoSuchAlgorithmException---------------------------");
e.printStackTrace();
return e.getMessage();
} catch (KeyStoreException e) {
System.out.println("KeyStoreException---------------------------");
e.printStackTrace();
return e.getMessage();
} catch (KeyManagementException e) {
System.out.println("KeyManagementException---------------------------");
e.printStackTrace();
return e.getMessage();
}catch (Exception e){
System.out.println("Exception---------------------------");
e.printStackTrace();
return e.getMessage();
}
return "执行成功";
}
@GetMapping("queryService")
public String test(@RequestParam(value = "deviceId",defaultValue = "D2899233167kupZT")String deviceId){
//String url = "https://" + sendIp + "/iot/1.0/deviceCommands?appId=" + appId;
String url = "https://" + sendIp + "/iot/1.0/services?appId=" + appId+"&deviceId="+deviceId;
HttpGet httpGet = new HttpGet(url); //创建post请求
setSSLHeader(httpGet); //设置请求的header
try {
org.apache.http.HttpEntity responseEntity = getSSLResponse(httpGet);//获取响应结果
return EntityUtils.toString(responseEntity);
} catch (IOException e) {
System.out.println("IOException---------------------------");
e.printStackTrace();
return e.getMessage();
} catch (NoSuchAlgorithmException e) {
System.out.println("NoSuchAlgorithmException---------------------------");
e.printStackTrace();
return e.getMessage();
} catch (KeyStoreException e) {
System.out.println("KeyStoreException---------------------------");
e.printStackTrace();
return e.getMessage();
} catch (KeyManagementException e) {
System.out.println("KeyManagementException---------------------------");
e.printStackTrace();
return e.getMessage();
}catch (Exception e){
System.out.println("Exception---------------------------");
e.printStackTrace();
return e.getMessage();
}
}
/**
* 创建ssl连接设置客户端信任所有证书
* @return CloseableHttpClient
* @throws KeyStoreException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
private CloseableHttpClient createSSLClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (TrustStrategy) (chain, authType) -> true).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[]{"TLSv1.2"}, null,
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
}
/**
* 设置请求时的header
* @param httpUriRequest
*/
private void setSSLHeader(HttpUriRequest httpUriRequest) {
long time = System.currentTimeMillis();
String authorization = DigestUtils.sha256Hex(appId + appKey + time);
httpUriRequest.addHeader("Content-Type", "application/json");
httpUriRequest.addHeader("Authorization", authorization);
httpUriRequest.addHeader("timestamp", String.valueOf(time));
}
/**
* 解析响应结果
* @param httpUriRequest
* @return
* @throws NoSuchAlgorithmException
* @throws KeyStoreException
* @throws KeyManagementException
* @throws IOException
*/
private org.apache.http.HttpEntity getSSLResponse(HttpUriRequest httpUriRequest) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException {
CloseableHttpClient httpClient = createSSLClient();
CloseableHttpResponse response = httpClient.execute(httpUriRequest);
org.apache.http.HttpEntity responseEntity = response.getEntity();
System.out.println("响应状态为:" + response.getStatusLine());
if (responseEntity != null) {
System.out.println("响应内容长度为:" + responseEntity.getContentLength());
System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
}
return responseEntity;
}
/**
* 命令下发
*
* @param serviceName
* @param commandName
* @param cmdComtent
* @throws JSONException
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws KeyStoreException
* @throws KeyManagementException
*/
public void deviceCommands(String deviceId,String serviceName, String commandName, org.json.JSONObject cmdComtent) throws JSONException, IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
String url = "https://" + sendIp + "/iot/1.0/deviceCommands?appId=" + appId;
HttpPost httpPost = new HttpPost(url); //创建post请求
org.json.JSONObject cmdContent = new org.json.JSONObject();
cmdContent.put("serviceId", serviceName);
cmdContent.put("method", commandName);
cmdContent.put("paras", cmdComtent);
org.json.JSONObject cmdBody = new org.json.JSONObject();
cmdBody.put("command", cmdContent);
cmdBody.put("deviceId", deviceId);
setSSLHeader(httpPost); //设置请求的header
StringEntity stringEntity = new StringEntity(cmdBody.toString(), "utf-8");
httpPost.setEntity(stringEntity);//设置请求的body
getSSLResponse(httpPost);//获取响应结果
}
}