diff --git a/rt-thread-version/rt-thread-standard/_sidebar.md b/rt-thread-version/rt-thread-standard/_sidebar.md index 2db2b93808f4e1d94e2835e98e34180600f5a35b..bb946ec440f50eb216338b7d69cc90baaa167d94 100644 --- a/rt-thread-version/rt-thread-standard/_sidebar.md +++ b/rt-thread-version/rt-thread-standard/_sidebar.md @@ -132,6 +132,7 @@ - [RISC-V 移植](/rt-thread-version/rt-thread-standard/application-note/porting/risc-v/port-risc-v.md) - [固件尺寸优化](/rt-thread-version/rt-thread-standard/application-note/system/optimization/Optimize-code-size/an0049-optimize-code-size.md) - [在RT-Thread潘多拉开发板上实现电源管理](/rt-thread-version/rt-thread-standard/application-note/system/pm/an0025-pm.md) + - [在RT-Thread小熊派开发板连接华为云](/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/kawaiimqtt_bearpi.md) - [网络协议栈驱动移植](/rt-thread-version/rt-thread-standard/application-note/components/network/an0010-lwip-driver-porting.md) - [在STM32F429上应用网络功能](/rt-thread-version/rt-thread-standard/application-note/components/network/an0011-network-started.md) - [在STM32F429上应用文件系统](/rt-thread-version/rt-thread-standard/application-note/components/dfs/an0012-dfs.md) diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_1_create_product.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_1_create_product.png new file mode 100644 index 0000000000000000000000000000000000000000..4771f7c09d9d0d752569050c28e4081e120c186d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_1_create_product.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_1_create_product_suc.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_1_create_product_suc.png new file mode 100644 index 0000000000000000000000000000000000000000..5189aac54c66f8fb3f8a46185c0574d3778e3301 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_1_create_product_suc.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_2_register_device.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_2_register_device.png new file mode 100644 index 0000000000000000000000000000000000000000..b7fbc0fe18ea087befc22d8f94bd8f25aecaeada Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_2_register_device.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_2_register_device_suc.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_2_register_device_suc.png new file mode 100644 index 0000000000000000000000000000000000000000..e04c5818397fe713af787f1d68300acf48b12bb3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_2_register_device_suc.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_3_mqtt_generator.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_3_mqtt_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..adce2cacf537ccb1b40e79ed90e19588d34d60ff Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_3_mqtt_generator.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_4_mqtt_host_port.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_4_mqtt_host_port.png new file mode 100644 index 0000000000000000000000000000000000000000..154aa9358eb10acbf5379c1a1781caeb231b77a3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_4_mqtt_host_port.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_6_mqtt_service.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_6_mqtt_service.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd1dd01709345213c91c0eae9fdf7443eef9c60 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/2_6_mqtt_service.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_2_menuconfig.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_2_menuconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa7fbc13e83ee549f3eaaeb96a55c96e47d912f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_2_menuconfig.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_3_at_create_resp.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_3_at_create_resp.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ad1c2f840f0412d218b606a27ac73c5a83f80d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_3_at_create_resp.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_3_serial_rb_bufsz.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_3_serial_rb_bufsz.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b820ca2755145161b7e4df1fbfc9b2802e629f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/3_3_serial_rb_bufsz.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_1_borad_reset.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_1_borad_reset.png new file mode 100644 index 0000000000000000000000000000000000000000..82926c744bbd01696dbf9f93d0cb649f302abed1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_1_borad_reset.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_2_data_upload_debug.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_2_data_upload_debug.png new file mode 100644 index 0000000000000000000000000000000000000000..76d341127fc4fa268c6843105647b19e861089f2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_2_data_upload_debug.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_2_data_upload_ui.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_2_data_upload_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..04a7b6b99dc45c65d94b0b82213ecbf53d37ae38 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_2_data_upload_ui.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_3_upload_false.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_3_upload_false.png new file mode 100644 index 0000000000000000000000000000000000000000..7bcf941f3421fd306202095706e08ec9813dc800 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_3_upload_false.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_3_upload_true.png b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_3_upload_true.png new file mode 100644 index 0000000000000000000000000000000000000000..57d0f9e6ee5d7b855416d707453fe33bb1b5ea22 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/figures/4_3_upload_true.png differ diff --git a/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/kawaiimqtt_bearpi.md b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/kawaiimqtt_bearpi.md new file mode 100644 index 0000000000000000000000000000000000000000..99cbafdf519bc41750851d9ce37a4b5cad1e5378 --- /dev/null +++ b/rt-thread-version/rt-thread-standard/application-note/packages/kawaiimqtt/kawaiimqtt_bearpi.md @@ -0,0 +1,358 @@ +# 基于RT-Thread的小熊派连接华为云说明文档 + +## 1 项目介绍 + +- 主要功能:使用小熊派ESP8266模块连接华为云物联网平台。 + - 设备端功能:将小熊派MPU6050模块的`xyz加速度原始值`上传至华为云平台。 + - 云端功能:可以控制小熊派`开启上传/停止上传`数据到华为云平台。 +- 小熊派主要使用的外设: + - I2C:采集MPU6050的数据(i2c) + - UART:向ESP8266模块发送AT指令联网(lpuart1) +- RT-Thread 主要使用到的软件包 + - at-device:用于esp8266快速联网。 + - mpu6xxx:用于读取mpu6050的原始数据。 + - kawaii-mqtt:用于快速对接到mqtt服务器。 + - cJSON:用于解析mqtt服务器下发的JSON数据。 + +## 2 云平台配置 + +进入华为云设备接入控制台 [华为云设备接入平台](https://console.huaweicloud.com/iotdm/?agencyId=559e6def93234d46b88a72e285cc7241®ion=cn-north-4&locale=zh-cn#/dm-dev/all-product) + +### 2.1 创建产品 + +![](figures/2_1_create_product.png) + +![](figures/2_1_create_product_suc.png) + +### 2.2 基于创建的产品注册一个设备 + +![](figures/2_2_register_device.png) + +![](figures/2_2_register_device_suc.png) + +### 2.3 根据设备信息获取MQTT连接所需要的三元组 + +我们可以通过华为云提供的官方产品帮助文档中,根据参数描述自己计算出三元组;或者我们可以使用下面的网页来帮助我们生成三元组:[Huaweicloud IoTDA Mqtt ClientId Generator (myhuaweicloud.com)](https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/) + + +这里我们需要填入两个信息就可以生成三元组了 +- DeviceId:设备ID(前面注册设备的时候生成的) +- DeviceSecret:设备密钥(前面注册设备的时候自己填入的) + +![](figures/2_3_mqtt_generator.png) + +### 2.4 查看设备接入服务器域名和端口 + +![](figures/2_4_mqtt_host_port.png) + +### 2.5 获取发布和订阅主题 + +设备使用MQTT协议接入平台时,平台和设备通过Topic进行通信。平台预置的topic列表可参考::[华为云预置的topic](https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html) + +我们可以进行如下设置: + +设备上报属性(发布主题):`$oc/devices/{device_id}/sys/properties/report`(需将“{device_id}”替换为所需的设备id) +平台下发命令(订阅主题):`$oc/devices/{device_id}/sys/commands/#`(需将“{device_id}”替换为所需的设备id) + +### 2.6 创建服务并添加属性和命令 + +根据本项目实现的功能: +- 设备端功能:将小熊派MPU6050模块的`xyz加速度原始值`上传至华为云平台。需要创建三个属性去显示数据。 +- 云端功能:可以控制小熊派`开启上传/停止上传`数据到华为云平台。需要创建一个命令去控制设备端。 + +![](figures/2_6_mqtt_service.png) + +至此,华为云的相关配置结束。 + +## 3 设备端配置 + +- 小熊派主要使用的外设: + - I2C:采集MPU6050的数据(i2c) + - UART:向ESP8266模块发送AT指令联网(lpuart1) +- RT-Thread 主要使用到的软件包 + - at-device:用于esp8266快速联网。 + - mpu6xxx:用于读取mpu6050的原始数据。 + - kawaii-mqtt:用于快速对接到mqtt服务器。 + - cJSON:用于解析mqtt服务器下发的JSON数据。 + +### 3.1 编写一键化Kconfig + +根据上面的描述,可以编写一个Kconfig来一键化配置工程: + +```Kconfig +config BSP_USING_MPU6050 + bool "Enable MPU6050 to read accel data" + select BSP_USING_I2C + select BSP_USING_I2C1 + select PKG_USING_MPU6XXX + default n + if BSP_USING_MPU6050 + menuconfig BSP_USING_MQTT_HW_CLOUD + bool "Enable MPU6050 Connect to Huawei Cloud" + select BSP_USING_LPUART1 + select PKG_USING_CJSON + select PKG_USING_AT_DEVICE + select AT_DEVICE_USING_ESP8266 + select PKG_USING_KAWAII_MQTT + select KAWAII_MQTT_NETSOCKET_USE_SAL + default n + + if AT_DEVICE_USING_ESP8266 + config ESP8266_SAMPLE_WIFI_SSID + string "WIFI ssid" + default "rtthread" + + config ESP8266_SAMPLE_WIFI_PASSWORD + string "WIFI password" + default "12345678" + + config ESP8266_SAMPLE_CLIENT_NAME + string "AT client device name" + default "lpuart1" + endif + + if PKG_USING_KAWAII_MQTT + config KAWAII_MQTT_HOST + string "mqtt host" + default "jiejie01.top" + + config KAWAII_MQTT_PORT + string "mqtt port" + default "1883" + + config KAWAII_MQTT_CLIENTID + string "mqtt client id" + default "rtthread001" + + config KAWAII_MQTT_USERNAME + string "mqtt username" + default "rt-thread" + + config KAWAII_MQTT_PASSWORD + string "mqtt password" + default "rt-thread" + + config KAWAII_MQTT_SUBTOPIC + string "mqtt subscribe topic" + default "rtt-sub" + + config KAWAII_MQTT_PUBTOPIC + string "mqtt publish topic" + default "rtt-pub" + endif + endif +``` + +> 注意,以上配置务必保证板载驱动支持`lpuart1`,`i2c1`。 + +### 3.2 配置工程 + +根据前面华为云得到的信息,填写对应的配置: + +![](figures/3_2_menuconfig.png) + +保存退出,直接生成工程。 + +### 3.3 需要修改的地方 + +这样配置后,还不能完全保证与服务器的通信连接(无法接受mqtt服务器发过来的数据)。需要修改如下两个地方: + +1. 修改`rtconfig.h`文件中`RT_SERIAL_RB_BUFSZ`的值。 + +![](figures/3_3_serial_rb_bufsz.png) + +2. 修改`at_client.c`文件中`at_create_resp`创建的接收缓冲区大小。 + +![](figures/3_3_at_create_resp.png) + +### 3.4 编写功能业务代码 + +```c +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-09-19 liYony first version + */ + +#include +#include "mpu6xxx.h" + +#define DBG_TAG "mpu6050" +#define DBG_LVL DBG_LOG +#include + +#define MPU6050_DEVICE_NAME "i2c1" + +#ifdef BSP_USING_MQTT_HW_CLOUD +#include "mqttclient.h" +#include +#include +#include + +#ifndef KAWAII_MQTT_HOST +#define KAWAII_MQTT_HOST "jiejie01.top" +#endif +#ifndef KAWAII_MQTT_PORT +#define KAWAII_MQTT_PORT "1883" +#endif +#ifndef KAWAII_MQTT_CLIENTID +#define KAWAII_MQTT_CLIENTID "rtthread001" +#endif +#ifndef KAWAII_MQTT_USERNAME +#define KAWAII_MQTT_USERNAME "rt-thread" +#endif +#ifndef KAWAII_MQTT_PASSWORD +#define KAWAII_MQTT_PASSWORD "rt-thread" +#endif +#ifndef KAWAII_MQTT_SUBTOPIC +#define KAWAII_MQTT_SUBTOPIC "rtt-sub" +#endif +#ifndef KAWAII_MQTT_PUBTOPIC +#define KAWAII_MQTT_PUBTOPIC "rtt-pub" +#endif + +static char payload_buf[256];/////////////////////// +static rt_bool_t is_upload = RT_TRUE; + +/* 处理mqtt服务器发过来的数据 */ +static void mqtt_subscribe_handle(void *client, message_data_t *msg) +{ + (void)client; + KAWAII_MQTT_LOG_I("-----------------------------------------------------------------------------------"); + KAWAII_MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char *)msg->message->payload); + KAWAII_MQTT_LOG_I("-----------------------------------------------------------------------------------"); + + /* 数据格式为: {"paras":{"upload_bool":true},"service_id":"mpu6050","command_name":"ctl_upload"} */ + cJSON* json_data = RT_NULL; + cJSON* json_upload = RT_NULL; + json_data = cJSON_Parse((char *)msg->message->payload); + if (json_data == RT_NULL) + { + return; + } + json_upload = cJSON_GetObjectItem(json_data, "paras"); + json_upload = cJSON_GetObjectItem(json_upload, "upload_bool"); + + if (json_upload->valueint == RT_TRUE) + { + is_upload = RT_TRUE; + LOG_I("start upload."); + } + else + { + is_upload = RT_FALSE; + LOG_I("stop upload."); + } + +} + +/* 处理上报mqtt服务器的数据 */ +static int mqtt_publish_handle(mqtt_client_t *client, void *payload) +{ + mqtt_message_t msg; + memset(&msg, 0, sizeof(msg)); + + msg.qos = QOS1; + msg.payload = payload; + + return mqtt_publish(client, KAWAII_MQTT_PUBTOPIC, &msg); +} +#endif /* BSP_USING_MQTT_HW_CLOUD */ + +static void mpu6050_accel_entry(void *parameter) +{ + struct mpu6xxx_device *dev; + struct mpu6xxx_3axes accel; + + /* Initialize mpu6050, The parameter is RT_NULL, means auto probing for i2c*/ + dev = mpu6xxx_init(MPU6050_DEVICE_NAME, RT_NULL); + + if (dev == RT_NULL) + { + LOG_E("mpu6050 init failed."); + return; + } + LOG_I("mpu6050 init succeed."); +#ifdef BSP_USING_MQTT_HW_CLOUD + /* 等待esp8266成功连接上网络 */ + while(!netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP)) + { + rt_thread_mdelay(2); + } + + LOG_I("network init succeed."); + + /* 配置mqtt服务器 */ + mqtt_log_init(); + mqtt_client_t *client = mqtt_lease(); + mqtt_set_host(client, KAWAII_MQTT_HOST); + mqtt_set_port(client, KAWAII_MQTT_PORT); + mqtt_set_user_name(client, KAWAII_MQTT_USERNAME); + mqtt_set_password(client, KAWAII_MQTT_PASSWORD); + mqtt_set_client_id(client, KAWAII_MQTT_CLIENTID); + mqtt_set_clean_session(client, 1); + + KAWAII_MQTT_LOG_I("The ID of the Kawaii client is: %s ", KAWAII_MQTT_CLIENTID); + + mqtt_connect(client); + mqtt_subscribe(client, KAWAII_MQTT_SUBTOPIC, QOS1, mqtt_subscribe_handle); +#endif /* BSP_USING_MQTT_HW_CLOUD */ + while(1) + { + mpu6xxx_get_accel(dev, &accel); + +#ifdef BSP_USING_MQTT_HW_CLOUD + if (is_upload == RT_TRUE) + { + /* 数据格式:{"services":[{"service_id":"你的服务id","properties":{"你的属性名称": 设置的值}}]} */ + rt_sprintf(payload_buf, "{\"services\":[{\"service_id\":\"mpu6050\",\"properties\":{\"accel_x\":%3d,\"accel_y\":%3d,\"accel_z\":%3d}}]}", accel.x, accel.y, accel.z); + mqtt_publish_handle(client, payload_buf); + } +#endif /* BSP_USING_MQTT_HW_CLOUD */ + LOG_D("accel.x = %3d, accel.y = %3d, accel.z = %3d", accel.x, accel.y, accel.z); + + rt_thread_mdelay(1000); + } +} + +static int rt_hw_mpu6050_init() +{ + rt_thread_t tid_mpu; + + tid_mpu = rt_thread_create("mpu_accel", mpu6050_accel_entry, RT_NULL, 2048, 6, 10); + if (tid_mpu == RT_NULL) + { + return -RT_ERROR; + } + + rt_thread_startup(tid_mpu); + + return RT_EOK; +} + +INIT_APP_EXPORT(rt_hw_mpu6050_init); +``` + +## 4 效果演示 + +### 4.1 复位现象 + +![](figures/4_1_borad_reset.png) + +### 4.2 数据上报 + +![](figures/4_2_data_upload_debug.png) + +![](figures/4_2_data_upload_ui.png) + +### 4.3 命令下发 + +![](figures/4_3_upload_false.png) + +![](figures/4_3_upload_true.png) + +