ESP32 IDF+Blinker 学习笔记2-ESP32适配blinker_esp_idf步骤

前言

房子中的甲醛一直是一个让人头疼的问题,于是突发奇想,diy一个兼具甲醛监测和通风的设备!
初步方案:ESP32(FreeRTOS IDF)+blinker+甲醛传感器+开窗器+风扇,当甲醛达到一定值,自动开窗+开风扇,把室内空气吹到室外,来释放甲醛!

因为是第一次接触blinker,所以一边学习,一边做笔记:
blinker资源介绍(app、sdk)
ESP32适配blinker_esp_idf步骤
ESP32+bliner实现智能甲醛通风器(检测甲醛+开关窗+开关风扇)
ESP32+blinker+天猫精灵实现智能甲醛通风器(语音控制)

ESP32适配blinker_esp_idf步骤

一、sdk库移植
1.解压sdk库,把ESP32\v4.3\components里的Blinker和esp_http_server文件夹,复制到工程目录的components夹下
(esp_http_server库也需要复制,因为blinker在httpd_uri_t里新增了回调函数成员变量。如果你的idf版本不一样,直接复制可能会出问题,这时候可以研究一下blinker的修改点,同步到你自己的idf里的esp_http_server库)

/**
 * @brief Structure for URI handler
 */
typedef struct httpd_uri {
    const char       *uri;    /*!< The URI to handle */
    httpd_method_t    method; /*!< Method supported by the URI */

    /**
     * Handler to call for supported request method. This must
     * return ESP_OK, or else the underlying socket will be closed.
     */
    esp_err_t (*handler)(httpd_req_t *r);

    /**
     * Pointer to user context data which will be available to handler
     */
    void *user_ctx;

#ifdef CONFIG_HTTPD_WS_SUPPORT
    /**
     * Flag for indicating a WebSocket endpoint.
     * If this flag is true, then method must be HTTP_GET. Otherwise the handshake will not be handled.
     */
    bool is_websocket;

    /**
     * Flag indicating that control frames (PING, PONG, CLOSE) are also passed to the handler
     * This is used if a custom processing of the control frames is needed
     */
    bool handle_ws_control_frames;

    /**
     * Pointer to subprotocol supported by URI
     */
    const char *supported_subprotocol;

    /**
     * blinker, websocket client connect handler
     */
    esp_err_t (*connect_cb)(httpd_req_t *r);      //此处为blinker新增回调
#endif
} httpd_uri_t;

2.由于blinker的sdk用的是V4.3的sdk做的库,和工程用的idf可能存在区别,因此编译有可能不过,先修复编译的问题。(不同的版本报的错可能不一致,不具备参考价值)
(1) 配置blinker组件参数(menuconfig->Blinker Config),设备类型、设备auth key、配网方式等:
Auth Key填入app创建的设备密钥。下面三项分别为aligenie阿里语音平台(天猫精灵)、dueros度秘OS(小度)、miot小米物联网(小爱同学)的平台支持,选择了设备类型,就能在对应app添加创建的blinker设备。由于我做的是传感器,所以都选的SENSOR
在这里插入图片描述
配网方案按照自己的方案设计来,一般选smartConfig就好,使用比较方便
在这里插入图片描述
(2)使能其他用到的服务:
menuconfig->Component config->HTTP Server->WebSocket support
在这里插入图片描述
menuconfig->Component config->mDNS
在这里插入图片描述
menuconfig->Component config->Newlib
在这里插入图片描述
(3) Kconfig的报错:217行,把默认选项default后面的REBOOT_RESET改为REBOOT_RESET_TYPE

choice BLINKER_RESET_TYPE
    prompt "The type use to reset device"
    default REBOOT_RESET_TYPE
    help
        The type use to reset device

config REBOOT_RESET_TYPE
    bool "REBOOT_RESET"
config BUTTON_RESET_TYPE
    bool "BUTTON_RESET"
endchoice

二、与app的数据交互
1.app数据下发:
(1)通过blinker_data_handler函数注册回调函数,该回调函数会在接收到数据时候被调用。回调函数输入参数为Json格式的字符串,格式为{“组件名”:“指令”}。比如名为“窗户”的按键按下,字符串内容为:{“窗户”:“tap”}。将接收到的数据,通过Json库解析组件名和指令

typedef void (*blinker_data_cb_t)(const char *data);        //回调函数结构
esp_err_t blinker_data_handler(const blinker_data_cb_t cb)  //注册函数

(2)通过blinker_widget_add函数注册回调函数,该回调函数会在收到对应组件数据时被调用。回调函数输入参数为blinker_widget_param_val_t结构体,其中的i或s为下发的数据或字符串指针,i为int类型,s为字符串指针,两者为共用体

typedef struct {
    union {           //共用体
        int i;
        char *s;
    };
    int array[4];
} blinker_widget_param_val_t;
typedef void (*blinker_widget_cb_t)(const blinker_widget_param_val_t *val); //回调函数结构

esp_err_t blinker_widget_add(const char *key, const blinker_widget_type_t type, const blinker_widget_cb_t cb)

2.设备端数据上报:
(1) 数据上报调用blinker_widget_print函数,其中第一个输入参数为组件名字符串,第二个参数为Json对象指针

esp_err_t blinker_widget_print(const char *key, cJSON *param)

(2) Json对象数据格式为:属性+数值。比如上报数值控件num-temp的参数(颜色值+文本+单位+数值),最终的Json格式为{“clr”:“#FF00FF”,“tex”:“室内温度”,“uni”:“℃”,“val”:9}
(3) 实现方式:

cJSON *num_param = cJSON_CreateObject();             //创建Json对象
blinker_widget_color(num_param, "#FF00FF");          //添加颜色
blinker_widget_text(num_param, "室内温度");          //添加文本
blinker_widget_unit(num_param, "℃");               //添加单位
blinker_widget_value_number(num_param, 25);         //添加数值
blinker_widget_print("num-temp", num_param);        //启动发送
cJSON_Delete(num_param);                            //释放Json对象

app最终收到的数据:{“num-temp”:{“clr”:“#FF00FF”,“tex”:“室内温度”,“uni”:“℃”,“val”:25}}

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值