ContainerProvider

ContainerProvider 功能

1、处理XML中bean元素:调用ContanerBuilder.factory方法,设置实现类的与工厂的关系,以便Container能够实现类的创建并注入依赖。

2、处理多个properties文件及xml文件中的contstant元素:将所有属性与值关系都存入ContainerProperties。

 

(ContainerProperties的constant方法会调用ContanerBuilder.constant方法注入常量工厂,以便bean中需要常量注入时使用)

 

 



 

 

 

这是原流程:package com.tplink.cloud.demo.websocket_client; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.PublicKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.X509EncodedKeySpec; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.crypto.Cipher; import javax.websocket.ContainerProvider; import javax.websocket.WebSocketContainer; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.convert.ConversionFailedException; import org.springframework.messaging.converter.ByteArrayMessageConverter; import org.springframework.messaging.converter.CompositeMessageConverter; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.StringMessageConverter; import org.springframework.messaging.simp.stomp.StompCommand; import org.springframework.messaging.simp.stomp.StompFrameHandler; import org.springframework.messaging.simp.stomp.StompHeaders; import org.springframework.messaging.simp.stomp.StompSession; import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter; import org.springframework.web.socket.WebSocketHttpHeaders; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.messaging.WebSocketStompClient; import org.springframework.web.socket.sockjs.client.RestTemplateXhrTransport; import org.springframework.web.socket.sockjs.client.SockJsClient; import org.springframework.web.socket.sockjs.client.Transport; import org.springframework.web.socket.sockjs.client.WebSocketTransport; import static sun.security.x509.CertificateAlgorithmId.ALGORITHM; @SpringBootApplication public class WebsocketClientApplication { public static void main(String[] args) throws InterruptedException { // 禁用SSL验证 SSLUtil.disableSSLVerification(); // WebSocketClient webSocketClient = new StandardWebSocketClient(); List<Transport> transports = new ArrayList<>(2); WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.setDefaultMaxTextMessageBufferSize(262144); container.setDefaultMaxBinaryMessageBufferSize(262144); transports.add(new WebSocketTransport(new StandardWebSocketClient(container))); transports.add(new RestTemplateXhrTransport()); SockJsClient webSocketClient = new SockJsClient(transports); WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient); List<MessageConverter> converters = new ArrayList<>(); converters.add(new MappingJackson2MessageConverter()); // 处理JSON负载 converters.add(new StringMessageConverter()); // 处理文本负载 converters.add(new StringToByteArrayConverter()); // 添加自定义转换器 converters.add(new ByteArrayMessageConverter()); // 处理二进制负载 stompClient.setMessageConverter(new CompositeMessageConverter(converters)); // stompClient.setMessageConverter(new StringMessageConverter()); // String url1 = "/api/vms/{vmsId}/ws/status"; // todo 1 修改vmsId和URL String vmsId = "a84976add940407cbd7a76d66f5e86e7"; String url = String.format("wss://aps1-vms-api-alpha3.tplinkcloud.com/api/vms/%s/ws/status", vmsId); // String url = "wss://127.0.0.1:8081/api/vms/vms-8ff225f900a44a90a937143fe6774a98/ws/status/230/xgydnmu0/websocket"; // 添加头,握手的那些http,比如cookie final WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); // todo 2 修改Cookie、CSRF-TOKEN、SourceType、Content-Type headers.set("Cookie", "VMS_SID=a1-b7836c06-67de-4afa-9160-04813ca11789; JSESSIONID=D650347521FA79F61D8715D1C20ED03B"); headers.set("CSRF-TOKEN", "33df86ec09a54f0f89c0cf3a07646d41"); headers.set("SourceType", "vms_web"); headers.set("Content-Type", "application/json;charset=UTF-8"); // headers.set("sec-websocket-extensions", "permessage-deflate; client_max_window_bits"); // headers.set("sec-websocket-key", "I+JC3ABcYT+0B5zOlklaPQ=="); // headers.set("sec-websocket-version", "13"); // headers.set("Host", "aps1-vms-api-alpha3.tplinkcloud.com"); // 头部字段 final StompHeaders connectHeaders = new StompHeaders(); // todo 3 修改CSRF-TOKEN、accept-version connectHeaders.set("CSRF-TOKEN", "33df86ec09a54f0f89c0cf3a07646d41"); // connectHeaders.set("accept-version", "1.1,1.0"); // connectHeaders.set("heart-beat", "20000,20000"); // 链接到服务端 stompClient.connect(url, headers, connectHeaders, new StompSessionHandlerAdapter() { @Override public void afterConnected(StompSession session, StompHeaders connectedHeaders) { System.out.println("************connected"); // 订阅用户消息,"/topic/vms/{vmsId}/users/{userId}/device-add-progress/{uuid}" // todo 4 修改订阅URL String subscribeUrl = "/topic/vms/{vmsId}/batch-import-device/{uuid}"; session.subscribe(subscribeUrl, new StompFrameHandler() { // @Override // public Type getPayloadType(StompHeaders headers) { // // 直接返回 Map.class,跳过二进制检查 // return Map.class; // } // @Override // public void handleFrame(StompHeaders headers, Object payload) { // if (payload instanceof Map) { // System.out.println("订阅响应: " + payload); // } // } @Override public Type getPayloadType(StompHeaders headers) { if (headers.getContentType() != null && headers.getContentType().toString().contains("application/json")) { return Map.class; // 或自定义DTO类 } return byte[].class; // 默认返回字节类型 } @Override public void handleFrame(StompHeaders headers, Object payload) { if (payload instanceof byte[]) { String jsonStr = new String((byte[]) payload, StandardCharsets.UTF_8); System.out.println("原始JSON消息: " + jsonStr); } // 处理自动转换的JSON对象 else if (payload instanceof Map) { Map<?, ?> jsonMap = (Map<?, ?>) payload; System.out.println("解析后的JSON消息: " + jsonMap); } // 处理字符串 else if (payload instanceof String) { System.out.println("文本消息: " + payload); } } }); // 构建动态路由负载 // todo 5 修改Body,一个一个看 Map<String, Object> stompPayload = new HashMap<>(); stompPayload.put("url", "https://aps1-vms-api-alpha3.tplinkcloud.com/api/v2/vms/{vmsId}/sites/{siteId}/devices/cloud/addDevicesCommon"); stompPayload.put("method", "POST"); stompPayload.put("subscribeDestination", subscribeUrl); // 路径参数 Map<String, String> pathVars = new HashMap<>(); pathVars.put("vmsId", "a84976add940407cbd7a76d66f5e86e7"); pathVars.put("siteId", "1707995954184193"); stompPayload.put("pathVars", pathVars); // 请求头 Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json;charset=UTF-8"); headers.put("CSRF-TOKEN", "33df86ec09a54f0f89c0cf3a07646d41"); headers.put("x-requested-with", "XMLHttpRequest"); //暂时携带cookie // headers.put("Cookie", "JSESSIONID=873F0324DD2E9DD2B23F5A29A01DC99E; VMS_SID=v-06f73de4-a748-4893-a277-b1c7579feda1"); headers.put("SourceType", "vms_web"); stompPayload.put("headers", headers); // 请求体(业务数据) Map<String, Object> body = new HashMap<>(); body.put("username", "admin"); String originPassword = "Tplink.124"; String password = publicKeyEncrypt(originPassword, "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7fPbjcNqrtKbJQ6posAogjyI+Fs2UaxDBxj5/S1M1M856RGBW56Y7SvBgLLWTTnLb9L8FU2ESI1KOkFYK3iz+iH7rNO21yyw4U3JGl61qA2ypBFhwa/Hy/J7ES2rN/lCb72lVRDRQkdEEu2HgKz36jeKM15LoQ9HMEKdsdg2nCAWu/OeoemNihrKuQone8Tseu/lGeZmYe+ygzxcfjWlt4rg1mdIol+7R+v2coAjxnE9wzRXTAre9WpAxtpqIjU/9Uwh3oPjaHMCRjzt8t3jQCCL7T3Nkm1T7e5Wc2LP1XyYDuV5Up1XPfF76fyCpwDt2IipAPGwRhvak8Ut8KuyIQIDAQAB"); body.put("password", password); List<Map<String, String>> deviceObjects = new ArrayList<>(); String[] qrCodes = { "TP14C3EFF0E1A638F582040", "TP14C3EFF0E1A62F47C2040", "TP14C3EFF0E1A6B477D2040", "TP14C3EFF0E1A6AFEF02040", "TP14C3EFF0E1A65C1282040", "TP14C3EFF0E1A6437D82040", "TP14C3EFF0E1A67AA172040", "TP14C3EFF0E1A669FF22040", "TP14C3EFF0E1A61B01E2040", "TP14C3EFF0E1A60E0BB2040", "TP14C3EFF0E1A696EF22040", "TP14C3EFF0E1A6CE36E2040", "TP14C3EFF0E1A6E33592040", "TP14C3EFF0E1A6DF2BC2040", "TP14C3EFF0E1A6898AD2040", "TP14C3EFF0E1A6F52152040", "TP14C3EFF0E1A72699B2040", "TP14C3EFF0E1A71687A2040", "TP14C3EFF0E1A73E52E2040", "TP14C3EFF0E1A7ADB8B2040", "TP14C3EFF0E1A7407632040", "TP14C3EFF0E1A7B9DD62040", "TP14C3EFF0E1A76343B2040", "TP14C3EFF0E1A75AC5F2040", "TP14C3EFF0E1A70D21F2040", "TP14C3EFF0E1A77620B2040", "TP14C3EFF0E1A792E392040", "TP14C3EFF0E1A78016E2040", "TP14C3EFF0E1BE278792040", "TP14C3EFF0E1BE133D32040", "TP14C3EFF0E1BE34BA92040", "TP14C3EFF0E1BEA08EF2040", "TP14C3EFF0E1BE4A2DA2040", "TP14C3EFF0E1BEB0B352040", "TP14C3EFF0E1BE613FF2040", "TP14C3EFF0E1BE5023D2040", "TP14C3EFF0E1BE0F3082040", "TP14C3EFF0E1BE7319A2040", "TP14C3EFF0E1BE9C4192040", "TP14C3EFF0E1BE8A4DA2040", "TP14C3EFF0E1BED0C332040", "TP14C3EFF0E1BECB3272040", "TP14C3EFF0E1BEF05EA2040", "TP14C3EFF0E1BEEEB102040", "TP14C3EFF0E1BF186642040", "TP14C3EFF0E1BF056F12040", "TP14C3EFF0E1BF310D02040", "TP14C3EFF0E1BF20B912040", "TP14C3EFF0E1BFBD10E2040", "TP14C3EFF0E1BFA6D172040", "TP14C3EFF0E1BF5B3322040", "TP14C3EFF0E1BF44BC02040", "TP14C3EFF0E1BF705962040", "TP14C3EFF0E1BF6606D2040", "TP14C3EFF0E1BF861312040", "TP14C3EFF0E1BFFD5662040", "TP14C3EFF0E1BF97C522040", "TP14C3EFF0E1BFC44192040", "TP14C3EFF0E1BFEAB402040", "TP14C3EFF0E1BFD44A52040", "TP14C3EFF0E1B9A19872040", "TP14C3EFF0E1B9DFCEA2040", "TP14C3EFF0E1B9C4C452040", "TP14C3EFF0E1B9FB6AD2040", "TP14C3EFF0E1B9E94142040", "TP14C3EFF0E1B99CD7F2040", "TP14C3EFF0E1B9892B42040", "TP14C3EFF0E1B1C42BA2040", "TP14C3EFF0E1B1D622B2040", "TP14C3EFF0E1BBAC7812040", "TP14C3EFF0E1BB43E5B2040", "TP14C3EFF0E1BBB48D62040", "TP14C3EFF0E1BBD066D2040", "TP14C3EFF0E1BBC1A952040", "TP14C3EFF0E1BBFF0102040", "TP14C3EFF0E1BBE25B82040", "TP14C3EFF0E1BB9E99E2040", "TP14C3EFF0E1BB85B8C2040", "TP14C3EFF0E1B8505532040", "TP14C3EFF0E1B84E1362040", "TP14C3EFF0E1B871B422040", "TP14C3EFF0E1B8605C32040", "TP14C3EFF0E1B8175782040", "TP14C3EFF0E1B80F12F2040", "TP14C3EFF0E1B8320C12040", "TP14C3EFF0E1B82E1EC2040", "TP14C3EFF0E1B8B4FAC2040", "TP14C3EFF0E1B8A1C942040", "TP14C3EFF0E1B8CC1B42040", "TP14C3EFF0E1B8E8AA42040", "TP14C3EFF0E1B8DEE662040", "TP14C3EFF0E1B8879D02040", "TP14C3EFF0E1B8F6C9C2040", "TP14C3EFF0E1B89B3C82040", "TP14C3EFF0E1B9366462040", "TP14C3EFF0E1B945C3B2040", "TP14C3EFF0E1B9B9FBE2040", "TP14C3EFF0E1B96160F2040", "TP14C3EFF0E1B952BE02040", "TP14C3EFF0E1B9009322040", "TP14C3EFF0E1B97469B2040", "TP14C3EFF0E1B92E0602040", "TP14C3EFF0E1B91BF7E2040", "TP14C3EFF0E1BDAAFA42040", "TP14C3EFF0E1BD4CBD82040", "TP14C3EFF0E1BDB652E2040", "TP14C3EFF0E1BD6D1E92040", "TP14C3EFF0E1A5D9FB12040", "TP14C3EFF0E1BD58D462040", "TP14C3EFF0E1A5C9CA52040", "TP14C3EFF0E1BDF2B6C2040", "TP14C3EFF0E1A27A74B2040", "TP14C3EFF0E1BDE59202040", "TP14C3EFF0E1A26816C2040", "TP14C3EFF0E1BD9AD8A2040", "TP14C3EFF0E1A21C7392040", "TP14C3EFF0E1BD8E3A52040", "TP14C3EFF0E1A209BC32040", "TP14C3EFF0E1A2337F12040", "TP14C3EFF0E1A227C1A2040", "TP14C3EFF0E1BDD8DC02040", "TP14C3EFF0E1BDC723E2040", "TP14C3EFF0E1BA79A162040", "TP14C3EFF0E1BA6ED472040", "TP14C3EFF0E1BA187232040", "TP14C3EFF0E1BA053972040", "TP14C3EFF0E1BA36CC52040", "TP14C3EFF0E1BA2072B2040", "TP14C3EFF0E1BAB5FEB2040", "TP14C3EFF0E1BAADBE52040", "TP14C3EFF0E1BA52C812040", "TP14C3EFF0E1BA473B72040", "TP14C3EFF0E1BAEC1DB2040", "TP14C3EFF0E1BAD26E72040", "TP14C3EFF0E1BA8776F2040", "TP14C3EFF0E1BAF73E72040", "TP14C3EFF0E1BA9DAEA2040", "TP14C3EFF0E1BACCEF22040", "TP14C3EFF0E1BB69E532040", "TP14C3EFF0E1BB58E762040", "TP14C3EFF0E1BB00E992040", "TP14C3EFF0E1BB7E7C62040", "TP14C3EFF0E1BB2EFD72040", "TP14C3EFF0E1BB172E12040", "TP14C3EFF0E1BB34E872040", "TP14C3EFF0E1A7D5DFA2040", "TP14C3EFF0E1A7C04142040", "TP14C3EFF0E1A7F0EE62040", "TP14C3EFF0E1A7E30402040", "TP14C3EFF0E1A41BC4D2040", "TP14C3EFF0E1A40CE712040", "TP14C3EFF0E1A438B152040", "TP14C3EFF0E1A42D1612040", "TP14C3EFF0E1A4B89712040", "TP14C3EFF0E1A4A4E542040", "TP14C3EFF0E1A45A8492040", "TP14C3EFF0E1A44AAE42040", "TP14C3EFF0E1A475DBC2040", "TP14C3EFF0E1A464A042040", "TP14C3EFF0E1BC1A80C2040", "TP14C3EFF0E1A4832F12040", "TP14C3EFF0E1BC0BABE2040", "TP14C3EFF0E1A4F78132040", "TP14C3EFF0E1BC3BD3E2040", "TP14C3EFF0E1BC2A2832040", "TP14C3EFF0E1A49E4022040", "TP14C3EFF0E1BCB79282040", "TP14C3EFF0E1BCAC7072040", "TP14C3EFF0E1BC5DF1C2040", "TP14C3EFF0E1A4CDD4C2040", "TP14C3EFF0E1BC40FB52040", "TP14C3EFF0E1BC7CF832040", "TP14C3EFF0E1A4EB2712040", "TP14C3EFF0E1BC648DC2040", "TP14C3EFF0E1A4D08262040", "TP14C3EFF0E1BC8699D2040", "TP14C3EFF0E1A50AEA82040", "TP14C3EFF0E1BCF1F0E2040", "TP14C3EFF0E1A57F7862040", "TP14C3EFF0E1A525BA42040", "TP14C3EFF0E1BC9CD8C2040", "TP14C3EFF0E1A517A292040", "TP14C3EFF0E1A5322682040", "TP14C3EFF0E1A5A83BC2040", "TP14C3EFF0E1BCCEE7E2040", "TP14C3EFF0E1A5436512040", "TP14C3EFF0E1A5BFE3D2040", "TP14C3EFF0E1BCEA8142040", "TP14C3EFF0E1A564A4C2040", "TP14C3EFF0E1BCDAAB42040", "TP14C3EFF0E1A5539AF2040", "TP14C3EFF0E1BD093C22040", "TP14C3EFF0E1A5F12202040", "TP14C3EFF0E1BD7592C2040", "TP14C3EFF0E1A5E39702040", "TP14C3EFF0E1BD2C15C2040", "TP14C3EFF0E1A5955402040", "TP14C3EFF0E1BD142BD2040", "TP14C3EFF0E1A58F8E02040", "TP14C3EFF0E1BD3FAE82040" }; for (String qrCode : qrCodes) { Map<String, String> device = new HashMap<>(); device.put("qrCode", qrCode); deviceObjects.add(device); } body.put("deviceList", deviceObjects); // 添加其他业务字段... body.put("importId", "2f9bc407b135017cb86465cedaeca25f"); body.put("needInitDevice", false); body.put("whetherRsa", true); stompPayload.put("body", body); // 发送优化后的STOMP消息 String sendDestination = "/vms/{vmsId}/httpoversend/{taskId}" .replace("{vmsId}", pathVars.get("vmsId")) .replace("{taskId}", pathVars.get("siteId")); // 替换为实际taskId session.send(sendDestination, stompPayload); } @Override public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) { System.err.println("STOMP Exception: " + exception.getMessage()); } @Override public void handleTransportError(StompSession session, Throwable exception) { System.err.println("Transport Error: " + exception.getMessage()); if (exception instanceof ConversionFailedException) { System.out.println("Conversion Failed"); } exception.printStackTrace(); // 关键:添加堆栈信息 } }); System.out.println("客户端已启动,阻塞主线程等待消息..."); Thread.sleep(Long.MAX_VALUE); // 永久阻塞主线程 } /** * 公钥加密 */ public static String publicKeyEncrypt(String str, String publicKey) { String outStr = ""; try { //base64编码的公钥 byte[] decoded = Base64.getDecoder().decode(publicKey.getBytes()); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA") .generatePublic(new X509EncodedKeySpec(decoded)); //RSA加密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes())); } catch (Exception e) { e.printStackTrace(); } return outStr; } } 这是新流程,为什么新流程接收不到websocket消息呢 package com.tplink.cloud.demo.websocket_client; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.simp.stomp.StompHeaders; import org.springframework.messaging.simp.stomp.StompSession; import org.springframework.messaging.simp.stomp.StompSessionHandler; import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter; import org.springframework.web.socket.WebSocketHttpHeaders; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.messaging.WebSocketStompClient; import org.springframework.web.socket.sockjs.client.SockJsClient; import org.springframework.web.socket.sockjs.client.Transport; import org.springframework.web.socket.sockjs.client.WebSocketTransport; import org.springframework.http.*; import org.springframework.web.client.RestTemplate; import javax.crypto.Cipher; import javax.websocket.ContainerProvider; import javax.websocket.WebSocketContainer; import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.interfaces.RSAPublicKey; import java.security.spec.X509EncodedKeySpec; import java.util.ArrayList; import java.util.Base64; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; /** * Description of this file * * @author Li Tailong * @version 1.0 * @since 2025/10/27 */ public class DeviceImportClient { // HTTP请求的目标URL(根据实际环境修改) private static final String HTTP_ENDPOINT = "https://aps1-vms-api-alpha3.tplinkcloud.com/api/v1/vms/a84976add940407cbd7a76d66f5e86e7/sites/1707995954184193/devices/cloud/addDevicesCommon"; // WebSocket连接地址(根据实际环境修改) private static final String WEBSOCKET_URL = "wss://aps1-vms-api-alpha3.tplinkcloud.com/api/vms/a84976add940407cbd7a76d66f5e86e7/ws/status"; public static void main(String[] args) throws Exception { // 1. 配置WebSocket客户端(包含256KB缓冲区) WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.setDefaultMaxTextMessageBufferSize(262144); container.setDefaultMaxBinaryMessageBufferSize(262144); Transport webSocketTransport = new WebSocketTransport(new StandardWebSocketClient(container)); List<Transport> transports = new ArrayList<>(); transports.add(webSocketTransport); SockJsClient sockJsClient = new SockJsClient(transports); WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient); stompClient.setMessageConverter(new MappingJackson2MessageConverter()); // 2. 创建STOMP会话处理器 StompSessionHandler sessionHandler = new StompSessionHandlerAdapter() { @Override public void afterConnected(StompSession session, StompHeaders connectedHeaders) { System.out.println("WebSocket连接成功!会话ID: " + session.getSessionId()); // 订阅目标主题(根据实际需求修改) session.subscribe("/topic/vms/a84976add940407cbd7a76d66f5e86e7/batch-import-device/146a67b7b1350179eac415dc6f2351d5", this); System.out.println("已订阅设备导入状态主题"); } @Override public void handleFrame(StompHeaders headers, Object payload) { if (payload instanceof byte[]) { String jsonStr = new String((byte[]) payload, StandardCharsets.UTF_8); System.out.println("原始JSON消息: " + jsonStr); } // 处理自动转换的JSON对象 else if (payload instanceof Map) { Map<?, ?> jsonMap = (Map<?, ?>) payload; System.out.println("解析后的JSON消息: " + jsonMap); } // 处理字符串 else if (payload instanceof String) { System.out.println("文本消息: " + payload); } } }; // tod final WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); headers.add("Cookie", "VMS_SID=a1-b7836c06-67de-4afa-9160-04813ca11789; JSESSIONID=55A393832551709466FC996F228B38F4"); headers.add("CSRF-TOKEN", "33df86ec09a54f0f89c0cf3a07646d41"); headers.add("SourceType", "vms_web"); headers.add("Content-Type", "application/json;charset=UTF-8"); final StompHeaders connectHeaders = new StompHeaders(); connectHeaders.add("CSRF-TOKEN", "33df86ec09a54f0f89c0cf3a07646d41"); // 3. 连接WebSocket服务器 try { StompSession stompSession = stompClient.connect(WEBSOCKET_URL, headers, connectHeaders, sessionHandler).get(); System.out.println("WebSocket连接建立完成,准备发送HTTP请求..."); // 4. 发送HTTP POST请求 sendDeviceImportRequest(); // 保持连接以接收订阅消息(根据需要调整等待时间) Thread.sleep(Long.MAX_VALUE); stompSession.disconnect(); } catch (InterruptedException | ExecutionException e) { System.err.println("WebSocket连接失败: " + e.getMessage()); } } private static void sendDeviceImportRequest() { // 创建请求对象 DeviceImportRequest request = new DeviceImportRequest(); request.setUsername("admin"); String originPassword = "Tplink.124"; String password = publicKeyEncrypt(originPassword, "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7fPbjcNqrtKbJQ6posAogjyI+Fs2UaxDBxj5/S1M1M856RGBW56Y7SvBgLLWTTnLb9L8FU2ESI1KOkFYK3iz+iH7rNO21yyw4U3JGl61qA2ypBFhwa/Hy/J7ES2rN/lCb72lVRDRQkdEEu2HgKz36jeKM15LoQ9HMEKdsdg2nCAWu/OeoemNihrKuQone8Tseu/lGeZmYe+ygzxcfjWlt4rg1mdIol+7R+v2coAjxnE9wzRXTAre9WpAxtpqIjU/9Uwh3oPjaHMCRjzt8t3jQCCL7T3Nkm1T7e5Wc2LP1XyYDuV5Up1XPfF76fyCpwDt2IipAPGwRhvak8Ut8KuyIQIDAQAB"); request.setPassword(password); request.setImportId("146a67b7b1350179eac415dc6f2351d5"); request.setNeedInitDevice(false); request.setWhetherRsa(true); // 添加设备列表 List<DeviceInfo> deviceList = new ArrayList<>(); deviceList.add(new DeviceInfo("TP14C3EFF0E1A638F582040")); deviceList.add(new DeviceInfo("TP14C3EFF0E1A62F47C2040")); request.setDeviceList(deviceList); // 配置HTTP请求 RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); // 添加Cookie(多个Cookie用分号分隔) headers.add("Cookie", "VMS_SID=a1-b7836c06-67de-4afa-9160-04813ca11789; JSESSIONID=55A393832551709466FC996F228B38F4"); // 添加csrf-token头 headers.add("csrf-token", "33df86ec09a54f0f89c0cf3a07646d41"); // 添加x-requested-with头 headers.add("x-requested-with", "XMLHttpRequest"); HttpEntity<DeviceImportRequest> entity = new HttpEntity<>(request, headers); // 发送请求并处理响应 try { ResponseEntity<String> response = restTemplate.postForEntity( HTTP_ENDPOINT, entity, String.class); System.out.println("HTTP请求发送成功!状态码: " + response.getStatusCode()); System.out.println("响应内容: " + response.getBody()); } catch (Exception e) { System.err.println("HTTP请求发送失败: " + e.getMessage()); } } // 内部类定义请求数据结构 static class DeviceImportRequest { private List<DeviceInfo> deviceList; private String username; private String password; private String importId; private boolean needInitDevice; private boolean whetherRsa; // 所有属性的getter和setter public List<DeviceInfo> getDeviceList() { return deviceList; } public void setDeviceList(List<DeviceInfo> deviceList) { this.deviceList = deviceList; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getImportId() { return importId; } public void setImportId(String importId) { this.importId = importId; } public boolean isNeedInitDevice() { return needInitDevice; } public void setNeedInitDevice(boolean needInitDevice) { this.needInitDevice = needInitDevice; } public boolean isWhetherRsa() { return whetherRsa; } public void setWhetherRsa(boolean whetherRsa) { this.whetherRsa = whetherRsa; } } static class DeviceInfo { private String qrCode; public DeviceInfo(String qrCode) { this.qrCode = qrCode; } public String getQrCode() { return qrCode; } public void setQrCode(String qrCode) { this.qrCode = qrCode; } } /** * 公钥加密 */ public static String publicKeyEncrypt(String str, String publicKey) { String outStr = ""; try { //base64编码的公钥 byte[] decoded = Base64.getDecoder().decode(publicKey.getBytes()); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA") .generatePublic(new X509EncodedKeySpec(decoded)); //RSA加密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes())); } catch (Exception e) { e.printStackTrace(); } return outStr; } }
最新发布
10-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值