1、現象描述:在使用ESP官方組件庫提供的esp_websocket_client庫時,發現一個BUG:在多線程併發訪問的環境下特別是ESP32 S3的雙核架構中,例如一個任務負責向服務器端發送數據,另一個默認websocket任務在ondata事件回調中讀取接受數據時。如果網絡出現波動延遲,導致底層網絡數據接收和發送超時,則會觸發erro事件。接收線程和發送線程同時報錯並觸發erro事件時,都會調用該組件庫的同一個方法。即中斷websocket連接的方法。在該方法中會斷開底層Tcp連接並釋放協議棧資源。但是這個方法並沒有做任何保護機制(鎖),導致多線程併發訪問時會發生資源競爭,最終導致協議棧資源在同一個方法中重複釋放,最終導致內存報錯,整個程序崩潰。
解決辦法:在發送線程中所調用的發送接口中,註釋掉多線程併發訪問可能會導致程序崩潰中斷連接方法。即發送失敗不做清理資源的操作,而是通過觸發erro事件,並在應用層的事件回調處理中再調用斷開連接的api來清理資源,並重新建立連接。直接避免接收線程和發送線程的併發訪問。
2、現象描述:同樣的在同時兩個線程併發,一個接收數據,一個發送數據。會隨機性的,不確定的導致內存訪問空指針錯誤,而導致程序崩潰。崩潰為止在send接口底層調用ssl重新認證的方法中。
解決辦法:進入menuconfig設置,關閉websocket關於SSL重新認證的配置選項即可。