想要实现一个手机端去控制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服务器还可以搭建在可以联网的嵌入式硬件平台上,值得学习
|