更新时间:2024-08-20 03:35:15下载pdf
本文介绍一款基于 TuyaOS 平台开发的 Zigbee 轻量级 Command Line Interface(CLI)Demo。通过 CLI 交互方式与串口通信协议,展示 TuyaOS 常用的部分 TAL 层接口。
支持 CLI 交互功能。
集成 TuyaOS TAL 层接口展示。
编译烧录,参考 设备编译与烧录。
在串口调试软件中,连接烧录授权串口,按如下参数配置并打开该串口。
参数 | 数值 |
---|---|
波特率 | 115200 |
数据位 | 8 |
停止位 | 1 |
校验位 | 无 |
流控制 | 无 |
本 Demo 使用烧录授权串口作为调试串口。
设备上电,完成初始化后,程序打印欢迎界面。
用户通过串口调试软件,输入指令。
每条指令需要输入 回车键 作为结束标志。
示例
1. help 打印 CLI 使用指导
2. ls 打印总指令列表
3. nwk join_start 30000 设备进入配网模式,配网超时时长为 30s
程序通过串口,输出处理结果。
示例
输入指令 help
后,程序的返回结果如下:
指令格式:main_cmd | sub_cmd | args
main_cmd
可支持多个 sub_cmd
。sub_cmd
可为空。main_cmd
、sub_cmd
和 args
情况。按照功能,本 Demo 的指令分别归类于如下指令集:
通用指令集
提供 Demo 引导、系统控制的指令。
包含 main_cmd
:help
(打印使用指导)、reset
(系统软复位)和 ls
(打印指令列表)等。
不同 main_cmd
的 sub_cmd
情况不尽相同。
GPIO 指令集
main_cmd
固定为 gpio
。sub_cmd
包含 init
、deinit
、write
等,主要用于展示 TAL 层的 GPIO 相关接口。PWM 指令集
main_cmd
固定为 pwm
。sub_cmd
包含 init
、deinit
、start
等,主要用于展示 TAL 层的 PWM 相关接口。sw_timer
指令集
sw_timer
专用的指令。main_cmd
固定为 sw_timer
。sub_cmd
包含 create
、delete
、start
等,主要用于展示 TAL 层的软件定时器相关接口。ADC 指令集
main_cmd
固定为 adc
。sub_cmd
包含 init
、deinit
、read_single_channel
等,主要用于展示 TAL 层的 ADC 相关接口。NWK 指令集
main_cmd
固定为 nwk
。Endpoint 注册(node_config
)、配网参数配置(join_config
)等操作必须在上电初始化时进行处理,而对于本 Demo,程序在上电初始化完成后才提供 CLI 服务。因此,nwk
指令集的部分指令并不提供实际功能的处理,而只介绍实际功能的处理流程。
更多信息,参考 nwk 指令集 的相关指令。
help
指令支持如下三种使用方式:
help
功能:获取 CLI 使用指导。
打印结果展示了本 Demo 所支持的 main_cmd
。
[main_cmd] help
功能:获取 main_cmd
使用指导。
以 gpio help
为例:
打印结果展示了该 main_cmd
所支持的 sub_cmd
。
[main_cmd] [sub_cmd] help
功能:获取由 main_cmd
和 sub_cmd
决定的指令的使用指导。
以 gpio init help
为例:
打印结果展示了该指令的参数列表。
ls 指令支持如下两种使用方式:
关于产品创建流程,参考产品创建。
参数 | 数值 |
---|---|
Profile ID | 0x0104 |
Device ID | 0x0103 |
Endpoint | 描述 |
---|---|
1 | 开关使用的端口号 |
Input clusters(Server) | Output clusters(Client) |
---|---|
Basic(0x0000) | Over The Air Upgrade(0x0019) |
Identify(0x0003) | / |
Group (0x0004) | / |
Scene (0x0005) | / |
OnOff (0x0006) | / |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | ZCL Version | uint8-0x20 | 0x00-0xff | 0x03 |
0x0001 | Application Version | uint8-0x20 | 0x00-0xff | 例如,0b 01 00 0001 = 1.0.1 ,即 0x41 为 1.0.1 。OTA 功能会用到该版本号,在 OTA 开始阶段,网关会读取 OTA 包的版本号推送给设备。在 OTA 成功重启后,网关会读取版本号来确定是否升级成功。只能往更高的版本升级。 |
0x0002 | Stack Version | uint8-0x20 | 0x00-0xff | 0x02 |
0x0003 | Hardware Version | uint8-0x20 | 0x00-0xff | 0x01 |
0x0004 | Manufacturer Name | string-0x42 | 0-32 bytes | XXX…XXX (长度为 16 个字节,由 8 字节前缀和 8 字节的 PID 组成),0-7 bytes:_TZ3000_ ,8-16 bytes:PID(由产品经理在平台或者自助创建和提供)。该字段决定了手机 App 界面的 UI 和功能展现,如果对 PID 没有特殊要求,可采用默认 PID。 |
0x0005 | Model Identifier | string-0x42 | 0-32 bytes | TS000x(零火开关)(接入涂鸦网关使用,x 用于指代路数,TS0002 代表 2 路零火开关) |
0x0007 | Power Source | enum8-0x30 | 0x00-0xff | 0x01 |
0xFFFD | Cluster Revision | uint16-0x21 | 0x0000-0xffff | 0x0001 |
ID | Name | Direction | Description |
---|---|---|---|
0x00 | Reset to Factory Defaults | C->S | 恢复出厂设置 |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | identify time | uint16-0x21 | 0x0000-0xffff | 0x0000 |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | name support | bitmap8-0x18 | 0x00-0xff | 0x00 |
ID | Name | Direction |
---|---|---|
0x00 | Add group | C->S |
0x03 | Remove group | C->S |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | Scene count | uint8-0x20 | 0x00-0xff | 0x00 |
0x0001 | Current scene | uint8-0x20 | 0x00-0xff | 0x00 |
0x0002 | Current group | uint16-0x21 | 0x0000-0xffff | 0x0000 |
0x0003 | Scene valid | bool-0x10 | 0x00-0xff | 0x00 |
0x0004 | Name support | bitmap8-0x18 | 0x00-0xff | 0x00 |
ID | Name | Direction |
---|---|---|
0x04 | Store Scene | C->S |
0x05 | Recall Scene | C->S |
ID | Name | Data type | Range | Default |
---|---|---|---|---|
0x0000 | OnOff | bool-0x10 |
|
0x00 |
ID | Name | Direction |
---|---|---|
0x00 | Off | C->S |
0x01 | On | C->S |
DPID | DP 含义 | 是否为标准指令 | 对应 Endpoint |
---|---|---|---|
1 | 开关 | 是 | 1 |
数据下发时,直接下发开或者关命令即可。上报需使用标准开关属性进行上报。
指令方向 | Cluster ID | CMD / ATTR ID | Value |
---|---|---|---|
下发 | 0x0006 :on/off |
|
/ |
上报 | 0x0006 :on/off |
0x0000 :on/off |
|
在 Visual Studio Code 软件页面上,打开产品开发包,展开左侧 software/TuyaOS/apps
,可以看到本产品 Demo 的 project
文件夹。
右键产品文件夹,选择 Build Project,在跳出的文本框内,输入编译固件的版本号(格式为 x.x.x
)后,按回车键确认。
关于泰凌微芯片平台,建议在 Build Project 前先 Clean Project。
编译成功后,控制台打印内容如下,以芯科平台为例:
编译产物可在 software/TuyaOS/_output
文件夹查看,其中 QIO 标识的是烧录固件,UG 标识的是 OTA 升级文件,具体如下:
software/TuyaOS/_output
文件夹内。output
文件夹内。software/TuyaOS/_output
文件夹内。以芯科平台为例:
清除编译内容,Telink 平台编译前,建议先清除上次编译内容。可右键产品文件夹,选择 Clean Project,输入版本号,按回车键,确认对产品编译内容进行清除。
设备注册配置
在产品工程的 src
文件夹中的 app_dev_register.c
文件,可修改注册的 Device ID、Cluster 和 Attribute 等设备信息。
可在文件的如下所示处,修改注册的 Server Cluster,您可根据需要进行删减:
// Server cluster list
CONST TAL_CLUSTER_T onoff_ep_server_cluster_list[] = {
DEF_CLUSTER_IDENTIFY_CLUSTER_ID(identify_attr_list)
DEF_CLUSTER_GROUPS_CLUSTER_ID(group_attr_list)
DEF_CLUSTER_SCENES_CLUSTER_ID(scene_attr_list)
DEF_CLUSTER_ON_OFF_CLUSTER_ID(onoff_attr_list)
};
在产品工程的 include
文件夹中的 app_dev_register.h
文件,可在文件的如下所示处,修改设备注册的 Endpoint 及其的 Device ID 等信息。
//Endpoint descriptor
TAL_ENDPOINT_T dev_endpoint_desc[] = {
{ONOFF_ENDPOINT, ZHA_PROFILE_ID, ZG_DEVICE_ID_ON_OFF_LIGHT_SWITCH, ONOFF_EP_SERVER_CLUSTER_NUM, (TAL_CLUSTER_T *)&onoff_ep_server_cluster_list[0], 0, NULL},
};
固件信息修改
在产品工程文件夹下的 app_config.yaml
,可配置该产品的 PID、Model ID 和设备类型等信息。文件支持两种配置方式,您根据需求任选其一即可。文件内容及作用如下:
#######################################################################
# COMPATIBILITY of [Tuya mode]
# For the use of tuya redefined attributes:
# [cluster:0x0000,attribute:0x0004] tuya manu name
# [cluster:0x0000,attribute:0x0005] tuya model id
########################################################################
Firmware_Information:
description: "this is a demo project"
device_role: "router" # router/sleep_end_dev
image_type: 0x1602
manufacture_id: 0x1002
model_id: "TS0002"
manufacture_name: "_TZ3000_qlizmo9x" # capacity+pid
module_name: ""
chip_id: "" # efr32mg21a020f1024im32/efr32mg21a020f768im32/TLSR8258F1KET
########################################################################
# COMPATIBILITY of [zigbee standard mode]
# For the use of ZCL stardard attributes:
# [cluster:0x0000,attribute:0x0004] ManufacturerName
# [cluster:0x0000,attribute:0x0005] ModelIdentifier
########################################################################
# Firmware_Information:
# description: "this is a demo project"
# device_role: "sleep_end_dev" # router/sleep_end_dev
# image_type:
# manufacture_id:
# model_id: "custom"
# manufacture_name: "custom"
# product_id: "cz8yd6r2"
# capacity: "_TZ3000_"
# product_type: "TS0203"
# module_name: ""
# chip_id: "" # efr32mg21a020f1024im32/efr32mg21a020f768im32/TLSR8258F1KET
如果您想要自定义 model_id
和 manufacture_name
属性,则必须使用第二种配置方式,并填写 capacity
、product_type
和 product_id
字段。
名称 | 功能 |
---|---|
description | 产品描述字段 |
device_role | 设备角色类型,router 代表正常功耗路由设备,sleep_end_dev 代表休眠低功耗设备,请谨慎更改 |
image_type | 固件信息,用于 OTA 时验证使用 |
manufacture_id | 厂商 ID,用于 OTA 时验证使用 |
model_id | 设备型号,用于加入涂鸦网关后确定设备功能,请谨慎更改 |
manufacture_name | 产品能力值和涂鸦 PID 拼接,用下划线(_ )连接,例如 _TZ3000_qlizmo9x |
module_name | 模组型号,指示产品使用的模组 |
chip_id | 芯片型号,指示产品使用的芯片,请勿更改 |
capacity | 涂鸦产品能力值,该字段请勿更改。如需更改,请咨询涂鸦产品经理 |
product_type | 设备型号,用于加入涂鸦网关后确定设备功能,请谨慎更改 |
product_id | 涂鸦产品 ID,此处留空,烧录授权时会写入新 PID |
例程开发需要开发者配置的设备信息及其配置方法如下:
设备信息配置
可在产品工程的 include
文件夹的 cli_app_config.h
文件,修改组件配置项,可配置项如下:
配置项 | 功能 |
---|---|
ONOFF_ENDPOINT | 开关的默认 Endpoint 序号,不建议修改 |
APP_ZG_NODE_ROUTER | 设备类型(router),不建议修改 |
ZIGBEE_JOIN_TIMEOUT_MS | 配网超时时间,默认 30s |
ZCL_ID_ONOFF | onoff 数据包发送时的 ZCL_ID ,默认 100 |
不同平台的管脚对应关系不一样。
tkl_platform_types.h
文件中查看。以 芯科 MG21 为例,其管脚对应关系如下,其中 TUYA_GPIO_NUM_0
对应的是 PA0
,以此类推。
//Gpio Index
#define APP_GPIO_PA0 TUYA_GPIO_NUM_0
#define APP_GPIO_PA1 TUYA_GPIO_NUM_1
#define APP_GPIO_PA2 TUYA_GPIO_NUM_2
#define APP_GPIO_PA3 TUYA_GPIO_NUM_3
#define APP_GPIO_PA4 TUYA_GPIO_NUM_4
#define APP_GPIO_PA5 TUYA_GPIO_NUM_5
#define APP_GPIO_PA6 TUYA_GPIO_NUM_6
#define APP_GPIO_PB0 TUYA_GPIO_NUM_7
#define APP_GPIO_PB1 TUYA_GPIO_NUM_8
#define APP_GPIO_PC0 TUYA_GPIO_NUM_9
#define APP_GPIO_PC1 TUYA_GPIO_NUM_10
#define APP_GPIO_PC2 TUYA_GPIO_NUM_11
#define APP_GPIO_PC3 TUYA_GPIO_NUM_12
#define APP_GPIO_PC4 TUYA_GPIO_NUM_13
#define APP_GPIO_PC5 TUYA_GPIO_NUM_14
#define APP_GPIO_PD0 TUYA_GPIO_NUM_15
#define APP_GPIO_PD1 TUYA_GPIO_NUM_16
#define APP_GPIO_PD2 TUYA_GPIO_NUM_17
#define APP_GPIO_PD3 TUYA_GPIO_NUM_18
#define APP_GPIO_PD4 TUYA_GPIO_NUM_19
在开发过程遇到问题,您可以登录 TuyaOS 开发者论坛 子设备开发版块 进行沟通咨询。
指令描述
该指令支持三种使用方式:
1. help 打印 CLI 的使用指导
2. [main_cmd] help 打印 main_cmd 的使用指导
3. [main_cmd] [sub_cmd] help 打印由 main_cmd 和 sub_cmd 决定的指令的使用指导
参数
无
示例
1. help 打印 CLI 的使用指导
2. gpio help 打印 GPIO 的使用指导
3. gpio init help 打印 GPIO init 的使用指导
指令描述
系统软复位。
参数
无
示例
1. reset 系统软复位
指令描述
该指令支持两种使用方式:
1. ls 打印总指令列表
2. ls [main_cmd] 打印 main_cmd 的指令列表
参数
1. 空/[main_cmd]
示例
1. ls 打印总指令列表
2. ls gpio 打印 GPIO 的指令列表
指令描述
进行 GPIO 初始化。
参数
1. [pin_id] GPIO 管脚,参考 'TUYA_GPIO_NUM_E'
2. [direction] 输入/输出,参考 'TUYA_GPIO_DRCT_E'
3. [active_level] GPIO 有效电平,参考 'TUYA_GPIO_LEVEL_E'
示例
1. gpio init 7 1 0 GPIO 初始化,参数为 'TUYA_GPIO_NUM_7'、输出、低电平有效
指令描述
进行 GPIO 反初始化。
参数
1. [pin_id] GPIO 管脚,参考 'TUYA_GPIO_NUM_E'
示例
1. gpio deinit 7 GPIO 反初始化
指令描述
设置 GPIO 电平。
参数
1. [pin_id] GPIO 管脚,参考 'TUYA_GPIO_NUM_E'
2. [level] GPIO 电平,参考 'TUYA_GPIO_LEVEL_E'
示例
1. gpio writr 7 1 设置 GPIO 电平为高电平
指令描述
读取 GPIO 电平。
参数
1. [pin_id] GPIO 管脚,参考 'TUYA_GPIO_NUM_E'
示例
1. gpio read 7 读取 GPIO 电平
指令描述
初始化 GPIO 并配置中断。
GPIO 配置中断后,默认使能该中断。
参数
1. [pin_id] GPIO 管脚,参考 'TUYA_GPIO_NUM_E'
2. [irq_mode] GPIO 中断触发模式,参考 'TUYA_GPIO_IRQ_E'
示例
1. gpio irq_init 7 0 初始化 GPIO,配置中断触发模式为上升沿中断
指令描述
使能 GPIO 中断。
参数
1. [pin_id] GPIO 管脚,参考'TUYA_GPIO_NUM_E'
示例
1. gpio irq_enable 7 使能 GPIO 中断
指令描述
禁用 GPIO 中断。
参数
1. [pin_id] GPIO 管脚,参考 'TUYA_GPIO_NUM_E'
示例
1. gpio irq_disable 7 禁用 GPIO 中断
指令描述
进行 PWM 初始化。
PWM 初始化后,默认是 stop 状态,需要 start。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
2. [duty] 占空比
3. [freq] 频率
4. [pola] 极性,参考 'TUYA_PWM_POLARITY_E'
5. [map_pin] GPIO 映射引脚
示例
1. pwm init 0 400 10000 1 7 PWM 初始化,使用 TUYA_PWM_NUM_0,占空比为 400/1000、频率为 10000、正极性、映射引脚为 TUYA_GPIO_NUM_7
指令描述
进行 PWM 反初始化。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
示例
1. pwm deinit 0 PWM 反初始化
指令描述
开启 PWM。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
2. [duty] 占空比
3. [freq] 频率
4. [pola] 极性,参考 'TUYA_PWM_POLARITY_E'
5. [map_pin] GPIO 映射引脚
示例
1. pwm start 0 开启 PWM
指令描述
停止 PWM。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
示例
1. pwm stop 0 停止 PWM
指令描述
设置 PWM 占空比。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
2. [duty] 占空比
示例
1. pwm duty_set 0 800 设置 PWM 占空比为 800/1000
指令描述
设置 PWM 频率。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
2. [freq] 频率
示例
1. pwm freq_set 0 5000 设置 PWM 频率为 5000
指令描述
设置 PWM 极性。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
2. [pola]
示例
1. pwm pola_set 0 0 设置 PWM 极性为负极性
指令描述
设置 PWM 参数。
参数
1. [pwm_ch_id] PWM channel number,参考 'TUYA_PWM_NUM_E'
2. [duty] 占空比
3. [freq] 频率
4. [pola] 极性,参考 'TUYA_PWM_POLARITY_E'
示例
1. pwm info_set 0 400 10000 1 设置 PWM 参数,占空比为 400/1000、频率为 10000、正极性
指令描述
获取 PWM 参数。
参数
1. [pwm_ch_id] PWM channel number,参考'TUYA_PWM_NUM_E'
示例
1. pwm info_get 0 获取 PWM 参数
指令描述
创建软件定时器。
参数
1. [sw_timer_index] 定时器编号
注意:这是本 Demo 为方便用户体验软件定时器使用流程而定义的编号,在实际开发中,使用 TIMER_ID 来区分软件定时器。
2. [led_pin] 被该定时器控制的 GPIO 管脚
示例
1. sw_timer create 0 7 创建软件定时器,定时器回调是翻转 TUYA_GPIO_NUM_7 的电平
指令描述
删除软件定时器。
参数
1. [sw_timer_index] 定时器编号
注意:这是本 Demo 为方便用户体验软件定时器使用流程而定义的编号,在实际开发中,使用 TIMER_ID 来区分软件定时器。
示例
1. sw_timer delete 0 删除软件定时器
指令描述
开启软件定时器。
参数
1. [sw_timer_index] 定时器编号
注意:这是本 Demo 为方便用户体验软件定时器使用流程而定义的编号,在实际开发中,使用 TIMER_ID 来区分软件定时器
2. [time_ms] 定时器周期
3. [sw_timer_type] 定时器工作模式(单次执行/循环执行)
示例
1. sw_timer start 0 100 1 开启软件定时器,周期为 100ms,循环执行
指令描述
停止软件定时器。
参数
1. [sw_timer_index] 定时器编号
注意:这是本 Demo 为方便用户体验软件定时器使用流程而定义的编号,在实际开发中,使用 TIMER_ID 来区分软件定时器。
示例
1. sw_timer stop 0 停止软件定时器
指令描述
获取软件定时器工作状态。
参数
1. [sw_timer_index] 定时器编号
注意:这是本 Demo 为方便用户体验软件定时器使用流程而定义的编号,在实际开发中,使用 TIMER_ID 来区分软件定时器。
示例
1. sw_timer is_running 0 获取软件定时器工作状态
指令描述
进行 ADC 初始化。
参数
1. [port_num] ADC port number,参考 'TUYA_ADC_NUM_E'
2. [adc_ch_id] ADC channel number
示例
1. adc init 0 0 ADC 初始化,使用 TUYA_ADC_NUM_0、通道 0
指令描述
进行 ADC 反初始化。
参数
1. [port_num] ADC port number,参考 'TUYA_ADC_NUM_E'
示例
1. adc deinit 0 ADC 反初始化
指令描述
读取指定 port number,指定通道的 ADC 值。
参数
1. [port_num] ADC port number,参考 'TUYA_ADC_NUM_E'
2. [adc_ch_id] ADC channel number
示例
1. adc read_single_channel 0 0 读取 TUYA_ADC_NUM_0,通道 0 的 ADC 值
指令描述
介绍 Endpoint 注册流程。
参数
1. [part] 介绍流程,0~6
示例
1. nwk endpoint_register 0 总览
指令描述
介绍 node config 流程。
参数
1. [part] 介绍流程,0~8
示例
1. nwk node_config 0 总览
指令描述
介绍 join config 流程。
参数
1. [part] 介绍流程,0~1
示例
1. nwk join_config 0 总览
指令描述
设备进入配网模式。
调用 TAL 层的 join start
函数时,设备会先本地离网,再开始扫网。
参数
1. [join_timeout] 配网超时时间
示例
1. nwk join_start 30000 设备进入配网模式,配网超时时间为 30 秒
指令描述
获取设备当前网络状态。
参数
无
示例
1. nwk nwk_status_get 获取设备当前网络状态
指令描述
介绍 nwk_status_change_callback
函数。
参数
1. [part] 介绍流程,0~2
示例
1. nwk nwk_status_change_callback 0 总览
指令描述
清除 send data queue。
在调用 TAL 层的 send data 接口前,应先清除 send data queue。
参数
无
示例
1. nwk endpoint_register 清除 send data queue
指令描述
上报 on/off 属性值。
本指令在调用 TAL 层的 send data 接口前,尚未清除 send data queue。
参数
1. [send_value] 上报数值
2. [join_timeout] 上报超时时间
示例
1. nwk send_data 0 1000 上报 on/off 属性值为 0,超时时间为 1000ms
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈