我正在尝试使用覆盆子pi上的go查询蓝牙低功耗设备。它是功能性的,我可以连接到所需的设备,并通过连接的设备的服务和特性进行迭代。现在,我只是在尝试简化事情,只是读/写我感兴趣的值。它不起作用。
码:
func onPeriphConnected(p gatt.Peripheral, err error) {
fmt.Println("Connected")
defer p.Device().CancelConnection(p)
if err := p.SetMTU(500); err != nil {
fmt.Printf("Failed to set MTU, err: %s\n", err)
}
batteryServiceId := gatt.MustParseUUID("180f")
// Direct read attempt (not working)
batterySerivce := gatt.NewService(batteryServiceId)
batteryLevelUUID := gatt.MustParseUUID("2a19")
batteryChar := gatt.NewCharacteristic(batteryLevelUUID,batterySerivce,gatt.Property(0x12),0,0)
e, err := p.ReadCharacteristic(batteryChar)
if err != nil {
fmt.Printf("Failed to read battery level, err: %s\n", err)
} else {
fmt.Println(e)
}
// iterate services read (working)
ss, err := p.DiscoverServices(nil)
if err != nil {
fmt.Printf("Failed to discover services, err: %s\n", err)
return
}
for _, s := range ss {
if(s.UUID().Equal(batteryServiceId)) {
fmt.Println("Found the battery service")
// Discovery characteristics
cs, err := p.DiscoverCharacteristics(nil, s)
if err != nil {
fmt.Printf("Failed to discover characteristics, err: %s\n", err)
continue
}
for _, c := range cs {
msg := " Characteristic " + c.UUID().String()
if len(c.Name()) > 0 {
msg += " (" + c.Name() + ")"
}
msg += "\n properties " + c.Properties().String()
fmt.Println(msg)
if (c.Properties() & gatt.CharRead) != 0 {
b, err := p.ReadCharacteristic(c)
if err != nil {
fmt.Printf("Failed to read characteristic, err: %s\n", err)
continue
}
fmt.Printf(" value %x\n", b)
}
}
}
}
}
结果:
Connected
[10 0 0 1]
Found the battery service
Characteristic 2a19 (Battery Level)
properties read notify
value 53
您可以看到我希望得到十六进制值53的位置,而我却得到[10 0 0 1]的数组。我刚上学,所以我可能在这里丢失了一些东西,或者只是错误地组装了我的读物。非常感谢任何指针。谢谢!
最佳答案
链接到appropriate documentation是可取的。我不知道此链接是否正确,因为gatt
软件包似乎有多个不同版本。
编辑:另请参见https://godoc.org/github.com/paypal/gatt/examples/service#NewBatteryService上的https://github.com/paypal/gatt/blob/master/examples/service/battery.go,它似乎显示了直接创建电池服务的正确方法。下面是原始答案。
快速浏览了上述文档后,我想到了两件事:
2a19
。电池服务ID为180f
。你用:batteryServiceId := gatt.MustParseUUID("180f")
batterySerivce := gatt.NewService(batteryServiceId)
batteryChar := gatt.NewCharacteristic(batteryLevelUUID, batterySerivce,
gatt.Property(0x12), 0, 0)
e, err := p.ReadCharacteristic(batteryChar)
(我保留了变量名的拼写,但是在StackOverflow显示中添加了一些空格以使其更适合显示。)您永远不会在
NewDescriptor
上调用AddDescriptor
或SetDescriptors
或batteryChar
。需要这样的电话吗?我不知道;该文档没有说。但是有效的调用使用DiscoverServices
和DiscoverCharacteristics
,后者可能确实创建了这些(已记录但未描述的)描述符。他们看起来好像将自己置于以价值为导向的运营中,因此它们可能很关键。进一步查看代码,在直接创建特征之后或代替直接创建特征,我认为您至少必须将特征链接回服务中。正确的调用可能是
AddCharacteristic
或SetCharacteristics
。参见this chunk of code in DiscoverCharacteristics
。 gatt.Property(0x12)
绝对是构造常量的错误方法。您可能应该使用:gatt.Property.CharRead | gatt.Property.CharNotify
关于linux - GATT库直接读取特征值,而无需遍历服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59915057/