您的术语主要是正确的。
通常,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)
在这两个服务之后,您可以添加自己的服务。在您的情况下,您似乎没有针对知名服务,因此您将创建自己的服务。
首先,创建一个 128 位 UUID,例如使用uuidgen
Mac 命令行上的工具
$ 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 数据库。如果您没有生成二进制数据的好工具,您可能必须自己编写它们。蓝牙核心规范 V4.0 对此进行了解释。希望您能找到一个为您进行转换的 API :-)
注册成功后,您必须设置广告参数并开始广告(请再次查阅您的 SDK 文档和示例)。
现在发生的情况是,在某个时候,您将收到一个已建立连接的回调,然后您将收到一个给定句柄的属性请求。然后,您只需通过查看句柄、提供的值和操作类型(读/写)来处理请求。不要忘记始终返回成功值或错误代码以响应请求,否则,您将锁定蓝牙通信。
通常,那些蓝牙芯片总是与异步操作一起工作。您将发送一个请求,然后必须等到请求完成后再发送下一个请求。请记住,在编程时,它可以节省您的时间:-)。
如果您想先尝试 Android,因为它对您来说更熟悉,您可以尝试使用 Android 4.2 的 Galaxy S 4。它还有一个 LE 外围模式——不过我还没有测试过它的可靠性。目前充当 LE 外围设备的最可靠的智能手机堆栈目前在 iOS 7 中 - 因此,如果可以负担得起使用 iPod touch,它可能是值得的。