## Yuniot ESP开发框架
[](https://components.espressif.com/components/imaxu/yuniot) [](https://idf.espressif.com/zh-cn/index.html) [](https://#)
### 说明
为了方便开发乐鑫系列芯片,基于esp-idf官方版本,封装了简化版本的组件库。该组件库对常见需求进行了二次封装,可以使开发过程更专注于硬件应用。
### 更新
#### 0.0.14
未发布
* 增加adc的二次封装, 头文件是 ```yuniot_adc.h```
* 调整事件如下:
* 新增OTA请求事件 ```YUNIOT_EVENT_OTA_REQUEST```,触发主题为 ```/ota_request```
* 修改原OTA事件,现在拆分为两种 ```YUNIOT_EVENT_OTA_MODULE```、```YUNIOT_EVENT_OTA_INC```, 触发主题分别为 ```/ota_module_push``` ```/ota_inc_push```
* 调整触发下行指令事件的主题,现在为 ```/action```
* 修改默认配置文件,默认禁用定时心跳
* 调整全局配置文件 ```yuniot.header.h```到用户级include目录,组件仅提供模板文件。
#### 0.0.13
2024-11-21
* 修复不能正确读取芯片MAC ID的问题
### 安装组件
```shell
idf.py add-dependency "imaxu/yuniot"
```
### 使用组件
#### 全局配置
当组件下载到本地后```(通常是managed_components/imaxu__yuniot)```,在组件include目录手动创建 ```yuniot.header.h``` 文件:
```c
#ifndef _ESPIDF_COMPONENT_YUNIOT_HEADER__H
#define _ESPIDF_COMPONENT_YUNIOT_HEADER__H
#include <stdio.h>
#define YUNIOT_FUNC_ENABLE 1
#define YUNIOT_FUNC_DISABLE 0
/// 1分钟等长的毫秒数
#define YUNIOT_G_MS_TO_MINUTE 60 * 1000
/// 组件广播心跳时,附带appdata的最大字节数
#define YUNIOT_KEEPALIVE_APP_DATA_MAXSIZE 256
/// SmartConfig配网
#define YUNIOT_WIFI_CONF_SC 1
/// 低功耗蓝牙通信配网
#define YUNIOT_WIFI_CONF_BLE 2
/* <!-- 基础设置 -->*/
/// 调试日志标签
#define YUNIOT_LOG_TAG "Yuniot"
/// 主循环周期,单位毫秒
#define YUNIOT_MAIN_LOOP_INTERVAL 100
/* <!-- Wifi配置 --> */
/// 是否启用Wifi
#define YUNIOT_WIFI_ENABLE YUNIOT_FUNC_ENABLE
/* <!-- 配网 --> */
/// 定义WIFI配网模式
#define YUNIOT_WIFI_CONF_MODE YUNIOT_WIFI_CONF_SC
/* <!-- OTA --> */
/// 是否启用OTA
#define YUNIOT_OTA_ENABLE YUNIOT_FUNC_ENABLE
/* <!-- MQTT消息网关 --> */
/// 是否启用 MQTT
#define YUNIOT_MQTT_ENABLE YUNIOT_FUNC_ENABLE
/// MQTT网关主机名
#ifndef YUNIOT_MQTT_HOST
#define YUNIOT_MQTT_HOST "mqtt://localhost"
#endif //
/// MQTT网关端口
#ifndef YUNIOT_MQTT_PORT
#define YUNIOT_MQTT_PORT 1883
#endif // !1
/// MQTT网关校验用户名
#ifndef YUNIOT_MQTT_USERNAME
#define YUNIOT_MQTT_USERNAME "app"
#endif // !1
/// MQTT网关校验密码
#ifndef YUNIOT_MQTT_PASSWORD
#define YUNIOT_MQTT_PASSWORD "123456"
#endif // !1
/// MQTT 遗嘱主题
#define YUNIOT_MQTT_WILL_TOPIC "baymax/device/%s/lastwill"
/// MQTT 心跳主题
#define YUNIOT_MQTT_KEEPALIVE_TOPIC "baymax/device/%s/keepalive"
/// MQTT 下行指令主题
#define YUNIOT_MQTT_DOWNSTREAM_ACTION "baymax/device/%s/down_stream/action"
/// MQTT 上行事件主题
#define YUNIOT_MQTT_UPSTREAM_EVENT "baymax/device/%s/up_stream/event"
/// MQTT 下行执行OTA主题
#define YUNIOT_MQTT_DOWNSTREAM_OTA "baymax/device/%s/down_stream/ota"
/// MQTT QOS=0
#define YUNIOT_MQTT_QOS_AT_MOST_ONCE 0
/// MQTT QOS=1
#define YUNIOT_MQTT_QOS_AT_LEAST_ONCE 1
/// MQTT QOS=2
#define YUNIOT_MQTT_QOS_EXACTLY_ONCE 2
/// MQTT 心跳周期,单位毫秒
#define YUNIOT_MQTT_KEEPALIVE_INTERVAL 10 * YUNIOT_G_MS_TO_MINUTE
/* <!--重置按钮定义 -->*/
/// 是否启用重置按钮功能
#define YUNIOT_RESET_ENABLE YUNIOT_FUNC_ENABLE
/// 定义重置按钮的引脚
#define YUNIOT_RESET_PIN GPIO_NUM_5
/// 定义是否需要上拉内部电阻
#define YUNIOT_RESET_PIN_PULLUP GPIO_PULLUP_DISABLE
/// 定义是否需要下拉内部电阻
#define YUNIOT_RESET_PIN_PULLDOWN GPIO_PULLDOWN_ENABLE
/// 重置引脚持续触发时长,如果大于0 则在指定时长后触发 YUNIOT_EVENT_RESET
#define YUNIOT_RESET_PIN_HOLD_MS 3000
/* <!-- GPIO --> */
/// 对标记为 INPUT的引脚自动读取间隔
#define YUNIOT_GPIO_INPUT_READ_INTERVAL_MS 200
/* <!-- RGB LED --> */
#define YUNIOT_RGB_LED_ENABLE YUNIOT_FUNC_ENABLE
#define YUNIT_RGB_LED_GIPO_NUM 8
#endif // !_ESPIDF_COMPONENT_YUNIOT_MACRO__H
```
#### 基本调用
```c
#include "yuniot.h"
#include "yuniot_events.h"
yuniot_event_loop_create();
yuniot_event_handle_register_with(YUNIOT_EVENT_ANY, yuniot_event_handler, NULL);
yuniot_init();
yuniot_main_loop();
```
#### 全局配置
```c
#include "yuniot_macro.h"
```
在头文件中,包含了一系列有用的宏定义,通过修改这些宏定义来实现改变框架的行为。
#### 循环事件库
```c
#include "yuniot_events.h"
```
##### 创建默认事件循环库
```c
esp_err_t yuniot_event_loop_create(void);
```
##### 注册事件处理程序
```c
esp_err_t yuniot_event_handle_register_with(yuniot_event_id_t event_id, esp_event_handler_t event_handle, void *event_args);
```
*event_id* 事件ID, 参考后表《事件定义》
*event_handle* 事件处理函数,类型为esp_event_handler_t
*event_args* 事件处理函数的用户参数
##### 手动触发事件
```c
esp_err_t yuniot_event_post(yuniot_event_id_t event_id, const void *event_data, size_t event_data_size);
```
*event_id* 事件ID, 参考后表《事件定义》
*event_data* 事件触发时携带的数据
*event_data_size* 事件数据的长度
##### 事件定义
| 事件名称 | 宏定义 | 说明 |
|---------------------------|--------------------------------------|----------------------------------------------|
| 主循环tick | YUNIOT_EVENT_TICK | 主循环函数在执行时,每一个循环周期都会触发该事件 |
| GPIO高电平输入 | YUNIOT_EVENT_GPIO_INPUT_HIGH | 当指定监听的引脚输入高电平时,触发该事件 |
| GPIO低电平输入 | YUNIOT_EVENT_GPIO_INPUT_LOW | 当指定监听的引脚输入低电平时,触发该事件 |
| 硬件重置事件 | YUNIOT_EVENT_RESET | 仅在 ```YUNIOT_RESET_ENABLE```启用时有效 |
| 硬件重置按钮按下事件 | YUNIOT_EVENT_RESET_BUTTON_PRESSDOWN | 仅在 ```YUNIOT_RESET_ENABLE```启用时有效 |
| 硬件重置按钮抬起事件 | YUNIOT_EVENT_RESET_BUTTON_PRESSUP | 仅在 ```YUNIOT_RESET_ENABLE```启用时有效 |
| Wi-Fi等待配网事件 | YUNIOT_EVENT_WIFI_WAIT_CONFIG | Wi-Fi信息不存在时,触发配网事件 |
| Wi-Fi正在连接事件 | YUNIOT_EVENT_WIFI_WAIT_CONNECT | |
| Wi-Fi连接成功事件 | YUNIOT_EVENT_WIFI_CONNECTED | 无线网络被正确连接,并且已获取到IP时,触发该事件 |
| Wi-Fi连接断开事件 | YUNIOT_EVENT_WIFI_DISCONNECTED | 无线网络被断开时,触发该事件 |
| Wi-Fi连接发生错误事件 | YUNIOT_EVENT_WIFI_ERROR | 无线网络连接发生错误时触发该事件 |
| 收到内部消息队列的消息 | YUNIOT_EVENT_QUEUE_DATA_RECEIVED | 从内部队列收到数据时触发 |
| MQTT连接成功 | YUNIOT_EVENT_MQTT_CONNECTED | MQTT成功连接到网关时触发 |
| MQTT断开连接 | YUNIOT_EVENT_MQTT_DISCONNECTED | MQTT连接断开或被复位时触发 |
| 收到OTA指令 | YUNIOT_EVENT_OTA | 收到云端推送的OTA指令时触发,仅在 ```YUNIOT_OTA_ENABLE``` 启用时有效 |
#### 物理引脚控制
```c
#include "yuniot_gpio.h"
```
#### MQTT
```c
#include "yuniot_mqtt.h"
```
#### 空中升级支持
```c
#include "yuniot_ota.h"
```
#### 重置设置支持
```c
#include "yuniot_reset.h"
```
#### Smart Config快速配网
```c
#include "yuniot_smart.h"
```
#### 消息队列
```c
#include "yuniot_queue.h"
```
idf.py add-dependency "imaxu/yuniot^0.0.15"