入门 ESP-IOT-SOLUTION 专题一:AWS IOT example 浅析

这篇文章主要是简单分析 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.cppaws_iot_task.cppaws_iot_lcd.cpp。下面我将分别解释其中的函数构成。

1. aws_main.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 看到。

2. aws_iot_lcd.cpp

经过上一小节的讨论,我们可以查看 app_lcd_init()app_lcd_wifi_connecting()

2.1 app_lcd_init()

在此函数中,先创建了 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 任务中,反复循环来接收队列信息,接收到的信息为以下五个之一:

  • LCD_EVT_WIFI_CONNECTING
  • LCD_EVT_SUB_CB
  • LCD_EVT_PUB_CB
  • LCD_EVT_AWS_CONNECTING
  • LCD_EVT_AWS_CONNECTED

分别是普通 Wi-Fi 正在连接、订阅信息、上传信息、AWS 正在连接、AWS 已连接。

2.2 app_lcd_wifi_connecting()

在这个函数中,直接向队列发送 LCD_EVT_WIFI_CONNECTING,从而进行 AWS 连接。

3. aws_iot_task.cpp

我们直接查看 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_subscribeaws_iot_mqtt_publish 顺利进行 subscribe 和 publish 操作了。

你可能感兴趣的:(ESP32)