BLE Gatt 自定义服务 - 如何仅通知注册中心基于应用级别 外围中央

问题描述

背景

  • 应用通过 BLE 5.0 连接到设备以进行简单配置/获取设备的一些信息。 (作为服务工具使用)

  • 之前没有某种注册是不允许与设备通信的。因此,您可以扫描设备的二维码并询问应用程序 ID 和 PIN 码(在设备启动期间或按下按钮时)

  • 可以在蓝牙堆栈级别进行连接并查看所有服务和特征,只要服务实现在中心是“未知”的情况下不会做任何有用的事情,我对此有疑问将此锁定在应用程序级别。

  • 这是我的第一个蓝牙/Ble/Gatt-Server/Dbus 和应用程序开发项目。

我的设置

外围

我已经在 RaspBerry Pi4 上使用 python3/DBusBluez 5.50(仅限 ControllerMode = le)实现了 Gatt-Server /p>

我从以下示例开始:

  • 如何读取树莓派的 cpu 温度
  • 如何写入 Gatt-Server(在摄氏度和华氏度之间切换)
  • 如何在温度变化时通知

https://github.com/Douglas6/cputemp/blob/master/cputemp.py

我还从 Apple 的以下文档中得到了一些想法:

https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Specification/Specification.html#//apple_ref/doc/uid/TP40013460-CH1-SW7

特征权限

  • 只写(有响应)到 exec。一些命令
  • 通知接收数据

配对:

  • 我使用了一个带有选项 NoInputNoOutput 的简单 Bluez 代理示例。作为中心,我只有在第一次与设备配对时才遇到问题。没有我必须接受的代码(这就是我想要的)。

中央

我有一个 iOS 应用,使用 Swift5 和 CoreBluetooth

从中心角度来看,有点像 Apple 通知中心服务的文档中所示:

我的基本沟通过程(目前对我来说效果很好)

  1. 应用连接到 Pi(简单配对,无需 PIN 码)
  2. 应用读取所有服务、特征并使用通知标志启用特征通知
  3. 应用程序提供一个验证码(从扫描的二维码提取)并接收一个应用程序 ID 和一个密码并存储以备下次使用
  4. 请求属性 x 并接收带有当前属性 x 值的通知

我的问题、想法和问题

当第二个中心激活该特定特征的通知时,它也会收到属性 x 的信息。 Central B 使用免费应用程序扫描所有可用的服务/特征..(我使用 LightBlue for Mac 或 Beacon Grabber for iPhone)。 Central B 只是与 RaspBerry Pi 配对,不需要提供其他东西..

  • 到目前为止,我在我的服务和特性实现中没有关于连接设备的上下文。我知道,我可以通过读出来读取哪个设备写入特性
dbus.ObjectPath('/org/bluez/hci0....
  • 我能记住这些信息并询问设备 X 是否有一个有效的 ID 和 pin,否则我不会做任何事情。

  • 我也可以仅在已知设备请求时触发通知。但这并不能完全解决问题。

  • 我只能(也许..)允许一个中央连接来避免我的问题(但不能解决它)

  • 有没有办法只通知特定设备?

  • 有没有更好的方法来处理这个问题?

  • 我可以强制断开与未注册的中心的连接吗?

  • 是否有更好的方法来实现此级别的某种安全性?

我对一些想法和意见感到高兴。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)