我有一个专有设备的自定义配置文件(我的智能手机应用程序将是与我的外围设备通信的唯一内容),其中包括两个简单的服务。每个服务都允许客户端在外设上读写单个字节的数据。我想添加在单个事务中读取和写入两个字节的功能。
我尝试添加第三项服务,其中只包含两个现有的单字节服务,但似乎只是分配一个UUID,它结合了现有服务的UUID,我看不到如何使用组合的UUID,因为它没有任何特征值。
我正在考虑的替代方案是为两个字节创建一个单独的服务并将它们的效果组合在我的服务器上,或者我可以用一个服务替换所有这些,包括两个字节以及每个字节的布尔标志指示是否应写入相关字节的字节。
第一种选择似乎过于复杂,第二种选择会阻止单独控制通知和单独字节的指示。
有没有办法使用附带的服务来实现我的目标?
答案 0 :(得分:2)
这是一个相当古老的问题,但如果有其他人遇到它我会在这里发表评论。
这是两部分。一个是Lance F的迟到答案:你对BLE设计原则有一个错误的理解。服务在BLE堆栈的主机级别定义。您从应用程序级别的角度考虑了您的问题,希望原子事务为您提供两个不同实体的复合对象。否则你为什么要定义两个服务?
第二部分是对Kevin Townsend等人的“蓝牙低能耗入门”引用的实际问题的回答,O'Reilly,2014,第58页: 包含的服务有助于避免重复GATT服务器中的数据。如果服务将被其他服务引用,则可以使用此机制来节省内存并简化GATT服务器的布局。在上一个类和对象的类比中,您可以看到包含定义作为指针或对现有对象实例的引用。
这是我的答案的更新,以澄清为何在Lance F所述的问题中不需要所包含的服务。
我最熟悉BLE在医疗设备中的使用,因此我简要地将SIG定义的葡萄糖配置文件作为示例,以便与您的问题进行一些类比。
让我们设想一个服务器设备,其具有2个定义特征的葡萄糖服务:葡萄糖测量和葡萄糖测量背景。客户可以订阅这些特征中的一个或两个的通知。在一段时间之后,客户端设备可以通过简单地写入相应特征的客户端配置特征描述符来改变其订阅。
服务器还具有特殊的强制性特征 - 记录访问控制点(RACP),客户端使用该记录访问控制点来检索或更新血糖测量历史记录。
如果客户想要获取大量存储的历史记录,则会写入RACP {OpCode:4(报告存储记录数),运营商:1(所有记录)}。然后服务器从RACP发送指示{OpCode:5(存储记录响应数),运算符:0(空),操作数:17(某个数字)}。
如果客户想要获取任何特定记录,则会写入RACP {OpCode:1(报告存储记录),运营商:4(在范围内,包括在内),操作数:[13,14](例如记录13和14)}。作为响应,服务器逐个发送请求的记录作为葡萄糖测量和葡萄糖测量上下文特征的通知,然后从RACP特征发送指示以报告操作的状态。
因此葡萄糖测量和葡萄糖测量环境是您的模式和速率特性,那么您还需要一个更多的控制特性 - RACP的模拟。现在,您需要定义许多代码,运算符和操作数。创建一个最适合您的结构,例如,代码:1 - 更新,操作员:1 - 仅模式,操作数:实际数字。客户端将其写入控制点特征。服务器在写入时得到通知,解释它,并以您的自定义配置文件定义的方式运行。