0

我正在使用 esp8266 来运行我的 websocket 服务器和 angular 7 来运行 socket.io 来运行 websocket 客户端。当我运行角度应用程序时。Arduino 中的日志显示已断开连接!。我不确定是什么原因造成的。

以下是客户端的角度代码。

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();
}

请提出可能出现的问题,任何指示都会有所帮助。

4

1 回答 1

0

要求某人实际尝试调试这个问题很多(为此,我必须使用您的 Angular 代码创建一个 Angular 项目,并使用您的 Arduino 代码设置一个 ESP8266 草图),所以我不是会尝试,但这里有几个建议:

  1. 尝试使用 socket.io-client 文档中的示例代码在 Node 中设置 WebSocket 服务器。如果可行,那么您已将问题缩小到 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();
    }
  }
于 2019-10-16T19:58:49.813 回答