esp 8266はtcp serverとして、クライアントが接続してから切断します。このように何回も繰り返します。6回目はもうつながりません。


  • は、ESP 8266のRTOS SDK 1.5バージョンでテストしたところ、同じクライアントが連続的に切断され、再接続されてから切断されたことが分かりました。このように5回繰り返しました。6回目には、もう接続できなくなりました。表示サーバは接続を拒否しました。
  • が使用するクライアントは、コンピュータ端末のtcp test toolsであり、直接192.168.4.1の傍受ポートに接続されている。
  • その後、SDKの下地層のespconn.cn、espconn_を分析した。tcp.cとtcp.cコードは、問題の所在を発見しました。元々はespconnを呼び出していました。acceptは以前はespconn_を呼び出していませんでした。initによると、公式の例示的なコードの中にはespconn_はありません。initは、呼び出しがないと、EspMboxメッセージのキューが作成できませんので、後はOSを使えません。postがメッセージを送るので、クライアントが接続を切断しても、Serverはまだリソースを解放できません!!
    void ICACHE_FLASH_ATTR espconn_init(void)
    {
        if (sys_mbox_new(&EspMbox, ESPCONN_MBOX_SIZE) != ERR_OK) {
            LWIP_ASSERT("failed to create espconn_thread mbox", 0);
        }
    
    #if ESPCONN_LOCKING
    
        if (sys_mutex_new(&lock_espconn_task) != ERR_OK) {
            LWIP_ASSERT("failed to create lock_espconn_task", 0);
        }
    
    #endif /* ESPCONN_LOCKING */
    
        sys_mutex_new(&EspMsgMutex);
    
        if (EspMsgMutex == NULL) {
            printf("EspMsgMutex create fail
    "
    ); } else { printf("EspMsgMutex created
    "
    ); } sys_thread_new(ESPCONN_THREAD_NAME, espconn_thread, NULL, ESPCONN_THREAD_STACKSIZE, ESPCONN_THREAD_PRIO); } #
    結論:
    実はespconnを呼び出しません。initなら、tcp serverも仕事ができます。ポートの傍受やデータの授受ができないというわけではありませんが、clientが何度も接続を切断し続けているだけで上記の問題が発生します。しかし、ネット上の多くの白さんは暇な時に何もしないで、接続を切ってから接続を再開しますか?すべてクライアントの接続は一回で接続できます。後はもう大丈夫です。使えばいいです。もう一回esp 8266を再起動しても大丈夫です。