这篇文章主要是简单分析 esp-iot-solution 里的 aws_iot_demo 示例,目录如下:/esp-iot-solution/examples/aws_iot_demo
。esp-iot-solution 版本 commit为: 40cec13
可通过以下命令确认:
git log --oneline -1
结果为:
40cec13 Merge branch 'master' of https://github.com/espressif/esp-iot-solution
aws_iot_demo
示例里面主要有三个相关文件,分别是:aws_main.cpp
、 aws_iot_task.cpp
和 aws_iot_lcd.cpp
。下面我将分别解释其中的函数构成。
我们直接查看 app_main()
函数 内容如下:
extern "C" void app_main()
{
app_lcd_init();
app_lcd_wifi_connecting();
CWiFi *my_wifi = CWiFi::GetInstance(WIFI_MODE_STA);
printf("connect wifi\n");
my_wifi->Connect(EXAMPLE_WIFI_SSID, EXAMPLE_WIFI_PASS, portMAX_DELAY);
app_sntp_init();
#ifdef CONFIG_MBEDTLS_DEBUG
const size_t stack_size = 36*1024;
#else
const size_t stack_size = 36 * 1024;
#endif
/*Start AWS task*/
xTaskCreatePinnedToCore(&aws_iot_task, "aws_iot_task", stack_size, NULL, 5,
NULL, 1);
}
其中 app_lcd_init()
和 app_lcd_wifi_connecting()
分别初始化 lcd 与进行 Wi-Fi 连接。详细内容我们将在后续的 aws_iot_lcd.cpp
讨论。然后通过 app_sntp_init()
初始化了简单时间网络协议函数。最后通过 xTaskCreatePinnedToCore(&aws_iot_task, "aws_iot_task", stack_size, NULL, 5, NULL, 1)
创建了 aws_iot_task
任务。具体信息我们可以在 aws_iot_task.cpp
看到。
经过上一小节的讨论,我们可以查看 app_lcd_init()
和 app_lcd_wifi_connecting()
。
在此函数中,先创建了 lcd 队列和 app_lcd_task
任务,代码如下:
if (lcd_queue == NULL) {
lcd_queue = xQueueCreate(10, sizeof(lcd_evt_t));
xTaskCreate(app_lcd_task, "app_lcd_task", 2048, NULL, 6, NULL);
}
然后就是对 lcd 引脚,时钟等硬件层面进行定义和屏幕初始化。
在 app_lcd_task
任务中,反复循环来接收队列信息,接收到的信息为以下五个之一:
分别是普通 Wi-Fi 正在连接、订阅信息、上传信息、AWS 正在连接、AWS 已连接。
在这个函数中,直接向队列发送 LCD_EVT_WIFI_CONNECTING
,从而进行 AWS 连接。
我们直接查看 aws_iot_task(void *param)
任务,首先任务声明了一个 AWS_IoT_Client
结构体。然后配置了 IoT_Client 的初始化与连接参数。后来继续将 mqtt初始化的相关参数一一配置。配置后即可运行 aws_iot_mqtt_init(&client, &mqttInitParams)
函数。随后继续配置进行 AWS IOT 连接需要的参数,通过 app_lcd_aws_connecting()
和 aws_iot_mqtt_connect(&client, &connectParams)
,之后如果顺利错误检测。就可以继续进行 app_lcd_aws_connected()
。然后我们就可以通过 aws_iot_mqtt_subscribe
和 aws_iot_mqtt_publish
顺利进行 subscribe 和 publish 操作了。