1.本文概述
2.环境搭建
3.esp32-c3 mqtt源代码编译与配置
4.手机控制
5.手机发送消息点亮led灯
5.1 设计思路
5.2 代码设计
5.3 功能测试
6.小结
对于ESP32-C3模块,是乐鑫的第一个基于RISCV架构的芯片,其主要定位还是一个物联网模块,所以在使用上更多的去考虑物联网的应用。本文主要是介绍在ESP32-C3模块上使用MQTT进行通信。
MQTT在物联网领域的使用非常的广泛,其协议在众多的智能控制领域广泛的使用。
本次实验在使用上,可以将PC上搭建一个mosquitto
的mqtt服务器,并且在手机上控制模块的行为。
主要是在Ubuntu20.04上进行开发,首先需要安装相关的开发环境,这一部分已经在前面的文章中介绍过了,现在主要介绍下面的步骤。
首先搭建mosquitto
的mqtt服务器。下面用最简单的办法搭建好一个可以使用的mqtt服务器。
第一步:安装mosquitto
$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
$ sudo apt-get update
$ sudo apt-get install mosquitto
第二步:安装开发包和客户端
$ sudo apt-get install libmosquitto-dev
$ sudo apt-get install mosquitto-clients
第三步:修改配置文件
正常情况下,上面步骤完成后,输入sudo service mosquitto start
就可以启动了。
但是发现只能用localhost
的ip地址或者127.0.0.1
的ip地址,在本地才能访问。如果要让开发板正常的访问,显然是不行的。
所以此时修改了配置文件。
sudo vim /etc/mosquitto/mosquitto.conf
文件内容如下:
# 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
输入下面的命令即可
sudo service mosquitto start
如果需要停止
sudo service mosquitto stop
还可以查看是否正常的启动。
sudo service mosquitto status
如下图所示,表示启动成功。
第五步:功能验证和环境测试
往往看服务器是否搭建成功,需要测试一下,这里先本地测试一下。
首先订阅一个topic
mosquitto_sub -h 192.168.15.123 -t "test_mqtt" -v
另外再开一个终端,往这个topic发布消息。
mosquitto_pub -t "test_mqtt" -h 192.168.15.123 -m "hello_mqtt"
最后可以看到效果如下
可以说明mqtt服务器基本成功。
前文已经搭建好开发环境,这里只说明操作步骤。
首先将ESP-IDF中的protocols的例程拷贝到自己的工作路径下。
cp -r $IDF_PATH/examples/protocols .
接着找到mqtt/tcp
的例子。
cd protocols/mqtt/tcp
设置相关的编译目标为esp32c3。
idf.py set-target esp32c3
选择配置
idf.py menuconfig
这里有两个地方的配置需要自行填写。
其中的Example Connection Configuration
用于配置wifi的连接信息。
而Example Configuration
则是配置mqtt的服务器地址。
该地址前面记得加上mqtt://
这样才能正常的解析,其地址为刚才搭建好的mqtt服务器的地址。
配置完成后开始编译
idf.py build
下载
idf.py -p /dev/ttyUSB0 flash
下载时注意/dev/ttyUSB0的权限,前文有说明
查看串口信息
idf.py -p /dev/ttyUSB0 monitor
正常情况下,会输入下面的信息
其topic为/topic/qos0
。
注意:需要保证esp32-c3模块与mqtt服务器的电脑在同一个局域网内,这样才能正常的操作。
然后pc往开发板发一条消息。
mosquitto_pub -t /topic/qos0 -h 192.168.15.123 -m "test_esp32"
其中-t /topic/qos0
表示需要往那个topic发送。
此时,可以看到开发板正常接受到了pc发过来的消息。
此处只做局域网内的控制,也就是手机、电脑、esp32-c3在同一个局域网内,如果要远程控制,那么需要进行内网穿透。
本次用安卓手机做演示
下载EasyMQTT客户端。
添加连接,设置Broker为服务器地址。
正常情况下连接服务器如下
选择箭头,然后填写topic和消息
这样,就可以通过手机往开发板发送消息了。
基本的思路是手机连接mqtt的服务器,通过发布topic,电脑和开发板监听该topic,当开发板监听到该topic的消息后,将收到的数据解析出来。比如led=on
表示开灯,led=off
关灯。
点灯采用外接的GPIO,因为板载的LED需要PWM。
在ESP32 IDF的编程模型中,对于GPIO的控制也是通过API接口进行控制。
最基本的操作
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)
函数中编写操作逻辑。
case MQTT_EVENT_DATA:
ESP_LOGI(TAG, "MQTT_EVENT_DATA");
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
printf("DATA=%.*s\r\n", 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。
输入idf.py build
开始编译程序,并且输入idf.py -p /dev/ttyUSB0 flash
开始下载。
最后idf.py -p /dev/ttyUSB0 monitor
监听数据。
可以正常观测到数据了。
手机上发送led=on
的消息,可以看到led被点亮。
在esp32-c3上做mqtt的业务逻辑设计,使用上注意mqtt的服务器的搭建,以及esp32-c3的mqtt的相关例子,还有将整个链路弄清楚即可。
从上层逻辑上来看,这种ESP-IDF的框架更加友好,通过对mqtt协议层面的支持,使得用户拿到数据后,直接控制相关的硬件操作即可。
做室内的智能家居应用也是非常好的选择。