Не могу найти пользовательский сервис GATT - PullRequest
1 голос
/ 15 апреля 2019

В моем приложении UWP я могу обнаружить приложение Android, работающее на устройстве, и прочитать его характеристика имени устройства

Это работает. Но в том же приложении Android у меня есть пользовательский сервис, который я добавил в GATT с характеристикой чтения. Я могу найти свой сервис в другом приложении для Android, но не могу сделать это в своем приложении UWP. Вот мой код:

if (ulong.TryParse(deviceAddress, out ulong address))
{
    BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(address);

    // the name of the device of bluetoothLeDevice matches my device, so I know I have the right address

    var serviceId = new Guid(myCustomServiceId);

    GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesForUuidAsync(serviceId);
    var q = await bluetoothLeDevice.GetGattServicesAsync();

    if (q?.Status == GattCommunicationStatus.Success)
    {
        foreach (var x in q.Services) // q.Services is empty
        {
            // never comes in here
        }
    }
}

Есть идеи почему?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Вы установили возможности ble в своем Package.appxmanifest?
Если вы используете Visual Studio, найдите Package.appxmanifest и дважды щелкните по нему. перейдите на вкладку возможностей и проверьте Bluetooth и сохранить.
Вы также можете использовать xml-редактор для изменения Package.appxmanifest. Добавить:

<Capabilities>
    <DeviceCapability Name="bluetooth" />
</Capabilities>

Если вы уже установили возможности, посмотрите на мое SimpleBleExample_by_Devicename на Github: https://github.com/GrooverFromHolland/SimpleBleExample_by_Devicename
Нет никаких средств управления, чтобы сделать его максимально простым. Все результаты отображаются в окне вывода отладки.

0 голосов
/ 17 апреля 2019

Для меня это решило то, что вместо того, чтобы пытаться найти мою услугу / характеристику по обратному вызову нажатия кнопки, я нахожу их в обратном вызове myBluetoothLEAdvertisementWatcher.Received:

private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
    bool isMyDevice = false;

    // figure out if isMyDevice should be true by checking the advertised service uuids

    if (isMyDevice)
    {
        var bluetoothLeDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);

        var serviceId = new Guid(My_Service_UUID);

        var result = await bluetoothLeDevice.GetGattServicesForUuidAsync(serviceId);

        if (result?.Status == GattCommunicationStatus.Success)
        {
            var service = result.Services.FirstOrDefault(s => s.Uuid == serviceId);

            if (service != null)
            {
                Log?.Invoke("service found!");

                var characteristicId = new Guid(My_Characteristic_UUID);

                var characteristic = await service.GetCharacteristicsForUuidAsync(characteristicId);

                if (characteristic?.Status == GattCommunicationStatus.Success)
                {
                    var c = characteristic.Characteristics.FirstOrDefault(x => x.Uuid == characteristicId);

                    if (c != null)
                    {
                        Log?.Invoke("characteristic found");

                        var v = await c.ReadValueAsync();

                        if (v?.Status == GattCommunicationStatus.Success)
                        {
                            var reader = DataReader.FromBuffer(v.Value);
                            byte[] input = new byte[reader.UnconsumedBufferLength];
                            reader.ReadBytes(input);

                            // Utilize the data as needed
                            string str = System.Text.Encoding.Default.GetString(input);
                            Log?.Invoke(str);
                        }
                    }
                }
            }
        }
    }
}

Этот инструмент также действительно полезен для всех, кто разрабатывает с BLE:

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BluetoothLE

Это позволяет вам читать услуги / характеристики любого соседнего устройства BLE. Может сильно помочь с тестированием. Приложение nRF Connect также хорошо работает для тестирования.

...