MQTT не удалось с состоянием -2 - PullRequest
0 голосов
/ 10 марта 2020

Я установил учетные данные WiFi и подключился по данным TCP. Wi-Fi подключается через MQTT, показывая, что не удалось установить соединение с сбойным состоянием -2 означает, что нет inte rnet. Также создавая одноименные hotspot и mqtt подписывайся topi c через данные tcp сервера. Вот пример кода

#include <ESP8266WiFi.h>
#include<SPI.h>
#include <PubSubClient.h>

#define LED 4

int port = 8888;
WiFiServer server(port);

//Enter your mqtt server configurations
const char* mqttServer = "xx.xx.xx.xx";    //Enter Your mqttServer address
const int mqttPort = 1883;       //Port number
const char* mqttUser = "xxxxxxxxx"; //User
const char* mqttPassword = "xxxxxxxxx"; //Password

WiFiClient espClient;
PubSubClient client(espClient);
IPAddress staticIP(192,168,4,1);   
IPAddress gateway(192,168,4,0);   
IPAddress subnet(255,255,255,0);

void setup() {
  delay(500);
  pinMode(LED,OUTPUT);
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.config(staticIP, gateway, subnet);  // (DNS not required)
  Serial.println(WiFi.SSID());
  Serial.println(WiFi.localIP());
  tcp_server_start();

}

void MQTTcallback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived in topic: ");
  Serial.println(topic);

  Serial.print("Message:");

  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Convert *byte to String
  }
   Serial.print(message);
  if(message == "#off") {digitalWrite(LED,LOW);}   //LED off
  if(message == "#on") {digitalWrite(LED,HIGH);} //LED on

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

void loop() {
  if (WiFi.status() == WL_CONNECTED){
    client.loop();
  }
  Serial.printf("Stations connected = %d\n", WiFi.softAPgetStationNum());
  delay(1000);
  WiFiClient client = server.available();
  if (client) {
    if(client.connected()){
      Serial.println("Client connected");
    }

    while(client.connected()){
      while(client.available()>0){
        // read data from the connected client
        String data = client.readStringUntil('\n');
        Serial.println(data);
        if (data.indexOf('|')>0 && data.indexOf(':')>0){
          String ssid = data.substring(0, data.indexOf("|"));
          String pass = data.substring(data.indexOf("|")+1, data.indexOf(":"));
          boolean res = wifi_connect(ssid.c_str(), pass.c_str());
          if (res == true){
            client.write("SUCCESS");
          } else {
            client.write("WRONG INPUT");  
          }
        }
        if (data.indexOf("SL1")>=0){
          const char* hotspot = data.c_str();
          if (WiFi.status() == WL_CONNECTED){
            client.write("SUCCESS");
            mqtt_connect(data.c_str());
            create_access_point(data.c_str());
          } else {
            client.write("WRONG INPUT");
          }
        } else if (data == "relay_on"){
          digitalWrite(LED,HIGH);
          client.write("SUCCESS");
        } else if (data == "relay_off"){
          digitalWrite(LED,LOW);
          client.write("SUCCESS");
        }
      }
    }
    client.stop();
    Serial.println("\nClient disconnected");    
  }
}

void create_access_point(const char* hotspot){
  Serial.print("Setting Soft Access Point ... ");
  boolean result = WiFi.softAP(hotspot, "88888888");
  if(result == true){
    Serial.println("Ready");
  } else{
    Serial.println("Failed!");
  }
}

boolean wifi_connect(const char* ssid, const char* password){
  WiFi.begin(ssid, password);
  delay(500);
  for (int i = 0; i<20; i++){
    if (WiFi.status() == WL_CONNECTED){
      Serial.println("Connected to WiFi");
      return true;
    }
    Serial.println("Connecting to WiFi...");
    delay(500);
  }
  return false;
}



void tcp_server_start(){
  server.begin();
  Serial.println("Open Telnet and connect to IP: ");
  Serial.println(WiFi.localIP());
  Serial.println("on port");
  Serial.println(port);
  create_access_point("ARNABESP8266");
}

void mqtt_connect(const char* topic_name){
  client.setServer(mqttServer, mqttPort);
  client.setCallback(MQTTcallback);
  delay(500);

  for (int i = 0; i<20; i++) {
    Serial.println("Connecting to MQTT...");
    client.connect("ESP8266", mqttUser, mqttPassword);
      if (client.connected()){
        Serial.println("connected");
        break;
      } else {
        Serial.print("failed with state ");
        Serial.println(client.state());  //If you get state 5: mismatch in configuration

    }
  }

  client.publish(topic_name, "device_notification");
  client.subscribe(topic_name);
}

На самом деле, что я хочу, я хочу сделать все через TCP, например, подключиться к WiFi, установить точку доступа и подписаться на MQTT в качестве имени точки доступа hotpost. Я думаю, что может быть проблема с подключением WiFi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...