在Zigbee项目中,您可以找到许多可用于调试的预构建CLI命令。对于每个工程师来说,开发产品都很方便。如果在控制台上键入“ help”,则可以找到以下CLI命令,包括但不限于:
bsend
changekey
debugprint
echo
endpoint
events
help
info
interpan
keys
libs
network
option
plugin
print
raw
read
reset
security
send
send-using-multicast-binding
send_multicast
timesync
version
write
zcl
zdo
安装堆栈后,您可以在以下文档中找到每个CLI命令的详细信息/描述。使用您的浏览器打开与此类似的Simplicity Studio相关的相对路径。
C:/SiliconLabs/SimplicityStudio/v4/developer/sdks/gecko_sdk_suite/v2.1/protocol/zigbee_6.1/documentation/120-3023-000_AF_V2_API/group__cli.html
但是对于某些客户,他们希望自定义其自定义CLI命令以实现某些特殊功能,例如控制外围设备或向其他设备发送一些特殊命令。在这种情况下,如何基于当前的CLI体系结构创建自定义CLI命令?
答案很简单。通过以下步骤扩展自定义CLI命令非常容易:
- 在{project}.isc的“Printing and CLI”选项卡中启用“Add Custom CLI Sub-menu”复选框。
- 然后,您应该在{project} _callback.c文件中实现emberAfCustomCommands []。XncpLedHost_callback.c中有一个很好的示例,请参考XncpLedHost示例。关键是要实现emberAfCustomCommands []中的功能。详细信息如下:
EmberCommandEntry emberAfCustomCommands[] = {
emberCommandEntryAction("get-led",
getLedCommand,
"",
"Get the state of an LED on the NCP."),
emberCommandEntryAction("set-led",
setLedCommand,
"u",
"Set the state of an LED on the NCP using a custom LED protocol command."),
emberCommandEntryAction("get-frequency",
getFrequencyCommand,
"",
"Get the current frequency of the LED strobe on the NCP."),
emberCommandEntryAction("set-frequency",
setFrequencyCommand,
"w",
"Set the frequency of the LED strobe on the NCP."),
emberCommandEntryAction("get-info",
getInfoCommand,
"",
"Display the XNCP information on the CLI."),
emberCommandEntryTerminator()
};
之后,编译项目并将固件下载到您的硬件,启动控制台,然后在键入“help”后看到“custom” CLI命令。这就是创建自定义CLI命令的所有步骤。如有其他问题,请随时与我们联系。
输入的类型及其字符表示形式:
对于普通(非嵌套)命令,argumentTypes是一个字符串,用于指定命令接受的参数的数量和类型。参数说明符为:
u:一字节无符号整数。
v:两字节无符号整数
w:四字节无符号整数
s:一字节有符号整数
r:两字节有符号整数
q:四字节有符号整数
b:字符串。可以使用引号将参数输入为ascii,例如:“ foo”。也可以使用花括号将其以十六进制形式输入,例如:{08 A1 f2}。十六进制数字必须为偶数,并且空格将被忽略。
*:零个或多个先前的类型。如果使用,则必须是最后一个说明符。
?:未知数量的参数。如果使用,则必须是唯一字符。这意味着该命令解释器将不执行任何参数验证,而是直接调用该操作,并相信它将使用传入的任何参数进行处理。
!:可选参数定界符。
如果命令输入具有足够的参数,使得解析器以!结尾。符号,则即使该命令不一定处理整个argumentsTypes字符串,也将被视为有效。如果除!之外还有其他参数,但仍比下一参数少!或字符串的末尾,则该命令将被视为无效。
请注意,这使调用的CommandAction函数可以实际验证其实际获得的可选参数数量。
示例:给定argumentsTypes字符串:uu!vv!u!vv
以下输入类型顺序有效:
uu,uuvv,uuvvu,uuvvuvv
以下无效:
u,uuv,uuvvuv,uuvvuvvv
整数参数可以是十进制或十六进制。
0x前缀表示十六进制整数。示例:0x3ed。
如果是嵌套命令(操作为NULL),则此字段包含指向嵌套EmberCommandEntry数组的指针。
接受函数中的CLI参数
可以根据输入的类型将参数与CLI调用一起传递。这些参数是通过以下相关函数调用捕获的:
1. uint32_t emberUnsignedCommandArgument(uint8_t argNum)
2. int32_t emberSignedCommandArgument(uint8_t argNum)
3. uint8_t *emberStringCommandArgument(int8_t argNum, uint8_t *length)
4. For special data types such as EUI64 address if a devuce, use emberCopyBigEndianEui64Argument(int8_t index, EmberEUI64 destination)
5. To copy string arguments, uint8_t emberCopyStringArgument(int8_t argNum,
uint8_t *destination,
uint8_t maxLength,
bool leftPad)
Example: uint8_t enable = (uint8_t)emberSignedCommandArgument(0);