【摘要】智能模组SDK开发系列课程.对模组二次开发本章节旨在通过一个简单Demo,使开发者能够了解涂鸦SDK的启动流程,带领开发者基于涂鸦提供的SDK对模组进行二次开发。Demo功能介绍:硬件使用CBU Nano板,要求可以通过按键(S2)和手机AP......
本章节旨在通过一个简单Demo,使开发者能够了解涂鸦SDK的启动流程,带领开发者基于涂鸦提供的SDK对模组进行二次开发。
Demo功能介绍:硬件使用CBU Nano板,要求可以通过按键(S2)和手机APP去控制板子上自带的LED灯(D2),配网状态发生改变时会通过日志将连网状态打印出来。
注意:为了能够通过Micro USB进行烧录和打印日志,需要将板子上的四个拨码开关全部打开(拨码位置拨到ON一端,非数字一端)。
示例Demo的GitHub仓库地址:GitHub - Tuya-Community/bk7231n_light1_io_xx: Module secondary development example demo
1. 启动流程介绍
在开始开发前,需要了解 SDK 的初始化流程。这里需要重点关注四个函数pre_app_init()、pre_device_init()、app_init()和device_init()。启动流程如下图所示,对于这四个函数的详细介绍请阅读3. tuya_device文件介绍。
2. 工程创建
在SDK的apps目录下新建一个bk7231n_light1_io_xx的文件夹,该文件夹名称就是工程名,也是上传固件时使用的固件标识名。所以大家在创建的时候文件夹名称应改成不同的名字,不然在编译生成固件后,上传到云平台时会因为已经有了该固件标识名导致固件上传失败。
固件命名可以按照:芯片平台+产品类型+产品特性+厂商标识名/个人姓名缩写,也可按照个人喜好来命名。如:固件名称可以命名为bk7231n_light1_io_xx,bk7231n表示使用的是bk7231n芯片进行开发的,light1表示一路灯,io表示通过IO口拉高拉低来控制灯的亮灭,xx为名字缩写。
在bk7231n_light1_io_xx文件夹中新建include和src两个文件夹,include文件夹用来放工程中用到的头文件,src文件夹用来放工程中用到的源文件(可以在include和src文件夹中创建新的文件夹对不同功能的.c和.h文件进行分类管理)。
该工程的目录树如下:
ty_iot_sdk_bk7231n_2.3.1
├── apps
│ ├── bk7231n_light1_io_xx # 新建的工程
│ │ ├── include
│ │ │ ├── dp_process.h
│ │ │ ├── light_system.h
│ │ │ └── tuya_device.h
│ │ └── src
│ │ ├── dp_process.c # DP(data point)处理文件
│ │ ├── light_system.c # 灯驱动文件
│ │ └── tuya_device.c # 该文件十分重要,用来实现SDK中需要的一些回调函数。
│ │
│ ├── tuya_demo_elp_1plug # SDK中自带的demo
│ ├── tuya_demo_light_pwm # SDK中自带的demo
│ └── tuya_demo_template # SDK中自带的demo
├── build_app.sh
├── CHANGELOG.md
├── platforms
├── README.md
└── sdk
在开始编写代码前,我们还需要对涂鸦SDK中常用头文件有一个了解。
头文件名称 功能
uni_log.h Tuya IoT OS日志打印。
tuya_iot_wifi_api.h 提供与WiFi相关的接口。常用API有初始化 tuya IoT 框架进行设置Wi-Fi的工作模式,重置设备再次进入配网状态等
tuya_iot_com_api.h 封装了各个服务组件的对外接口。常用API有获取SDK信息等
tuya_hal_system.h 系统接口封装。常用API有得到系统重启原因,得到系统运行的ticket等
tuya_error_code.h 涂鸦对一些错误类型的定义
tuya_cloud_com_defs.h 一些与云端相关的类型定义。
tuya_cloud_types.h 对参数类型的封装。对变量、函数进行类型定义或修饰时应调用这里的函数。
tuya_gpio.h 对gpio的API进行了封装,需在tuya IoT 初始化完成后调用。
tuya_key.h 按键功能,需在tuya IoT 初始化完成后调用。
3. tuya_device文件
tuya_device.c和tuya_device.h这两个文件主要用来实现产测函数和对实现对涂鸦IoT框架的初始化。实现函数列表如下:
函数名称 函数功能
mf_user_pre_gpio_test_cb() gpio测试前置回调函数。
mf_user_enter_callback() 通知应用已经进入到产测,在回调中对应用数据清除。
mf_user_callback() 应用结合需要将授权信息中需要的部分进行写入到uf等不加密的空间,加快启动应用获取信息的速度。
mf_user_product_test_cb() 成品测试回调。
pre_app_init() 用来处理需要快速初始化的函数,此时tuya iot相关功能还未开始初始化,无法调用和tuya iot相关函数。
pre_device_init() tuya iot初始化完成,WiFi和tuya kv flash 还未初始化完成。
app_init() kv flash 初始化完成。
device_init() 所有准备工作都已完成。
在最新版本的SDK中,至少需要实现app_init()和device_init()这两个函数,其他函数没有需求可以不用包含到tuya_device.c中实现。
3.1 产测函数介绍
mf_user_pre_gpio_test_cb(), mf_user_enter_callback(), mf_user_callback()和mf_user_product_test_cb()这四个函数是和产测功能相关的,在最新的SDK中对该部分功能无需求的话可以不用实现(在tuya_device.c中不用写,SDK内会有对应weak修饰的函数。如果不写这四个函数导致编译不过,提示没有找到这些函数的话,说明你的SDK不是最新的,那么还是要加上这四个函数的)。
为了兼容老版本的SDK,这里在tuya_device.c中会加上这四个函数。
这里只是实现一个demo对于产测部分的功能基本上都没有具体实现,对于量产的产品要按照产品的需要对这些产测函数的功能进行具体的实现。
3.2 pre_app_init()函数介绍
执行到pre_app_init()的时候,tuya iot还没有开始初始化,所有和tuya iot有关的资源都不能调用。
由于tuya iot和flash的初始化时间较长,对于一些需要快速启动的资源都需要再该函数内实现。
为了让设备一上电就快速把灯点亮,这里将灯的初始化放到pre_app_init()中进行快速初始化。由于此时tuya iot还未开始初始化,那么就不能使用tuya iot 提供的GPIO初始化函数OPERATE_RET tuya_gpio_inout_set(IN CONST TY_GPIO_PORT_E port, IN CONST BOOL_T in);来进行初始化。需要借助"early_init"这个事件来进行快速初始化。