我是靠谱客的博主 标致西装,最近开发中收集的这篇文章主要介绍mqtt与esp8266学习记录,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

想要实现一个手机端去控制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("rn 测试开始rn");                           //打印测试例程提示信息

   

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 ( "rn连接成功rn" );        //有连接后串口输出连接成功



//设置服务器超时时间为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 ( "%srn", "吴昊臻!n" );

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

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

                                                                

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

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

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

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

  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服务器还可以搭建在可以联网的嵌入式硬件平台上,值得学习

最后

以上就是标致西装为你收集整理的mqtt与esp8266学习记录的全部内容,希望文章能够帮你解决mqtt与esp8266学习记录所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部