摘要

蓝牙是一种短距离的无线技术,允许在特定的蓝牙频道上广播数据。

有40个独特的频段(通道),每个频段有2兆赫的间隔。37、38和39通道用于主要广播,0-36通道用于数据传输。

在广播过程中,BLE数据包被广播。这个数据包包含序言、访问地址、PDU和CRS字段。

序言和访问地址字段帮助接收器检测帧。CRS字段用于检查错误。PDU由PDU头和PDU有效载荷组成。PDU定义了数据包本身。

PDU头包含关于PDU类型的信息。基于该类型,有效载荷字段可能不同。

例如,当PDU类型为ADVNONCONNIND时,PDU有效载荷由 "AdvA"(一个包含广告商地址信息的字段)和 "AdvData"(一个包含数据信息的字段)字段组成:

1 octet = 1 byte = 8 bits

Preamble1 octet
Access-Address4 octets
PDU
  • PDU Header = 2 octets
  • PDU Payload = AdvA (6 octets)+AdvData (0...31 octets)
CRS3 octets

有不同的PDU类型。

  • ADV_IND(其中有效载荷由AdvA[6octets]+AdvData[0-31 octets]组成,用于可连接、可扫描的无定向通告)。

  • ADV_NOCONN_IND(有效载荷由AdvA[6octets]+AdvData[0-31 octets]组成,用于不可连接的、不可扫描的不定向通告)。

  • ADV_SCAN_IND(其中有效载荷由AdvA[6octets]+AdvData[0-31 octets]组成,用于可扫描、无定向通告)。

  • SCAN_REQ(其中有效载荷由ScanA[6octets]+AdvA[6octets]组成,ScanA字段包含扫描仪的地址,AdvA包含广告商的地址,用于请求SCAN_RSP响应)。

  • SCAN_RSP(其中有效载荷由AdvA[6octets]+ScanRspData[0-31 octets]组成,其中ScanRspData可以包含来自通告主主机的任何数据,它用于响应SCAN_REQ请求)。

  • ADV_DIRECT_IND(其中有效载荷由AdvA[6octets]+TargetA[6octets]组成,其中TargetA是PDU寻址的设备地址域,用于可连接、定向通告)。

  • 等等

你可以在 这里 找到更多关于数据包结构的信息(蓝牙规格)。

RouterOS中的蓝牙接口的主要应用是监测由其他设备(例如 蓝牙标签 广播的蓝牙通告数据包(扫描器功能)或广播通告数据包(广告商功能)。

配置

Sub-menu: /iot bluetooth

: 要使用 iot 包。

:检查设备的规格页面,确保设备支持蓝牙。

物联网软件包可与RouterOS 6.48.3版本一起使用。可以从 下载页面 - "额外包 "下获得。

设备

在这个菜单中,可以检查和设置一般的蓝牙芯片参数:

[admin@device] > iot bluetooth print
Columns: NAME, PUBLIC-ADDRESS, RANDOM-STATIC-ADDRESS, ANTENNA
  #  NAM  PUBLIC-ADDRESS     RANDOM-STATIC-ADD  ANTENNA
  0  bt1  00:00:00:00:00:00  F4:4E:E8:04:77:3A  internal
[admin@device] /iot bluetooth set

:公共地址是IEEE注册的永久地址。这个地址不能被改变。在上面的 "打印 "例子中,设备没有分配公共地址(所有八位数都设置为0)。

可配置的设置显示如下:

属性 说明
antenna (string; Default: internal) 选择使用内部或外部蓝牙天线
name (string; Default: ) 蓝牙芯片/接口的描述名称
random-static-address (MAC address; Default: ) 用户可配置的蓝牙芯片的地址

可以用以下命令监控芯片的统计信息:

[admin@device] /iot bluetooth print stats
Columns: NAME, RX-BYTES, TX-BYTES, RX-ERRORS, TX-ERRORS, RX-EVT, TX-CMD, RX-ACL, TX-ACL
  #  NAM  RX-BYTE  TX-  R  T  RX-EV  TX  R  T
  0  bt1  1857835  235  0  0  46677  45  0  0

广播者

在这个菜单中,可以设置蓝牙芯片广播通告包。可以用命令检查和设置广播者设置:

[admin@device] > iot bluetooth advertisers print
Flags: X - DISABLED
Columns: DEVICE, MIN-INTERVAL, MAX-INTERVAL, OWN-ADDRESS-TYPE, CHANNEL-MAP, AD-SIZE
#   DEVICE  MIN-INTERVAL  MAX-INTERVAL  OWN-ADDRESS-TYPE  CHANNEL-MAP  AD-SIZE
0 X bt1     1280ms        2560ms        random-static              37        0
                                                                   38
                                                                   39
[admin@device] /iot bluetooth advertisers set

可配置的设置如下:

属性 说明
ad-structures (string; Default: ) 为广告数据包选择一个预先配置的结构。更多信息见 "AD结构 "部分。
channel-map (37|38 | 39; Default: 37, 38, 39) 用于广播的通道
disabled (yes | no; Default: yes) 禁用或启用蓝牙芯片广播包的选项
max-interval (_integer:_20..10240;__ Default: 2560 ms) 广播通告数据包的最大间隔时间。
min-interval (_integer:_20..10240;__ Default: 1280 ms) 广播通告数据包的最小间隔。
own-address-type (public | random-static | rpa-fallback-to-public | rpa-fallback-to-random; Default: random-static) 在广播数据包有效载荷中使用的MAC地址:
- public → 使用IEEE注册的永久地址。
- random-static → 使用用户可配置的地址(会在下一次上电时改变)。
- rpa-fallback-to-public → 使用可解析的随机私人地址(RPA),只有当接收方拥有身份解析密钥(IRK)时才能解析。如果不能生成RPA,将使用公共地址。
- rpa-fallback-to-random → 与 "rpa-fallback-to-public "相同,但如果不能生成RPA,将使用随机静态地址代替。

: 通告包将在每一个 min-interval <= X <= max-interval 毫秒的时间内广播。

扫描者

在这个菜单中,你可以设置蓝牙芯片的扫描者设置。如果禁用,设备就不能再接收广播报告。启用后,可以在 "广播报告 "选项卡中监测广播报告(本指南后面会有解释)。可以用命令检查和设置扫描设置:

[admin@device] > iot bluetooth scanners print
Flags: X - DISABLED
Columns: DEVICE, TYPE, INTERVAL, WINDOW, OWN-ADDRESS-TYPE, FILTER-POLICY, FILTER-DUPL
ICATES
#   DEVICE  TYPE     INTERVAL  WINDOW  OWN-ADDRESS-TYPE  FILTER-POLICY  FIL
0 X bt1     passive  10ms      10ms    random-static     default        off
[admin@device] /iot bluetooth scanners set

可配置的属性如下:

属性 说明
disabled (yes|no; Default: no) 禁用或启用蓝牙芯片接收广播报告的选项。
filter-duplicates (keep-newest | keep-oldest | off; Default: off) 丢弃重复通告的选项:
- keep-newest → 保留最新的报告(丢弃最旧的)。只有来自单一AdvA的最新PDU会被保留。
- keep-oldest → 保留最老的报告(丢弃最新的)。只有来自单个AdvA的最老的PDU将被保留。这种类型的PDU过滤发生在控制器层面,因此它是最有效的(能源/带宽方面)重复过滤方法。
- off → 不丢弃重复的内容。所有相同AdvA的PDU将被保留。
重复的广播报告是指从同一设备地址发送的通告报告。实际数据(有效载荷的 "AdvData "部分)可能会改变/不同,在确定重复的广播报告时,它不被视为重要的。意思是说,例如,如果蓝牙接口从同一个标签收到10个有效载荷(有效载荷后,间隔1秒):
- 如果你使用 "keep-oldest "设置→蓝牙接口将只显示从该标签收到的第一个有效载荷(9个后续有效载荷将被过滤掉)。
- 如果你使用 "keep-newest "设置→蓝牙接口将只显示从该标签收到的最后一个有效载荷(每个后续有效载荷将重写前一个)。
filter-policy (default | whitelist | no; Default: default) 设置过滤策略(控制器级广播过滤)的选项:
- 默认→当此策略被启用时,扫描者只接受ADV_IND、ADV_NOCONN_IND、ADV_SCAN_IND、SCAN_RSP和ADV_DIRECT_IND(其中TargetA是扫描仪自己的蓝牙地址)PDU类型。
- 白名单→当此策略启用时,扫描者只接受由广播者广播的ADV_IND、ADV_NOCONN_IND、ADV_SCAN_IND、SCAN_RSP PDU类型,其地址配置为 "白名单 "部分,以及ADV_DIRECT_IND类型PDU(其中TargetA是扫描仪自己的蓝牙地址)。
interval (integer:3..10240;Default: 10 ms) 扫描者开始扫描下一个广播频道的时间。
own-address-type (public | random-static | rpa-fallback-to-public | rpa-fallback-to-random; Default: random-static) 扫描请求中使用的地址类型(如果使用主动扫描类型):
- public → 使用IEEE注册的永久地址。
- random-static → 使用用户可配置的地址(将在下一次上电时改变)。
- rpa-fallback-to-public → 使用可解析的随机私人地址(RPA),只能用身份解析密钥(IRK)来解析。如果不能生成RPA,将使用公共地址。
- rpa-fallback-to-random → 与 "rpa-fallback-to-public "相同,但如果不能生成RPA,将使用随机静态地址。
type (active | passive; Default: passive) 定义扫描 者类型:
- active → 扫描者如果收到一个可扫描的广播就可以发送扫描请求。扫描者可以发送SCAN_REQ,以获得SCAN_RSP的响应。
- passive → 扫描者将只监听通告,不发送数据(例如扫描请求)。
window (integer:3..10240; Default: 10 ms) 扫描者扫描一个广告通道的时间。

例如,如果扫描间隔设置为20ms,意味着只有在20ms之后,设备才会开始扫描下一个通道。如果扫描窗口设置为10ms,意味着设备将只在这10ms的窗口内扫描每个通道。意思是,扫描37号通道10ms(窗口时间),再过10ms后开始扫描下一个通道(20ms[interval]-10ms[window])。用10ms来扫描通道38,再过10ms后,设备将开始扫描通道39。

广播报告

这部分可以监测蓝牙广播报告(来自附近的广播)。可以用命令监控广播报告:

[admin@device] > iot bluetooth scanners advertisements print
Columns: DEVICE, PDU-TYPE, TIME, ADDRESS-TYPE, ADDRESS, RSSI
 #  DEV  PDU-TYPE        TIME                  ADDRES  ADDRESS            RSSI
 0  bt1  adv-noconn-ind  jul/28/2021 09:30:56  public  2C:C8:1B:93:16:49  -24dBm
 1  bt1  adv-noconn-ind  jul/28/2021 09:30:56  random  0B:16:17:9E:7B:EF  -60dBm

可以用以下命令为报告设置一个过滤器:

[admin@device] > iot bluetooth scanners advertisements print where

例如,要打印由特定蓝牙地址广播的报告,使用命令:

[admin@device] > iot bluetooth scanners advertisements print where address=XX:XX:XX:XX:XX:XX
 # DEVICE    PDU-TYPE       TIME                 ADD... ADDRESS                    RSSI     LENGTH DATA
79 bt1       adv-noconn-ind jul/28/2021 09:46:38 public XX:XX:XX:XX:XX:XX        -70dBm         30 02010...
80 bt1       adv-noconn-ind jul/28/2021 09:46:43 public XX:XX:XX:XX:XX:XX        -67dBm         30 02010...
81 bt1       adv-noconn-ind jul/28/2021 09:46:44 public XX:XX:XX:XX:XX:XX        -70dBm         28 1bff0...
82 bt1       adv-noconn-ind jul/28/2021 09:46:48 public XX:XX:XX:XX:XX:XX        -75dBm         30 02010...

只显示RSSI强于-30 dBm的广播报告,使用命令:

[admin@device] > iot bluetooth scanners advertisements print where rssi > -30
 # DEVICE         PDU-TYPE       TIME                 ADDRESS-TYPE ADDRESS                    RSSI     LENGTH DATA
307 bt1            adv-noconn-ind jul/29/2021 10:11:31 public       2C:C8:1B:93:16:49        -24dBm         22 15ff4f09.>
308 bt1            adv-noconn-ind jul/29/2021 10:11:31 public       2C:C8:1B:93:16:49        -26dBm         22 15ff4f09.>

可用的过滤器(可以在以下参数的帮助下过滤广播报告列表):

过滤器 说明
address 蓝牙广播者地址
address-type 广播者地址类型 (例如,公共或随机)
data 十六进制格式的广播数据(AdvData有效载荷)
device 蓝牙芯片/接口名称
epoch 自Unix Epoch以来的毫秒数
filter-comment 匹配的白名单过滤器的注释
length 广播数据长度
pdu-type 广播PDU的类型
rssi 信号强度
time 广播数据包的接收时间

白名单

在这个选项卡中,可以配置白名单,在 "扫描者"过滤策略中使用。换句话说,这是一个指定哪些蓝牙地址将被扫描的选项(显示在 "广播报告 "中)。

可以用命令查看白名单条目:

[admin@device] > iot bluetooth whitelist print
Columns: DEVICE, ADDRESS-TYPE, ADDRESS
# DEVICE  ADDRESS-TYPE  ADDRESS
0 bt1     public        08:55:31:CF:F3:9C

可以用命令添加一个新的白名单条目:

[admin@device] > iot bluetooth whitelist add

可配置属性:

属性 说明
address (MAC address; Default: ) 广播者地址
address-type (public | random; Default: ) 广播者地址地址类型
comment (string; Default: ) 白名单的简短说明
copy-from 复制条目的选项 - 更多信息请查看 控制台文档
device (bt1; Default: ) 选择蓝牙接口/芯片名称
disabled (yes|no; Default: ) 禁用或启用条目的选项

只能添加8个白名单条目。