手机与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
相关产品推荐
相关产品推荐

