1

您好我希望有人可以帮助我进行蓝牙广告和扫描。这是一个学校干项目。

我正在使用电路游乐场 Bluefruit 开发板并使用电路 python。尝试实施社交距离徽章 - 当另一个用户离得太近时会亮起。总体思路是设置一个广告信标,然后切换到扫描。

我已经尝试过代码,但希望有人对其进行审查。我不确定 eddystoneuid 是否有效;例如,当我扫描时,它只会扫描我的特定 uid。

谢谢

import time
from adafruit_circuitplayground.bluefruit import cpb
import adafruit_ble
from adafruit_ble_eddystone import uid

emitter = adafruit_ble.BLERadio()
advertisement = uid.EddystoneUID(emitter.address_bytes)
receiver = adafruit_ble.BLERadio()

while cpb.switch:    
    # only if the switch is to the leftt the code will work
    # so there's an option to turn the board off if needed.
    
    emitter.start_advertising(advertisement)
    time.sleep(0.5)
    emitter.stop_advertising()
    # advertises its "address" almost every half second
    for advertisement in receiver.start_scan():
        # then the same board scans for advertisements after
        rssi = advertisement.rssi
        if advertisement.rssi > -80:
            # if the rssi is stronger than -80 (around 2m, yet to be certain)
            cpb.pixels.fill((250, 0, 0))
            time.sleep(0.2)
            cpb.pixels.fill((250, 0, 0))
            time.sleep(0.2)
            cpb.pixels.fill((250, 0, 0))
            cpb.pixels.fill((0, 0, 0))
            # then the neopixels flash bright red three times, then turn off
    receiver.stop_scan()
4

1 回答 1

1

目前看来,如果检测到任何 RSSI 大于 -80 dBm 的蓝牙广告,您的代码将触发。那是你要的吗?通常,您会发现其他设备正在广播/宣传您的通知服务。

通常,这样的服务不会只使用 RSSI 号码。广告数据还包括广播广告的 dBm。使用这两个 dBm 数字之间的差异可以粗略估计距离,如下文所述:https ://medium.com/personaldata-io/inferring-distance-from-bluetooth-signal-strength-a-deep- dive-fe7badc2bb6d 如果您的所有设备都相同并且以相同的 dBm 广播,那么计算距离就不那么重要了。

所以总而言之,emitter.address_bytes我不会广播,而是放一些所有徽章都会广播的特定数字。然后,当您扫描时,请查看advertisement.ServiceData该号码。只有当它是你的曝光通知时,才计算它是否太接近。

如需进一步参考,这里是去年发布的Google/Apple Exposure Notification Bluetooth® 规范的链接。

于 2021-01-25T07:45:23.070 回答