查看: 1223|回复: 0
收起左侧

嵌入式IoT[05]_ESP32-C3 mqtt操作实践

[复制链接]
发表于 2021-5-18 19:21:35 | 显示全部楼层 |阅读模式

有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 草帽王子 于 2021-5-18 19:20 编辑

ESP32-C3 mqtt操作实践


1.本文概述
2.环境搭建
3.esp32-c3 mqtt源代码编译与配置
4.手机控制
5.手机发送消息点亮led灯
  5.1 设计思路
  5.2 代码设计
  5.3 功能测试
6.小结


1.本文概述

对于ESP32-C3模块,是乐鑫的第一个基于RISCV架构的芯片,其主要定位还是一个物联网模块,所以在使用上更多的去考虑物联网的应用。本文主要是介绍在ESP32-C3模块上使用MQTT进行通信。

MQTT在物联网领域的使用非常的广泛,其协议在众多的智能控制领域广泛的使用。

本次实验在使用上,可以将PC上搭建一个mosquitto的mqtt服务器,并且在手机上控制模块的行为。


2.环境搭建

主要是在Ubuntu20.04上进行开发,首先需要安装相关的开发环境,这一部分已经在前面的文章中介绍过了,现在主要介绍下面的步骤。

首先搭建mosquitto的mqtt服务器。下面用最简单的办法搭建好一个可以使用的mqtt服务器。

第一步:安装mosquitto
  1. $ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
  2. $ sudo apt-get update
  3. $ sudo apt-get install mosquitto
复制代码
第二步:安装开发包和客户端
  1. $ sudo apt-get install libmosquitto-dev
  2. $ sudo apt-get install mosquitto-clients
复制代码
第三步:修改配置文件

正常情况下,上面步骤完成后,输入sudo service mosquitto start就可以启动了。

但是发现只能用localhost的ip地址或者127.0.0.1的ip地址,在本地才能访问。如果要让开发板正常的访问,显然是不行的。

所以此时修改了配置文件。
  1. sudo vim /etc/mosquitto/mosquitto.conf
复制代码
文件内容如下:
  1. # Place your local configuration in /etc/mosquitto/conf.d/
  2. #
  3. # A full description of the configuration file is at
  4. # /usr/share/doc/mosquitto/examples/mosquitto.conf.example

  5. persistence true
  6. persistence_location /var/lib/mosquitto/

  7. bind_address 192.168.15.123

  8. # 禁止匿名访问
  9. allow_anonymous true

  10. # 认证配置
  11. #password_file /etc/mosquitto/pwfile

  12. # 权限配置
  13. #acl_file /etc/mosquitto/aclfile

  14. log_dest file /var/log/mosquitto/mosquitto.log

  15. include_dir /etc/mosquitto/conf.d
复制代码
解释一下上述的配置

bind_address 192.168.15.123这里设置是服务器的ip地址,如果不设置,只能访问 127.0.0.1。后面的ip地址可以根据自己电脑的ip地址进行设置。
allow_anonymous true这里的参数配置为true表示可以不需要用户名和密码访问,否则如果填写成 false则需要配置认证和权限,这里简单起见,不用用户名密码。

第四步:启动mosquitto

输入下面的命令即可
  1. sudo service mosquitto start
复制代码
如果需要停止
  1. sudo service mosquitto stop
复制代码
还可以查看是否正常的启动。
  1. sudo service mosquitto status
复制代码
如下图所示,表示启动成功。
1.png

第五步:功能验证和环境测试

往往看服务器是否搭建成功,需要测试一下,这里先本地测试一下。

首先订阅一个topic
  1. mosquitto_sub -h 192.168.15.123 -t "test_mqtt" -v
复制代码
另外再开一个终端,往这个topic发布消息。
  1. mosquitto_pub -t "test_mqtt" -h 192.168.15.123 -m "hello_mqtt"
复制代码
最后可以看到效果如下
2.png

可以说明mqtt服务器基本成功。


3.esp32-c3 mqtt源代码编译与配置

前文已经搭建好开发环境,这里只说明操作步骤。

首先将ESP-IDF中的protocols的例程拷贝到自己的工作路径下。
  1. cp -r $IDF_PATH/examples/protocols .
复制代码
接着找到mqtt/tcp的例子。
  1. cd protocols/mqtt/tcp
复制代码
设置相关的编译目标为esp32c3。
  1. idf.py set-target esp32c3
复制代码
选择配置
  1. idf.py menuconfig
复制代码
这里有两个地方的配置需要自行填写。
3.png

其中的Example Connection Configuration用于配置wifi的连接信息。
4.png

而Example Configuration则是配置mqtt的服务器地址。
5.png

该地址前面记得加上mqtt://这样才能正常的解析,其地址为刚才搭建好的mqtt服务器的地址。

配置完成后开始编译
  1. idf.py build
复制代码
下载
  1. idf.py -p /dev/ttyUSB0 flash
复制代码
查看串口信息
  1. idf.py -p /dev/ttyUSB0 monitor
复制代码
正常情况下,会输入下面的信息
6.png

其topic为/topic/qos0。

注意:需要保证esp32-c3模块与mqtt服务器的电脑在同一个局域网内,这样才能正常的操作。

然后pc往开发板发一条消息。
  1. mosquitto_pub -t /topic/qos0 -h 192.168.15.123 -m "test_esp32"
复制代码
其中-t /topic/qos0表示需要往那个topic发送。
7.png
此时,可以看到开发板正常接受到了pc发过来的消息。


4.手机控制

此处只做局域网内的控制,也就是手机、电脑、esp32-c3在同一个局域网内,如果要远程控制,那么需要进行内网穿透。

本次用安卓手机做演示
8.png

下载EasyMQTT客户端。
9.png

添加连接,设置Broker为服务器地址。

正常情况下连接服务器如下
10.png

选择箭头,然后填写topic和消息
11.png

这样,就可以通过手机往开发板发送消息了。


5.手机发送消息点亮led灯

5.1 设计思路

基本的思路是手机连接mqtt的服务器,通过发布topic,电脑和开发板监听该topic,当开发板监听到该topic的消息后,将收到的数据解析出来。比如led=on表示开灯,led=off关灯。

点灯采用外接的GPIO,因为板载的LED需要PWM。

5.2 代码设计

在ESP32 IDF的编程模型中,对于GPIO的控制也是通过API接口进行控制。

最基本的操作
  1. gpio_reset_pin(LED_CTL); //复位gpio
  2. gpio_set_direction(LED_CTL, GPIO_MODE_OUTPUT); //设置gpio为输出模式
  3. gpio_set_level(LED_CTL, 1); //设置为高电平
复制代码
配置完成后,可以在
  1. static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
复制代码
函数中编写操作逻辑。
  1. case MQTT_EVENT_DATA:
  2.      ESP_LOGI(TAG, "MQTT_EVENT_DATA");
  3.      printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
  4.      printf("DATA=%.*s\r\n", event->data_len, event->data);
  5.      if(strstr(event->data, "led=on") != NULL)
  6.      {
  7.           gpio_set_level(LED_CTL, 0);
  8.      }
  9.      else if(trstr(event->data, "led=off") != NULL)
  10.      {
  11.            gpio_set_level(LED_CTL, 1);
  12.      }
  13.      break;
复制代码
当接受到led=on的指令,将GPIO拉低,此时灯点亮。

当接受到led=off的指令,将GPIO拉低,此时灯熄灭。

这样就完成了程序的设计。

硬件上的连接采用的GPIO3。

5.3 功能测试

输入idf.py build开始编译程序,并且输入idf.py -p /dev/ttyUSB0 flash开始下载。

最后idf.py -p /dev/ttyUSB0 monitor监听数据。

可以正常观测到数据了。
12.png

手机上发送led=on的消息,可以看到led被点亮。
13.png


6.小结

在esp32-c3上做mqtt的业务逻辑设计,使用上注意mqtt的服务器的搭建,以及esp32-c3的mqtt的相关例子,还有将整个链路弄清楚即可。

从上层逻辑上来看,这种ESP-IDF的框架更加友好,通过对mqtt协议层面的支持,使得用户拿到数据后,直接控制相关的硬件操作即可。

做室内的智能家居应用也是非常好的选择。


全球首家只专注于RISC-V单片机行业应用的中文网站
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

关闭

RISC-V单片机中文网上一条 /2 下一条



版权及免责声明|RISC-V单片机中文网

GMT+8, 2025-8-31 21:42 , Processed in 0.224996 second(s), 34 queries .

快速回复 返回顶部 返回列表