Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Server accidentally throwing error: Invalid WebSocket frame: RSV2 and RSV3 must be clear #925

Open
taizhouchen opened this issue Dec 25, 2024 · 0 comments

Comments

@taizhouchen
Copy link

taizhouchen commented Dec 25, 2024

I am using sendBIN() to send audio data steam from a ESP32 client to a nodejs server. The audio data is captured through a i2s microphone. I create a xTask to keep watching on the audio buffer and send until it reaches a certain length (chunk size was set to 2000 byte in my case). But the server accidentally throwing error "Invalid WebSocket frame: RSV2 and RSV3 must be clear".

Here is the code of my xTask:

void AudioRecorder::_processAudioBuffTask(void* self)
{
        AudioRecorder* recorder = static_cast<AudioRecorder*>(self);
        uint8_t* chunk = (uint8_t*)malloc(SEND_CHUNK_SIZE);
        if (chunk == NULL) {
            recorder->print("Failed to allocate memory for chunk");
            vTaskDelete(NULL); // Exit task if memory allocation fails
            return;
        }
        while (true) {
            Serial.println("Process Task running...");
            if (recorder->_audio_buff.size() > SEND_CHUNK_SIZE && recorder->_audioDataComingCallback) {
                for (int i = 0; i < SEND_CHUNK_SIZE; i++) {
                    chunk[i] = recorder->_audio_buff.shift();
                }
                recorder->_audioDataComingCallback(chunk, SEND_CHUNK_SIZE);    //Send the data
            }
            // Handle remaining data in shutdown mode
            if(recorder->shutdownInProgress && recorder->_audio_buff.size() <= SEND_CHUNK_SIZE && recorder->_audioDataComingCallback){
                uint16_t size_left = recorder->_audio_buff.size();
                chunk = (uint8_t*)realloc(chunk, size_left);
                if (chunk == NULL) {
                    recorder->print("Failed to allocate memory for chunk");
                    break;
                }
                // uint8_t chunk[size_left]; // Adjust chunk size to match remaining buffer size
                for (size_t i = 0; i < size_left; i++) {
                    chunk[i] = recorder->_audio_buff.shift();
                }
                recorder->_audioDataComingCallback(chunk, size_left);
                break;
            }
            vTaskDelay(40 / portTICK_PERIOD_MS); // Adjust as needed
        }
        recorder->shutdownInProgress = false;
        free(chunk);
        recorder->print("Process Task Completed");
        if(recorder->_stopProcessTaskCallback != NULL) 
            recorder->_stopProcessTaskCallback();  // Send ending audio signal to the server
        recorder->_processAudioBuffTaskHandle = NULL;
        vTaskDelete(NULL); // Delete task when done
}

where the _audioDataComingCallback function simple:

void sendAudioChunk(uint8_t* data, size_t size) {
      if(webSocketsClient.isConnected()){
        webSocketsClient.sendBIN(data, size);
        webSocketsClient.loop();
      }else{
        Serial.println("Web socket server not connected.");
        stopRecording();
      }
    }

I doubt if this is caused by the call of webSocketsClient.loop() since it is called in the main thread loop. I have add webSocketsClient.loop() right after I call sendBIN(), but it won't solved the problem. Can anyone help me on that?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant