FromBluetoothAddressAsync 函数返回 null

问题描述

有时来自 WinRT 的 FromBluetoothAddressAsync() 返回 NULL:

BluetoothLEDevice::FromBluetoothAddressAsync(deviceAddr).get(); 

这取决于deviceAddr,这意味着某些远程设备的函数每次返回NULL,某些设备返回BluetoothLEDevice对象。

在 Internet 的某个地方,我发现有人提到这是 Microsoft 的问题,对此无能为力,但那是几年前的事。因此,对于经常使用该功能的人来说,问题是:什么样的设备无法接收BluetoothLEDevice对象,在这种情况下如何处理?

GetFirstAdvertisingBLEAddr():

uint64_t GetFirstAdvertisingBLEAddr()
{
    std::mutex m;
    std::condition_variable cv;

    bluetoothleadvertisementwatcher advWatcher;
    uint64_t addr = 0;
    bool stopCalled = false;
    auto recvToken = advWatcher.Received([&addr,&m,&cv](bluetoothleadvertisementwatcher watcher,BluetoothLEAdvertisementReceivedEventArgs eventArgs) {
        ShowAdvertisement(eventArgs);
        addr = eventArgs.BluetoothAddress();
        watcher.Stop();
        std::unique_lock l(m);
        cv.notify_all(); 
    });
    auto stoppedToken = advWatcher.Stopped([&stopCalled,bluetoothleadvertisementwatcherStoppedEventArgs eventArgs) {
        std::unique_lock l(m);
        stopCalled = true;
        cv.notify_all();
    });

    {
        std::unique_lock l(m);
        advWatcher.Start();
        cv.wait(l,[&addr,&stopCalled,&advWatcher] { return addr != 0 && stopCalled && (advWatcher.Status() == bluetoothleadvertisementwatcherStatus::Aborted || advWatcher.Status() == bluetoothleadvertisementwatcherStatus::Stopped); });
    }

    // remove event handlers
    advWatcher.Received(recvToken);
    advWatcher.Stopped(stoppedToken);

    return addr;
}

GetDeviceName():

std::wstring GetDeviceName(uint64_t deviceAddr) {
BluetoothLEDevice dev = BluetoothLEDevice::FromBluetoothAddressAsync(deviceAddr).get();
if (NULL == dev) {
    std::wstringstream resp;
    resp << L"NULL" << AddrToString(deviceAddr);
    return resp.str();
}
auto gapServicesResult = dev.GetGattServicesForUuidAsync(GattServiceUuids::GenericAccess(),BluetoothCacheMode::Uncached).get();
if (gapServicesResult.Status() == GattCommunicationStatus::Success) {
    auto gapServices = gapServicesResult.Services();
    if (gapServices.Size() > 0) {
        GattDeviceService genericAccessSvc = gapServices.GetAt(0);
        if (genericAccessSvc) {
            auto gapDeviceNameChrs = genericAccessSvc.Getcharacteristics(GattCharacteristicUuids::GapDeviceName());
            if (gapDeviceNameChrs.Size() == 1) {
                GattCharacteristic gapDeviceNameChr = gapDeviceNameChrs.GetAt(0);

                GattReadResult readRes = gapDeviceNameChr.ReadValueAsync().get();
                if (readRes.Status() == GattCommunicationStatus::Success) {
                    DataReader reader = DataReader::FromBuffer(readRes.Value());
                    return reader.ReadString(reader.UnconsumedBufferLength()).c_str();
                }
            }
        }
    }
}

main():

int main()
{

    winrt::init_apartment();

    std::wcout << "Main thread: " << std::this_thread::get_id() << std::endl;

    uint64_t addr = GetFirstAdvertisingBLEAddr();
    if (addr == 0) {
        std::wcout << L"Failed to find advertising BLE device." << std::endl;
        return 1;
    }
    std::wcout << "Found BLE device: " << GetDeviceName(addr) << std::endl;

    BluetoothLEDevice dev = BluetoothLEDevice::FromBluetoothAddressAsync(addr).get();

    GattDeviceServicesResult result = dev.GetGattServicesAsync(BluetoothCacheMode::Uncached).get();
.......

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)