Ви не увійшли.
Вы и роутер собрались сами делать, на ESP8266? Wi-Fi технология содержит все необходимые вам функции и обеспечивает уверенную радиосвязь до 200 м, поизучайте её.
Тока беспроводные датчики)) у меня с ESP очень плохой опыт, не могу победить её и заставить стабильно работать как MQTT client, да и wifi-канал в наше время сильно перегружен и как следствие очень много помех и уменьшение радиуса действия
Передатчик на 433, тини13, CR2032. Простенько, экономичненько и бюджетненько.)
Если я Вас правильно понял, то нужно соединить ATTiny c Радио удлинителем 433Мгц
20 ESP8266, они ж не дорогие.
А какая ESP сможет удерживать соединение с 20 другими ESP? ))
Переделал код по примеру Nick O’Leary (автор данной библиотеки), что позволило отлавливать состояние клиента
void reconnect() {
//Переподключение
while (!mqtt_client.connected()) {
Serial.print(F("ReConnected..."));
// Попытка подключения
if (mqtt_client.connect("ESP8266_test", "", "")) {
Serial.println(F("Connected"));
//
mqtt_client.publish("/logs", "Connected");
mqtt_client.subscribe("/logs");
}
else {
Serial.print(F("failed, rc="));
Serial.print(mqtt_client.state());
Serial.println(F(" try again in 5 seconds"));
//
delay(5000);
}
}
}
переделал файл PubSubClient.h
#define MQTT_VERSION_3_1 3
//#define MQTT_VERSION_3_1_1 4
// MQTT_VERSION : Pick the version
//#define MQTT_VERSION MQTT_VERSION_3_1_1
#ifndef MQTT_VERSION
#define MQTT_VERSION MQTT_VERSION_3_1
#endif
Полный код
/*
Name: MQTT_new.ino
Created: 10.08.2018
Author: DARK\Admin
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);
byte server[] = { 192, 168, 0, 1 };
unsigned long lastMqtt = 0;
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print(F("Message arrived ["));
Serial.print(topic);
Serial.print(F("] "));
for (int i = 0; i<length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void setup()
{
Serial.begin(115200);
Serial.println(F("start"));
//
wifi();
//
mqtt_client.setServer(server, 1883);
mqtt_client.setCallback(callback);
//
delay(1500);
}
void loop()
{
if (!mqtt_client.connected()) {
reconnect();
}
mqtt_client.loop();
}
void wifi()
{
WiFiManager wifiManager;
//
IPAddress _ip = IPAddress(192, 168, 0, 1);
IPAddress _gw = IPAddress(192, 168, 0, 1);
IPAddress _sn = IPAddress(255, 255, 255, 0);
//
wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);
//
if (!wifiManager.autoConnect("ESP8266", "1234567890")) {
Serial.println(F("Error"));
delay(3000);
ESP.reset();
delay(5000);
}
//
Serial.println(F("Connected"));
Serial.print(F("local ip: "));
Serial.println(WiFi.localIP());
}
void reconnect() {
//Переподключение
while (!mqtt_client.connected()) {
Serial.print(F("ReConnected..."));
// Попытка подключения
if (mqtt_client.connect("ESP8266_test", "", "")) {
Serial.println(F("Connected"));
//
mqtt_client.publish("/logs", "Connected");
mqtt_client.subscribe("/logs");
}
else {
Serial.print(F("failed, rc="));
Serial.print(mqtt_client.state());
Serial.println(F(" try again in 5 seconds"));
//
delay(5000);
}
}
}
Получаю в Monitor Port
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-4 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...Connected
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...failed, rc=-2 try again in 5 seconds
ReConnected...
Добавил комментарии))
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);
byte server[] = { 192, 168, 0, 1 };
unsigned long lastMqtt = 0;
//callback для получения сообщений от MQTT брокера
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
//
String strTopic = String(topic);
String strPayload = String((char*)payload);
//
Serial.print(F("topic: "));
Serial.println(strTopic);
Serial.print(F("message: "));
Serial.println(strPayload);
}
void setup()
{
Serial.begin(115200);
Serial.println(F("start"));
//
wifi();
//
mqtt_client.setServer(server, 1883);
mqtt_client.setCallback(callback);
//
//первичное подключение к MQTT брокеру
if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
//подписка на нужную тему
mqtt_client.subscribe("/logs");
//публикациясообщения об успешном соединении
mqtt_client.publish("/logs", "Connect");
}
}
void loop()
{
if (lastMqtt > millis()) {
lastMqtt = 0;
}
//
//нужно постоянно вызывать так как асинхронности нет
mqtt_client.loop();
//
//таймер на 5сек.
if (millis() > (lastMqtt + 5000)) {
//если mqtt_client.connected == false, значит соединение разорвано
if (!mqtt_client.connected()) {
//повторное подключение
if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
//повторная подписка, так как повторное подключение к MQTT ьрокеру
mqtt_client.subscribe("/logs");
//публикация сообщения о повторном подключении
mqtt_client.publish("/logs", "ReConnect");
}
}
//
lastMqtt = millis();
}
}
void wifi()
{
WiFiManager wifiManager;
//
IPAddress _ip = IPAddress(192, 168, 1, 0);
IPAddress _gw = IPAddress(192, 168, 1, 0);
IPAddress _sn = IPAddress(255, 255, 255, 0);
//
wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);
//
if (!wifiManager.autoConnect("ESP8266", "1234567890")) {
Serial.println(F("Error"));
delay(3000);
ESP.reset();
delay(5000);
}
//
Serial.println(F("Connected"));
Serial.print(F("local ip: "));
Serial.println(WiFi.localIP());
}
повторное соединение при достижении таймера в 5 сек. при условии что соединение разорвано
if (millis() > (lastMqtt + 5000)) {
//если mqtt_client.connected == false, значит соединение разорвано
if (!mqtt_client.connected()) {
//повторное подключение
if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
//повторная подписка, так как повторное подключение к MQTT ьрокеру
mqtt_client.subscribe("/logs");
//публикация сообщения о повторном подключении
mqtt_client.publish("/logs", "ReConnect");
}
}
//
lastMqtt = millis();
}
Ужасное отображение кода при использовании тега <code> и нет нумерации строк((
API документацию брал с офф.сайта проекта pubsubclient.knolleary.net
Библиотека установлена через менеджер библиотек Arduino IDE, версия библиотеки 2.6.0.
Пробовал устанавливать и другие библиотеки и использовал их примеры, но ничего не изменяется.
Если у кого-то есть ESP8266 и MQTT брокер или время на его установку, то залейте пожалуйста мой код и протестируйте, а то складывается впечатление, что проблема в ESP8266, а не в коде((
Об ESP я думал, но в будущем датчиков будет ~20 и нужно что-то на радиочастоте, вот тока до этого с такими девайсами не имел дел и не хочется покупать разных чтоб методом тыка найти оптимальный, по этой причине и создал данную тему, мож кто-то имеет опыт в данном направлении и сможет направить и ещё хотелось, чтоб передача данных была с шифрованием, а то доброжелателей хватает))
Сервер у меня Mosquitto 3.1 и с моим андроид клиентом идеально держит постоянную связь, в этом и суть данного протокола: один раз соединился, подписался на нужную тему и как тока появилось новое сообщение сразу получил его, а на стороне MEGA из-за постоянных переподключений сообщения попросту в этот период не доходят.
У меня есть проверка в loop() состояния клиента и если клиент по какой-то причине разорвал соединение, значит он не сможет получат сообщения по подписке и не будет работать callback, то идёт повторное соединение и повторная подписка. После этого, сообщения снова приходят пару минут, а потом снова разрыв и через 3-5 попыток получаеться снова соединиться, но сообщения в этот период будут потеряны, а значит контроллер не выполнит команды от андроид-клиента
Здравствуйте,
у меня контроллер MEGA2560 + WiFi R3 запитан через блок питания 9В/1А, написал простой скетч для отображения в Monitor Port входящих сообщений от локального MQTT брокера. Работает все хорошо, но не долго, очень часто происходит переподключение к MQTT брокеру => mqtt_client.publish("/logs", "ReConnect");.
Вопрос: в чем можеть быть проблема?
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);
byte server[] = { 192, 168, 0, 1 };
unsigned long lastMqtt = 0;
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
//
String strTopic = String(topic);
String strPayload = String((char*)payload);
//
Serial.print(F("topic: "));
Serial.println(strTopic);
Serial.print(F("message: "));
Serial.println(strPayload);
}
void setup()
{
Serial.begin(115200);
Serial.println(F("start"));
//
wifi();
//
mqtt_client.setServer(server, 1883);
mqtt_client.setCallback(callback);
//
if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
mqtt_client.subscribe("/logs");
mqtt_client.publish("/logs", "Connect");
}
}
void loop()
{
if (lastMqtt > millis()) {
lastMqtt = 0;
}
//
mqtt_client.loop();
//
if (millis() > (lastMqtt + 5000)) {
if (!mqtt_client.connected()) {
if (mqtt_client.connect("ESP8266_test", "user", "pass")) {
mqtt_client.subscribe("/logs");
mqtt_client.publish("/logs", "ReConnect");
}
}
//
lastMqtt = millis();
}
}
void wifi()
{
WiFiManager wifiManager;
//
IPAddress _ip = IPAddress(192, 168, 1, 0);
IPAddress _gw = IPAddress(192, 168, 1, 0);
IPAddress _sn = IPAddress(255, 255, 255, 0);
//
wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);
//
if (!wifiManager.autoConnect("ESP8266", "1234567890")) {
Serial.println(F("Error"));
delay(3000);
ESP.reset();
delay(5000);
}
//
Serial.println(F("Connected"));
Serial.print(F("local ip: "));
Serial.println(WiFi.localIP());
}
Здравствуйте,
Хочу купить датчик температуры DS18B20 для установки на улице.
Вопрос: что еще нужно приобрести для передачи данных на контроллер MEGA2560 "по воздуху", желательно небольшого габарита, расстояние ~10м + стена (~30см).