在EmberZNet中创建自定义CLI命令

在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);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smartlabs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值