gpt4 book ai didi

linux - GATT 库直接读取特征值,无需遍历服务

转载 作者:行者123 更新时间:2023-12-01 22:26:02 26 4
gpt4 key购买 nike

我正在尝试在树莓派上使用 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#NewBatteryServicehttps://github.com/paypal/gatt/blob/master/examples/service/battery.go ,这似乎显示了直接创建电池服务的正确方法。下面的原始答案。

快速浏览了上述文档后,我突然想到了两件事:

  • 电池电量 ID 为 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也不是AddDescriptorSetDescriptorsbatteryChar .需要这样的电话吗?我不知道;文档没有说。但是有效的调用使用 DiscoverServices后跟 DiscoverCharacteristics ,它可能确实创建了这些(记录但未描述的)描述符。他们看起来像是介入了以值(value)为导向的运营,所以他们可能很关键。

    进一步查看代码,在直接创建特征之后或代替直接创建特征,我认为您必须至少将特征链接回服务。正确的调用可能是 AddCharacteristicSetCharacteristics .见 this chunk of code in DiscoverCharacteristics .
  • (未成年人)gatt.Property(0x12)绝对是构造常数的错误方法。您可能应该使用:
    gatt.Property.CharRead | gatt.Property.CharNotify
  • 关于linux - GATT 库直接读取特征值,无需遍历服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59915057/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com