не могу публиковать данные на моем локальном сервере mqtt

Пожалуйста, я бы хотел, чтобы кто-нибудь помог мне с этим. Я боролся с этим уже пару недель, я новичок в этом.

Я хочу отправить данные с ESP32 SIM800L брокеру mqtt. Сервер mqtt работает на моем локальном компьютере, и ESP32 SIM800 может отлично подключаться к APN. Я видел много руководств, в которых использовалось соединение WIFI, но не GPRS (то, что я использую).

Я наконец нахожу это: tinyGSM и это: arduino mqtt mongodb

И я адаптировал его следующим образом, но все равно не удалось установить соединение:

// Your GPRS credentials (leave empty, if not needed)
const char apn[]      = "internet.tn"; // APN (example: internet.vodafone.pt) use https://wiki.apnchanger.org
const char gprsUser[] = ""; // GPRS User
const char gprsPass[] = ""; // GPRS Password

// SIM card PIN (leave empty, if not defined)
const char simPIN[]   = ""; 

uint32_t lastReconnectAttempt = 0;

// TTGO T-Call pins
#define MODEM_RST            5
#define MODEM_PWKEY          4
#define MODEM_POWER_ON       23
#define MODEM_TX             27
#define MODEM_RX             26
#define I2C_SDA              21
#define I2C_SCL              22


// Set serial for debug console (to Serial Monitor, default speed 115200)
#define SerialMon Serial
// Set serial for AT commands (to SIM800 module)
#define SerialAT Serial1

// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800      // Modem is SIM800
#define TINY_GSM_RX_BUFFER   1024  // Set RX buffer to 1Kb

#include <Wire.h>
#include <TinyGsmClient.h>
#include <PubSubClient.h>

#ifdef DUMP_AT_COMMANDS
    #include <StreamDebugger.h>
    StreamDebugger debugger(SerialAT, SerialMon);
    TinyGsm modem(debugger);
#else
    TinyGsm modem(SerialAT);
#endif



// I2C for SIM800 (to keep it running when powered from battery)
TwoWire I2CPower = TwoWire(0);

const char* broker = "localhost";

const char* topicInit = "GsmClientTest/init";
// Function prototypes
void subscribeReceive(char* topic, byte* payload, unsigned int length);

// TinyGSM Client for Internet connection
// gsm and MQTT related objects
TinyGsmClient client(modem);
PubSubClient mqtt(client);

long mqtttimer = 0;                 // Timer for counting 5 seconds and retrying mqtt connection
byte mqtttarea = 1;   

#define uS_TO_S_FACTOR 1000000     /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  3600        /* Time ESP32 will go to sleep (in seconds) 3600 seconds = 1 hour */

void mqttCallback(char* topic, byte* payload, unsigned int len) {
    SerialMon.print("Message arrived [");
    SerialMon.print(topic);
    SerialMon.print("]: ");
    SerialMon.write(payload, len);
    SerialMon.println();}

boolean mqttConnect() {
    SerialMon.print("Connecting to ");
    SerialMon.print(broker);

    // Connect to MQTT Broker
    boolean status = mqtt.connect("GsmClientTest");

    // Or, if you want to authenticate MQTT:
    //boolean status = mqtt.connect("GsmClientName", "mqtt_user", "mqtt_pass");

    if (status == false) {
        SerialMon.println(" fail");
        return false;
    }
    SerialMon.println(" success");
    mqtt.publish(topicInit, "GsmClientTest started");
    // mqtt.subscribe(topicLed);
    return mqtt.connected();}
void setup() {

    SerialMon.begin(9600);

    // Start I2C communication
    I2CPower.begin(I2C_SDA, I2C_SCL, 400000);

    // Set modem reset, enable, power pins
    pinMode(MODEM_PWKEY, OUTPUT);
    pinMode(MODEM_RST, OUTPUT);
    pinMode(MODEM_POWER_ON, OUTPUT);
    digitalWrite(MODEM_PWKEY, LOW);
    digitalWrite(MODEM_RST, HIGH);
    digitalWrite(MODEM_POWER_ON, HIGH);

    // Set GSM module baud rate and UART pins
    SerialAT.begin(9600, SERIAL_8N1, MODEM_RX, MODEM_TX);
    delay(3000);

    // Restart SIM800 module, it takes quite some time
    // To skip it, call init() instead of restart()
    SerialMon.println("Initializing modem...");
    modem.restart();
    // use modem.init() if you don't need the complete restart

    // Unlock your SIM card with a PIN if needed
    if (strlen(simPIN) && modem.getSimStatus() != 3 ) {
        modem.simUnlock(simPIN);
    }
    SerialMon.print("Connecting to APN: ");
    SerialMon.print(apn);
    if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
        SerialMon.println(" fail");
    }
    else {
        SerialMon.println(" OK");
    }
    // MQTT Broker setup
    mqtt.setServer(broker, 1883);
    mqtt.setCallback(mqttCallback);
    esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
}


void loop() {
    // This is needed at the top of the loop!
    if (!mqtt.connected()) {
        SerialMon.println("=== MQTT NOT CONNECTED ===");
        // Reconnect every 10 seconds
        uint32_t t = millis();
        if (t - lastReconnectAttempt > 10000L) {
            lastReconnectAttempt = t;
            if (mqttConnect()) {
                lastReconnectAttempt = 0;
            }
        }
        delay(100);
        return;
    }
    mqtt.publish(topicInit, "Hello");
    mqtt.loop();

}

person nadia    schedule 02.09.2020    source источник


Ответы (1)


Вы устанавливаете имя брокера на localhost:

const char* broker = "localhost";

localhost и IP-адрес 127.0.0.1 означают хост, на котором выполняется этот код. Когда вы вводите команды на компьютере, на котором запущен брокер, localhost будет означать этот компьютер. На ESP32 это никак не сработает.

Вам необходимо указать имя или IP-адрес компьютера, на котором работает брокер. Как вы это обнаружите, будет зависеть от используемой вами операционной системы.

Если этот компьютер находится в вашей локальной сети, он, вероятно, использует частный IP-адрес, например 10.0.1.x или 192.168.1.x. В этом случае вам нужно либо использовать переадресацию портов в вашем маршрутизаторе, чтобы пересылать ему пакеты (и тогда вы будете использовать IP-адрес вашего маршрутизатора, а не вашего брокера).

Если вы используете IP-адрес вашего маршрутизатора, он может измениться без предупреждения, поэтому вам нужно будет использовать что-то вроде Динамический DNS, чтобы быть в курсе его текущего IP-адреса.

Скорее всего, вам будет лучше запустить брокера за пределами вашей сети на виртуальном сервере в облаке или с помощью одной из нескольких имеющихся коммерческих услуг MQTT. У большинства из них есть уровень бесплатного пользования, который обеспечивает разумный объем трафика в месяц.

Тем не менее, localhost здесь никогда не будет работать. Вам нужен реальный публичный IP-адрес или имя вашего брокера.

person romkey    schedule 02.09.2020
comment
Это такой ясный ответ, большое вам спасибо. Это правда, что я также тестировал свой частный IPAdd 192.168.x.x, и он не работал. Итак, я собираюсь попробовать с публичным брокером - person nadia; 03.09.2020
comment
Люди @nadia часто случайно используют localhost таким образом. Удачи! - person romkey; 03.09.2020