UUID和Name不在同一条BLE广播报文里
概要通过在命令行窗口打印部分报文信息发现设备向外发送BLE蓝牙低功耗广播设备的UUID和Name不在同一条广播报文里UUID是通用唯一标识符一、设备1、发送报文的设备能够发送BLE蓝牙低功耗广播的设备。本篇使用的是周围环境中的未知设备。2、接收报文的设备本篇使用一台Windows11电脑二、代码#include iostream #include windows.h #include winrt/Windows.Foundation.h #include winrt/Windows.Foundation.Collections.h #include winrt/Windows.Devices.Bluetooth.Advertisement.h #include winrt/Windows.Storage.Streams.h #include atomic #include string #include sstream #include vector #include mutex #include iomanip #include chrono using namespace winrt; using namespace Windows::Foundation; using namespace Windows::Devices::Bluetooth::Advertisement; using namespace Windows::Storage::Streams; BluetoothLEAdvertisementWatcher g_watcher{nullptr}; std::string BluetoothAddressToString(uint64_t address){ std::stringstream ss; ss std::setw(2) std::setfill(0) std::hex ((address 40) 0xFF) : ((address 32) 0xFF) : ((address 24) 0xFF) : ((address 16) 0xFF) : ((address 8) 0xFF) : (address 0xFF); return ss.str(); } std::string WStringToUtf8(const std::wstring wstr) { if(wstr.empty()){ return ; } int sizeWideCharToMultiByte(CP_UTF8,0,wstr.c_str(),-1,nullptr,0,nullptr,nullptr); std::string str(size-1,0); WideCharToMultiByte(CP_UTF8,0,wstr.c_str(),-1,str[0],size,nullptr,nullptr); return str; } void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) { std::string sout; auto now std::chrono::system_clock::now(); auto ms std::chrono::duration_caststd::chrono::milliseconds(now.time_since_epoch()).count()%10000; std::string mac BluetoothAddressToString(args.BluetoothAddress()); sout[; soutstd::to_string(ms); sout ms]; sout mac; sout ; std::wstring name args.Advertisement().LocalName().c_str(); if(!name.empty()){ sout WStringToUtf8(name) ; }else{ sout[Empty name]; } soutUUIDS: ; for(const auto uuid : args.Advertisement().ServiceUuids()){ sout WStringToUtf8(winrt::to_hstring(uuid).c_str()); } std::coutsoutstd::endl; std::coutstd::flush; } int main() { winrt::init_apartment(winrt::apartment_type::multi_threaded); std::coutStarting BLE Scanner......std::endl; g_watcher BluetoothLEAdvertisementWatcher(); g_watcher.ScanningMode(BluetoothLEScanningMode::Active); g_watcher.Received(OnAdvertisementReceived); g_watcher.Start(); std::coutScanning.....Press Enter to stop.std::endl; std::cin.get(); g_watcher.Stop(); std::coutStopped.std::endl; return 0; }三、编译链接1、动态编译cl /EHsc /MD /std:c17 /Fe:Ble.exe main.cpp windowsapp.lib查看文件大小和依赖dirdumpbin /dependents Ble.exe2、静态编译cl /EHsc /std:c17 /MT /Fe:BleStatic.exe main.cpp windowsapp.lib查看文件大小和依赖dirdumpbin /dependents BleStatic.exe3、关于静态链接的说明当使用/MT进行静态编译时并不是生成了一个完全独立、不依赖任何系统DLL的程序C标准库(MSVCP140.dll)和C运行时支持(VCRUNTIME140.dll)被静态打包进了.exeWindows API依然是动态链接的。windowsapp.lib本质上是一个导入库(Import Library)里面是函数名符号什么的。也就是说即使加了/MT程序依然只能在Windows上运行且依赖系统组件四、在开发环境上演示在开发环境Windows11上运行程序1、动态链接的程序可以明显看到同一个设备(同一mac地址)发送过来的广播报文总是先出现有uuid的报文后出现有name的报文。uuid和name并不在同一条报文里。2、静态链接的程序可以看到静态链接的程序运行效果和动态链接的程序运行效果是一样的五、在非开发环境上演示将程序复制到另一台没有开发环境的Windows10电脑上运行1、动态链接的程序可以看到程序由于找不到MSVCP140.dll和VCRUNTIME140.dlll而无法运行2、静态链接的程序程序能够运行但扫描不到设备。按Enter键程序不能正常退出。按两次Enter键之后窗口关闭。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2466796.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!