问题描述
因此,我们一直在构建一些 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 并从那里开始使用。