Постоянное отключение ESP8266 SocketIOclient с Python WebServerSocket

Я пишу программу, которая повторяет сообщение, отправленное на сервер веб-сокетов на хост-машине. При запуске модуля ESP соединение устанавливается, но сразу же отключается, как показано на первом изображении. Первоначально я думал, что это может быть результатом брандмауэра хост-машин, однако, используя соединение с моими ноутбуками, я смог получить желаемое эхо. Является ли постоянное отключение результатом разных протоколов или чего-то мне не хватает?

WebSocketServer на хост-машине (смоделированный пример)

import asyncio

from autobahn.asyncio.websocket import WebSocketServerProtocol, \
    WebSocketServerFactory


class MyServerProtocol(WebSocketServerProtocol):

    def onConnect(self, request):
        print("Client connecting: {0}".format(request.peer))

    def onOpen(self):
        print("WebSocket connection open.")

    def onMessage(self, payload, isBinary):
        if isBinary:
            print("Binary message received: {0} bytes".format(len(payload)))
        else:
            print("Text message received: {0}".format(payload.decode('utf8')))

        # echo back message verbatim
        self.sendMessage(payload, isBinary)

    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))


if __name__ == '__main__':
    factory = WebSocketServerFactory("ws://127.0.0.1:9000")
    factory.protocol = MyServerProtocol

    loop = asyncio.get_event_loop()
    coro = loop.create_server(factory, '0.0.0.0', 9000)
    server = loop.run_until_complete(coro) 

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        server.close()
        loop.close()

ESP8266 смоделирован в arduinoWebSockets

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ArduinoJson.h>

#include <WebSocketsClient.h>
#include <SocketIOclient.h>

#include <Hash.h>

ESP8266WiFiMulti wiFiMulti;
SocketIOclient socketIO;

void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) {
    switch(type) {
        case sIOtype_DISCONNECT:
            Serial.printf("[IOc] Disconnected!\n");
            break;
        case sIOtype_CONNECT:
            Serial.printf("[IOc] Connected to url: %s\n", payload);
            socketIO.send(sIOtype_CONNECT, "/");
            break;
        case sIOtype_EVENT:
            Serial.printf("[IOc] get event: %s\n", payload);
            break;
        case sIOtype_ACK:
            Serial.printf("[IOc] get ack: %u\n", length);
            hexdump(payload, length);
            break;
        case sIOtype_ERROR:
            Serial.printf("[IOc] get error: %u\n", length);
            hexdump(payload, length);
            break;
        case sIOtype_BINARY_EVENT:
            Serial.printf("[IOc] get binary: %u\n", length);
            hexdump(payload, length);
            break;
        case sIOtype_BINARY_ACK:
            Serial.printf("[IOc] get binary ack: %u\n", length);
            hexdump(payload, length);
            break;
    }
}

void setup() {
    // Serial.begin(921600);
    Serial.begin(115200);

    //Serial.setDebugOutput(true);
    Serial.setDebugOutput(true);
    Serial.printf("[SETUP] starting up");

    Serial.println();
    Serial.println();
    Serial.println();

      for(uint8_t t = 4; t > 0; t--) {
          Serial.printf("[SETUP] BOOT WAIT %d...\n", t);
          Serial.flush();
          delay(1000);
      }

    // disable AP
    if(WiFi.getMode() & WIFI_AP) {
        WiFi.softAPdisconnect(true);
    }

    wiFiMulti.addAP("ssid", "password");

    //WiFi.disconnect();
    while(wiFiMulti.run() != WL_CONNECTED) {
        delay(5000);
        Serial.println("Retrying...");
    }

    String ip = WiFi.localIP().toString();
    Serial.printf("[SETUP] WiFi Connected %s\n", ip.c_str());

    // server address, port and URL
    socketIO.begin("local host address", 9000);
    // event handler
    socketIO.onEvent(socketIOEvent);
}

unsigned long messageTimestamp = 0;
//int attempts = 0;
void loop() {
    socketIO.loop();
}

Serial Monitor Output of the ESP8266 Connection output from Python WSS

, 👍1

Обсуждение

Во-первых, работает ли пример ESP8266 по умолчанию с вашим сервером Python? Лучше всего начать с этого в качестве ориентира. Затем, изменили ли вы какую-либо конфигурацию библиотеки по умолчанию, раскомментировали или закомментировали что-нибудь? На данный момент ни одно устройство не показывает, что соединение Websocket когда-либо было открыто, они просто показывают "отключено" или "закрыто", так что, вероятно, что-то произошло на этапе настройки, что заставило одну сторону отказаться от соединения. Попробуйте добавить #define DEBUG_ESP_PORT Serial в WebSockets.h (после Arduino.h inclusion), поэтому мы можем увидеть более подробное ведение журнала из библиотеки., @SoreDakeNoKoto

Привет @SoreDakeNoKoto , спасибо за ответ. После некоторого сна и более глубокого погружения я нашел [пост] (https://forum.arduino.cc/index.php?topic=522526.0 ) это наводило на мысль, что проблема была в библиотеке. В итоге я использовал [это] (https://github.com/gilmaimon/ArduinoWebsockets ) вместо этого. Лучшие, @John Mason


1 ответ


Лучший ответ:

1

После тестирования сервера на главной машине с помощью дополнительного компьютера я смог получить желаемый результат. Я бы заподозрил, что это проблема в библиотеке или неправильное использование / понимание. Я нашел сообщение, в котором говорилось, что проблема в библиотеке, и в итоге использовал эту библиотеку.

Используя пример реализации, я смог добиться желаемых результатов.

,