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

手机与Esp8266 NodeMcu实时音频传输的Arduino代码实现方法

手机浏览器通过WebSocket向ESP8266 NodeMCU实时传语音的Arduino实现

核心思路

ESP8266作为WebSocket服务器,手机浏览器通过WiFi连接后,调用浏览器MediaRecorder API捕获语音流,将音频分片通过WebSocket实时发送到模块,模块端接收后可按需做存储、转发或本地播放等处理。

所需库

在Arduino库管理器中安装以下库:

  • ESP8266WiFi(ESP8266核心库自带)
  • WebSocketsServer(直接搜索安装即可)

Arduino代码实现

#include <ESP8266WiFi.h>
#include <WebSocketsServer.h>

// WiFi配置信息
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// WebSocket服务端口
#define WEBSOCKET_PORT 81

// 初始化WebSocket服务器
WebSocketsServer webSocket = WebSocketsServer(WEBSOCKET_PORT);

// WebSocket事件回调函数
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
  switch(type) {
    case WStype_DISCONNECTED:
      Serial.printf("[%u] 客户端断开连接\n", num);
      break;
    case WStype_CONNECTED: {
        IPAddress ip = webSocket.remoteIP(num);
        Serial.printf("[%u] 客户端连接成功,IP: %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]);
        webSocket.sendTXT(num, "已连接到ESP8266语音服务器");
      }
      break;
    case WStype_BIN:
      // 接收二进制语音数据
      Serial.printf("[%u] 收到语音数据,长度: %u bytes\n", num, length);
      // 这里可添加自定义处理逻辑:比如写入SD卡、转发至其他设备等
      // 示例:打印前10个字节的十六进制值
      for(int i=0; i<min(length, 10); i++){
        Serial.printf("%02X ", payload[i]);
      }
      Serial.println();
      break;
    case WStype_TEXT:
      // 处理文本控制指令
      Serial.printf("[%u] 收到文本消息: %s\n", num, payload);
      break;
    default:
      break;
  }
}

void setup() {
  Serial.begin(115200);
  
  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功");
  Serial.print("ESP8266 IP地址: ");
  Serial.println(WiFi.localIP());

  // 启动WebSocket服务并绑定回调
  webSocket.begin();
  webSocket.onEvent(webSocketEvent);
}

void loop() {
  // 持续处理WebSocket客户端事件
  webSocket.loop();
  delay(10);
}

配套浏览器客户端示例(HTML+JS)

创建一个简单网页,在手机浏览器打开(确保手机和ESP8266在同一WiFi网络):

<!DOCTYPE html>
<html>
<head>
  <title>语音传输到ESP8266</title>
</head>
<body>
  <button id="startBtn">开始录音</button>
  <button id="stopBtn">停止录音</button>
  <script>
    // 替换为你的ESP8266实际IP地址
    const ws = new WebSocket('ws://192.168.xxx.xxx:81');
    let mediaRecorder;

    ws.onopen = () => {
      console.log("已连接到WebSocket服务器");
    };

    document.getElementById('startBtn').addEventListener('click', async () => {
      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
      mediaRecorder = new MediaRecorder(stream);
      // 每100ms发送一次音频分片,平衡实时性与传输压力
      mediaRecorder.start(100);

      mediaRecorder.ondataavailable = (event) => {
        if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {
          ws.send(event.data); // 发送二进制音频数据
        }
      };
    });

    document.getElementById('stopBtn').addEventListener('click', () => {
      mediaRecorder?.stop();
    });
  </script>
</body>
</html>

注意事项

  • 务必保证手机与ESP8266处于同一WiFi网络,替换代码中的WiFi信息和ESP8266 IP地址
  • ESP8266内存有限,避免一次性处理过大的音频数据块,可通过调整分片时间控制数据量
  • 若需要播放语音,可搭配VS1053等音频解码模块扩展功能

内容的提问来源于stack exchange,提问作者Sina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:35:20