前言
Beacon 是具有藍芽連線的小裝置,通常裡面的格式為 Apple 的 iBeacon 或是 Google 的 Eddystone . 一般而言,要開發 Beacon 的話比較好的方式就是架設一個 Raspberry Pi 然後在裡面灌起來相關的藍芽模擬.但是如果你想要在 MacOSX 上面寫 Beacon 模擬程式的話,大部分的人都會使用 Bleno 一套由 nodejs 開發出來的藍芽套件. 支援夠好又熱門.
Golang 是很方便的語言,不論是寫在後端或是系統上來說.當然我也會想說來寫寫一些測試 beacon 範例的. 三年前,我曾經寫了這篇文章 Golang BLE Eddystone 初體驗(包含Beacon模擬器) 的文章.但是事隔三年之後,由於 Mac OSX 的系統更新,整個部分已經無法正常運行,需要做修改.
在 Golang 上面要使用藍牙的相關工具,大部分人都是使用 paypal 所開源的 PayPal/gatt ,但是那個套件兩年沒有維護了.以下會簡單記錄一下出了哪些問題.
tldr: PayPal/gatt 已經沒有在維護這個軟體.. Golang 要寫藍牙請用 https://github.com/go-ble/ble
Mac OSX 改了什麼
首先 Mac 在 High Sierra 上面將藍牙設備名稱改名字(為何要這樣做?) 原本的名字是 com.apple.blued
但是到了 High Sierra 就改成 com.apple.bluetoothd
這樣導致了 PayPal/gatt 的 golang 套件無法順利運行.其實在 nodejs 的套件上面馬上就跟上了這個部分( nodejs bleno fixed )
Paypal/GATT 已經沒有在維護
回過頭來的老問題,這些問題其實不能解決也不難維護.但是 PayPal/gatt 由於沒有在維護了.其實相當的困難繼續開發,而且許多 fork 出來的專案似乎也沒有比較解決大部分的問題.
換 go-ble/ble
換過去整個流程還算簡單, go-ble 提供 Advertisement 跟 iBeaconAdvertisement.方便提供相關的轉換.
參考
- paypal/gatt issue: Examples issue “Go pointer to Go pointer”
- ` GODEBUG=cgocheck=0 ./server`
- currantlabs/ble issue: Not working on macOS High Sierra
Unhandled event: xpc.Dict{"kCBMsgId":4, "kCBMsgArgs":xpc.Dict{"kCBMsgArgState":5}}
- Tracking macOS High Sierra Support