如何解决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 举报,一经查实,本站将立刻删除。