Невозможно настроить идентификатор клиента MQTT с помощью библиотеки Adafruit MQTT.
Я использую библиотеку MQTT, созданную Adafruit и расположенную здесь, и сама библиотека работает прекрасно, однако я нахожу я не могу редактировать идентификатор клиента или настроить PINGRESP. Код, который я сейчас использую, можно увидеть ниже —
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, "10.116.10.191", 1883);
Когда клиент подключается к MQTT Broker, идентификатор клиента превращается в случайную строку букв, цифр и символов, как показано ниже —
1534023607: Client ]7llG5K6J4=^tPHJHqgTUFc<Ep^m3vJ`4vSL2oB<cO[^_chw[GBp]v3smagpOqWS has exceeded timeout, disconnecting.
1534023608: New connection from 10.116.7.21 on port 1883.
1534023608: New client connected from 10.116.7.21 as ^k_aQq];7xigbIUD`htDex>IPfAoNX:4JiUkR9vY9WG[`m`GL[KqZJAk7RaEkkIu (c1, k300).
1534023608: Sending CONNACK to ^k_aQq];7xigbIUD`htDex>IPfAoNX:4JiUkR9vY9WG[`m`GL[KqZJAk7RaEkkIu (0)
1534023608: Received SUBSCRIBE from ^k_aQq];7xigbIUD`htDex>IPfAoNX:4JiUkR9vY9WG[`m`GL[KqZJAk7RaEkkIu
1534023608: quantity (QoS 0)
1534023608: ^k_aQq];7xigbIUD`htDex>IPfAoNX:4JiUkR9vY9WG[`m`GL[KqZJAk7RaEkkIu 0 quantity
1534023608: Sending SUBACK to ^k_aQq];7xigbIUD`htDex>IPfAoNX:4JiUkR9vY9WG[`m`GL[KqZJAk7RaEkkIu
По прошествии некоторого времени клиент превышает время ожидания и отключается. Мы будем очень признательны за любые советы по преодолению этого препятствия. Я попробовал следующее для изменения ClientID, для каждого конструктора клиента MQTT сломал r -
Adafruit_MQTT_Client(Client *client, const char *server, uint16_t port,
const char *cid, const char *user, const char *pass):
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, "10.116.10.191", 1883, "Rear-Controller");
Это результат добавления идентификатора клиента («Rear-Controller») после номера порта MQTT Broker -
New client connected from 10.116.7.21 as GFONMktFXFSG1rARE@JWCRv@P^XwLifdo<rCg]YFs4Ndf_>2_XIsjFsAtS08Cf\: (c1, k300, uRear-Controller)
@HobarGJ, 👍0
1 ответ
Ожидается, что идентификатор клиента будет храниться во флэш-памяти (он считывается с помощью pgm_read_byte
). Однако на Arduino, если не указано иное, он сначала копирует строковый литерал в ОЗУ. Это означает, что функция получает адрес строки в ОЗУ, а не во флэш-памяти, и использует его так, как если бы это был адрес во флэш-памяти, и это становится бессмыслицей.
Вам нужно принудительно перевести его во флэш-память, создав строку PROGMEM:
const char clientid[] PROGMEM = "clientfoo";
Adafruit_MQTT_Client mqtt(&client, "10.116.10.191", 1883, clientid);
- Как вызвать конструктор класса после того, как он был вызван один раз?
- Соединение MQTT не распознается в void loop()
- Как подключиться к MQTT брокеру с помощью TLS?
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Преобразование byte* в int в Arduino
- Почему Adafruit motor shield не крутит моторы?
- esp32-cam публикует изображение в mqtt
- Какие компоненты мне нужны маленького GPS-трекера
Я столкнулся с такой ошибкой: Нет соответствующей функции для вызова 'Adafruit_MQTT_Client::Adafruit_MQTT_Client(WiFiClient*, const char [14], int, const __FlashStringHelper*)', @HobarGJ
Не имея вашего кода для тестирования, я задавался вопросом, может ли это произойти. Вам может понадобиться привести его к const char *. Или сделать его отдельным как PROGMEM., @Majenko
Я преобразовал его в const char, и он успешно скомпилировался, однако в нем все еще была тарабарщина. Похоже, это сработало только с - "(c1, k300, uRear-Controller)", @HobarGJ
@HobarGJ Смотрите мою правку. Это должно сработать., @Majenko
Хотя это успешно скомпилировалось, я все еще получаю строку тарабарщины при подключении к MQTT Broker. Конец, "(c1, k300, uRear-Controller)", правильный и отражает изменения. Будет ли вам проще загрузить больше моего кода?, @HobarGJ
Я бы предложил вместо этого перейти на PubSubClient. Это работает., @Majenko
@HobarGJ Я согласен с Majenko, [MQTT-API][1] сказал: «Если библиотека MQTT требует, чтобы вы установили идентификатор клиента, то используйте уникальное значение, например случайный GUID. Большинство библиотек MQTT автоматически устанавливают случайное значение идентификатора клиента». Я не вижу, чтобы ваша библиотека могла требовать установку идентификатора клиента, я также использую PubSubClient, для меня это работает, сэр. [1]: https://learn.adafruit.com/adafruit-io/mqtt-api, @abu-ahmed al-khatiri