
這次我們來看一個很有意思的技術實現用藍牙信號結合 Claude 來幫你找回手機。這聽起來像是一個智能家居或物聯網的實用功能但背后其實是一套本地部署的藍牙信號監測與智能推理系統。它不依賴云端服務核心是利用你電腦或樹莓派上的藍牙模塊實時掃描周圍的藍牙設備信號強度再通過 Claude 的本地推理能力分析信號變化趨勢從而判斷你的手機大概在哪個方向或距離范圍內。這個項目的重點不是概念多復雜而是它能不能在你現有的硬件上跑起來以及實際定位的準確度如何。對于經常把手機隨手一放就找不到的朋友或者想在辦公室、家里搭建一個低成本室內定位原型的人來說值得一試。本文會帶你從零開始完成環境搭建、服務部署、功能測試到效果驗證的全過程重點關注藍牙信號采集的穩定性、Claude 本地推理的準確性以及整個系統的資源占用情況。1. 核心能力速覽在動手之前我們先快速了解這個項目的核心能力和門檻判斷它是否適合你。能力項說明核心功能通過持續監測手機藍牙信號強度RSSI結合歷史數據分析推測手機的大致方位或距離變化趨勢。技術棧藍牙掃描如bluepy,pybluez Claude 本地推理或 Claude API 數據可視化/邏輯判斷。硬件門檻必備一臺帶有藍牙適配器的電腦Windows/macOS/Linux或樹莓派等開發板。推薦支持藍牙 4.0 及以上信號接收更穩定。顯存/內存占用主要取決于 Claude 的運行方式。若使用 Claude 的輕量級本地版本或僅調用其分析邏輯內存占用可能僅數百MB若運行完整大模型則需按模型實際需求。本項目核心是藍牙信號處理對 GPU 無硬性要求。啟動方式通常為 Python 腳本命令行啟動可配置為后臺服務或定時任務。是否支持 API是??梢苑庋b藍牙掃描和推理邏輯為 REST API供其他應用如智能家居中控調用。是否支持“一鍵啟動”取決于項目封裝程度。成熟的實現可能提供 Docker 鏡像或批處理腳本實現一鍵啟動。適合場景1. 家庭/辦公室室內粗略定位原型。2. 物聯網設備追蹤演示。3. 學習藍牙信號處理與AI結合的應用開發。不適合場景1. 需要厘米級精確定位。2. 復雜多房間、多障礙物環境。3. 對實時性要求極高的安防場景。2. 適用場景與使用邊界2.1 誰適合使用這個方案極客與開發者希望學習或實踐物聯網IoT、藍牙信號處理、以及如何將傳感器數據與AI推理結合的用戶。智能家居愛好者想搭建一個低成本、本地的“手機查找器”集成到現有的Home Assistant等系統中。原型驗證者需要驗證基于信號強度的室內定位IPS概念但不想投入專業UWB或Wi-Fi定位硬件。2.2 它能解決什么問題靜態尋找當手機在房間內靜置時通過多點掃描如果部署了多個藍牙接收點或單點信號強度歷史對比縮小搜索范圍。動態追蹤趨勢如果手機在移動例如被帶走系統可以通過信號強度的快速變化判斷手機是正在遠離還是靠近接收器。自動化觸發與智能家居聯動例如當系統判斷手機離開家一定距離后自動執行關燈、鎖門等操作。2.3 重要使用邊界與提醒精度有限藍牙 RSSI 信號易受墻體、人體、其他電子設備干擾定位結果是一個大致方向或距離區間并非精確坐標。結果僅供參考不能替代手機自帶的“查找我的設備”等GPS/網絡定位功能。隱私與授權掃描周圍藍牙設備會獲取設備的 MAC 地址和名稱。請僅在自己擁有所有權或已獲得明確授權的環境和設備上使用。切勿在公共場合掃描他人設備這可能涉及隱私侵權。環境依賴空曠環境效果較好。鋼筋混凝土墻體、金屬柜子會嚴重衰減和反射信號影響判斷。合法合規本項目技術用于學習與合法范圍內的設備管理。禁止用于非法跟蹤、監視等侵犯他人權益的行為。3. 環境準備與前置條件開始部署前請確保你的環境滿足以下要求。3.1 硬件與操作系統主機一臺 Windows 10/11 macOS 或 Linux如 Ubuntu 20.04的電腦。樹莓派 3B/4B 等帶有藍牙的開發板也可。藍牙適配器確保電腦內置或外接的藍牙適配器已啟用且驅動正常。在Linux下可使用hciconfig或bluetoothctl命令檢查。3.2 軟件與依賴Python推薦 Python 3.8 - 3.11。這是大多數藍牙庫和AI框架兼容性較好的版本。包管理工具pip已更新至最新版。藍牙開發庫Linux: 通常需要安裝bluez和相關開發包。sudo apt update sudo apt install bluez bluez-tools libbluetooth-devWindows/macOS: 系統通常已集成Python庫會調用系統API。Claude 運行環境這是關鍵。根據你選擇的 Claude 集成方式準備方式AClaude API你需要一個可用的 Claude API Key。這種方式最輕量你的本地代碼只需發送 HTTP 請求。方式B本地輕量模型如果你使用某些開源項目封裝的、能執行簡單邏輯推理的 Claude 兼容模型或代碼則需要準備相應的模型文件和環境如 Ollama。方式C完整本地部署如果需要 Claude 進行復雜的上下文推理可能需要部署其桌面版或 Code 版本這會對系統資源有更高要求。請參考 Claude Desktop 或 Claude Code 的官方文檔進行安裝。4. 安裝部署與啟動方式我們以一個典型的項目結構為例假設項目包含藍牙掃描、數據預處理、Claude 推理和結果輸出四個模塊。4.1 克隆或創建項目首先創建一個項目目錄并初始化虛擬環境推薦。mkdir bluetooth_phone_finder cd bluetooth_phone_finder python -m venv venv # Windows venv\Scripts\activate # Linux/macOS source venv/bin/activate4.2 安裝 Python 依賴安裝核心的藍牙操作庫和網絡請求庫。這里以bleak一個跨平臺的藍牙庫為例。pip install bleak requests pandas numpy # 如果需要圖形化界面或圖表可以添加 # pip install matplotlib dash注意bleak在 Windows 上依賴.NET如果遇到問題請確保已安裝相應運行時。4.3 項目核心腳本結構創建一個主腳本例如phone_finder.py其核心邏輯框架如下import asyncio from bleak import BleakScanner import requests import json import time from collections import deque import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) class BluetoothPhoneFinder: def __init__(self, target_device_nameMyPhone, claude_api_keyNone, api_basehttps://api.anthropic.com/v1/messages): self.target_name target_device_name self.claude_api_key claude_api_key self.api_base api_base self.signal_history deque(maxlen20) # 保存最近20次信號強度 self.last_known_rssi None async def scan_bluetooth(self): 掃描藍牙設備查找目標手機 devices await BleakScanner.discover(timeout5.0, return_advTrue) for device, adv_data in devices.values(): if device.name and self.target_name in device.name: rssi adv_data.rssi self.signal_history.append((time.time(), rssi)) logger.info(fFound {device.name}, RSSI: {rssi} dBm, Address: {device.address}) return rssi, device.address logger.warning(fTarget device {self.target_name} not found in this scan.) return None, None def analyze_signal_trend(self): 分析信號歷史趨勢簡單示例 if len(self.signal_history) 3: return Insufficient data # 簡單計算最近幾次信號的平均值和變化 recent_rssi [rssi for (_, rssi) in list(self.signal_history)[-3:]] avg_rssi sum(recent_rssi) / len(recent_rssi) trend stable if len(recent_rssi) 2: if recent_rssi[-1] recent_rssi[-2] 5: trend getting stronger (可能正在靠近) elif recent_rssi[-1] recent_rssi[-2] - 5: trend getting weaker (可能正在遠離) return fAvg RSSI: {avg_rssi:.1f} dBm, Trend: {trend} def ask_claude_for_location_hint(self, rssi, trend_analysis): 調用 Claude API根據信號信息獲取位置提示 if not self.claude_api_key: logger.error(Claude API Key is not set.) return API Key missing prompt f 你是一個室內定位助手。我通過藍牙掃描到了一個設備。 當前信號強度(RSSI)是: {rssi} dBm。 歷史信號變化趨勢是: {trend_analysis}。 請根據常見的藍牙信號強度與距離關系例如-30 dBm 非常近-70 dBm 在同一個房間-90 dBm 隔墻或較遠給出一個通俗易懂的提示告訴我這個設備可能在哪。例如“信號很強設備很可能就在電腦附近幾米內”或者“信號較弱且在減弱設備可能正在向門口移動”。 請只輸出判斷結果和建議不要輸出分析過程。 headers { x-api-key: self.claude_api_key, anthropic-version: 2023-06-01, content-type: application/json } data { model: claude-3-haiku-20240307, # 使用輕量且低成本的模型 max_tokens: 100, messages: [{role: user, content: prompt}] } try: response requests.post(self.api_base, headersheaders, jsondata, timeout30) response.raise_for_status() result response.json() return result.get(content, [{}])[0].get(text, No response text) except Exception as e: logger.error(fError calling Claude API: {e}) return fAPI Error: {e} async def run(self, interval10): 主循環定期掃描并分析 logger.info(fStarting Bluetooth Phone Finder for device: {self.target_name}) while True: rssi, addr await self.scan_bluetooth() if rssi is not None: trend self.analyze_signal_trend() logger.info(fSignal Analysis: {trend}) # 只有當信號發生較大變化或定期需要時才詢問Claude if self.last_known_rssi is None or abs(rssi - self.last_known_rssi) 8: hint self.ask_claude_for_location_hint(rssi, trend) logger.info(fClaude Location Hint: {hint}) self.last_known_rssi rssi await asyncio.sleep(interval) if __name__ __main__: # 請在此處填入你的 Claude API Key 和目標手機藍牙名稱 FINDER BluetoothPhoneFinder( target_device_nameYourPhoneBluetoothName, # 例如 iPhone, Xiaomi 13 claude_api_keyyour_claude_api_key_here # 從 Anthropic 控制臺獲取 ) asyncio.run(FINDER.run(interval15)) # 每15秒掃描一次4.4 啟動服務保存腳本后在項目目錄下運行python phone_finder.py如果一切正常你將看到類似以下的日志輸出開始周期性掃描INFO:__main__:Starting Bluetooth Phone Finder for device: YourPhoneBluetoothName INFO:__main__:Found iPhone, RSSI: -45 dBm, Address: AA:BB:CC:DD:EE:FF INFO:__main__:Signal Analysis: Avg RSSI: -47.3 dBm, Trend: stable INFO:__main__:Claude Location Hint: 信號強度很好設備應該就在這個房間內距離藍牙接收器非常近可能在桌上或口袋里。5. 功能測試與效果驗證部署完成后需要通過一系列測試來驗證系統的穩定性和準確性。5.1 基礎藍牙掃描測試測試目的確認腳本能正確發現你的手機。操作步驟確保手機藍牙已打開并處于可被發現狀態通常以本機名稱廣播。在腳本中正確填寫你的手機藍牙名稱。運行腳本。預期結果日志中能穩定、周期性地打印出你手機的設備名稱、MAC地址和 RSSI 值。判斷成功連續多個掃描周期都能發現設備且 RSSI 值在合理范圍內波動例如 -35 到 -90 dBm。常見失敗原因手機藍牙未打開或處于隱藏模式。腳本中填寫的設備名稱不匹配注意大小寫和空格。系統藍牙權限未授予給 Python 程序常見于 macOS 和 Linux。5.2 信號趨勢分析測試測試目的驗證本地趨勢分析邏輯是否靈敏。操作步驟讓手機靜止放在電腦旁運行腳本幾分鐘觀察Signal Analysis日志趨勢應為stable。手持手機緩慢從電腦旁走開觀察趨勢是否變為getting weaker。再走回電腦旁觀察趨勢是否變為getting stronger。預期結果趨勢分析能基本反映你的移動方向。判斷成功信號變化與你的物理移動方向有直觀對應關系。常見失敗原因信號波動太大導致簡單閾值判斷不準。可以嘗試調整analyze_signal_trend方法中的閾值代碼中的5dBm或增加歷史數據長度。5.3 Claude 推理提示測試測試目的驗證 Claude API 調用成功且返回的提示信息合理。操作步驟確保claude_api_key正確。執行移動測試如 5.2觸發 Claude 調用當 RSSI 變化超過閾值時。預期結果日志中打印出Claude Location Hint內容是一句關于設備可能位置的自然語言描述。判斷成功API 調用返回 HTTP 200且返回的文本是連貫的、與當前信號情況相關的提示。常見失敗原因API Key 無效或過期。網絡問題導致請求超時。Claude 服務端暫時錯誤。5.4 長時穩定性與資源占用測試測試目的觀察系統長時間運行的穩定性和資源消耗。操作步驟讓腳本持續運行 1-2 小時。觀察指標內存占用通過系統任務管理器或htop查看 Python 進程的內存使用通常應在 100MB 以內。CPU 占用掃描間隔如15秒內 CPU 使用率應有短暫峰值其余時間應很低。藍牙穩定性是否會出現掃描失敗、藍牙適配器斷開等情況。日志完整性有無異常報錯堆積。判斷成功資源占用平穩無內存泄漏藍牙掃描持續正常。6. 接口 API 與批量任務封裝將核心功能封裝成 API 服務可以更方便地與其他系統集成或進行批量設備管理。6.1 使用 Flask 創建 REST API 服務創建一個api_server.py文件from flask import Flask, request, jsonify import asyncio from phone_finder import BluetoothPhoneFinder # 導入之前寫的類 import threading import logging app Flask(__name__) finder_instance None finder_lock threading.Lock() def get_finder(): global finder_instance with finder_lock: if finder_instance is None: # 初始化這里可以從配置或環境變量讀取參數 finder_instance BluetoothPhoneFinder( target_device_nameapp.config.get(TARGET_DEVICE, iPhone), claude_api_keyapp.config.get(CLAUDE_API_KEY) ) # 在后臺啟動掃描循環 loop asyncio.new_event_loop() asyncio.set_event_loop(loop) threading.Thread(targetlambda: loop.run_until_complete(finder_instance.run(interval20)), daemonTrue).start() return finder_instance app.route(/api/scan, methods[GET]) def scan_once(): 執行一次掃描并立即返回結果 try: finder get_finder() # 注意這里簡化了實際需要處理異步調用。更嚴謹的做法是用 asyncio.run 在單獨線程中執行單次掃描。 # 為演示我們直接返回最近一次的歷史數據。 if finder.signal_history: last_time, last_rssi finder.signal_history[-1] trend finder.analyze_signal_trend() hint 觸發Claude提示需信號變化較大 return jsonify({ status: success, device_found: True, last_rssi: last_rssi, last_seen: last_time, trend_analysis: trend, location_hint: hint }) else: return jsonify({status: success, device_found: False, message: No recent scan data.}) except Exception as e: return jsonify({status: error, message: str(e)}), 500 app.route(/api/status, methods[GET]) def get_system_status(): 獲取系統狀態如歷史數據點數量 finder get_finder() return jsonify({ history_count: len(finder.signal_history), target_device: finder.target_name, is_scanning_running: True }) if __name__ __main__: app.config[TARGET_DEVICE] YourPhoneBluetoothName app.config[CLAUDE_API_KEY] your_key_here # 生產環境應從環境變量讀取 app.run(host127.0.0.1, port5000, debugFalse)6.2 啟動 API 服務并測試python api_server.py服務啟動后使用curl或瀏覽器測試接口curl http://127.0.0.1:5000/api/status curl http://127.0.0.1:5000/api/scan6.3 批量任務與多設備支持如果你有多個藍牙接收點如多個樹莓派可以擴展架構邊緣掃描節點每個節點運行精簡版的掃描程序只負責采集 RSSI 數據并通過 MQTT 或 HTTP 上報到中央服務器。中央處理服務器接收所有節點的數據進行數據融合如三角定位初步計算并調用 Claude API 進行綜合推理。任務隊列使用CeleryRedis管理掃描和推理任務實現異步處理和調度。7. 資源占用與性能觀察本項目的性能瓶頸主要在藍牙掃描和網絡請求如果使用云端 Claude API。藍牙掃描單次掃描耗時約 2-5 秒期間藍牙適配器處于活躍狀態會輕微增加功耗。掃描間隔不宜過短建議≥10秒以免影響適配器壽命和系統功耗。內存與CPU核心 Python 進程內存占用通常小于 150 MB。CPU 占用呈周期性峰值掃描時平均利用率很低。網絡 I/O如果使用 Claude API每次調用會產生一次網絡請求延遲在幾百毫秒到數秒不等取決于網絡狀況和 Claude 服務負載。這是主要的延遲來源。優化建議降低 Claude 調用頻率僅在信號強度發生顯著變化或用戶主動查詢時調用 API。本地緩存與濾波對 RSSI 值進行滑動平均濾波減少噪聲使趨勢判斷更穩定。使用輕量模型調用 Claude API 時選擇claude-3-haiku這類響應快、成本低的模型。8. 常見問題與排查方法部署和運行過程中你可能會遇到以下問題。問題現象可能原因排查方式解決方案啟動腳本報錯ModuleNotFoundError: No module named bleakPython 依賴未安裝或虛擬環境未激活。檢查當前終端是否在虛擬環境中 (which python或where python)。激活虛擬環境后重新安裝依賴pip install bleak。掃描不到任何藍牙設備1. 系統藍牙未開啟或硬件故障。2. 操作系統權限不足。3.bleak庫與系統藍牙服務不兼容。1. 檢查系統藍牙開關。2. 嘗試用系統自帶工具掃描如bluetoothctl。3. 查看腳本日志或捕獲異常。1. 開啟藍牙并確保適配器可用。2. Linux/macOS 可能需要將用戶加入bluetooth組或授予隱私權限。3. 嘗試其他藍牙庫如pybluezLinux。能掃描到設備但找不到目標手機1. 手機藍牙名稱不匹配。2. 手機藍牙未處于“可被發現”模式部分手機連接后即隱藏。1. 核對手機藍牙設置中的準確名稱。2. 嘗試掃描所有設備并打印名稱列表。1. 修改腳本中的target_device_name。2. 改為通過設備的固定 MAC 地址進行過濾需提前獲取。Claude API 調用返回 401 或 403 錯誤API Key 無效、過期或沒有調用對應模型的權限。檢查 Anthropic 控制臺確認 Key 狀態和可用額度。更換有效的 API Key并確認模型名稱正確。API 調用超時網絡連接不穩定或 Claude 服務器響應慢。增加requests.post的timeout參數值。實現重試機制并考慮在超時后使用本地緩存邏輯提供降級服務。信號強度 (RSSI) 跳動劇烈藍牙信號受多徑效應、環境干擾影響大。觀察在靜止狀態下 RSSI 的波動范圍。在代碼中增加濾波算法如卡爾曼濾波、移動平均使用歷史數據平滑當前值。趨勢判斷不準代碼中的閾值 (5 dBm) 不適合當前環境。在靜止和移動狀態下記錄 RSSI 的正常波動范圍和變化幅度。根據實測數據調整趨勢判斷的閾值或采用更復雜的算法如線性擬合斜率。9. 最佳實踐與使用建議為了讓項目運行更穩定、更實用遵循以下建議環境校準在部署的固定位置先將手機放在幾個已知位置如桌上、門口、隔壁房間記錄下大致的 RSSI 范圍建立簡單的“信號-距離”映射表用于輔助判斷。安全第一API Key 等敏感信息務必通過環境變量或配置文件讀取不要硬編碼在腳本中。對于公開的 API 服務端點要設置訪問認證或限制訪問 IP。日志與監控為腳本添加詳細的日志記錄如logging模塊記錄每次掃描結果、API 調用和錯誤信息。這便于后期排查問題和優化參數。優雅退出在長時間運行的服務中捕獲KeyboardInterrupt等信號實現資源的清理和狀態的保存。與現有系統集成可以將本服務作為 Home Assistant 的一個自定義集成或者通過其 Webhook 功能實現“手機離家自動關空調”等場景。明確邊界管理預期始終牢記這是一個精度有限的輔助工具??梢詫⑵涮崾菊Z設為“手機可能在東側房間”而不是“手機在書桌第二個抽屜里”。10. 總結與下一步這個“用藍牙信號幫用戶找回手機”的項目其價值在于提供了一個低成本的、本地的、可高度定制的技術原型。它巧妙地將常見的藍牙掃描能力與 AI 的語言推理能力結合把枯燥的 dBm 數值轉換成了更人性化的方位提示。最值得嘗試的點在于你可以用很少的代碼和硬件成本快速驗證一個物聯網感知AI決策的想法。最先應該驗證的功能就是基礎藍牙掃描和信號趨勢分析這是整個項目的基石。最容易踩的坑是環境配置藍牙權限和信號穩定性。建議先從最簡單的腳本開始確保能穩定掃描到設備信號再逐步加入 Claude 的推理邏輯。后續可以探索的方向有很多比如部署多個掃描節點進行粗略三角定位結合 Wi-Fi 信號強度做多源融合或者將推理邏輯從云端 Claude API 替換為完全本地的輕量級機器學習模型如訓練一個簡單的 RSSI-距離分類器實現完全離線的運行。建議收藏本文的代碼框架和排查清單當你需要搭建一個類似的藍牙感知應用時可以直接在此基礎上進行擴展。