【AliOS Things学习笔记】为你的AliOS Things应用增加自定义cli命令

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
Lindorm AIGC体验服务,AIGC 体验服务
简介: 怎么才能在RTOS系统中,通过 串口shell控制LED的开关。
在日常嵌入式开发中,我们经常会用串口命令来使设备进入某种特定的状态,或执行某个特定的操作。如系统自检,模拟运行,或者进入手动模式进行设备点动。linux下有强大的shell工具,可以让用户和片上系统进行交互,而在传统的单片机系统中,用户往往需要自行实现一套类似的交互工具。AliOS-Things原生带有一套名为cli(command-line interface)的命令行交互工具,在提供基本的系统交互命令的基础上,也支持用户自定义命令。本文将介绍如何自定义cli命令并执行。
我们通过在《【AliOS Things学习笔记】在Developerkit开发板上运行blink例程》 基础上,注册一个cli命令,通过命令行的方式控制LED的亮灭的例子,来演示一个带有参数的cli命令如何被注册以及调用。
首先,我们先保证Developerkit的原有cli功能可用。将开发板通过USB连接线和PC连接。
3b06db95172f9fc8a5a68358d6d679fd742cdb6c
windows用户通过设备管理器确认开发板所虚拟出的串口号,MAC和linux用户可用在终端中输入如下命令来查看USB串口是否已正确连接。
ls /dev/tty.*
如果出现如下设备列表,则表示连接正确。usbmodem后的数字可能会因为计算机不同而不同。
/dev/tty.usbmodem14103
此时,可用打开PC上的串口调试工具,设置对应的串口,波特率默认为115200bps。建议串口调试助手具备终端功能,这样会在cli的使用中有更好的体验。接下来我将以植入VScode中的aos-cube工具的串口监视器功能为例进行演示。打开VScode,确保已经按照alios-studio和aos-cube插件。点击alios-studio工具条中的“插头”按钮,启动串口monitor
30aa210650524bfbfdae0967fbfd3e2440ba1650
如果工具没能正确地打开串口,也可以尝试在控制台中使用命令行的方式启动串口monitor。命令格式如下:
aos monitor /dev/tty.usbmodem14103 115200      #mac linux下命令
aos monitor com5 115200                        #windows 下命令
成功进入串口monitor后,会从终端中打印出帮助信息。输入回车,会出现“#”提示符,此时就可以输入命令了。
--- Miniterm on /dev/tty.usbmodem14103  115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

#
#
输入“help”回车,会看到当前支持的cli命令
# help
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help      : print this
p         : print memory
m         : modify memory
echo      : echo for command
exit      : close CLI
devname   : print device name
sysver    : system version
reboot    : reboot system
time      : system time
ota       : system ota

====User Commands====
loglevel  : set log level
tasklist  : list all thread info
dumpsys   : dump system info
udp       : [ip] [port] [string data] send udp data
wifi_debug: wifi debug mode
mac       : get/set mac
kv        : kv [set key value | get key | del key | list]
version   : show version

#
输入“tasklist”,可以看到现有的任务运行情况
# tasklist
------------------------------------------------------------------------
cpu usage period = 25
CPU usage :   1.89
------------------------------------------------------------------------
Name               State    Prio StackSize MinFreesize Runtime %CPU Candidate
------------------------------------------------------------------------
dyn_mem_proc_task  PEND     6    256       216         22         0.00   N
idle_task          RDY      61   200       177         745102697 98.11   N
DEFAULT-WORKQUEUE  PEND     20   768       738         23         0.00   N
timer_task         PEND     5    300       254         25         0.00   N
aos-init           PEND     32   1536      1389        1419569    1.38   N
cli                RDY      60   512       271         491760     0.47   Y
------------------------------------------------------------------------
到此,我们已经验证了cli功能在Developerkit开发板上,接下我们开始注册和使用自己的cli命令。
我们依然打开blink.c文件,在其中添加代码实现。首先,cli命令的注册,依赖于一个名为cli_command结构体,结构体描述如下:
struct cli_command {
    const char *name;            // 命令体,字符串
    const char *help;            // 命令的帮助说明文本,字符串
    
    void (*function)(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv);
    // 命令被执行时实际调用的功能函数    
};
在本例中,我们将cli命令命名为“led_switch”,帮助文本字符串为“[on] turn on led2;[off] trun off led2”
接下来我们来实现cli命令的功能函数。将下面函数直接加入blink.c文件中。
static void led_switch(char *pwbuf, int blen, int argc, char **argv)
{
    if(argc == 1)                       // 如果参数为空,则报错返回
    {
        LOG("参数错误");
        return;
    }
    if(strcmp(argv[1],"on") == 0)       // 如果输入参数为“on”,则点亮led
    {
        hal_gpio_output_low(&led);      // GPIO输出低,点亮LED2
    }
    else
    {
        hal_gpio_output_high(&led);     // GPIO输出高,熄灭LED2
    }
}
cli函数具有固定的形式和参数,参考上述函数实现,用户只需要修改函数名,请保持参数与上述函数一致,参数的意义如下:
参数名称
参数描述
char *pwbuf
当函数执行完成返回时,通过控制台打印出来的字符串指针。可以不传入。
int blen
上述字符串长度
int argc
命令调用时传入的参数长度,没有参数传入时为1
char **argv
传入参数缓存,字符串。第一个有效参数的角标从1开始。
接下来填写注册用结构体,以便将命令信息传递给cli服务。按照前所讲的设计,注册结构体信息如下,将结构体拷贝到blink.c文件中。
struct cli_command led_switch_command[] = {
    {
        .name = "led_switch",            // 命令名称
        .help = "[on] turn on led2;[off] trun off led2",// 帮助文本
        .function = led_switch           // 命令具体执行的函数指针
    }
};
将cli命令注册到系统中。cli命令注册只需要一个函数如下:
aos_cli_register_commands(&led_switch_command[0],1);
函数需要传入两个参数,参数1为刚刚创建的命令信息体的结构体指针;参数2,为本次需要注册的命令数,也就是说可以一次性注册多个命令,只需要在命令信息结构体中,用数组的方式同时填入几个命令的信息即可。
将上述函数调用加入到blink.c文件application_start函数的如下位置:
    aos_cli_register_commands(&led_switch_command[0],1); // 注册cli命令函数
    aos_loop_run();
至此,一个cli命令的实现和注册的代码编写部分就完成了。编译并下载至开发板中运行。在cli控制台输入help,看到led_switch命令已注册成功。
# help
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help      : print this
p         : print memory
m         : modify memory
echo      : echo for command
exit      : close CLI
devname   : print device name
sysver    : system version
reboot    : reboot system
time      : system time
ota       : system ota

====User Commands====
loglevel  : set log level
tasklist  : list all thread info
dumpsys   : dump system info
udp       : [ip] [port] [string data] send udp data
wifi_debug: wifi debug mode
mac       : get/set mac
kv        : kv [set key value | get key | del key | list]
version   : show version
led_switch: [on] turn on led2;[off] trun off led2
测试命令是否执行,在命令提示符下输入如下命令,并回车:
#led_switch on
led2点亮
测试参数有效性判断,输入如下指令,不带参数。命令按设计返回错误报警。
## led_switch
[1291080]<V> 参数错误
赶快试试,加入自己的cli功能吧!
相关文章
|
AliOS-Things 物联网 编译器
使用HaaS Studio开发AliOS Things C/C++应用
本文章将介绍使用HaaS Studio 进行AliOS-Things C/C++应用开发。
使用HaaS Studio开发AliOS Things C/C++应用
|
传感器 监控 算法
使用AliOS Things快速构建温度计应用 |《AliOS Things快速开发指南》
本文是基于AliOS Things 3.1快速构建温度计的应用场景。涉及AliOS Things组件开发,构建AliOS Things用户项目,AliOS Things HAL API使用,向AliOS Things中添加并使用组件。用到的硬件设备有半导体开发板、温度传感器、数码管显示器。
使用AliOS Things快速构建温度计应用 |《AliOS Things快速开发指南》
|
域名解析 移动开发 数据可视化
使用 AliOS Things 3.0 快速构建用户应用 BlinkAPP
AliOS Things 3.0版本于去年9月份在云栖大会正式发布,在新版本中带来了全新的应用开发框架,帮助用户快速构建自己的应用。使用户可以更专注于自身应用的开发。本文将已BlinkAPP为例,为大家演示如何快速使用应用开发框创建项目并完成应用代码编写。
977 0
使用 AliOS Things 3.0 快速构建用户应用 BlinkAPP
|
物联网 机器人 AliOS-Things
|
物联网 传感器 API
AliOS Things 3.0应用笔记:http client简单应用
AliOS Things 3.0版本新增加了httpc组件(http 客户端组件),httpc组件支持多种RESTful的API调用,包括GET、POST、PUT、HEAD等,也支持https安全协议。
12367 1
|
物联网 C++
使用AliOS Things 3.0快速构建用户应用 BlinkAPP
AliOS Things 3.0版本于9月27日在云栖大会正式发布,在新版本中带来了全新的应用开发框架,帮助用户快速构建自己的应用。使用户可以更专注于自身应用的开发。本文将已BlinkAPP为例,为大家演示如何快速使用应用开发框创建项目并完成应用代码编写。
7007 0
|
缓存 算法 物联网
AliOS Things声源定位应用演示
1. 概述 利用麦克风阵列进行声源定位在智能降噪、语音增强、语音识别等领域有广泛应用和研究前景。本文介绍基于AliOS Things + STM32F413H Discovery开发板实现声源定位算法集成和功能演示。
4160 0
|
传感器 物联网
AliOS Things手势识别应用演示
1. 概述 手势识别作为一种辅助的人机交互方式,在人机脱离的场景下可以提供方便的交互体验。本文介绍基于AliOS Things + STM32F413H Discovery开发板实现手势交互功能的演示。
3157 0
|
传感器 移动开发 物联网
AliOS Things 3.0应用笔记:http client简单应用
AliOS Things 3.0版本于9月27日在云栖大会正式发布,在新版本中带来了全新的应用开发框架,帮助用户快速构建自己的应用。使用户可以更专注于自身应用的开发。 本示例是基于AliOS Things 3.0应用开发框架做的一个简单的http client应用,通过http API请求获取当前的天气信息。
4424 0
|
物联网 AliOS-Things
AliOS Things lorawanapp应用介绍
文本旨介绍AliOS Things的lorawanapp的示例,完成一个LoRaWAN网络的构建和数据传输,并通过该示例让大家对AliOS Things有一个初步的了解。
3622 0