You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:20:16