Сервер веб-сокетов esp8266 и клиент sodcket.io в угловой 7 - PullRequest
0 голосов
/ 16 октября 2019

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

следующий угловой код для клиента.

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 Ответ

0 голосов
/ 16 октября 2019

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

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

  2. Если проблема в вашем Angular-коде, я бы предложил использовать класс rsjx WebSocketSubject. Он дает вам полностью настроенный клиент WebSocket, работает очень хорошо и устранит ваш низкоуровневый код клиента 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();
    }
  }
...