ESP8266未返回有效负载或未连接到node.js express.js服务器上的socket.io

时间:2019-06-27 18:58:58

标签: node.js socket.io arduino arduino-esp8266

我正在socket.ionode.js下运行express.js服务器。从iOS或Android应用程序连接时,它允许连接和交互。

但是,当我们从ESP8266设备尝试相同操作时,它会在Serial Monitor控制台中返回以下日志:


启动与服务器http://192:168.1.6:4000的套接字连接


* WM:释放分配的参数!  ~~~~~~~~~~~~~~~~~~  {{正在监听WebSocket事件}}  ~~~~~~~~~~~~~~~~~~  下午打开,输入:2 0

------ webSocketEvent ------  webSocketEvent类型:1  有效负载类型:WStype_DISCONNECTED  有效负载:{}  ------结束webSocketEvent ------

~~~~~~~~~~~~~~~~~~  {{正在监听WebSocket事件}}  ~~~~~~~~~~~~~~~~~

------ webSocketEvent ------  webSocketEvent类型:1  有效负载类型:WStype_DISCONNECTED  有效负载:{}  ------结束webSocketEvent ------

在服务器端,我们可以看到这样的日志:

节点应用程序在端口4000上运行

新客户端:连接请求 套接字连接ID:Zt7MusE6D44t3S1oAAAA

新客户端:连接请求 套接字连接ID:hxmYDUARQcw3aoBPAAAB

新客户端:连接请求 套接字连接ID:0OZL_zLhjVfzGBrKAAAC

新客户端:连接请求 套接字连接ID:u4v8iZYSJKk6x50IAAAD

新客户端:连接请求 套接字连接ID:Qo_KEh9kC-Byy-wXAAAE

设备已断开连接:Zt7MusE6D44t3S1oAAAA

新客户端:连接请求 套接字连接ID:jM8iBVVPJrrGnar8AAAF


#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <WebSockets.h>
#include <WebSocketsClient.h>

#define USE_SERIAL Serial

WebSocketsClient webSocket;

String ap = "ESP8266";
const char *pass = "ESP1234";
String ap2;
uint8_t mac[6];
char const macStr[19] = {0};
// const String host = "website.com";
int current_stat = 0;
String GetMyMacAddress() {
uint8_t mac[6];
char macStr[18] = {0};
WiFi.macAddress(mac);
// sprintf(macStr, "%02X%02X%02X%02X%02X%02X", mac[0],  mac[1], mac[2], mac[3], mac[4], mac[5]); // no :'s
sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0],  mac[1], mac[2], mac[3], mac[4], mac[5]);  // with :'s
return  String(macStr);
}

String myMacAddress = GetMyMacAddress();

const int reset_pin = 5;
const int pin = 0;
String last_state = "0";

void setup() {
  Serial.begin(9600);
  WiFiManager wifiManager;  //WiFiManager -- Local intialization.

  Serial.setDebugOutput(true);
  USE_SERIAL.setDebugOutput(true);

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

  pinMode(reset_pin, INPUT);

  pinMode(pin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);

  ap2 = ap + "-" + myMacAddress;

  //std::string ap2;
  char *macStr = new char[ap2.length() + 1 ];
  digitalWrite(pin, LOW);
  digitalWrite(LED_BUILTIN, HIGH);

  //fetches ssid and pass from eeprom and tries to connect
  //if connect fails it starts an access point with the specified name
  //here  "AutoConnectAP" and goes into a loop awaiting configuration

  wifiManager.autoConnect((const char*)ap2.c_str(), pass);

  //if you get here you have connected to the WiFi
  Serial.println();
  Serial.println("--------- WiFi Status ----------");
  Serial.println("Yeey!!! Connected to Wifi Network");
  Serial.print("ap2: ");
  Serial.print(ap2);
  Serial.println(" (String)");
  Serial.print("myMacAddress: ");
  Serial.print(myMacAddress);
  Serial.println(" (String)");
  Serial.println("------- End Wifi Status ---------");
  Serial.println();

  webSocket.onEvent(webSocketEvent);

  // Using Begin Method (to include Protocol)
  // ----------------------------------------
  String strPath = "/socket.io/?EIO=3";
  String strProtocol = "http";
  // webSocket.begin((char *)     IPAddress(192,168,1,6).toString().c_str(), 4000, (char *) strPath.c_str(), (char *) strProtocol.c_str());

  // Using beginSocketIO Method
  // --------------------------
  // Pointer Method Allows SocketIO and Protocol
  webSocket.beginSocketIO((char *) IPAddress(192,168,1,6).toString().c_str(), 4000, (char *) strPath.c_str(), (char *) strProtocol.c_str());

  Serial.println("-----------------------------------------------------------------");
  Serial.println("Initiating Socket Connection with Server http://192:168.1.6:4000");
  Serial.println("-----------------------------------------------------------------");
  // tryToConnectToServer();
}

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
  Serial.println();
  Serial.println("------ webSocketEvent ------");
  Serial.print("webSocketEvent Type: ");
  Serial.println(type);
  Serial.print("Payload Type: ");

  if (type == WStype_TEXT) {
    Serial.println("WStype_TEXT");
  } else if (type == WStype_BIN) {
    Serial.println("WStype_BIN");
  } else if (type == WStype_ERROR) {
    Serial.println("WStype_ERROR");
  } else if (type == WStype_DISCONNECTED) {
    Serial.println("WStype_DISCONNECTED");
  } else if (type == WStype_CONNECTED) {
    Serial.println("WStype_CONNECTED");
  }
  Serial.print("Payload: {");
  for (int i = 0; i < length; i++) {
    Serial.print((char) payload[i]);
  }
  Serial.print("}");
  Serial.println();

  Serial.println("------ End webSocketEvent ------");
  Serial.println();
}

void tryToConnectToServer() {
  Serial.println("~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~");
  Serial.println("{{ Listening for WebSocket Event }}");
  Serial.println("~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~");
  delay(3000);
}

void loop() {
  // Serial.println("Input pin status before reset");
  // Serial.println(digitalRead(reset_pin));
  if (digitalRead(reset_pin) == LOW) {
    Serial.println("Resetting");
    Serial.print("Input Pin status: ");
    Serial.println(digitalRead(reset_pin));
    Serial.println("============");

    pinMode(reset_pin, OUTPUT);

    digitalWrite(reset_pin, HIGH);
    pinMode(reset_pin, INPUT);

    WiFi.disconnect();
    delay(500);
    ESP.restart();
  } else {
    webSocket.loop();
  }
//*********************************************************************
  tryToConnectToServer();
}

用于连接iOS设备,Android设备和ESP8266设备的服务器端日志均相似。但是,如上所述,在客户端和服务器日志中,它都显示客户端无法连接。

服务器日志显示连接ID,但未进入connect事件。但是,它会暂停一段时间并显示断开连接事件。

在客户端(ESP8266),它不显示任何有效负载,并显示WStype_DISCONNECTED

0 个答案:

没有答案