为你的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串口是否已正確連接。
如果出現如下設備列表,則表示連接正確。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命令調用時傳入的參數長度,沒有參數傳入時為1char **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功能吧!
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
轉載于:https://juejin.im/post/5bf64eeae51d45491b014039
總結
以上是生活随笔為你收集整理的为你的AliOS Things应用增加自定义cli命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle sum(col1) ove
- 下一篇: 阿里云实时计算,前世功,今生能!