[Модуль] MQTT (mqtt)

Разработка дополнительных модулей, подключение различных приложений.

Модераторы: Bagir, Ivan, Vit, immortal, PAV

alexpzas
Сообщения: 20
Зарегистрирован: Пн авг 19, 2013 4:17 pm
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] MQTT (mqtt)

Сообщение alexpzas » Чт ноя 15, 2018 12:00 am

Добрый вечер. Я только знакомлюсь с mqtt, подозреваю, что проблема простая, но решения не нашёл.
Суть :
- Есть распбери 3 с последним образом
- Есть ардуина с езернет шилдом
- пару датчиков на ней, пытаюсь подружить ардуину и мажордомо.
- На Распбери установил москито (не уверен что нужно было, где-то вычитал , что этот брокер уже есть в дистрибутиве)
На виндовом компе поставил MQTT.fx клиент, коннекчусь к серверу мажордомо и отправляю паблики, мажордомо их видит все ок. С ардуины ничего не уходи, подскажите пожалуйста в чем проблема.
Вот текст скетча

Код: Выделить всё

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <LiquidCrystal.h>

//Настройки для ЛСиДи
LiquidCrystal lcd(3, 4, 25, 24, 23, 22);
// Датчик MQ-2
int smokeA0 = A1;
int sensorThres = 400;

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192,168,0,118);
IPAddress server(192,168,0,102);

// Callback function header
void callback(char* topic, byte* payload, unsigned int length);

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

// Callback function
void callback(char* topic, byte* payload, unsigned int length) {
  
  byte* p = (byte*)malloc(length);
  // Copy the payload to the new buffer
  memcpy(p,payload,length);
  client.publish("/home/sensor/", p, length);
  // Free the memory
  free(p);
}

void setup()
{

 // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.print("Hi!");
  // MQ-2
  pinMode(smokeA0, INPUT);
  Serial.begin(9600);
  
  Ethernet.begin(mac, ip);
 // client.connect("MQTT_FX_Client 3");
  if (client.connect("MQTT_FX_Client 3")) 
  {
     client.publish("/home/sensor/ 121212","222");
     //client.subscribe("inTopic");
  }
  
}

void loop()
{
  char buf[64];
  lcd.setCursor(0, 1);

  //MQ-2 датчик
  int analogSensor = analogRead(smokeA0);

  static char char_gaz[10];
  dtostrf(analogSensor,3,0,char_gaz);

  Serial.print("Pin A0: ");  //  "Контакт A0: "
  Serial.println(analogSensor);
  // проверяем, не превышено ли пороговое значение:
  client.connect("MQTT_FX_Client 3");
  
  if (analogSensor > sensorThres)
  {
    lcd.print("Gaz ! Warning!");
  }
  else
  {
    lcd.print("Gaz normal");
  }
  delay(100);
  
if (client.connect("MQTT_FX_Client 3")) 
{
    client.publish("/home/sensor/","123");
     delay(3000);
     client.disconnect();
}
    client.subscribe("inTopic");

 
 client.loop();
}
Заранее спасибо за помощь.
ZyaK
Сообщения: 179
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 23 раза
Поблагодарили: 20 раз

Re: [Модуль] MQTT (mqtt)

Сообщение ZyaK » Чт ноя 15, 2018 6:03 am

У меня код для ЕСП выглядит как то так

Код: Выделить всё


#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Keenetic"; //Название сети
const char* password = "88002000601";           //пароль
const char* Smart_Home = "192.168.1.2";    //ip брокера mqtt
#define BUTTON_1 3 
#define BUTTON_2 5                           //Кнопка
#define BUTTON_3 4  
#define BUTTON_4 0  
#define BUTTON_5 2  
#define BUTTON_6 14  
#define BUTTON_7 12  
#define BUTTON_8 13

#define relays_topic "ESP02/#"
#define relays_topic1 "ESP02/r_1"
#define relays_topic2 "ESP02/r_2"
#define relays_topic3 "ESP02/r_3"
#define relays_topic4 "ESP02/r_4"
#define relays_topic5 "ESP02/r_5"
#define relays_topic6 "ESP02/r_6"
#define relays_topic7 "ESP02/r_7"
#define relays_topic8 "ESP02/r_8"

#define clk 15
#define data 16
#define latch 1

WiFiClient espClient;                        //инициализация WiFi клиента
PubSubClient client(espClient);              //инициализация MQTT клиента

void setup(){

  pinMode(clk, OUTPUT);
  pinMode(data, OUTPUT);
  pinMode(latch, OUTPUT);
  digitalWrite(latch, HIGH);

  digitalWrite(latch, LOW);
  shiftOut(data, clk, LSBFIRST, 0b11111111);
  digitalWrite(latch, HIGH);
     
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
  pinMode(BUTTON_3, INPUT);
  pinMode(BUTTON_4, INPUT);
  pinMode(BUTTON_5, INPUT);
  pinMode(BUTTON_6, INPUT);
  pinMode(BUTTON_7, INPUT);
  pinMode(BUTTON_8, INPUT);
  //Кнопка
    
  //Serial.begin(115200);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);                //подключаемся к WiFi
  delay(6000);

  client.setServer(Smart_Home, 1883);       //подключаемся к MQTT
  client.setCallback(callback);              //функция получения топиков с брокера
  delay(100);
  
  client.connect("ESP02Client");
    delay (100);//конектимся с брокером как клиент

    
    client.subscribe(relays_topic); //подписка на все топики с названием "relay"
    client.loop();
    
    client.publish(relays_topic1, String(regim1).c_str()); // отправка данных на сервер
    client.loop();
    client.publish(relays_topic2, String(regim2).c_str());
    client.loop();
    client.publish(relays_topic3, String(regim3).c_str());
    client.loop();
    client.publish(relays_topic4, String(regim4).c_str());
    client.loop();
    client.publish(relays_topic5, String(regim5).c_str());
    client.loop();
    client.publish(relays_topic6, String(regim6).c_str());
    client.loop();
    client.publish(relays_topic7, String(regim7).c_str());
    client.loop();
    client.publish(relays_topic8, String(regim8).c_str());
    client.loop();
  
 
}

void callback(char* topic, uint8_t* payload, unsigned int length){  //приём данных с сервера
  //Serial.print("Message arrived [");
  //Serial.print(topic);
  //Serial.print("  ");
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  for (unsigned int i = 0; i < length; i++) {
  //Serial.print((char)payload[i]);
  }
  //Serial.println();
  if (strTopic == "ESP02/r_1") {
    if ((char)payload[0] == '0') {
      Status1 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status1 = true;
      regim1 = 1;
    }
  }
  
  if (strTopic == "ESP02/r_2") {
    if ((char)payload[0] == '0') {
      Status2 = false;
      regim2 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status2 = true;
      regim2 = 1;
    } 
  }
код урезан
PI2 + MQTT + 5 ESP8266 + Atmega16
alexpzas
Сообщения: 20
Зарегистрирован: Пн авг 19, 2013 4:17 pm
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] MQTT (mqtt)

Сообщение alexpzas » Вс ноя 18, 2018 2:45 pm

Всем привет. Разобрался со своей проблемой. Может кому будет интересно.
Сервер на малинке подключен витой парой к роутеру, к нему же подключен и комп рабочий, на этом компе 2 сетевые карты, в одну из них подключена ардуина с езернет шилдом, как раз в этом и была загвоздка. Воткнул ардуину напрямую в роутер и все заработало.
Аватара пользователя
Lerych
Сообщения: 88
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 37 раз
Поблагодарили: 9 раз

Re: [Модуль] MQTT (mqtt)

Сообщение Lerych » Вс ноя 18, 2018 8:20 pm

Мужчины!
Пытаюсь поставить mosquitto на Linux (AstraLinux - аналог Debian) пишет:
root@astra:/etc/apt# apt-get install mosquitto
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Некоторые пакеты невозможно установить. Возможно, вы просите невозможного,
или же используете нестабильную версию дистрибутива, где запрошенные вами
пакеты ещё не созданы или были удалены из Incoming.
Следующая информация, возможно, поможет вам:

Пакеты, имеющие неудовлетворённые зависимости:
mosquitto : Зависит: libssl1.0.0 (>= 1.0.0) но он не может быть установлен
Зависит: libwebsockets3 (>= 1.2) но он не может быть установлен
Кто-нибудь пробовал что-то подобное? Как установить? Спасибо
Аватара пользователя
Lerych
Сообщения: 88
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 37 раз
Поблагодарили: 9 раз

Re: [Модуль] MQTT (mqtt)

Сообщение Lerych » Вс ноя 18, 2018 8:53 pm

Снимаю вопрос, установил с бубном.
Вопрос теперь в настройках etc/mosquitto/mosquitto.conf что там должно быть?
Аватара пользователя
nick7zmail
Сообщения: 5722
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 111 раз
Поблагодарили: 1397 раз

Re: [Модуль] MQTT (mqtt)

Сообщение nick7zmail » Вс ноя 18, 2018 10:27 pm

Ну тип настройки)) https://mosquitto.org/man/mosquitto-conf-5.html
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
deemjd
Сообщения: 11
Зарегистрирован: Чт сен 13, 2018 10:20 pm
Благодарил (а): 6 раз
Поблагодарили: 0

Re: [Модуль] MQTT (mqtt)

Сообщение deemjd » Вс ноя 25, 2018 2:41 am

В MQTT слетела кодировка. Топики выглядят ужасно.
Как можно это починить?
Изображение

Сижу только на stable, в код не лезу.. Образ 3.33 от Сергея
Аватара пользователя
Kvantos
Сообщения: 125
Зарегистрирован: Вт окт 31, 2017 1:05 pm
Благодарил (а): 11 раз
Поблагодарили: 19 раз

Re: [Модуль] MQTT (mqtt)

Сообщение Kvantos » Вс ноя 25, 2018 1:37 pm

Заметил такую вещь:
Топики
test/topic
и
/test/topic
при отображении дерева визуально не отличаются, т.е. ведущий "/" не виден (можно увидеть только войдя в сам топик)
согласен с тем, что ведущего слеша по стандарту не должно быть...., но неопытный пользователь может попасть в эту "ловушку", когда визуально топики не отличить, но на самом деле они разные.
Предлагаю в обновлении как-то решить это неоднозначное отображение фактически разных топиков
MDM живет на 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux
Аватара пользователя
prmres
Сообщения: 103
Зарегистрирован: Пт ноя 24, 2017 2:24 am
Откуда: оттуда
Благодарил (а): 36 раз
Поблагодарили: 14 раз

Re: [Модуль] MQTT (mqtt)

Сообщение prmres » Пн ноя 26, 2018 11:56 am

Lerych писал(а):
Вс ноя 18, 2018 8:53 pm
Вопрос теперь в настройках etc/mosquitto/mosquitto.conf что там должно быть?
вот тут посмотрите: viewtopic.php?f=3&t=3737&p=64889#p64889
Не только лишь все!
flandger
Сообщения: 1
Зарегистрирован: Чт ноя 29, 2018 9:58 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] MQTT (mqtt)

Сообщение flandger » Чт ноя 29, 2018 10:34 am

Здравствуйте.
Поднял majordomo в докере по образу https://github.com/dimitrystd/docker-ma ... er-compose . Поставил mqtt плагин, почему-то не хочет коннектится к mqtt серверу. Сервер 100% рабочий (работает девайс по управлению от телефона через него).
В логах mqtt сервера нет даже попыток коннекта. В логах majordomo никаких ошибок. Видел по видео что перезагружают majordomo. Делал рестарт докер контейнеру, результатов нет.

В чём может быть дело?
Ответить