无法将数据发布到本地mqtt服务器

无法将数据发布到本地mqtt服务器,mqtt,esp32,sim800,Mqtt,Esp32,Sim800,拜托,我希望有人能帮我。几个星期以来我一直在努力,我对这一点还很陌生 我想将数据从ESP32 SIM800L发送到mqtt代理。 mqtt服务器正在我的本地机器上运行,ESP32 SIM800可以完美地连接到APN。 我看到很多教程使用WIFI连接,但不是GPRS(我正在使用的) 我终于找到了这个:还有这个: 我对其进行了如下调整,但仍然无法连接: // Your GPRS credentials (leave empty, if not needed) const char apn[]

拜托,我希望有人能帮我。几个星期以来我一直在努力,我对这一点还很陌生

我想将数据从ESP32 SIM800L发送到mqtt代理。 mqtt服务器正在我的本地机器上运行,ESP32 SIM800可以完美地连接到APN。 我看到很多教程使用WIFI连接,但不是GPRS(我正在使用的)

我终于找到了这个:还有这个:

我对其进行了如下调整,但仍然无法连接:

// 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();

}
//您的GPRS凭据(如果不需要,请留空)
const char apn[]=“internet.tn”;//APN(例如:internet.vodafone.pt)使用https://wiki.apnchanger.org
常量字符gprsUser[]=“”;//GPRS用户
常量字符gprsPass[]=“”;//GPRS密码
//SIM卡PIN(如果未定义,请留空)
常量字符simPIN[]=“”;
uint32\u t LastReconnectEntry=0;
//TTGO T-Call PIN码
#定义调制解调器\u RST 5
#定义调制解调器键4
#在23上定义调制解调器\u电源\u
#定义调制解调器_TX 27
#定义调制解调器_RX 26
#定义I2C_SDA 21
#定义I2C_SCL 22
//为调试控制台设置串行(至串行监视器,默认速度115200)
#定义SerialMon序列
//为AT命令设置串行(至SIM800模块)
#定义SerialAT Serial1
//配置TinyGSM库
#定义微型\u GSM\u调制解调器\u SIM800//调制解调器为SIM800
#定义微小的GSM接收缓冲区1024//将接收缓冲区设置为1Kb
#包括
#包括
#包括
#ifdef DUMP_AT_命令
#包括
StreamDebugger调试器(SerialAT、SerialMon);
TinyGsm调制解调器(调试器);
#否则
TinyGsm调制解调器(串行);
#恩迪夫
//用于SIM800的I2C(电池供电时保持其运行)
TwoWire I2CPower=TwoWire(0);
const char*broker=“localhost”;
const char*topicInit=“gsmclientset/init”;
//功能原型
void subscribeReceive(字符*主题,字节*有效负载,无符号整数长度);
//用于Internet连接的TinyGSM客户端
//gsm和MQTT相关对象
TinyGSClient客户端(调制解调器);
PubSubClient mqtt(客户);
长mqtttimer=0;//用于计数5秒并重试mqtt连接的计时器
字节mqtttarea=1;
#定义uS_TO_S_因数1000000/*微秒到秒的转换因数*/
#定义睡眠时间3600/*ESP32进入睡眠的时间(秒)3600秒=1小时*/
void mqttCallback(字符*主题,字节*有效负载,无符号整数len){
SerialMon.print(“消息到达[”);
SerialMon.print(主题);
SerialMon.print(“]:”);
SerialMon.write(有效负载,len);
SerialMon.println();}
布尔mqttConnect(){
SerialMon.print(“连接到”);
SerialMon.print(经纪人);
//连接到MQTT代理
布尔状态=mqtt.connect(“gsmclientset”);
//或者,如果要对MQTT进行身份验证:
//布尔状态=mqtt.connect(“GsmClientName”、“mqtt_用户”、“mqtt_传递”);
如果(状态==false){
SerialMon.println(“失败”);
返回false;
}
SerialMon.println(“成功”);
mqtt.publish(topicInit,“gsmclientest已启动”);
//mqtt.subscribe(topicLed);
返回mqtt.connected();}
无效设置(){
SerialMon.begin(9600);
//启动I2C通信
I2CPower.begin(I2C_SDA,I2C_SCL,400000);
//设置调制解调器复位、启用、电源引脚
pinMode(调制解调器按键,输出);
pinMode(调制解调器第一,输出);
pinMode(调制解调器通电,输出);
数字写入(调制解调器按键,低电平);
数字写入(调制解调器第一,高);
数字写入(调制解调器开机,高电平);
//设置GSM模块波特率和UART引脚
串行开始(9600,串行8N1,调制解调器接收,调制解调器发送);
延迟(3000);
//重新启动SIM800模块,需要相当长的时间
//要跳过它,请调用init()而不是restart()
SerialMon.println(“初始化调制解调器…”);
modem.restart();
//如果不需要完全重新启动,请使用modem.init()
//如果需要,请使用PIN解锁您的SIM卡
if(strlen(simPIN)和&modem.getSimStatus()!=3){
调制解调器。simUnlock(simPIN);
}
SerialMon.print(“连接到APN:”);
连载印刷(apn);
如果(!modem.gprsConnect(apn、gprsUser、gprsPass)){
SerialMon.println(“失败”);
}
否则{
SerialMon.println(“OK”);
}
//MQTT代理设置
mqtt.setServer(broker,1883);
setCallback(mqttCallback);
esp_sleep_enable_timer_wakeup(睡眠时间*睡眠系数);
}
void循环(){
//这是需要在循环的顶部!
如果(!mqtt.connected()){
SerialMon.println(“==MQTT未连接==”);
//每10秒重新连接一次
uint32_t=millis();
如果(t-上次重新连接尝试>10000L){
最后重新连接尝试=t;
if(mqttConnect()){
LastReconnectEntry=0;
}
}
延迟(100);
返回;
}
publish(topicInit,“Hello”);
mqtt.loop();
}

您将代理的名称设置为
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地址)

如果您正在使用路由器的IP地址,则该地址可能会在没有警告的情况下更改,因此您需要使用类似的方法来更新其当前IP地址

您最好在基于云的虚拟服务器上的网络之外运行代理,或者使用几种商业MQTT服务之一