蓝牙 Shell
Bluetooth Shell 是一种基于命令行的应用程序。它提供了一系列命令,可以轻松与蓝牙堆栈交互。
Bluetooth Shell 的设置和使用
首先,你需要使能 bluetooth shell 构建你的固件。有关如何执行此操作,请参见 bluetooth_cli 。Bluetooth Shell 实现代码位于:components/bluetooth/shell/
完成后,使用你喜爱的串行终端应用程序连接到 CLI 。你应该会看到以下提示:
W800:~$
有关 shell 的一般用法的更多详细信息,请参阅 shell 。
第一步是启用蓝牙,为此,请使用 bt init
命令,打印以下消息以确认蓝牙已初始化。
W800: W/NO_TAG [19.930] ECC HCI commands not available
I/bt_hci_core [19.936] No ID address. App must call settings_load()
Bluetooth initialized
I/bt_hci_core [19.974] Identity: 38:65:BD:12:21:66 (public)
I/bt_hci_core [19.980] HCI: version 4.2 (0x08) revision 0x0709, manufacturer 0x070c
I/bt_hci_core [19.988] LMP: version 4.2 (0x08) subver 0x0709
Settings Loaded
标识
标识是 wm-iot-sdk 主机标识地址概念,允许单个物理设备像多个逻辑蓝牙设备一样工作。
shell 允许创建多个标识,最大值由 Kconfig 符号 CONFIG_BT_ID_MAX
设置。要创建新标识,请使用 btidcreate
命令。然后,你可以使用它的 ID btidselect<ID>
来选择它。最后,你可以列出 id 为 btidshow
的所有可用标识。
扫描设备
使用 btscan on
命令开始扫描。根据你所处的环境,你可能会看到 shell 上打印了许多线条。要停止扫描, 执行 btscan off
, 滚动应该停止。
下面是一个你可以预期的示例:
W800:~$ btscan on
Bluetooth active scan enabled
[DEVICE]: CB:01:1A:2D:6E:AE (random), AD evt type 0, RSSI -78 C:1 S:1 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
[DEVICE]: 20:C2:EE:59:85:5B (random), AD evt type 3, RSSI -62 C:0 S:0 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
[DEVICE]: E3:72:76:87:2F:E8 (random), AD evt type 3, RSSI -74 C:0 S:0 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
[DEVICE]: 1E:19:25:8A:CB:84 (random), AD evt type 3, RSSI -67 C:0 S:0 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
[DEVICE]: 26:42:F3:D5:A0:86 (random), AD evt type 3, RSSI -73 C:0 S:0 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
[DEVICE]: 0C:61:D1:B9:5D:9E (random), AD evt type 3, RSSI -87 C:0 S:0 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
[DEVICE]: 20:C2:EE:59:85:5B (random), AD evt type 3, RSSI -66 C:0 S:0 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
[DEVICE]: 25:3F:7A:EE:0F:55 (random), AD evt type 3, RSSI -83 C:0 S:0 D:0 SR:0 E:0 Prim: LE 1M, Secn: No packets, Interval: 0x0000 (0 us), SID: 0xff
W800:~$ bt scan off
Scan successfully stopped
如你所见,这可能会导致高位数的结果。要减少该数量并轻松找到特定设备,可以启用扫描过滤器。有四种类型的过滤器:按名称、按 RSSI 、按地址和按定期广播间隔。要应用筛选器,请使用 bt scan-set-filter
命令,后跟筛选器类型,通过再次使用命令,可以添加多个过滤器。
例如,如果你只想查找名为 TestShell 的设备:
W800:~$ btfiltername "test shell"
或者,如果你想在非常近的范围内寻找设备:
W800:~$ btfilterrssi -40
RSSI cutoff set at -40 dB
最后,如果要删除所有筛选器:
W800:~$ btfilterclear
你可以使用命令 bt scan on
来创建活动扫描仪,这意味着扫描仪将通过发送扫描请求数据包来请求广播商提供更多信息。或者,你可以使用 bt scan passive
命令创建被动扫描仪,因此扫描仪不会要求广告商提供更多信息。
连接到设备
要连接到设备,你需要知道其地址和地址类型,并使用 btconnect
命令,将地址和类型作为参数。
下面是一个示例:
W800:~$ btconnect 52:84:F6:BD:CE:48 random
Connected: 38:65:BD:12:21:66 (public)
LE conn param req: int (0x0018, 0x0028) lat 0 to 300
LE conn param updated: int 0x0028 lat 0 to 300
你可以使用 btconnections
命令,外壳最大连接数由 CONFIG_BT_MAX_CONN
定义,你可以断开与
btdisconnect <address: XX:XX:XX:XX:XX:XX> <type: (public|random)>
的连接命令。
备注
如果之前正在扫描,则可以通过以下方式连接到上次扫描的设备:只需运行: btconnect
命令。
或者,你可以使用 btconnectname <name>
命令自动启用名称筛选器扫描,并连接到第一个匹配项。
广播
使用 btadv on
命令开始广播。 这将使用默认参数,并用设备的名称播发可解析的专用地址。 你可以通过运行 btadv on identity
命令来选择使用标识地址。要停止广播,请使用 btadv off
命令
例如,如果要创建可连接和可扫描的广播并启动它:
W800:~$ btadv on
Advertising started
广播时,如果其他设备使用主动扫描,就会发现此设备 WM-SHELL。
定向广播
如果要重新连接到设备,可以在SHELL上使用定向广播。下面的示例演示如何创建具有在 directed
参数之后指定的地址的定向广播客户。low
参数表示我们想要使用低占空比模式,如果远程设备启用了隐私并支持定向播发中目标地址的地址解析,则需要 dir-rpa
参数。
W800:~$ btdirectedadv D7:54:03:CE:F3:B4 random low dir-rpa
Created adv id: 0, adv: 0x20002348
自动连接
可以创建一个自动连接。以下是操作方法:
W800:~$ btautoconnect 38:65:BD:12:21:66 public
然后, shell 将启动主动扫描,如果扫描到38:65:BD:12:21:66 public 的广播地址,将发起连接操作。连接成功后,如果后续连接断开,将自动重复上述过程。
启用安全性
当连接到设备时,你可以启用多个级别的安全性,下面是 Bluetooth LE 的列表:
1 无加密,无身份验证;
2 加密,无认证;
3 加密和认证;
4 蓝牙 LE 安全连接
要启用安全性,请使用 btsecurity <level>
命令。对于需要身份验证的级别(级别3和更高级别),必须首先设置身份验证方法。为此,可以使用 btauth all
命令。之后,当你设置安全级别时,将要求你确认两个设备上的密钥。在 shell 端,使用命令 btauthpasskeyconfirm
执行该操作。
配对
启用身份验证需要设备可绑定。默认情况下,壳是可绑定的。你可以使用 btbondable off
来使壳不可绑定。你可以使用命令 btbonds
列出与你配对的所有设备。
使用 CONFIG_BT_MAX_PAIRED
设置成对设备的最大数量。 你可以使用 btclear <address: XX:XX:XX:XX:XX:XX> <type: (public|random)>
删除配对的设备或者用 btclear all
命令删除所有配对的设备。
GATT
以下示例假设你已经连接了两个设备。
要在客户端执行服务发现,请使用 btdiscover
命令,这应该会打印 GATT 服务器上可用的所有服务。
在服务器端,可以使用 btregister
命令注册预定义的测试服务。完成后,在运行发现命令时,应该会在客户端看到新添加的服务。
你现在可以在客户端订阅这些新服务。下面是关于如何订阅测试服务的示例:
W800:~$ btsubscribe 26 25
Subscribed
服务器现在可以使用命令 btnotify
通知客户机。
通过 GATT 命令可用的另一个选项是启动 MTU 交换。要执行此操作,请使用
btexchangemtu
命令,要更新 shell 最大 MTU ,需要更新 shell 配置文件中的 Kconfig 符号。有关更多详细信息 ,请参见 bluetooth_mtu_update_sample
。
L2CAP
l2cap
命令公开 2cap API 的部分。下面的示例显示如何注册 LE PSM ,从另一个设备连接到它,并发送3个数据包,每个数据包包含14个八位字节。
该示例假设两个设备已经连接。
在设备 A 上,注册 LE PSM :
W800:~$ btl2capregister 29
L2CAP psm 41 sec_level 1 registered
在设备 B 上,连接到注册的 LE PSM 并发送数据:
W800:~$ btl2capconnect 29
Chan sec: 1
L2CAP connection pending
Channel 0x20000210 connected
Channel 0x20000210 status 1
W800:~$ l2cap send 3 14
Rem 2
Rem 1
Rem 0
Outgoing data channel 0x20000210 transmitted
Outgoing data channel 0x20000210 transmitted
Outgoing data channel 0x20000210 transmitted
在设备 A 上,你应该已经收到数据:
Incoming conn 0x20002398
Channel 0x20000210 status 1
Channel 0x20000210 connected
Channel 0x20000210 requires buffer
Incoming data channel 0x20000210 len 14
00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff |........ ...... |
Channel 0x20000210 requires buffer
Incoming data channel 0x20000210 len 14
00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff |........ ...... |
Channel 0x20000210 requires buffer
Incoming data channel 0x20000210 len 14
00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff |........ ...... |