Шилд w5500 и enc28j60 и MQTT.

Yura_15
Offline
Зарегистрирован: 02.08.2019

Привет.

Стоит задача отправить данные брокеру cloudmqtt.com (MQTT). В наличии  w5500 и enc28j60.

Нужен рабочий пример скетча или совет куда копать. Может эти шилды не могут с такой задачей справиться?

Спасибо за ответы.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
Yura_15
Offline
Зарегистрирован: 02.08.2019

Спасибо. Объмный код, 400 строк. Читаю 20% понимаю. э-Э-э-x  :))

Yura_15
Offline
Зарегистрирован: 02.08.2019

Юзаю ардуину 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;
  
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Какие байты идут, если коннект не проходит? Адрес DNS / маршрута по умолчанию 192.168.1.1 ?

Если есть в сети DHCP, то пробуйте запускать драйвер Wiznet как: Ethernet.begin(mac), это поможет локализовать проблему. Так же может просто не совпадать версия MQTT протокола.

Yura_15
Offline
Зарегистрирован: 02.08.2019

sadman41 пишет:

Какие байты идут, если коннект не проходит? Адрес 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;
  
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Самая первая ошибка - сразу из ардуины херачить космолёт.

Доступ к логам MQTT есть? Нет. С ардуины целевой хост запинговать можете, открытые порты проверить? Тоже нет. Как собираетесь сеть проверять? Или хотите, чтобы мы тут все руками поверх исходника поводили и написали, в которой строке 8 заменить на 56?

В локальной сети отладьте свой скетч, потом будете на внешние сервера лазить. Или траффик перехватывайте и анализируйте.

Yura_15
Offline
Зарегистрирован: 02.08.2019

sadman41 пишет:

Самая первая ошибка - сразу из ардуины херачить космолёт.

Доступ к логам 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 в локальной сети byte ip[] = { 192, 168, 31, 161 }; // IP адрес

Еще не понятно откуда серверу "farmer.cloudmqtt.com" знать куда отвечать?,,, это нубский вопрос. Поблема остается.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я вам о чём пишу? Ставите в локалке брокера, на ардуину - пример из PubSubClient. На брокере логи на максимум и начинаете втыкать в то, что такое Ethernet, MQTT, как выглядит правильный коннект, ошибочный и пр. Иначе проблема так и останется.

Yura_15
Offline
Зарегистрирован: 02.08.2019

Получилось подключиться к https://thingspeak.com .    Как-то без особых заморочек https://drive.google.com/open?id=10g59UM4Ilm7Jh_kyJUwNgtVR5PTHjtX2   А к тому, моему,  " кривокодию" надо будет еще вернутся.

Спасибо за ответы.