为你的AliOS Things应用增加自定义cli命令

在日常嵌入式开发中,我们经常会用串口命令来使设备进入某种特定的状态,或执行某个特定的操作。如系统自检,模拟运行,或者进入手动模式进行设备点动。linux下有强大的shell工具,可以让用户和片上系统进行交互,而在传统的单片机系统中,用户往往需要自行实现一套类似的交互工具。AliOS-Things原生带有一套名为cli(command-line interface)的命令行交互工具,在提供基本的系统交互命令的基础上,也支持用户自定义命令。本文将介绍如何自定义cli命令并执行。

我们通过在《【AliOS Things学习笔记】在Developerkit开发板上运行blink例程》基础上,注册一个cli命令,通过命令行的方式控制LED的亮灭的例子,来演示一个带有参数的cli命令如何被注册以及调用。

首先,我们先保证Developerkit的原有cli功能可用。将开发板通过USB连接线和PC连接。

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

如果工具没能正确地打开串口,也可以尝试在控制台中使用命令行的方式启动串口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功能吧!

 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4________请拖拽到此区域5________请拖拽到此区域_5分钟学会:蒙版与通道(剪贴蒙版)...

剪贴蒙版可以用一个图层中包含像素的区域来限制它上层图像的显示范围。它的最大优点是可以通过一个图层来控制多个图层的可见内容&#xff0c;而图层蒙版和矢量蒙版都只能控制一个图层。1、实例&#xff1a;创建剪贴蒙版颜回&#xff1a;5分钟学会&#xff1a;蒙版与通道 实例&…

一场高质量的技术盛会怎样炼成?「2019中国大数据技术大会」即将来临,邀您共赴!...

2019年12月&#xff0c;一场轰动国内产业界、学术界、科研界及投资领域的顶级科技盛会即将拉开帷幕&#xff0c;它涵盖大数据、人工智能、云计算、AIoT、金融科技、智能制造等十几个前沿领域的热门话题。在过去十二年里&#xff0c;这场盛会从最初仅 60 余人参加的技术沙龙到如…

在Developerkit开发板上运行blink例程

本文将介绍怎么样在VScode环境下&#xff0c;将AliOS Tings提供的blink例程在Developerkit开发板上运行起来。 DeveloperKit开发板 在例程中分别用到两个led和一个按钮&#xff0c;上图中用红色的框标识出来。例程正确运行后&#xff0c;会有一个LED按1s的周期闪烁&#xff0c…

阿里下一代云分析型数据库AnalyticDB入选Forrester云化数仓象限

前言 近期, 全球权威IT咨询机构Forrester发布"The Forrester Wave: CloudData Warehouse Q4 2018"研究报告&#xff0c;阿里巴巴分析型数据库(AnalyticDB)成功入选。 AnalyticDB作为阿里巴巴自主研发的PB级实时云数据仓库&#xff0c;全面兼容MySQL协议以及SQL:200…

俄罗斯互联网的BAT

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff5c;挖数责编&#xff5c;阿秃1961年&#xff0c;尤里米尔纳 出生在莫斯科一个犹太人家庭&#xff0c;他的父亲是一名经济学家&#xff0c;母亲是一名医生&#xff0c;他儿时的梦想是成为科学家。高中毕业后&#xff0c…

fiq中断的入口地址_嵌入式技巧:ARM的三种中断调试方法介绍

嵌入式软件开发流程参照嵌入式软件的开发流程。第一步&#xff1a;工程建立和配置。第二步&#xff1a;编辑源文件。第三步&#xff1a;工程编译和链接。第四步&#xff1a;软件的调试。第五步&#xff1a;执行文件的固化。在整个流程中&#xff0c;用户首先需要建立工程并对工…

一文带你领略虚拟化领域顶级技术会议KVM Forum 2018

KVM Forum是由Linux基金会组织的高端技术论坛会议&#xff0c;主要为社区各个维护者&#xff0c;开发人员&#xff0c;和用户提供一个讨论Linux虚拟化技术发展趋势以及挑战的交流场所。参会人员都集中在KVM虚拟化相关领域&#xff0c;是KVM社区最为重要和权威的大会。 概述 2…

直击KubeCon 2018 |云原生正在改变你的衣食住行

云计算从不被看好到成长为势不可挡的技术潮流&#xff0c;仅仅用了十年的时间。如今“云原生”又被企业以及开发者奉为圭臬&#xff0c;并被认为是云计算的未来。 阿里云容器技术负责人易立认为云计算有三个阶段&#xff1a;云搬迁、云就绪和云原生。 第一个阶段是为了降低成…

玩大了!别再埋头学Python了,它真的无用!

在知乎上有一个特别火的问题&#xff1a;如何学Python&#xff1f;你会看到很多高赞回答是&#xff1a;我一天就学完了。在大家群嘲的背后&#xff0c;我们来分析一下&#xff0c;为什么在已经学过的人眼里&#xff0c;Python这么容易学&#xff0c;甚至简单到被某些人鄙视呢&a…

2020洪灾地图_卫星地图看洪灾:为何湖北易发洪水?

▲7月6日&#xff0c;武昌江滩凉亭被淹没。图片来源&#xff1a;中国气象局疫情甫定&#xff0c;洪水又来。入汛以来&#xff0c;长江中下游地区的日子并不好过。荆楚大地湖北遭遇多轮强降雨&#xff0c;引发严重洪涝灾害&#xff0c;让我们不禁将目光再次聚焦这里。荆楚大地为…

双十一高并发场景背后的数据库RDS技术揭秘

【战报】11月11日聚石塔&#xff08;阿里云数据库RDS产品形态&#xff09;峰值QPS突破X00w&#xff0c;Proxy 峰值QPS超过X00w。 双十一就要来了&#xff0c;全世界都为其疯狂&#xff0c;但是在双十一抢购中经常会出现几万人抢一个红包或者很多人共同购买一个商品的情况&…

Vue优化策略_项目发布_01

文章目录一、移除console 策略1. 命令1.1. 插件官网&#xff1a;1.2. 安装babel-plugin-transform-remove-console1.3. 在babel.config.js或者.babelrc文件中配置2. 图形化(推荐使用)2.1. 在线图形化安装插件2.2. 在babel.config.js或者.babelrc文件中配置二、生成打包报告1. 通…

双十一流量洪峰 支撑阿里核心业务的云数据库揭秘

背景介绍 今年双十一又有新纪录刷新&#xff0c;21秒成交额超10亿&#xff0c;数据瞬间膨胀到PB级&#xff0c;包裹数亿级&#xff0c;严苛的指标对数据库产品提出了更严格的需求。HybridDB作为阿里云自研的HTAP数据库经受住了流量洪峰的考验&#xff0c;顺利的完成了2019年双…

乘法原理的例题和答案_吃透高考数学17个必考题型,基础再差也能考130!(内附解题技巧+例题解析)...

2019高考数学难度比例为7&#xff1a;2&#xff1a;1&#xff0c;也就是说80%都是基础题。然而数学却是高考中最拉分的。90%的学生都缺少一套科学&#xff0c;高效的提分方法&#xff0c;尤其到了冲刺阶段&#xff01;为此&#xff0c;我们为大家整理了高考数学历年17个必考题型…

为何“爱辞职”成为了90后的又一标签?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | AlfredWu责编 | 阿秃金三银四金九银十&#xff0c;又到了每年的秋招时节。在各企业HR狂刷简历企图招贤纳士的同时&#xff0c;内部年轻员工心中实则也暗流涌动&#xff1a;他们有些已提交了辞呈&#xff0c;有些在骑驴找马物…

双11大考 POLARDB分钟级弹性让企业轻松扩展

POLARDB优势解读系列文章之——分钟级弹性 无处不在的脉冲计算 阿里有双11&#xff0c;中国有春运&#xff0c;高考后有分数出来的那天&#xff0c;歌迷心中有周杰伦演唱会门票在线开售之时。。。。有人的地方就有江湖&#xff0c;有人的地方也有脉冲计算&#xff0c;这些热点…

Vue优化策略_项目上线_02

接上一篇&#xff1a;Vue优化策略_项目发布_01 https://gblfy.blog.csdn.net/article/details/105359879 文章目录一、通过node创建web服务器1. 创建文件夹2. 初始化包管理配置文件3. 安装express插件4. 复制vue打包后dist5. 创建app.js配置6. 运行项目并浏览器访问二、开启gzi…

深度解析双十一背后的阿里云 Redis 服务

在一片欢呼之中&#xff0c;2018年的双十一完美收官&#xff0c;各项数据不出意外的刷出了新的记录&#xff0c;亮眼的数据背后是阿里过硬的技术支撑。其中阿里云Redis不仅保障了阿里集团内部业务双十一的流量洪峰平稳度过&#xff0c;也让使用阿里云Redis的各个客户度过了一个…

oracle中prad函数_等保测评2.0:Oracle身份鉴别

一、说明本篇文章主要说一说oracle数据库中身份鉴别控制点中测评项a的相关内容和理解。二、测评项aa)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b;三、测评项a要求1应对登录的用户进行身份标…

区块链真的会火吗?

区块链的境地如何&#xff1f;2019年10月25日&#xff0c;应该是区块链技术人以及对区块链感兴趣的人狂欢的一天&#xff0c;因为在那天国家领导人发表讲话&#xff0c;将区块链作为核心技术自主创新重要突破&#xff0c;随着这个新闻爆出&#xff0c;区块链市场炸开了锅&#…