ESP32-C3 mqtt操作实践

2021-05-18 14:31:04 浏览数 (1)

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

代码语言:javascript复制
$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
$ sudo apt-get update
$ sudo apt-get install mosquitto

第二步:安装开发包和客户端

代码语言:javascript复制
$ sudo apt-get install libmosquitto-dev
$ sudo apt-get install mosquitto-clients

第三步:修改配置文件

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

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

所以此时修改了配置文件。

代码语言:javascript复制
sudo vim /etc/mosquitto/mosquitto.conf

文件内容如下:

代码语言:javascript复制
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

persistence true
persistence_location /var/lib/mosquitto/

bind_address 192.168.15.123

# 禁止匿名访问
allow_anonymous true

# 认证配置
#password_file /etc/mosquitto/pwfile

# 权限配置
#acl_file /etc/mosquitto/aclfile

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

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

输入下面的命令即可

代码语言:javascript复制
sudo service mosquitto start

如果需要停止

代码语言:javascript复制
sudo service mosquitto stop

还可以查看是否正常的启动。

代码语言:javascript复制
sudo service mosquitto status

如下图所示,表示启动成功。

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

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

首先订阅一个topic

代码语言:javascript复制
mosquitto_sub -h 192.168.15.123 -t "test_mqtt" -v

另外再开一个终端,往这个topic发布消息。

代码语言:javascript复制
mosquitto_pub -t "test_mqtt" -h 192.168.15.123 -m "hello_mqtt"

最后可以看到效果如下

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

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

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

首先将ESP-IDF中的protocols的例程拷贝到自己的工作路径下。

代码语言:javascript复制
cp -r $IDF_PATH/examples/protocols .

接着找到mqtt/tcp的例子。

代码语言:javascript复制
cd protocols/mqtt/tcp

设置相关的编译目标为esp32c3。

代码语言:javascript复制
idf.py set-target esp32c3

选择配置

代码语言:javascript复制
idf.py menuconfig

这里有两个地方的配置需要自行填写。

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

Example Configuration则是配置mqtt的服务器地址。

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

配置完成后开始编译

代码语言:javascript复制
idf.py build

下载

代码语言:javascript复制
idf.py -p /dev/ttyUSB0 flash

下载时注意/dev/ttyUSB0的权限,前文有说明

查看串口信息

代码语言:javascript复制
idf.py -p /dev/ttyUSB0 monitor

正常情况下,会输入下面的信息

其topic为/topic/qos0

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

然后pc往开发板发一条消息。

代码语言:javascript复制
mosquitto_pub -t /topic/qos0 -h 192.168.15.123 -m "test_esp32"

其中-t /topic/qos0表示需要往那个topic发送。

此时,可以看到开发板正常接受到了pc发过来的消息。

4.手机控制

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

本次用安卓手机做演示

下载EasyMQTT客户端。

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

正常情况下连接服务器如下

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

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

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

5.1 设计思路

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

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

5.2 代码设计

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

最基本的操作

代码语言:javascript复制
gpio_reset_pin(LED_CTL); //复位gpio
gpio_set_direction(LED_CTL, GPIO_MODE_OUTPUT); //设置gpio为输出模式
gpio_set_level(LED_CTL, 1); //设置为高电平

配置完成后,可以在static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)函数中编写操作逻辑。

代码语言:javascript复制
case MQTT_EVENT_DATA:
     ESP_LOGI(TAG, "MQTT_EVENT_DATA");
     printf("TOPIC=%.*srn", event->topic_len, event->topic);
     printf("DATA=%.*srn", event->data_len, event->data);
     if(strstr(event->data, "led=on") != NULL)
     {
          gpio_set_level(LED_CTL, 0);
     }
     else if(trstr(event->data, "led=off") != NULL)
     {
           gpio_set_level(LED_CTL, 1);
     }
     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监听数据。

可以正常观测到数据了。

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

6.小结

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

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

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

0 人点赞