ESP32与WebSocket服务器握手时如何发送自定义请求头?
ESP32 WebSocket 握手阶段添加自定义请求头方法
针对你需要在ESP32连接WebSocket服务器时,在握手阶段发送serialNo: 123456自定义请求头的需求,下面给出两种常用库的具体实现方式,重点说明setExtraHeader()相关用法:
一、使用WebSocketsClient库(主流客户端库)
这个库是ESP32开发中常用的WebSocket客户端实现,setExtraHeader()方法就是专门用来添加握手阶段的自定义HTTP请求头的,用法直接明了:
代码示例
#include <WebSocketsClient.h> #include <WiFi.h> // 配置WiFi和WebSocket参数 const char* WIFI_SSID = "你的WiFi名称"; const char* WIFI_PWD = "你的WiFi密码"; const char* WS_HOST = "api.sdasdaf.com"; const uint16_t WS_PORT = 80; const char* WS_PATH = "/abc/def"; WebSocketsClient wsClient; void setup() { Serial.begin(115200); // 连接WiFi WiFi.begin(WIFI_SSID, WIFI_PWD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi连接成功"); // 关键:设置自定义请求头,必须在begin()之前调用 wsClient.setExtraHeader("serialNo", "123456"); // 发起WebSocket连接 wsClient.begin(WS_HOST, WS_PORT, WS_PATH); // 可选:设置事件回调,处理连接状态和消息 wsClient.onEvent(wsEventHandler); } void loop() { wsClient.loop(); } // WebSocket事件处理回调 void wsEventHandler(WStype_t type, uint8_t* payload, size_t length) { switch(type) { case WStype_CONNECTED: Serial.println("WebSocket握手成功"); break; case WStype_DISCONNECTED: Serial.println("WebSocket连接断开"); break; case WStype_TEXT: Serial.print("收到消息:"); Serial.println((char*)payload); break; } }
注意事项
setExtraHeader()必须在begin()方法调用前执行,因为握手请求是在begin()时发送的,提前设置才能把自定义头加入握手的HTTP请求中- 如果需要添加多个自定义头,多次调用
setExtraHeader()即可,每次传入不同的键值对
二、使用ESPAsyncWebServer的客户端模式(可选)
如果你项目中已经在用ESPAsyncWebServer库,也可以用它的异步WebSocket客户端来实现,核心是在创建客户端实例时通过setExtraHeaders()传入头信息:
代码示例
#include <ESPAsyncWebServer.h> #include <WiFi.h> const char* WIFI_SSID = "你的WiFi名称"; const char* WIFI_PWD = "你的WiFi密码"; const char* WS_URL = "ws://api.sdasdaf.com/abc/def"; AsyncWebSocketClient* wsClient = nullptr; void setup() { Serial.begin(115200); WiFi.begin(WIFI_SSID, WIFI_PWD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi连接成功"); // 创建WebSocket客户端并设置自定义头 wsClient = new AsyncWebSocketClient(); wsClient->setExtraHeaders("serialNo: 123456"); // 注意格式是"键: 值" // 连接服务器 wsClient->connect(WS_URL); // 设置回调 wsClient->onEvent([](AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len) { if (type == AWS_EVT_CONNECT) { Serial.println("WebSocket连接成功"); } else if (type == AWS_EVT_DISCONNECT) { Serial.println("WebSocket连接断开"); } else if (type == AWS_EVT_DATA) { Serial.print("收到消息:"); Serial.write(data, len); Serial.println(); } }); } void loop() { if (wsClient) { wsClient->loop(); } }
内容的提问来源于stack exchange,提问作者Ahmad Muazam
相关产品推荐
相关产品推荐

