我们的董事会对发布到我们的 MQTT 经纪人没有反应?

问题描述

因此,我们一直在构建一些 arduino 代码来对某些主题的发布做出反应。然而,虽然我们可以在代理接口上看到我们的代码中进行的发布,但代码似乎没有看到我们在接口上进行的任何发布。所以基本上:我们的发布工作但我们的订阅似乎没有这样做。

我们通过 ws 端口 8000 连接到 HIVEMQ 网络代理 http://www.hivemq.com/demos/websocket-client/,我们的代码连接到 tcp 端口。我们使用的是 Wemos Board,它连接到“SmartRobotCarKit V3”。然而,我不认为硬件(汽车)太重要了,因为没有它我们也无法让它工作。

感谢任何帮助!

我们的代码

//Fahrzeugsteuerung mit MQTT
// Dienstag,20.07.2021

#include <ESP8266WiFi.h>                            //importierte Bibliotheken
#include <PubSubClient.h>

//Festlegen der Konstanten für die Verbindungen
const char* ssid = "FRITZBox";                //Netzwerk-Daten
const char* password =  "FRITZBoxPASSWORD";

const char* mqttServer = "broker.hivemq.com";       //MQTT-Server-Daten
const int mqttPort = 1883;
const char* mqttUser = "MQTTuser";
const char* mqttPassword = "MQTTuser!1";

//L298-Modul-Pins
#define ENA D5
#define ENB D6
#define IN1 D7  //front left wheel
#define IN2 D8  //back right wheel
#define IN3 D9  //back left wheel
#define IN4 D11 //front right wheel

WiFiClient espClient;
PubSubClient client(espClient);

void forward(){ 
  digitalWrite(ENA,HIGH); //enable L298n A channel
  digitalWrite(ENB,HIGH); //enable L298n B channel
  digitalWrite(IN1,HIGH); //set IN1 hight level
  digitalWrite(IN2,LOW);  //set IN2 low level
  digitalWrite(IN3,LOW);  //set IN3 low level
  digitalWrite(IN4,HIGH); //set IN4 hight level
}

void back(){
  digitalWrite(ENA,HIGH);
  digitalWrite(ENB,HIGH);
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);
}

void left(){
  digitalWrite(ENA,LOW);
  digitalWrite(IN4,HIGH); 
}

void right(){
  digitalWrite(ENA,HIGH);
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,LOW);
}

void stopcar(){
  digitalWrite(ENA,LOW);
  digitalWrite(ENB,LOW);
}

void controll(char* topic,byte* payload,unsigned int length) {
  Serial.print("Nachricht erhalten in: ");
  Serial.println(topic); 
  Serial.print("Nachricht:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }

  char* topicforwardpressed = "hsanhalt/dvm/forwardsbutton-pressed";
  char* topicforwardreleased = "hsanhalt/dvm/forwardsbutton-released";
  char* topicleftpressed = "hsanhalt/dvm/leftbutton-pressed";
  char* topicleftreleased = "hsanhalt/dvm/leftbutton-released";
  char* topicrightpressed = "hsanhalt/dvm/rightbutton-pressed";
  char* topicrightreleased = "hsanhalt/dvm/rightbutton-released";
  char* topicbackpressed = "hsanhalt/dvm/backwardsbutton-pressed";
  char* topicbackreleased = "hsanhalt/dvm/backwardsbutton-released";
  
  char* trigger = topic;
  
  if(strcmp(topicforwardpressed,trigger) ==0){
    forward();
  }
  if(strcmp(topicforwardreleased,trigger) ==0){
    stopcar();
  }
  if(strcmp(topicleftpressed,trigger) ==0){
    left();
  }
  if(strcmp(topicleftreleased,trigger) ==0){
    stopcar();
  }
  if(strcmp(topicrightpressed,trigger) ==0){
    right();
  }
  if(strcmp(topicrightreleased,trigger) ==0){
    stopcar();
  }
  if(strcmp(topicbackpressed,trigger) ==0){
    back();
  }
  if(strcmp(topicbackreleased,trigger) ==0){
    stopcar();
  } 
}

void setup() { // Todo serial begin nach initialisierung? vor wifi begin
  pinMode(IN1,OUTPUT);//before useing io pin,pin mode must be set first 
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(ENA,OUTPUT);
  pinMode(ENB,OUTPUT);

  Serial.begin(115200);//open serial and set the baudrate
  WiFi.begin(ssid,password); 
  while (WiFi.status() != WL_CONNECTED) { //Solange probieren,bis die Connection hergestellt wurde
    delay(500);
    Serial.println("Verbinden mit Wifi-Netzwerk");
  }
  Serial.println("Internetverbindung erfolgreich");

  client.setServer(mqttServer,mqttPort); // DeFinition des verwendeten Servers und Port
  client.setCallback(controll); // Festlegen der Funktion,die aufgerufen wird,wenn eine Nachricht empfangen wird
  while (!client.connected()) { // Solange versuchen,bis eine Connection aufgebaut wurde
    Serial.println("Verbinden mit MQTT-Server..."); 
    if (client.connect("ESP8266Client",mqttUser,mqttPassword )) { 
      Serial.println("Verbunden");   
    } else { 
      Serial.print("Fehler beim Verbinden ");
      Serial.print(client.state());
    }
  }
  
}

void loop(){
  client.loop();
  //client.publish("hsanhalt/dvm/forwardsbutton-pressed","test");
  delay(10);
  client.subscribe("hsanhalt/dvm/forwardsbutton-pressed");
  client.subscribe("hsanhalt/dvm/forwardsbutton-released");
  client.subscribe("hsanhalt/dvm/leftbutton-pressed");
  client.subscribe("hsanhalt/dvm/leftbutton-released");
  client.subscribe("hsanhalt/dvm/backwardsbutton-pressed");
  client.subscribe("hsanhalt/dvm/backwardsbutton-released");
  client.subscribe("hsanhalt/dvm/rightbutton-pressed");
  client.subscribe("hsanhalt/dvm/rightbutton-released");
}

解决方法

您不需要订阅 loop(),连接后只需订阅一次,并且您应该检查 WiFi 和 MQTT 连接是否处于活动状态。

我建议您从 sample shown here 开始,将其修改为 WiFi 并从那里开始使用。