您的术语主要是正确的。
通常,GATT数据库至少具有0x1800(通用访问)和0x1801(通用属性)服务。 通用访问服务包含两个强制特征:设备名称和外观。 通用属性服务应为空。
因此,最小的GATT数据库如下所示:
Handle Description
0000 Service: Generic Access (1800)
0001 Characteristic: Device Name (2A00, readable)
0002 Characteristic Value (string)
0003 Characteristic: Appearance (2A01, readable)
0004 Characteristic Value (16bit enum)
0005 Service: Generic Attribute (1801)
完成这两项服务后,您可以添加自己的服务。在您的情况下,您似乎没有针对一个知名的服务进行定位,因此您将创建一个自己的服务。
首先,在您的Mac命令行中使用uuidgen
工具创建一个128位UUID。
$ uuidgen
DCDF2725-56C8-4235-A4BC-F7951D5C3762
这将是您的服务UUID
0006 Service: Custom defined Service (DCDF2725-56C8-4235-A4BC-F7951D5C3762)
然后,你提到你想要几个可写的特征。那么,让我们为那个创建另一个UUID。
$ uuidgen
4C06C6F4-C90D-4C58-8E31-20C8C74FF832
并为服务添加一个特征
0007 Characteristic: Custom Characteristic (4C06C...FF832, writeable)
0008 Characteristic Value (hex, 20 bytes)
您的特征值不应超过20个字节,并且应选择“写请求”以确保将写操作的确认发送到中央。如果选择“写命令”,则写操作可能会被您手机的堆栈或外围设备丢弃。
定义了这个特征后,就可以开始编码了。
我不知道BeagleBoard SDK,但通常情况下,您需要初始化GATT库和其他模块(例如,为了支持写入,您必须初始化库的第二部分)。
初始化后,注册GATT数据库。如果没有好的工具来生成二进制数据,则可能需要自己编写。在Bluetooth Core Spec V4.0中有解释。希望您能找到一个可以为您进行转换的API :-)
注册成功后,您将必须设置广告参数并开始广告(再次请参阅SDK的文档和示例)。
现在发生的是,在某个时间点,您将获得一个回调,告诉您已建立连接,并且稍后,您将收到给定句柄的属性请求。然后,您只需通过查看句柄、提供的值和操作类型(读取/写入)来处理请求。不要忘记始终对请求返回成功值或错误代码,否则,您将锁定蓝牙通信。
通常,这些蓝牙芯片始终与异步操作一起工作。您将发送请求,然后必须等待请求完成,然后再发送下一个请求。记住,在编程时,这可以节省时间 :-)
如果您想先在Android上尝试,因为它更熟悉,请尝试搭载Android 4.2的Galaxy S 4。它也具有LE外围模式——虽然我没有测试其可靠性。目前,最可靠的智能手机堆栈用作LE外围设备的是iOS 7——所以,如果可以负担得起,可能值得购买一个iPod touch来进行实验。