11.1. 為什麼使用藍牙¶
網路可讓相機接上 Wi-Fi 或 Ethernet 網路,使其能與該網路所能觸及的任何裝置通訊。可能是走廊另一端的筆記型電腦、另一個大陸上的伺服器,或是在行動網路上漫遊的手機。這種觸及範圍是有前提的:網路必須存在;某個存取點(access point)必須在訊號範圍內;某些憑證必須可用;某台路由器必須願意配發位址給相機。相機還必須讓無線電(或 Ethernet 連接埠)持續運作得夠強,才能維持連線。
藍牙則涵蓋相反的情況——短距離、無基礎設施、低功耗。位於同一房間內的相機與手機透過直接的無線電鏈路交換資料,兩者之間沒有任何中介。沒有存取點、沒有路由器,雙方完全不需要接上任何網路。在短暫的活動爆發之間,無線電大部分時間都處於關閉狀態,因此在 Wi-Fi 下幾乎撐不過一天的電池,在藍牙下可以運作數個月。
11.1.1. 何時藍牙是正確的工具¶
在相機上常見的情況:
手機或平板與相機配對。 附近的使用者在手機上開啟一個應用程式,便能設定相機、讀取其狀態或下載結果——而不必先讓兩個裝置都接上同一個 Wi-Fi 網路。大多數手機原生支援藍牙低功耗(Bluetooth Low Energy),因此使用者的體驗是「開啟應用程式、按下連線」,而不是「先加入這個網路」。
穿戴式裝置或感測器向相機回報資料。 心率帶、溫度計、信標(beacon)、接點開關——這些全都是圍繞藍牙低功耗設計的電池供電裝置。相機以用戶端(client)身分連接、讀取它們的數值,並將資料融入它正在執行的其他工作中。
相機發佈一個小型狀態資訊流。 電池電量、最後偵測到的物件、影格率——只要公開幾個數字,供附近任何想讀取的裝置使用。配對是選用的;對於非敏感資料,相機甚至完全不需要連線,便可直接廣播這些數值。
兩台相機(或一台相機與一個微控制器)在沒有網路的情況下共享資料。 兩端彼此都認識;兩端都在同一棟建築物內;沒有理由讓這些位元組往上跑到雲端、再往下跑回來,才能橫越同一個房間。
11.1.2. 何時改用網路才是正確的工具¶
藍牙的權衡取捨在以下幾種常見情況中並不適合:
超出範圍的對端裝置。 藍牙低功耗的實際範圍是幾公尺,在開放空間中頂多數十公尺。任何橫跨建築物、橫跨城鎮或橫越網際網路的通訊,都需要 Wi-Fi 或 Ethernet。
高頻寬鏈路。 藍牙低功耗的實際傳輸速率為每秒數十至數百千位元。串流影格或任何有意義的視訊都需要 Wi-Fi。
在共享基礎設施上的多對多群組通訊。 一整個房間的裝置全部與同一台伺服器通訊,或一群相機組成網狀網路共享結果——這種模式正是 IP 網路所設計來處理的。
11.1.3. 低功耗,而非傳統藍牙¶
在日常用語中,「藍牙」涵蓋兩種截然不同的無線電堆疊。傳統藍牙(Classic Bluetooth) 是無線耳機、車載音響、鍵盤/滑鼠連線中使用的那一種:一種語音與音訊等級的無線電、一個相對複雜的堆疊,以及明顯的耗電量。藍牙低功耗(Bluetooth Low Energy,BLE) 則是另一種較新的協定,它與傳統藍牙共用品牌名稱與 2.4 GHz 頻段,但其餘部分幾乎毫無共通之處。它圍繞著短暫、不頻繁的無線電爆發而設計,以使平均功耗極小,並圍繞鍵/值資料模型而非串流音訊而建構。
相機上的 MicroPython 僅支援 BLE。傳統藍牙完全不在 API 之中。以下所稱「藍牙」皆指 BLE。
11.1.4. 與網路模型相比有何改變¶
BLE 擁有與網路相同的五層堆疊,但上層的行為方式不同:
沒有「開啟一個 socket 並傳送位元組」這種抽象。BLE 圍繞著一個小型的 鍵/值資料庫 而建構,由一方代管、另一方讀取、寫入或訂閱。相機發佈具名的數值(電池電量、溫度、命令暫存器);對端則讀取或監看這些數值。
沒有依名稱定址這回事。裝置透過 廣告(advertising) 來標識自己——發出一段描述自身身分的簡短廣播;對端則 掃描(scan) 這些廣播並挑選其中一個來連接。
無線電大部分時間處於閒置狀態。兩端在建立連線時協議多久喚醒一次來通訊。在這之間,兩端都會回到睡眠狀態。
正是這三項差異,使得 BLE API 的其餘部分偏離了 socket 模型。