我有一个 ESP8266。在此板上,我运行最新版本的 MicroPython 固件 (1Mib)。
我有一个带有 2 个按钮的 Java Vaadin Web 应用程序。一个按钮用于发布,LED 应关闭,一个按钮用于打开 LED。
ESP 上的 MicroPython 程序运行良好,直到我从 Vaadin 应用程序发布。我得到 OSError -1,没有其他参数。
一些信息: 代理:dockerhub localhost 中的 hivemq 闪烁程序:Thonny
这是我的MicroPython代码:(为了数据保护我删除了ssid和密码->客户端成功连接wifi)
import machine
from umqtt.simple import MQTTClient
import network
import time
ssid = "ssid"
password = "password"
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected():
pass
print("hallo")
MQTT_TOPIC = "led/control"
LEDstatus = "off"
ClientID = "Alabama"
LED_PIN = machine.Pin(2, machine.Pin.OUT)
LED_PIN.value(1)
def mqtt_callback(topic, msg):
if msg.decode() == "on":
LEDstatus = "on"
LED_PIN.value(0)
elif msg.decode() == "off":
LEDstatus = "off"
LED_PIN.value(1)
client = MQTTClient(b"Alabama", b"192.168.2.125", 1883)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(MQTT_TOPIC)
while True:
try:
client.check_msg()
time.sleep(10)
except OSError as e:
print("Fehler beim Empfangen der Nachricht:")
print(e.args)
client.disconnect()
break
这是我在 Java Vaadin 中的订阅发布方法:
public void publishToDashboard(String topic, String message, String clientID)
throws ExecutionException, InterruptedException, JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, String> payload = new HashMap<>();
payload.put("clientID", clientID);
payload.put("message", message);
String strPayload = objectMapper.writeValueAsString(payload);
Mqtt5Publish mqttMessage = Mqtt5Publish.builder()
.topic(topic)
.payload(strPayload.getBytes())
.contentType("json")
.qos(MqttQos.AT_LEAST_ONCE)
.build();
this.client.publish(mqttMessage).get();
System.out.println("published");
}
对于 Java MQTT 客户端,我正在使用 hivemq 中的这个客户端。
这是我在单击按钮时调用的方法:
private void publishLED(ClickEvent<Button> event, String msg, String clientID) {
CompletableFuture.runAsync(() -> {
try {
client.publishToDashboard("led/control", msg, clientID);
} catch (ExecutionException | InterruptedException | JsonProcessingException ex) {
throw new RuntimeException(ex);
}
});
}
这是我第一个使用 ESP8266 和 MQTT 的项目,我确实搜索了 5 个小时来查找此异常,但我没有找到任何东西。
如果缺少任何信息,请告诉我。
感谢您尝试帮助我。 :)
祝你好运
尝试:使用按钮从 Web 应用程序发布消息 预期:ESP8266 通过订阅捕获消息并打开或关闭 LED 发生了什么:OSError -1
找到了解决方案。
问题出在客户名称上。不要在 JavaMQTTClient 和 Python 程序中使用客户端名称。
对于 JavaMQTTClient,您可以使用 UUID 作为示例。