Arduino не подключается к локальному брокеру MQTT
У меня есть Arduino Mega с Ethernet, подключенная к маршрутизатору кабелем. Также у меня есть компьютер, подключенный к маршрутизатору (по Wi-Fi), на котором также установлен локальный брокер MQTT (mosquitto). Хотя с Ethernet-соединением Arduino все в порядке, с MQTT-соединением все в порядке: я получаю код возврата -2
Это полный код, есть несколько функций, но инициализация MQTT не работает:
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h> // Библиотека для MQTT
byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0x3A, 0xC4 };
byte ip[] = { 192, 168, 1, 100 };
byte gateway[] = { 192, 168, 1, 2 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetClient ethClient;
PubSubClient mqttClient(ethClient);
const char *MQTT_BROKER_ADRESS = "192.168.1.101";
const uint16_t MQTT_PORT = 1883;
const char *MQTT_CLIENT_NAME = "mqttx_7c0a0ed3";
void SuscribeMqtt()
{
mqttClient.subscribe("hello/world");
}
void OnMqttReceived(char *topic, byte *payload, unsigned int length)
{
Serial.print("Received on ");
Serial.print(topic);
Serial.print(": ");
String content = "";
for (size_t i = 0; i < length; i++)
{
content.concat((char)payload[i]);
}
Serial.print(content);
Serial.println();
}
void InitMqtt()
{
mqttClient.setServer(MQTT_BROKER_ADRESS, MQTT_PORT);
mqttClient.setCallback(OnMqttReceived);
}
void ConnectMqtt()
{
Serial.print("Starting MQTT connection...");
if (mqttClient.connect(MQTT_CLIENT_NAME))
{
SuscribeMqtt();
mqttClient.publish("connected","hello/world");
}
else
{
Serial.print("Failed MQTT connection, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
void HandleMqtt()
{
if (!mqttClient.connected())
{
ConnectMqtt();
}
mqttClient.loop();
}
void CheckLinkStatus() {
auto link = Ethernet.linkStatus();
Serial.print("Link status: ");
switch (link) {
case Unknown:
Serial.println("Unknown");
break;
case LinkON:
Serial.println("ON");
break;
case LinkOFF:
Serial.println("OFF");
break;
}
delay(1000);
}
void setup() {
// Вы можете использовать Ethernet.init(pin) для настройки вывода CS
//Ethernet.init(10); // Большинство шилдов Arduino
Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
delay(1500);
InitMqtt();
}
// поместите сюда ваш основной код для многократного запуска:
void loop() {
CheckLinkStatus();
HandleMqtt();
}
Я выполнил ping с IP-адреса ПК (192.168.1.101) на IP-адрес Arduino (192.168.1.100), и все в порядке. В чем может быть проблема?.
@bardulia, 👍1
Обсуждение2 ответа
Проведя небольшое исследование, вы увидите, что второй код возврата:
2 Соединение отклонено: идентификатор клиента не разрешен сервером.
Я предполагаю, что вы забыли добавить данные для входа в код или код не работает, потому что идентификатор клиента не является строкой c. Попробуйте что-то вроде этого (замените соответствующими значениями):
if (client.connect(clientId.c_str(), mqttUsername, mqttPassword)){
Это был брандмауэр при запуске mosquitto, но все равно спасибо!, @bardulia
Проблема исходила от локального брокера mosquitto, который блокировался брандмауэром Windows 10. Когда я запустил mosquitto с правильными разрешениями для его папки (чтение и запись для «всех пользователей») и с правильным файлом конфигурации mosquitto, появилось следующее окно, и я щелкнул, чтобы разрешить как частные, так и общедоступные подключения:
Я также использую следующий пакетный файл для загрузки mosquitto, и он всегда работает:
cd "C:\Program Files\mosquitto"
del mosquitto.log
mosquitto -v -c mosquitto.conf
Это содержимое моего конфигурационного файла mosquitto:
listener 1883
allow_anonymous true
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
log_dest file C:\Program Files\mosquitto\mosquitto.log
Теперь я могу использовать MQTT из Arduino, подключенного к маршрутизатору.
- Arduino Ethernet Shield при использовании контактов Arduino Mega
- Удаленная загрузка кода на плату Arduino через интернет
- Arduino Ethernet Shield 2 застрял на EthernetServer::begin()
- Arduino Ethernet Shield 2: Как автоматически определить MAC-адрес?
- Как сделать веб сервер arduino через USB? Без ethernet shield и чипа wifi
- Использовать Ethernet Shield и RFID rc522 вместе на мега
- MQTT на nano с Ethernet Shield не работает
- Как отправить информацию с сайта на ардуино?
Что в логах MQTT-брокера?, @StarCat
@StarCat, как мне проверить файл журнала? Я не могу найти его., @bardulia
@StarCat, может быть, я не могу его найти, потому что использую mosquitto как услугу? также я не могу изменить файл conf, @bardulia
порт открыт в брандмауэре?, @Juraj
Возможно, найдите приложение, которое вы можете запустить на другом компьютере или телефоне, чтобы убедиться, что вы можете подключиться к серверу mosquito на ПК., @timemage
Наконец-то я нашел проблему! Как указал @Juraj, возникла проблема с mosquitto, который был заблокирован брандмауэром Windows 10. Я уверен в этом, потому что, когда я выполнил mosquito с разрешениями и правильно использовал cmd, окна брандмауэра Windows выскочили, а затем я разблокировал его, и после этого Arduino смог подключиться, @bardulia
@timemage Я установил MQTT Explorer на ПК, очень удобно проверять трафик. Спасибо!, @bardulia
@StarCat Наконец-то я смог правильно запустить mosquitto, и теперь я пишу журнал в текстовый файл. В моем ответе я поместил весь код. Спасибо., @bardulia