mqtt与esp8266学习记录

本文介绍了如何使用ESP8266模块作为桥梁,通过MQTT协议连接云端服务器,实现手机端控制STM32单片机LED灯的闪烁。流程涉及ESP8266在AP和STA模式下的配置,以及MQTT客户端的创建和数据传输。在手机端,使用QT编写安卓APP,通过MQTT库连接服务器,实现发布和订阅功能,完成远程控制。
摘要由CSDN通过智能技术生成

想要实现一个手机端去控制stm32实现led灯闪烁的实验

流程:在云端搭建好网页(服务器),发送控制消息至MQTT中指定的topic,esp8266订阅topic,接收到控制命令时,控制相应的LED。

首先,我们需要esp8266模块 stm32单片机 一个mqtt服务器 QT编写的安卓app

MQTT X: 优雅的跨平台 MQTT 5.0 客户端工具

首先 我们用的是正点原子的esp8266模块 esp8266有两种模式AP模式和STA模式

AP模式是作为无线WiFi热点,允许其他WiFi设备连接到本模块,可以设置三个子模式

TCP服务器,TCP客户端,UDP模式

PC_Usart("\r\n 测试开始\r\n");                           //打印测试例程提示信息

   

ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );  //重启复位

ESP8266_Cmd ( "AT+CWMODE=2", "OK", NULL, 200 );   //设置为AP模式,即主机模式

ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );   //复位后生效

//创建热点,

ESP8266_Cmd ( "AT+CWJAP=\"ATK-ESP8266\",\"12345678\",1,4","OK", NULL, 200 );  //设置wifi名称和密码等

//AT+CWJAP="ZIXE7TRCAUPIWAI 4895","12345678"

//设置多路连接方式

ESP8266_Cmd ( "AT+CIPMUX=1","OK", NULL, 200 );

//设置服务器

ESP8266_Cmd ( "AT+CIPSERVER=1,8080","OK", NULL, 200 );  



//此时用手机或PC机连上wifi,并连上模块创建的服务器,默认ip为192.168.4.1,端口号8080



//等待连接成功,strstr函数判断包含CONNECT返回1,表连接成功,不包含返回0,继续等待

while(!strstr(strEsp8266_Fram_Record .Data_RX_BUF,"CONNECT" ));

PC_Usart ( "\r\n连接成功\r\n" );        //有连接后串口输出连接成功



//设置服务器超时时间为2000s,单位s

ESP8266_Cmd ( "AT+CIPSTO=2000","OK", NULL, 200 );  



//准备发送数据

  while(1)

{   

 key=KET_SCAN(0);

switch(key)

{

 case KEY_LEFT:

ESP8266_Cmd ( "AT+CIPSEND=0,16",">", NULL, 500 );  //向已连接的设备0发送数据

  ESP8266_Usart ( "%s\r\n", "吴昊臻!\n" );

此时esp8266作为一个WiFi热点 主要是起到数据集散收发的作用,配置AP-TCP服务器模式后

可以将手机与电脑同时连入esp8266产生的热点wifi中,实现手机与电脑数据的传输

                                                                

STA模式 是用于连接到无线网络,实现串口与其他联网设备的无线(WiFi)数据转换互传,也就是实现手机联网控制stm32单片机led灯的开关。其有三个子模式 TCP服务器 TCP客户端 UDP

这里说一下TCP与UDP的区别 为了传输的快 就选UDP 为了传输数据的稳定性 就选TCP

此时我们的设备是作为一个节点在网络中,所以为TCP客户端模式 并需要借助mqtt服务器进行三次握手等形式数据的中转

PC_Usart("\r\n 测试开始\r\n");                            //打印测试例程提示信息

  atk_8266_quit_trans();

ESP8266_Cmd ( "AT+RST", "OK", "ready", 200 );  //重启复位

ESP8266_Cmd ( " AT+CWMODE=1", "OK", NULL, 200 );   //设置为AP模式,即主机模式

ESP8266_Cmd ( "AT+RST", "OK", "ready",200);   //复位后生效

//创建热点,

Delay_ms(1000);



ESP8266_Cmd ( "AT+CWJAP=\"ZIXE7TRCAUPIWAI 4895\",\"123456789\"","WIFI CONNECTEDWIFI GOT IP", "OK", 3000 );  //设置wifi名称和密码等

//AT+CWJAP="ZIXE7TRCAUPIWAI 4895","12345678"

Delay_ms(1000);



//设置多路连接方式

ESP8266_Cmd ( "AT+CIPMUX=0","OK", NULL, 200 );

Delay_ms(1000);



ESP8266_Cmd ( "AT+CIPSTART=\"TCP\",\"111.115.78.48\",8086","CONNECT", "OK",3000 ); //建立TCP连接到111.115.78.48,端口号8086

Delay_ms(1000);





//设置服务器

//ESP8266_Cmd ( "AT+CIPSERVER=1,8080","OK", NULL, 200 );  

ESP8266_Cmd ( "AT+CIPMODE=1","OK", NULL, 200 );

Delay_ms(1000);

Delay_ms(1000);



ESP8266_Cmd ( "AT+CIPSEND","OK", NULL, 200 );

Delay_ms(1000);

Delay_ms(1000);

图中情况为,将电脑作为一个服务器,esp8266连接输入的是电脑的IP地址和端口号

 有一个订阅主题和发布主题:订阅主题是你去订阅,然后另一个客户端按照这个主题去发布,所以有两个

接下来探索mqtt的情况

查阅发现,mqtt服务器有两种情况,自建和租用(云端服务器)

一 租用(云端服务器)

EMQX Cloud MQTT服务器

随后借助MQTTX软件模拟客户端进行调试
云服务器通过宝塔创建MySQL数据库并连接到本地,这部分需要在我们的云服务器上安装一个数据库,我在这里选择的是MySQL,还需要安装PHP、Nginx。大家可以自行在服务器上安装,这里展示华为云安装宝塔后的情况

其核心是利用EMQX获取一个服务器的IP地址和端口号,在这个服务器上实现数据的订阅和发布。

单片机方面:首先第一步连接上一个WiFi进网,第二步搜寻服务器的IP地址和端口号实现自身STA-TCP客户端模式的配置,随后就是建立发送缓存区和接收缓存区进行数据的发送和接收(怎么发送和接收的)然后对接收的数据进行if判断。

手机APP方面:

首先我们需要在QT加载mqtt库,

随后就可以调用API接口函数了

连接://连接

void MainWindow::on_pushButton_connect_clicked()

{

    if (m_client->state() == QMqttClient::Disconnected)

    {

        ui->pushButton_connect->setText(tr("断开"));

        m_client->setHostname(ui->lineEdit_host->text());

        m_client->setPort(ui->lineEdit_port->text().toInt());

        m_client->setUsername(ui->lineEdit_user->text());

        m_client->setPassword(ui->lineEdit_pwd->text());

        m_client->setClientId("1234");



        m_client->setKeepAlive(120);



        ui->lineEdit_host->setEnabled(false);

        ui->lineEdit_port->setEnabled(false);

        ui->lineEdit_user->setEnabled(false);

        ui->lineEdit_pwd->setEnabled(false);



        m_client->connectToHost();

    }

    else

    {//断开连接

        ui->pushButton_connect->setText(tr("连接"));

        ui->lineEdit_host->setEnabled(true);

        ui->lineEdit_port->setEnabled(true);

        ui->lineEdit_user->setEnabled(true);

        ui->lineEdit_pwd->setEnabled(true);



        m_client->disconnectFromHost();

        ui->textEdit->append("连接断开!!!");

    }

}

发布://发布

void MainWindow::on_pushButton_2_clicked()

{

    QString topicPub;

    QByteArray messagePub;

    if(m_client->state() == QMqttClient::Connected)

    {

        topicPub = ui->lineEdit_pub->text();

        messagePub = ui->lineEdit_pubMsg->text().toUtf8();



        m_client->publish(topicPub, messagePub, 0);

        return;

    }

    ui->textEdit->append("请连接后重新操作!");

}

订阅://订阅

void MainWindow::on_pushButton_clicked()

{

    QString topicSub;

    int qos;

    if(m_client->state() == QMqttClient::Connected)

    {

        topicSub = ui->lineEdit_sub->text();

        qos = ui->spinBox->text().toInt();

        m_client->subscribe(topicSub, qos);

        return;

    }

    ui->textEdit->append("请连接后重新操作!");

}


接收消息://收到消息

void MainWindow::topicMessageReceived(const QByteArray &message, const QMqttTopicName &topic)

{

    QString content;

    content = QDateTime::currentDateTime().toString() + QLatin1Char('\n');

    content += QLatin1String(" Received Topic: ") + topic.name() + QLatin1Char('\n');

    content += QLatin1String(" Message: ") + message + QLatin1Char('\n');

    ui->textEdit->append(content);

}


二 自建

Mosquitto是一款「An Open Source MQTT v3.1/v3.1.1 Broker」——开源的MQTT代理服务器

我做的是在Ubuntu10.4环境下mosquitto的简单配置

配置好后主要函数有

启动服务器 mosquitto -c /etc/mosquitto/mosquitto.conf

订阅主题  mosquitto_sub -t zheng # 订阅主题zheng

发布消息 mosquitto_pub -h localhost -t "zheng" -m "hello" # 其中-h参数为主机地址

配置用户名和密码见 Ubuntu下安装配置MQTT服务器 - zlook - 博客园

2020_千锋嗨哥_嵌入式之RFID开发与应用(通俗易懂)_哔哩哔哩_bilibili

此时 在Ubuntu的配置下 IP地址为 本机IP地址

在命令流中输入 ifconfig -a即可查看

端口号默认为1883

如图为MQTTX与Ubuntu中的mosquitto-client两个客户端通过订阅同一个主题zheng所互相传输的信息

后续发现mqtt服务器还可以搭建在可以联网的嵌入式硬件平台上,值得学习

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT是一种轻量级的通信协议,可以实现设备与云端之间的数据传输。而ESP8266是一款常用的物联网开发板,可以通过MQTT协议将数据传输到云平台。 以下是大致的步骤: 1. 在云平台上注册并创建一个MQTT通道,获取对应的用户名、密码、主题等信息。 2. 在ESP8266上安装MQTT库,例如PubSubClient库,以便使用MQTT协议与云平台通信。 3. 在ESP8266上编写程序,将需要传输的数据通过MQTT协议发送到云平台。可参考以下示例代码: ``` #include <ESP8266WiFi.h> #include <PubSubClient.h> // WiFi连接信息 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // 云平台MQTT信息 const char* mqttServer = "your_MQTT_SERVER"; const int mqttPort = 1883; const char* mqttUser = "your_MQTT_USER"; const char* mqttPassword = "your_MQTT_PASSWORD"; const char* mqttTopic = "your_MQTT_TOPIC"; // WiFi客户端和MQTT客户端 WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { // 连接WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); } // 连接MQTT mqttClient.setServer(mqttServer, mqttPort); mqttClient.setCallback(callback); while (!mqttClient.connect("ESP8266Client", mqttUser, mqttPassword)) { delay(1000); } mqttClient.subscribe(mqttTopic); } void loop() { // 发送数据到云平台 int value = analogRead(A0); mqttClient.publish(mqttTopic, String(value).c_str()); } void callback(char* topic, byte* message, unsigned int length) { // 处理云平台发来的消息 } ``` 4. 在云平台上查看数据是否传输成功。 需要注意的是,不同的云平台可能有不同的MQTT接入方式和参数设置,具体操作可以参考对应云平台的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值