这是原流程: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;
}
}
最新发布