新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于蓝牙RSSI信号强度实现室内设备定位的Python实践

发布时间:2026/9/2 3:29:52来源:尧图网络
基于蓝牙RSSI信号强度实现室内设备定位的Python实践
在办公室、会议室或公共空间里手机随手一放转身就找不到的情况时有发生。如果手机恰好处于静音或震动模式传统的“打电话听铃声”方法就会失效。这时一个基于蓝牙信号强度进行粗略定位的思路或许能提供一种技术上的解决路径。本文将从零开始探讨如何利用常见的蓝牙技术特别是蓝牙低功耗的信号强度指示来构建一个简单的“手机信号追踪器”原型。我们将使用 Python 作为主要工具通过监听周围蓝牙设备的广播信号并计算其信号强度来辅助判断目标设备的大致方位。这个方案的核心是RSSI。RSSI 是接收信号强度指示的缩写它是一个相对值单位通常是 dBm。简单来说信号越强RSSI 的绝对值越小例如 -50 dBm 比 -80 dBm 信号强。通过持续扫描并比较目标设备 RSSI 值的变化我们可以推断出接收端与目标设备之间距离的相对远近。虽然 RSSI 易受环境、障碍物和天线方向性影响精度有限无法实现厘米级定位但对于“在房间内寻找手机”这类场景提供“信号变强了”或“信号变弱了”的直观反馈已经足够有价值。本文将带领你完成一个命令行版本的蓝牙信号强度监视工具。你会了解到蓝牙扫描的基本原理、如何解析设备信息、如何持续追踪特定设备的 RSSI以及如何解读这些数据来辅助决策。整个过程不需要手机安装额外 App仅作为被扫描的目标但需要一个带有蓝牙适配器的电脑作为扫描端。1. 理解蓝牙扫描与 RSSI 定位的基本原理在动手写代码之前需要先理清几个关键概念这能帮助你在后续遇到问题时知道该从哪个方向排查。1.1 蓝牙设备的广播与扫描蓝牙设备特别是低功耗蓝牙设备为了能被发现会周期性地向外发送广播数据包。这个数据包包含了设备地址、设备名称、服务 UUID 等信息。我们的电脑或开发板上的蓝牙适配器可以设置为扫描模式被动接收这些广播包。当你打开手机的蓝牙设置界面看到周围一堆设备列表就是这个过程的结果。1.2 什么是 RSSI 以及它的局限性RSSI 是接收端测量到的信号强度。理论上距离发射源越近信号强度越大RSSI 值越高绝对值越小。但实际环境中RSSI 受到多重因素干扰距离遵循对数衰减模型是主要因素。障碍物墙壁、人体、家具会显著衰减信号。多径效应信号经反射后叠加可能导致某点信号意外增强或减弱。设备差异不同手机、不同蓝牙芯片的发射功率和天线性能不同。环境噪声2.4GHz 频段的 Wi-Fi、微波炉等都会造成干扰。因此绝对距离计算非常困难且不准确。我们的策略是相对比较在同一环境、短时间间隔内通过移动扫描端观察同一目标设备 RSSI 值的变化趋势。如果 RSSI 值增大例如从 -80 dBm 变为 -65 dBm通常意味着你正朝目标设备靠近。1.3 方案的技术边界与适用场景必须明确这不是一个高精度室内定位系统。它的目标是场景在有限、已知的空间内如一个办公室、一个家寻找一个已知蓝牙 MAC 地址或名称的设备。输入目标设备的蓝牙标识地址或名称。输出实时的 RSSI 值和简单的趋势提示如“信号增强”。限制无法穿透多堵承重墙在设备密集区域可能受到干扰需要目标设备蓝牙功能开启并处于可发现模式对于手机即使锁屏蓝牙通常也仍在工作。2. 环境准备与依赖配置我们将使用 Python 的pybluez库在桌面系统Windows/Linux/macOS上进行蓝牙扫描。pybluez是对系统底层蓝牙栈的封装不同操作系统下的安装和配置略有差异。2.1 系统与硬件要求操作系统Windows 10/11 Ubuntu/Debian 等 Linux 发行版或 macOS。硬件计算机必须配备蓝牙适配器。大多数笔记本已内置台式机可能需要 USB 蓝牙适配器建议选择 4.0 及以上版本。目标设备一部蓝牙功能已开启的手机Android 或 iOS。用于测试的手机不需要安装任何软件。2.2 Python 环境与依赖安装首先确保你已安装 Python建议 3.7 及以上版本。然后通过 pip 安装pybluez。请注意pybluez是底层绑定其安装可能依赖系统级的蓝牙开发库。对于 Ubuntu/Debian Linux# 安装系统蓝牙开发库 sudo apt update sudo apt install libbluetooth-dev # 安装Python虚拟环境工具可选但推荐 pip install virtualenv # 创建并激活虚拟环境 virtualenv venv source venv/bin/activate # 安装pybluez pip install pybluez对于 WindowsWindows 下的pybluez安装相对简单但可能需要手动处理一些依赖。最可靠的方式是使用预编译的 wheel 文件。# 直接使用pip安装pip会尝试寻找合适的版本 pip install pybluez # 如果上述命令失败可以尝试安装非官方编译版本例如 # pip install pybluez-win10对于 macOSmacOS 使用系统的 IOBluetooth 框架安装命令如下pip install pybluez如果遇到权限问题可能需要使用pip install --user pybluez。安装完成后可以运行一个简单的命令测试蓝牙适配器是否被 Python 识别import bluetooth print(bluetooth.__version__) print(“本地蓝牙设备地址”, bluetooth.read_local_bdaddr())如果报错bluetooth.btcommon.BluetoothError: (2, ‘No such file or directory’)常见于Linux可能是蓝牙服务未运行或权限不足。请检查蓝牙服务状态并确保当前用户有访问蓝牙硬件的权限通常需要将用户加入bluetooth组。2.3 权限与系统服务检查Linux 权限问题处理# 检查蓝牙服务状态 sudo systemctl status bluetooth # 如果未运行则启动 sudo systemctl start bluetooth # 将当前用户加入bluetooth组避免每次使用sudo sudo usermod -a -G bluetooth $USER # 修改后需要注销并重新登录或使用newgrp命令立即生效 newgrp bluetoothWindows 服务检查在 Windows 搜索栏输入“服务”找到 “Bluetooth Support Service”确保其状态为“正在运行”。3. 构建蓝牙信号强度扫描器我们将分步构建一个扫描器首先实现发现周围所有设备然后筛选出目标设备最后持续监控其 RSSI 变化。3.1 基础扫描发现周围蓝牙设备pybluez提供了discover_devices函数可以执行一次耗时约 10 秒的经典蓝牙设备发现。但对于低功耗蓝牙设备以及需要获取 RSSI 的场景我们需要使用更底层的find_service或lookup_name配合套接字操作。一个更直接获取 RSSI 的方法是使用bluetooth.ble如果支持或系统命令行工具。为了通用性我们先实现一个经典蓝牙的设备发现示例。创建一个名为bt_scanner.py的文件import bluetooth import sys import time def discover_devices(duration8): 扫描周围经典蓝牙设备 :param duration: 扫描持续时间秒 :return: 包含设备地址和名称的列表 print(f“正在扫描经典蓝牙设备耗时约 {duration} 秒...”) try: # discover_devices 返回设备地址列表lookup_name 用于获取名称 devices bluetooth.discover_devices(durationduration, lookup_namesTrue, flush_cacheTrue) return devices except Exception as e: print(f“扫描过程中发生错误{e}”) return [] if __name__ “__main__”: found_devices discover_devices() if not found_devices: print(“未发现任何蓝牙设备。请确认”) print(“1. 电脑蓝牙已开启。”) print(“2. 周围有蓝牙设备且处于可发现模式。”) print(“3. 你有足够的权限Linux下可能需要sudo或用户组权限。”) sys.exit(1) print(f“\n发现 {len(found_devices)} 个设备”) print(“-” * 40) for addr, name in found_devices: # 有些设备可能没有名称显示为 None device_name name if name else ‘未知设备’ print(f“地址{addr}”) print(f“名称{device_name}”) print(“-” * 20)运行这个脚本python bt_scanner.py你应该能看到一个设备列表其中可能包含你的手机、耳机、音箱等。记录下你手机的蓝牙地址格式如XX:XX:XX:XX:XX:XX或名称这将是我们的目标。注意discover_devices默认扫描的是经典蓝牙BR/EDR。许多现代手机在广播时也兼容经典蓝牙发现。如果此方法找不到你的手机可以尝试让手机进入“蓝牙配对”模式通常在蓝牙设置里点击“配对新设备”这通常会强制手机发送更强的可发现信号。3.2 进阶扫描获取设备的 RSSI 值discover_devices函数不直接返回 RSSI。为了获取 RSSI我们需要使用蓝牙套接字进行更底层的查询。这里我们使用bluetooth.BluetoothSocket来读取远程设备的信号强度。需要注意的是这种方法可能需要与设备建立临时连接或查询并非所有设备都支持。创建bt_rssi_scanner.pyimport bluetooth import sys import time def get_rssi_for_device(target_addr): 尝试获取指定蓝牙设备的 RSSI。 注意此方法不稳定并非所有设备或系统都支持。 :param target_addr: 目标设备的蓝牙 MAC 地址 :return: RSSI 值dBm失败则返回 None # 使用 HCI主机控制器接口套接字 sock bluetooth.BluetoothSocket(bluetooth.L2CAP) try: # 尝试连接到一个已知的 PSM协议/服务多路复用器这里使用一个通用值 # 实际上更可靠的方式是使用系统命令如hcitool sock.connect((target_addr, 0x1001)) # 0x1001 是一个示例PSM rssi bluetooth.read_rssi(sock.fileno()) sock.close() return rssi except bluetooth.btcommon.BluetoothError as e: # 连接失败是常见的因为设备可能不支持此PSM # print(f“无法连接至 {target_addr} 获取 RSSI: {e}”) pass except AttributeError: # read_rssi 函数可能在某些平台不可用 print(“当前平台或蓝牙栈不支持 read_rssi 函数。”) except Exception as e: print(f“获取 RSSI 时发生未知错误{e}”) finally: try: sock.close() except: pass return None def continuous_rssi_scan(target_addr, interval2, max_attempts50): 持续扫描目标设备的 RSSI :param target_addr: 目标地址 :param interval: 每次扫描间隔秒 :param max_attempts: 最大尝试次数 print(f“开始持续追踪设备 {target_addr} 的 RSSI按 CtrlC 终止。”) attempt 0 last_rssi None try: while attempt max_attempts: rssi get_rssi_for_device(target_addr) if rssi is not None: trend “” if last_rssi is not None: if rssi last_rssi: # RSSI值越大信号越强 trend “↑ (信号增强)” elif rssi last_rssi: trend “↓ (信号减弱)” print(f“[{time.strftime(‘%H:%M:%S’)}] RSSI: {rssi:4d} dBm {trend}”) last_rssi rssi else: print(f“[{time.strftime(‘%H:%M:%S’)}] 未能获取 RSSI。设备可能不在范围内或不可连接。”) time.sleep(interval) attempt 1 except KeyboardInterrupt: print(“\n扫描被用户中断。”) if __name__ “__main__”: if len(sys.argv) 2: print(“用法python bt_rssi_scanner.py 目标蓝牙地址”) print(“示例python bt_rssi_scanner.py XX:XX:XX:XX:XX:XX”) sys.exit(1) target_addr sys.argv[1].upper() # 简单的地址格式校验 import re if not re.match(r“^([0-9A-F]{2}:){5}[0-9A-F]{2}$”, target_addr): print(“错误蓝牙地址格式不正确。应为 XX:XX:XX:XX:XX:XX”) sys.exit(1) continuous_rssi_scan(target_addr, interval3)运行脚本传入你之前记录的手机蓝牙地址python bt_rssi_scanner.py “你的:手机:蓝牙:地址”重要说明上述get_rssi_for_device方法在实际操作中成功率可能不高因为它试图与一个随机端口建立连接。在 Linux 系统上更可靠的方法是调用系统命令行工具hcitool。3.3 更稳定的方案调用系统命令获取 RSSILinux/macOS对于 Linux 和 macOS我们可以通过子进程调用系统自带的蓝牙工具来获取更稳定的 RSSI 信息。下面是一个改进版本优先使用系统命令。创建bt_rssi_linux.pyimport subprocess import re import time import sys def get_rssi_via_hcitool(device_addr): 使用 hcitool 命令获取经典蓝牙设备的 RSSI (Linux) :param device_addr: 设备地址 :return: RSSI 值整数失败返回 None try: # 使用 hcitool 读取远程设备的信号强度 # 注意这可能需要 sudo 权限或者用户属于 bluetooth 组 cmd [“hcitool”, “rssi”, device_addr] result subprocess.run(cmd, capture_outputTrue, textTrue, timeout5) if result.returncode 0: # 输出示例RSSI return value: -45 match re.search(r“RSSI return value:\s*(-?\d)”, result.stdout) if match: return int(match.group(1)) else: # 可能设备未连接尝试先连接临时 # 注意频繁连接/断开可能耗电或干扰设备 connect_cmd [“bluetoothctl”, “connect”, device_addr] subprocess.run(connect_cmd, capture_outputTrue, timeout2) time.sleep(1) # 再次尝试获取 RSSI result subprocess.run(cmd, capture_outputTrue, textTrue, timeout5) if result.returncode 0: match re.search(r“RSSI return value:\s*(-?\d)”, result.stdout) if match: rssi_val int(match.group(1)) # 获取后断开连接避免保持连接 disconnect_cmd [“bluetoothctl”, “disconnect”, device_addr] subprocess.run(disconnect_cmd, capture_outputTrue, timeout2) return rssi_val except FileNotFoundError: print(“错误未找到 ‘hcitool’ 或 ‘bluetoothctl’ 命令。请确保 bluez 工具包已安装。”) except subprocess.TimeoutExpired: print(“命令执行超时。”) except Exception as e: print(f“执行命令时出错{e}”) return None def get_rssi_via_bluetoothctl(device_addr): 使用 bluetoothctl 的信息命令获取设备信息可能包含 RSSI (Linux) :param device_addr: 设备地址 :return: RSSI 值整数失败返回 None try: # 启动 bluetoothctl 交互模式发送 info 命令 proc subprocess.Popen([“bluetoothctl”], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue) # 发送命令序列 commands f“connect {device_addr}\ninfo {device_addr}\ndisconnect {device_addr}\nquit\n” stdout, stderr proc.communicate(inputcommands, timeout10) # 在输出中查找 RSSI match re.search(r“RSSI:\s*(-?\d)”, stdout) if match: return int(match.group(1)) except Exception as e: print(f“通过 bluetoothctl 获取 RSSI 失败{e}”) return None def continuous_rssi_monitor(target_addr, interval3): 持续监控 RSSI print(f“启动 RSSI 监控目标设备{target_addr}”) print(“手持扫描设备电脑缓慢移动观察 RSSI 变化。”) print(“RSSI 值越接近 0例如 -40信号越强越负例如 -90信号越弱。”) print(“按 CtrlC 停止。\n”) last_rssi None try: while True: rssi None # 尝试第一种方法 rssi get_rssi_via_hcitool(target_addr) if rssi is None: # 尝试第二种方法 rssi get_rssi_via_bluetoothctl(target_addr) current_time time.strftime(“%H:%M:%S”) if rssi is not None: trend “” if last_rssi is not None: if rssi last_rssi: trend “↑” elif rssi last_rssi: trend “↓” print(f“[ {current_time} ] RSSI: {rssi:4d} dBm {trend}”) last_rssi rssi else: print(f“[ {current_time} ] 无法读取 RSSI。设备可能已超出范围或未连接。”) last_rssi None # 重置上次记录 time.sleep(interval) except KeyboardInterrupt: print(“\n监控已停止。”) if __name__ “__main__”: if len(sys.argv) ! 2: print(“用法python bt_rssi_linux.py 蓝牙设备地址”) print(“示例python bt_rssi_linux.py AA:BB:CC:DD:EE:FF”) sys.exit(1) target sys.argv[1].strip().upper() continuous_rssi_monitor(target, interval3)在 Linux 终端运行此脚本可能需要普通用户权限或sudo取决于你的系统配置python bt_rssi_linux.py “AA:BB:CC:DD:EE:FF”现在拿着你的笔记本电脑在房间内走动观察终端输出的 RSSI 值变化。当你走向手机时RSSI 值应该逐渐增大例如从 -85 变为 -60远离时则减小。4. 数据解读与追踪策略获取到 RSSI 数据流后如何将其转化为有效的“寻物指南”4.1 理解 RSSI 数值的含义下表提供了 RSSI 值与典型距离和信号质量的粗略对应关系在无障碍空旷环境设备发射功率标准的情况下RSSI 范围 (dBm)信号质量大致距离估计行动建议-30 至 -50极强非常近1米内目标就在眼前仔细查看桌面、抽屉、口袋。-50 至 -70强较近数米内在同一个房间内可以尝试改变天线方向或缓慢转圈寻找信号最强的方向。-70 至 -85中等在同一楼层可能隔一堵墙信号方向性开始明显。朝信号增强的方向移动注意穿过门或走廊时信号的变化。-85 至 -100弱较远可能隔多堵墙或楼层目标可能不在当前房间。需要扩大搜索范围优先朝信号绝对值小的方向探索。 -100 或 无法获取极弱/无信号超出有效范围目标可能已关机、蓝牙关闭或距离过远。回到最后已知的强信号位置重新开始。重要提醒此表仅为经验参考。实际环境中一堵承重墙可能导致信号衰减 20-30 dBm。人体遮挡也会产生 5-10 dBm 的衰减。4.2 实现简单的追踪算法我们可以为脚本增加一个简单的状态机根据 RSSI 变化趋势给出文字提示。修改continuous_rssi_monitor函数中的打印部分def get_trend_advice(current_rssi, last_rssi, stable_count): 根据 RSSI 变化给出建议 :param stable_count: 信号稳定的次数计数器 :return: (建议文本, 新的stable_count) if last_rssi is None: return “正在获取初始信号...”, 0 delta current_rssi - last_rssi advice “” new_stable_count stable_count if abs(delta) 2: # 变化很小认为是稳定 new_stable_count 1 if new_stable_count 3: advice “[信号稳定] 你很可能正对着目标方向或目标在固定位置。尝试小范围搜索。” else: advice “[信号微变] 保持当前方向移动。” elif delta 5: # 信号显著增强 new_stable_count 0 # 重置稳定计数器 advice “[信号显著增强] 方向正确继续前进” elif delta 2: # 信号增强 new_stable_count 0 advice “[信号增强] 方向大致正确。” elif delta -5: # 信号显著减弱 new_stable_count 0 advice “[信号显著减弱] 方向可能错了建议退回或调整方向。” elif delta -2: # 信号减弱 new_stable_count 0 advice “[信号减弱] 考虑调整移动方向。” else: advice “[保持]” new_stable_count 1 return advice, new_stable_count # 在监控循环中使用 stable_counter 0 last_rssi_val None while True: rssi get_rssi(...) if rssi is not None: if last_rssi_val is not None: advice, stable_counter get_trend_advice(rssi, last_rssi_val, stable_counter) print(f“[ {time.strftime(‘%H:%M:%S’)} ] RSSI: {rssi:4d} dBm | {advice}”) else: print(f“[ {time.strftime(‘%H:%M:%S’)} ] RSSI: {rssi:4d} dBm | 初始读数”) last_rssi_val rssi # ... sleep ...4.3 可视化信号强度可选对于命令行界面我们可以用简单的字符画来模拟一个强度条更直观。def visualize_rssi(rssi): 将 RSSI 转换为一个简单的文本强度条 # RSSI 通常在 -100 到 -30 之间 # 映射到 0-10 的长度 if rssi -30: level 10 elif rssi -100: level 0 else: # 线性映射-30-10, -100-0 level int(((rssi 100) / 70) * 10) level max(0, min(10, level)) bar “█” * level “░” * (10 - level) return f“[ {bar} ]”在打印输出中加入这个可视化条print(f“[ {time.strftime(‘%H:%M:%S’)} ] RSSI: {rssi:4d} dBm {visualize_rssi(rssi)} | {advice}”)5. 常见问题排查与优化在实际操作中你可能会遇到各种问题。下面是一些常见问题及其排查思路。5.1 扫描不到任何设备问题现象可能原因检查与解决步骤运行脚本后无任何输出或提示“未发现设备”。1. 电脑蓝牙硬件未开启或驱动异常。2. 系统蓝牙服务未运行。3. 脚本权限不足Linux。4. 周围没有蓝牙设备处于可发现模式。1.检查硬件系统设置中确认蓝牙已开启。设备管理器Windows或lsusb/lspciLinux检查适配器。2.检查服务Linux运行sudo systemctl status bluetoothWindows检查“Bluetooth Support Service”。3.检查权限Linux将用户加入bluetooth组并重新登录。4.确认目标状态确保手机等设备的蓝牙已打开并进入“可被搜索”或“配对”模式。5.2 能发现设备但无法获取 RSSI问题现象可能原因检查与解决步骤设备列表中有目标但get_rssi函数始终返回None或系统命令执行失败。1. 目标设备不支持查询 RSSI 的连接方式。2. 防火墙或安全软件阻止了蓝牙连接。3. 使用的系统命令 (hcitool) 已过时或被替代新版BlueZ。4. 设备已配对但未连接。1.尝试连接先用系统蓝牙界面手动配对并连接一次手机然后再运行脚本。有时建立过信任关系后更容易读取信息。2.使用替代命令尝试使用bluetoothctl的info命令它可能提供不同的数据源。3.检查BlueZ版本bluetoothctl -v。新版可能推荐使用bluetoothctl而非hcitool。4.考虑 BLE如果目标是手机尝试寻找其 BLE低功耗蓝牙广播并使用gatttool或bluepyPython库进行扫描BLE广播包有时也包含 RSSI。5.3 RSSI 值跳动剧烈或不变化问题现象可能原因检查与解决步骤RSSI 值在短时间内如1秒内上下跳动超过20dBm或者移动时 RSSI 毫无变化。1. 环境电磁干扰严重如多个Wi-Fi路由器、微波炉。2. 蓝牙天线性能差或被遮挡。3. 扫描间隔太短设备广播或系统上报有延迟。4. 脚本获取 RSSI 的源不稳定如从缓存读取。1.改变环境移动到相对开阔、干扰少的地方测试。2.调整扫描间隔将interval参数从 1 秒增加到 2-3 秒给系统足够的采样时间。3.数据平滑在代码中实现简单滤波如取最近3次读数的平均值。4.验证数据源尝试用bluetoothctl monitor命令观察原始事件看 RSSI 上报是否本身就不稳定。5.4 脚本在 Windows 或 macOS 上无法运行问题现象可能原因检查与解决步骤pybluez安装失败或导入bluetooth模块时报错。1. Windows 缺少必要的 C 编译环境或 SDK。2.pybluez对较新的操作系统版本支持不佳。3. macOS 的蓝牙权限未授予给终端或 IDE。1.Windows尝试安装预编译的pybluez轮子文件或使用pip install pybluez-win10。2.macOS在“系统偏好设置”-“安全性与隐私”-“隐私”中确保“蓝牙”已勾选你的终端应用如 Terminal、iTerm或 Python IDE。3.通用方案考虑使用跨平台的bleak库专注于 BLE但需要目标设备支持 BLE 广播。6. 生产环境考量与扩展方向本文的脚本仅适用于个人、临时的寻物场景。若想将其用于更稳定或集成的项目需要考虑以下方面。6.1 提升稳定性和准确性多天线与三角定位使用多个固定位置的蓝牙接收器如树莓派通过测量同一设备到达不同接收器的 RSSI可以进行三角定位精度更高。指纹定位事先在空间内多个参考点采集 RSSI 指纹记录不同位置对不同固定发射源的信号强度实际定位时将实时采集的指纹与数据库匹配找到最相似的位置。滤波算法对 RSSI 原始数据应用卡尔曼滤波或移动平均滤波减少抖动。融合其他传感器结合手机加速度计、陀螺仪数据需手机端 App 配合或利用环境 Wi-Fi 信号进行辅助定位。6.2 开发图形化界面或移动应用桌面 GUI使用tkinter、PyQt或Electron为扫描脚本包装一个图形界面实时显示信号强度曲线图和指南针方向。手机 App开发一个简单的手机 App使用 Flutter、React Native 或原生开发让手机成为扫描端去寻找另一个蓝牙设备如防丢器。这需要处理 Android/iOS 的蓝牙 API 权限和后台扫描限制。6.3 集成到智能家居或物联网系统人员存在检测在房间入口布置蓝牙扫描器通过识别特定手机或可穿戴设备的 RSSI判断人员是否进入或离开房间联动灯光、空调等。资产追踪为重要资产如工具箱、医疗设备贴上蓝牙信标Beacon在仓库或医院内布置扫描网关实现粗略的资产位置管理。6.4 安全与隐私提醒隐私风险持续扫描并记录周围蓝牙设备地址可能涉及隐私问题。在实际部署中应明确告知用户并遵守相关数据保护法规。权限管理无论是桌面脚本还是移动应用访问蓝牙功能都需要相应的系统权限在代码中应妥善处理权限申请和拒绝的流程。数据安全如果位置数据需要上传到服务器必须进行加密传输并在服务器端安全存储。通过这个项目你不仅学会了如何用 Python 和系统工具读取蓝牙信号强度更重要的是理解了基于 RSSI 的接近感知技术的原理、局限性和实践方法。下次在办公室找不到手机时除了求助同事不妨打开终端运行一下你的脚本让技术给你提供一个寻找的方向。记住关键不是绝对精度而是相对变化带来的信息。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MiniMax H3本地部署实战:用ComfyUI生成阿喀琉斯MG动画全流程 2026/9/2 4:17:58

MiniMax H3本地部署实战:用ComfyUI生成阿喀琉斯MG动画全流程

最近用 MiniMax H3 做了一轮 MG 动画测试,测试主题是“阿喀琉斯”这个经典角色。整体跑下来,发现它和之前用的文生视频模型思路很不一样,特别是在参考图控制、提示词编写和本地部署这三个环节,坑点不少,但也有非常明显…

阅读更多 →
L3/L4自动驾驶国标倒计时:时间同步与数据回灌的工程化落地指南 2026/9/2 4:17:58

L3/L4自动驾驶国标倒计时:时间同步与数据回灌的工程化落地指南

从 2027 年 7 月 1 日起,国内 L3/L4 级自动驾驶将迎来首批强制国标。很多工程师看到这类新闻,第一反应是“这是法规和法务团队的事情”,但从实际研发链路看,这份标准真正影响的是感知、融合、决策、测试、数据平台等每一个环节。 …

阅读更多 →
Unity角色实时特效:基于Mesh的顶点动画与绑定方案 2026/9/2 4:17:58

Unity角色实时特效:基于Mesh的顶点动画与绑定方案

在Unity里做“角色实时特效”,很多人第一反应是Particle System或VFX Graph。等到真做一个角色攻击时的能量爆发、冰冻蔓延、燃烧上身,就会发现粒子很难做到“贴骨贴形”——火焰不从指定皮肤区域起来,冰霜不会沿着角色表面扩散。这种情况下&…

阅读更多 →
SOEM详解:开源EtherCAT主站协议栈从入门到实践 2026/9/2 4:17:58

SOEM详解:开源EtherCAT主站协议栈从入门到实践

简介:SOEM v1.4.0 是一款以 C 语言编写的开源 EtherCAT 主站库,主要面向工业总线开发者、嵌入式工程师以及希望深入理解 EtherCAT 协议实现的学习者。库本身保持轻量,不强制设计架构,可在 Linux 通用用户模式、PREEMPT_RT、Xenoma…

阅读更多 →
写论文这一年,我用顺的工具和踩过的坑都在这了 2026/9/2 4:17:58

写论文这一年,我用顺的工具和踩过的坑都在这了

又到了一年几度被论文支配的季节。 先说个扎心的事实:2026年的毕业论文,早就不是"查重过了就行"的年代了。现在学校那边知网、维普、格子达三套AIGC检测轮着上,很多同学的现状是——重复率降下来了,AIGC率红得像股票涨停…

阅读更多 →
壁挂式桶装水饮水平台机安装指南:冰热双温原理与厨房布局避坑 2026/9/2 4:14:58

壁挂式桶装水饮水平台机安装指南:冰热双温原理与厨房布局避坑

最近在帮朋友规划厨房装修时,注意到一个很现实的矛盾:厨房台面越来越紧张,但家里对“喝热水、喝冷水、随时泡茶冲奶”的需求一点没少。传统的台式饮水机占台面,普通茶吧机管线多、水桶外露,时间一长不仅乱,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞