扫描蓝牙设备并获取原始广播数据的功能实现

通过扫描蓝牙设备并获取原始广播数据的功能实现。通过异步编程和回调函数,可以实时处理扫描到的设备和广播数据,并将其打印输出

  1. 引入必要的模块和库:
    import asyncio
    from bleak import BleakScanner
    import binascii
    import datetime
    

    这里使用了asyncio库来实现异步编程,BleakScanner用于扫描蓝牙设备,binascii用于将字节转换为十六进制字符串,datetime用于获取当前时间。

  2. 定义函数run_scan_rawdata(self),该函数用于执行蓝牙设备扫描,并处理广播数据:
    async def scan_callback(device, advertisement_data):
        # 如果扫描到目标设备,则将广播数据处理打印
        if device.address == target_mac_address:
            self.thread.update_signal.emit(str(datetime.datetime.now()) + "\t" + f"{device.name} {device.address}" + "\t")
            manufacturer_data = advertisement_data.manufacturer_data  # manufacturer_data服务下原始数据,bytes转16进制再转字符串
            for key, value in manufacturer_data.items():
                hex_data: str = binascii.hexlify(value).decode("utf-8")
                self.thread.update_signal.emit(f"{hex_data.upper()}")
            
            service_data = advertisement_data.service_data  # service_data服务下原始数据,bytes转16进制再转字符串
            for key, value in service_data.items():
                hex_data: str = binascii.hexlify(value).decode("utf-8")
                self.thread.update_signal.emit(f"{hex_data.upper()}")
    

    scan_callback函数是一个回调函数,用于处理扫描到的蓝牙设备和广播数据。首先判断是否扫描到目标设备(通过比较设备地址),如果是目标设备,则将广播数据进行处理和打印。

  3. 定义异步函数main(self),该函数用于执行蓝牙设备扫描:
    async def main(self):
        scanner = BleakScanner()
        scanner.register_detection_callback(scan_callback)
        await scanner.start()
        await asyncio.sleep(65535.0)
        await scanner.stop()
    

    main函数中,创建了一个BleakScanner对象scanner,并注册了之前定义的回调函数scan_callback。然后调用scanner.start()开始扫描,并使用asyncio.sleep(65535.0)进行等待,最后调用scanner.stop()停止扫描。

  4. 执行主程序:
    try:
        s = self.lineEdit_mac_three_axis_11.text()
        target_mac_address = ':'.join([s[i:i + 2] for i in range(0, len(s), 2)])
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(main(self))
        loop.close()
    except Exception as e:
        self.thread.update_signal.emit(f"Error: {e},请检查")
    

    获取目标设备的MAC地址,并将其格式化为冒号分隔的形式。然后创建一个新的事件循环loop,并将其设置为当前asyncio的事件循环。接着调用loop.run_until_complete(main(self))来执行主程序,最后关闭事件循环。

  5. 原代码如下:

    def run_scan_rawdata(self):
        async def scan_callback(device, advertisement_data):
            # 如果扫描到目标设备,则将广播数据处理打印
            if device.address == target_mac_address:
                # print(advertisement_data)
                self.thread.update_signal.emit(str(datetime.datetime.now()) + "\t" + f"{device.name} {device.address}" + "\t")
                manufacturer_data = advertisement_data.manufacturer_data  # manufacturer_data服务下原始数据,bytes转16进制再转字符串
                for key, value in manufacturer_data.items():
                    hex_data:str = binascii.hexlify(value).decode("utf-8")
                    self.thread.update_signal.emit(f"{hex_data.upper()}")
    
                service_data = advertisement_data.service_data  # service_data服务下原始数据,bytes转16进制再转字符串
                for key, value in service_data.items():
                    hex_data:str = binascii.hexlify(value).decode("utf-8")
                    self.thread.update_signal.emit(f"{hex_data.upper()}")
                    # self.thread_14.update_signal.emit(f"rssi={advertisement_data.rssi}dBm")
    
    
        async def main(self):
            scanner = BleakScanner()
            scanner.register_detection_callback(scan_callback)
            await scanner.start()
            await asyncio.sleep(65535.0)
            await scanner.stop()
    
        try:
            s = self.lineEdit_mac_three_axis_11.text()
            target_mac_address = ':'.join([s[i:i + 2] for i in range(0, len(s), 2)])
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            loop.run_until_complete(main(self))
            loop.close()
        except Exception as e:
            self.thread.update_signal.emit(f"Error: {e},请检查")#此条可忽略,为配合上位机发送信号用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值