From b4dd20950bba235a8b3c167c9ac327b1ab6eb277 Mon Sep 17 00:00:00 2001 From: Lincoln Roth Date: Sat, 17 Feb 2024 18:17:49 -0800 Subject: [PATCH] websockets from esp32 to server work, very chunky in other direction --- 01OS/01OS/clients/esp32/playback.ino | 110 ++++++++++++++++++++-- 01OS/01OS/clients/esp32/websocket_test.py | 33 +++++++ 2 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 01OS/01OS/clients/esp32/websocket_test.py diff --git a/01OS/01OS/clients/esp32/playback.ino b/01OS/01OS/clients/esp32/playback.ino index 61c800c..3dc91c1 100644 --- a/01OS/01OS/clients/esp32/playback.ino +++ b/01OS/01OS/clients/esp32/playback.ino @@ -3,6 +3,14 @@ #include #include +#include + +#include +#include +#include + +#include + #define CONFIG_I2S_BCK_PIN 19 #define CONFIG_I2S_LRCK_PIN 33 #define CONFIG_I2S_DATA_PIN 22 @@ -17,6 +25,24 @@ uint8_t microphonedata0[1024 * 70]; int data_offset = 0; +WebSocketsClient webSocket; + + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + Serial.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for (uint32_t i = 0; i < len; i++) { + if (i % cols == 0) { + Serial.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + Serial.printf("%02X ", *src); + src++; + } + Serial.printf("\n"); +} + + + void InitI2SSpeakerOrMic(int mode) { esp_err_t err = ESP_OK; @@ -25,11 +51,11 @@ void InitI2SSpeakerOrMic(int mode) { .mode = (i2s_mode_t)(I2S_MODE_MASTER), .sample_rate = 16000, .bits_per_sample = - I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB + I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB .channel_format = I2S_CHANNEL_FMT_ALL_RIGHT, #if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 1, 0) .communication_format = - I2S_COMM_FORMAT_STAND_I2S, // Set the format of the communication. + I2S_COMM_FORMAT_STAND_I2S, // Set the format of the communication. #else // 设置通讯格式 .communication_format = I2S_COMM_FORMAT_I2S, #endif @@ -64,12 +90,71 @@ void InitI2SSpeakerOrMic(int mode) { I2S_CHANNEL_MONO); } +void speaker_play(uint8_t *payload, uint32_t len){ + size_t bytes_written; + InitI2SSpeakerOrMic(MODE_SPK); + i2s_write(SPEAKER_I2S_NUMBER, payload, len, + &bytes_written, portMAX_DELAY); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch (type) { + case WStype_DISCONNECTED: + Serial.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + Serial.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + Serial.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + Serial.printf("[WSc] get binary length: %u\n", length); + // hexdump(payload, length); + speaker_play(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } + +} + +void websocket_setup() { + Serial.begin(115200); + WiFi.begin("Soundview_Guest", ""); + while (WiFi.status() != WL_CONNECTED){ + delay(500); + Serial.println("connecting to WiFi"); + } + Serial.println("connected to WiFi"); + webSocket.begin("192.168.68.71", 9001, "/"); + webSocket.onEvent(webSocketEvent); + // webSocket.setAuthorization("user", "Password"); + webSocket.setReconnectInterval(5000); + +} void setup() { M5.begin(true, false, true); M5.dis.drawpix(0, CRGB(128, 128, 0)); + websocket_setup(); delay(2000); } + void loop() { if (M5.Btn.isPressed()) { data_offset = 0; @@ -86,10 +171,21 @@ void loop() { if (M5.Btn.isReleased() || data_offset >= 71679) break; // delay(60); } - size_t bytes_written; - InitI2SSpeakerOrMic(MODE_SPK); - i2s_write(SPEAKER_I2S_NUMBER, microphonedata0, data_offset, - &bytes_written, portMAX_DELAY); + + Serial.println(data_offset); + + int chunk_size = 1004; + chunk_size = 4096; + + webSocket.sendBIN(microphonedata0, data_offset); + + // size_t bytes_written; + // InitI2SSpeakerOrMic(MODE_SPK); + // i2s_write(SPEAKER_I2S_NUMBER, microphonedata0, data_offset, + // &bytes_written, portMAX_DELAY); + } M5.update(); -} \ No newline at end of file + webSocket.loop(); + +} diff --git a/01OS/01OS/clients/esp32/websocket_test.py b/01OS/01OS/clients/esp32/websocket_test.py new file mode 100644 index 0000000..71c6813 --- /dev/null +++ b/01OS/01OS/clients/esp32/websocket_test.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import asyncio +import simpleaudio as sa +from websockets.server import serve + + +def divide_chunks(l, n): + # looping till length l + for i in range(0, len(l), n): + yield l[i:i + n] + + +async def echo(websocket): + async for message in websocket: + try: + play_obj = sa.play_buffer(bytearray(message), 1, 2, 16000) + play_obj.wait_done() + + x = list(divide_chunks(bytearray(message), 1000)) + for i in x: + await websocket.send(i) + + except Exception as e: + print('fail') + + + +async def main(): + async with serve(echo, "0.0.0.0", 9001): + await asyncio.Future() # run forever + +asyncio.run(main()) \ No newline at end of file