Сервер websocket esp8266 и клиент sodcket.io в angular 7

Я использую esp8266 для запуска своего сервера websocket и angular 7 для запуска socket.io для запуска клиента websocket. Когда я запускаю приложение angular. Журналы в Arduino показывают Disconnected!. Я не уверен, чем это вызвано.

Ниже приведен боковой код angular для клиента.

import * as io from 'socket.io-client';
import { Observable } from 'rxjs/Observable';
import * as Rx from 'rxjs/Rx';
import { environment } from 'src/environments/environment';

@Injectable()
export class SocketServiceService {
  private socket;

  constructor() { }

  connect(): Rx.Subject<MessageEvent> {

    this.socket = io('ws://192.168.43.155:81');
    console.log("created server")
    let observable = new Observable(observer => {
        this.socket.on('message', (data) => {
          console.log("Received message from Websocket Server")
          observer.next(data);
        })
        return () => {
          this.socket.disconnect();
        }
    });
    let observer = {
        next: (data: Object) => {
            this.socket.emit('message', JSON.stringify(data));
            console.log("msg emited"+ data);
        },
    };
    return Rx.Subject.create(observer, observable);
  }

} 

это код esp8266

#include <Arduino.h>

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

ESP8266WiFiMulti WiFiMulti;

WebSocketsServer webSocket = WebSocketsServer(81);

#define USE_SERIAL Serial1

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {

    switch(type) {
        case WStype_DISCONNECTED:
            USE_SERIAL.printf("[%u] Disconnected!\n", num);
            break;
        case WStype_CONNECTED:
            {
                IPAddress ip = webSocket.remoteIP(num);
                USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);

                webSocket.sendTXT(num, "Connected");
            }
            break;
        case WStype_TEXT:
            USE_SERIAL.printf("[%u] get Text: %s\n", num, payload);

            break;
        case WStype_BIN:
            USE_SERIAL.printf("[%u] get binary length: %u\n", num, length);
            hexdump(payload, length);
            break;
    }

}

void setup() {
    USE_SERIAL.begin(115200);

    USE_SERIAL.setDebugOutput(true);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

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

    WiFiMulti.addAP("SSID", "passpasspass");

    while(WiFiMulti.run() != WL_CONNECTED) {
        delay(100);
    }

    webSocket.begin();
    webSocket.onEvent(webSocketEvent);
}

void loop() {
    webSocket.loop();
}

Пожалуйста, подскажите, что может пойти не так, любые указатели будут полезны.

1 ответ

Очень много просить кого-то действительно попытаться отладить это (для этого мне пришлось бы создать проект Angular, используя ваш код Angular, а также настроить эскиз ESP8266, используя ваш код Arduino), поэтому я не собираюсь попробовать, но вот пара предложений:

  1. Попробуйте настроить сервер WebSocket в Node, используя пример кода в документации socket.io-client. Если это сработает, значит, вы сузили проблему до кода ESP8266. Если он не работает таким же образом, значит, у вас проблема с вашим клиентом Angular.

  2. Если проблема в вашем коде Angular, я бы предложил использовать класс rsjx WebSocketSubject. Он дает вам полностью настроенный клиент WebSocket, работает очень хорошо и устраняет ваш низкоуровневый клиентский код веб-сокета.

Вот пример подключения к WebSocket, подписки на входящие сообщения и отправки исходящего сообщения:

connect() {
    this.webSocket = webSocket(environment.chatUrl);

    this.subscription = this.webSocket.subscribe(msg => {
      console.log('got message: ' + msg);
    },
    err => {
        this.setDisconnected();
        console.log('err!', err);
    },
      () => {
        console.log('websocket closed'));
        this.setDisconnected();
      }
    );

    this.webSocket.next({
      name: this.name
    });
  }

и вот отправка сообщения:


  sendMessage(msg: string) {
    if (this.connected) {
      this.webSocket.next(msg);
    }
  }

а вот отключение:

  private disconnect() {
    if (this.subscription) {
      this.webSocket.complete();
      this.subscription.unsubscribe();
      this.subscription = undefined;
      this.setDisconnected();
    }
  }
Другие вопросы по тегам