Библиотека GATT, непосредственно считывающая значения характеристик c без итерации по сервисам - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь использовать go на Raspberry Pi для запроса устройств Bluetooth с низким энергопотреблением. Это функционально, я могу подключиться к устройству, которое я хочу, и просматривать сервисы и характеристики подключенного устройства. Сейчас я просто пытаюсь упорядочить вещи и просто читать / записывать интересующие меня значения. Это не работает.

Код:

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]. Я довольно новичок в go, поэтому я, возможно, что-то здесь упускаю или просто неправильно собираю данные. Любые указатели очень ценятся. Спасибо!

1 Ответ

0 голосов
/ 26 января 2020

Рекомендуется ссылка на соответствующую документацию . Я не знаю, правильна ли эта ссылка, так как кажется, что существует несколько разных версий пакета gatt.

Редактировать: см. Также https://godoc.org/github.com/paypal/gatt/examples/service#NewBatteryService в https://github.com/paypal/gatt/blob/master/examples/service/battery.go, который, по-видимому, показывает правильный способ создания службы батареи напрямую. Оригинальный ответ ниже.


После быстрого сканирования указанной документации на меня выпрыгивают две вещи:

  1. Батарея Уровень ID 2a19. Аккумулятор , сервис , идентификатор 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, что, возможно, создает эти (документированные, но неописанные) дескрипторы. Они выглядят так, как будто они вставляют себя в ориентированные на значение операции, поэтому они могут быть критически важными.

    Если посмотреть на код дальше, после или вместо непосредственного создания признака c, я думаю, что вам нужно как минимум ссылку характеристики c обратно в сервис. Правильный вызов может быть AddCharacteristic или SetCharacteristics. См. этот фрагмент кода в DiscoverCharacteristics.

  2. (Minor.) gatt.Property(0x12) - определенно неправильный способ построения константы. Вы, вероятно, должны использовать:

    gatt.Property.CharRead | gatt.Property.CharNotify
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...