爲你的AliOS Things應用增長自定義cli命令

在平常嵌入式開發中,咱們常常會用串口命令來使設備進入某種特定的狀態,或執行某個特定的操做。如系統自檢,模擬運行,或者進入手動模式進行設備點動。linux下有強大的shell工具,可讓用戶和片上系統進行交互,而在傳統的單片機系統中,用戶每每須要自行實現一套相似的交互工具。AliOS-Things原生帶有一套名爲cli(command-line interface)的命令行交互工具,在提供基本的系統交互命令的基礎上,也支持用戶自定義命令。本文將介紹如何自定義cli命令並執行。linux

咱們經過在《【AliOS Things學習筆記】在Developerkit開發板上運行blink例程》基礎上,註冊一個cli命令,經過命令行的方式控制LED的亮滅的例子,來演示一個帶有參數的cli命令如何被註冊以及調用。ios

首先,咱們先保證Developerkit的原有cli功能可用。將開發板經過USB鏈接線和PC鏈接。 shell



windows用戶經過設備管理器確認開發板所虛擬出的串口號,MAC和linux用戶可用在終端中輸入以下命令來查看USB串口是否已正確鏈接。windows

ls /dev/tty.*

若是出現以下設備列表,則表示鏈接正確。usbmodem後的數字可能會由於計算機不一樣而不一樣。數組

/dev/tty.usbmodem14103

此時,可用打開PC上的串口調試工具,設置對應的串口,波特率默認爲115200bps。建議串口調試助手具有終端功能,這樣會在cli的使用中有更好的體驗。接下來我將以植入VScode中的aos-cube工具的串口監視器功能爲例進行演示。打開VScode,確保已經按照alios-studio和aos-cube插件。點擊alios-studio工具條中的「插頭」按鈕,啓動串口monitor緩存

若是工具沒能正確地打開串口,也能夠嘗試在控制檯中使用命令行的方式啓動串口monitor。命令格式以下:app

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」,能夠看到現有的任務運行狀況oop

# 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功能吧!

 

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索