IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> mqtt与esp8266学习记录 -> 正文阅读

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:37:07  更:2021-10-12 23:38:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:42:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码