我正在尝试使用覆盆子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,它似乎显示了直接创建电池服务的正确方法。下面是原始答案。

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

  • 电池电量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。需要这样的电话吗?我不知道;该文档没有说。但是有效的调用使用DiscoverServicesDiscoverCharacteristics,后者可能确实创建了这些(已记录但未描述的)描述符。他们看起来好像将自己置于以价值为导向的运营中,因此它们可能很关键。

    进一步查看代码,在直接创建特征之后或代替直接创建特征,我认为您至少必须将特征链接回服务中。正确的调用可能是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/

    10-12 06:08