Шилд w5500 и enc28j60 и MQTT.
- Войдите на сайт для отправки комментариев
Пнд, 02/09/2019 - 16:55
Привет.
Стоит задача отправить данные брокеру cloudmqtt.com (MQTT). В наличии w5500 и enc28j60.
Нужен рабочий пример скетча или совет куда копать. Может эти шилды не могут с такой задачей справиться?
Спасибо за ответы.
http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalnoi-seti
http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalnoi-seti
Спасибо. Объмный код, 400 строк. Читаю 20% понимаю. э-Э-э-x :))
Юзаю ардуину 5-6 недель. Кое как написал, что-то свое, но оно не работает. Смотрел чужой код здесь http://arduinolab.pw/index.php/2017/08/22/protokol-mqtt-kod-iz-video/ и здесь http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalnoi-seti. Не могу приконектится и передать данные брокеру. У брокера статистика показавает, что какие байты туда сюда идут, но в топик ничего не приходит. Код зациклился, без конекта, в строках 41 - 54.
//#include <avr/wdt.h> #include <SPI.h> #include <Ethernet2.h> #include <PubSubClient.h> long randNumber; int rand_temp; int rand_hum; char clientId[] = "W5500_none"; char mqtt_server[] = "farmer.cloudmqtt.com"; // Имя сервера MQTT int mqtt_port = 17596; // Порт для подключения к серверу MQTT char mqtt_user[] = "udrewpzp"; // Логин от сервер char mqtt_pass[] = "c6-noQxme7YU"; // Пароль от сервера char mqtt_id[] = "UNO_01"; // имя непосдерственно данной железки не должно ни с чем совпадать char mqtt_device[] = "barell1"; // логическое имя - фактически первое слово в топике char mqtt_topic_temp[] = "temp11"; //char mqtt_topic_gettemp[] = "/gettemp"; byte ip[] = { 192, 168, 1, 161 }; // IP адрес long lastMsg = 0; EthernetClient clientMqtt; byte mac[] = {0xD4, 0xA8, 0xB7, 0x6F, 0x5E, 0x4D}; EthernetServer server(80); PubSubClient client(clientMqtt); // вызывается когда приходят данные от брокера void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); // отправляем в монитор порта название топика Serial.print("] "); for (int i = 0; i < length; i++) { // отправляем данные из топика Serial.print((char)payload[i]); } Serial.println(); } // // подключение к mqtt брокеру void reconnect() { while (!client.connected()) { // крутимся пока не подключемся. Serial.print("Attempting MQTT connection..."); // создаем случайный идентификатор клиента // подключаемся, в client.connect передаем ID, логин и пасс if (client.connect(clientId,mqtt_user, mqtt_pass)) { Serial.println("connected"); // если подключились client.subscribe(mqtt_topic_temp); // подписываемся на топик, в который же пишем данные } else { // иначе ругаемся в монитор порта Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); client.setServer(mqtt_server, mqtt_port); // указываем адрес брокера и порт client.setCallback(callback); // указываем функцию которая вызывается когда приходят данные от брокера } void loop() { // выводим случайное число в диапазоне от 0 до 299 //randNumber = random(300); //Serial.println(randNumber); data_rnd(); // выводим случайное число в диапазоне от 10 до 19 Serial.print("Случайная температура "); Serial.print(rand_temp); ; Serial.print(" "); Serial.print("Случайная влажность "); Serial.println(rand_hum); char msg[4]; // забераем температуру и конвертируем её в char float tmp = rand_temp; dtostrf(tmp, 4, 2, msg); if (!client.connected()) { // проверяем подключение к брокеру reconnect(); } client.loop(); long now = millis(); // каждые 10 секунд if (now - lastMsg > 10000) { lastMsg = now; client.publish(mqtt_topic_temp, msg); // пишем в топик } //sendByteToMQTTclient(5); delay(3000); } //void sendByteToMQTTclient(byte inByte) { // clientMqtt.write((byte)(inByte)); // clientMqtt.stop(); //} void data_rnd() { // Случайные данные (температура, влажность) rand_temp = 10*random(100, 350)/100.0; rand_hum = 10*random(550, 850)/100.0; }Какие байты идут, если коннект не проходит? Адрес DNS / маршрута по умолчанию 192.168.1.1 ?
Если есть в сети DHCP, то пробуйте запускать драйвер Wiznet как: Ethernet.begin(mac), это поможет локализовать проблему. Так же может просто не совпадать версия MQTT протокола.
Какие байты идут, если коннект не проходит? Адрес DNS / маршрута по умолчанию 192.168.1.1 ?
Если есть в сети DHCP, то пробуйте запускать драйвер Wiznet как: Ethernet.begin(mac), это поможет локализовать проблему. Так же может просто не совпадать версия MQTT протокола.
В статистике пишет, что что-то пришло. Скрин сделал как выложить не знаю.
Пробовал по всякому проблема таже. Код:
//#include <avr/wdt.h> #include <SPI.h> #include <Ethernet2.h> #include <PubSubClient.h> long randNumber; int rand_temp; int rand_hum; char clientId[] = "W5500_none"; char mqtt_server[] = "farmer.cloudmqtt.com"; // Имя сервера MQTT int mqtt_port = 17596; // Порт для подключения к серверу MQTT char mqtt_user[] = "udrewpzp"; // Логин от сервер char mqtt_pass[] = "c6-noQxme7YU"; // Пароль от сервера char mqtt_id[] = "UNO_01"; // имя непосдерственно данной железки не должно ни с чем совпадать //char mqtt_device[] = "temp111"; // логическое имя - фактически первое слово в топике char mqtt_topic_temp[] = "temp111"; //char mqtt_topic_gettemp[] = "/gettemp"; byte ip[] = { 192, 168, 31, 161 }; // IP адрес long lastMsg = 0; //EthernetClient clientMqtt; byte mac[] = {0xD4, 0xA8, 0xB7, 0x6F, 0x5E, 0x4D}; //EthernetServer server(80); //PubSubClient client(clientMqtt); EthernetClient ethClient; PubSubClient client(ethClient); // вызывается когда приходят данные от брокера void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); // отправляем в монитор порта название топика Serial.print("] "); for (int i = 0; i < length; i++) { // отправляем данные из топика Serial.print((char)payload[i]); } Serial.println(); } // // подключение к mqtt брокеру void reconnect() { Serial.print("----------------------------------"); while (!client.connected()) { // крутимся пока не подключемся. Serial.print("Attempting MQTT connection..."); // создаем случайный идентификатор клиента // подключаемся, в client.connect передаем ID, логин и пасс if (client.connect(clientId, mqtt_user, mqtt_pass)) { Serial.println("connected"); // если подключились client.subscribe(mqtt_topic_temp); // подписываемся на топик, в который же пишем данные } else { // иначе ругаемся в монитор порта Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); client.setServer(mqtt_server, mqtt_port); // указываем адрес брокера и порт //client.setServer("example.com",1883); client.setCallback(callback); // указываем функцию которая вызывается когда приходят данные от брокера } void loop() { data_rnd(); // выводим случайное число в диапазоне от 10 до 19 Serial.print("Случайная температура "); Serial.print(rand_temp); ; Serial.print(" "); Serial.print("Случайная влажность "); Serial.println(rand_hum); char msg[4]; // забераем температуру и конвертируем её в char float tmp = rand_temp; dtostrf(tmp, 6, 2, msg); Serial.print("Температура, передача данных______"); Serial.println(msg); if (!client.connected()) { // проверяем подключение к брокеру reconnect(); } client.loop(); long now = millis(); // каждые 10 секунд if (now - lastMsg > 10000) { lastMsg = now; client.publish(mqtt_topic_temp, msg); // пишем в топик } //sendByteToMQTTclient(5); //delay(3000); } //void sendByteToMQTTclient(byte inByte) { //client.write((byte)(inByte)); //client.stop(); //} void data_rnd() { // Случайные данные (температура, влажность) rand_temp = 10*random(100, 350)/100.0; rand_hum = 10*random(550, 850)/100.0; }Самая первая ошибка - сразу из ардуины херачить космолёт.
Доступ к логам MQTT есть? Нет. С ардуины целевой хост запинговать можете, открытые порты проверить? Тоже нет. Как собираетесь сеть проверять? Или хотите, чтобы мы тут все руками поверх исходника поводили и написали, в которой строке 8 заменить на 56?
В локальной сети отладьте свой скетч, потом будете на внешние сервера лазить. Или траффик перехватывайте и анализируйте.
Самая первая ошибка - сразу из ардуины херачить космолёт.
Доступ к логам MQTT есть? Нет. С ардуины целевой хост запинговать можете, открытые порты проверить? Тоже нет. Как собираетесь сеть проверять? Или хотите, чтобы мы тут все руками поверх исходника поводили и написали, в которой строке 8 заменить на 56?
В локальной сети отладьте свой скетч, потом будете на внешние сервера лазить. Или траффик перехватывайте и анализируйте.
Спасибо за ответ. Недавно закончил проэкт в локалке: 2-ве Ардуино НАНО и одно УНО + W5500. 16*2 (6 в тестах) датчиков АМ2320 на НАНО(СЛЭЙВЫ) подключены к МАСТЕРУ УНО по I2C. В W5500 реализовал локальный сервер с таблицей данных. А связаться с Cloudmqtt никак не могу.
Это фрагмент статистики на Cloudmqtt: https://drive.google.com/open?id=1hoFXTcxiop7-0q9gd0tQOy-Hj0-DQrwx Судя по тому что ардуино отключена, а подклчение есть в статистике, в статистику попадает тот же вход в аккаунт.
Это логи. В них тоже сохраняется вход аккаунт. Ошибку подключения ардуино видно(подчеркнул) : https://drive.google.com/open?id=1w1m2jL_m2T1p7Z8GILeN8LZVlLQjUL_8
https://drive.google.com/open?id=1xJnwdubtWNVx3REr_TckMuJyXcilItIb
Думаю не правильно логинюсь. Может проблема с ID устройства, сочинил от потолка. Еще эта строка, как я понимаю, определяет адрес IP в локальной сети
byteip[] = { 192, 168, 31, 161 };// IP адресЕще не понятно откуда серверу "farmer.cloudmqtt.com" знать куда отвечать?,,, это нубский вопрос. Поблема остается.
Я вам о чём пишу? Ставите в локалке брокера, на ардуину - пример из PubSubClient. На брокере логи на максимум и начинаете втыкать в то, что такое Ethernet, MQTT, как выглядит правильный коннект, ошибочный и пр. Иначе проблема так и останется.
Получилось подключиться к https://thingspeak.com . Как-то без особых заморочек https://drive.google.com/open?id=10g59UM4Ilm7Jh_kyJUwNgtVR5PTHjtX2 А к тому, моему, " кривокодию" надо будет еще вернутся.
Спасибо за ответы.