Raspberry PI 3 終於內建藍牙與網路晶片
回到主題,我們再來看Battery 這個專案
main.js 啟動藍牙SERVER(呼叫Bleno 當成ble ProFile)
這個晶片有點強大,可以同時讓Wifi 與 BLE 和 SPP (RF Com) 同時繁忙通訊都沒有問題。
Raspberry PI 如果是當成藍牙Client 連結身邊的BLE裝置,例如ibeancon、智慧手環、智慧手錶,那只要使用簡單hcitool搭配hciconfig 指令就可以達到將資料要回來,在網路關鍵字一下就可以找到如何使用hcitool 連線並要得資料。
手機要與Raspberry PI連線的方法可以透過,wifi 或是藍牙,但是操作上使用藍牙比較直覺與簡易。但是要讓手機連線Raspberry PI,Raspberry PI上就需要將藍牙裝置當成Server,這件事情就需要一些程式碼上的撰寫。
現在的文件說到關於如何將Raspberry PI藍牙裝置當成Server的文章並不太多,開發上總感覺困難重重,我也是在這裡停滯了好多天,不斷的搜尋解決方法,因為通起來了,資料來自網路所以也回饋給網路,讓下一個使用者減少這類問題的負擔。
不過目前這個方法未來開發資源越來越齊備可能不敷使用,但至少現在是可用的備案。
網路上搜尋之後,整體套件如下
藍牙硬體<== BlueZ <== Nodejs(Bleno) <== Node Ble <== Node Socket <==你的程式
我們發現藍牙要動起來通常會倚賴BlueZ的套件,好在的是最新的版作業系統已經將BlueZ提升到5.23,支援BLE了。 所以安裝BlueZ套件這件事情就可以省略。
接著安裝Node環境 ,
http://blog.itist.tw/2016/04/using-raspberry-pi-3-to-build-eddystone-beacons-with-raspbian-jessie.html
於這篇網址提到安裝Node的快速方法,如果隨著時間推移太舊或是失效,在搜尋一下如何安裝Node即可解決。
http://blog.itist.tw/2016/04/using-raspberry-pi-3-to-build-eddystone-beacons-with-raspbian-jessie.html
於這篇網址提到安裝Node的快速方法,如果隨著時間推移太舊或是失效,在搜尋一下如何安裝Node即可解決。
題外話:Linux上開發要有所體悟,所有的架構都是在變動的,隨著版本的變動舊的API可能就會改變或是失效,期待不變與或是統一開發方式都是不太切合實際的想法,畢竟這不是linux的核心價值也不是在這一塊領域玩樂的人的想法,但多數的答案都可以在GOOGLE一下就可以順利解決(苦笑)。
bleno套件安裝,如果安裝好了NODE就可以使用好用的nmp來安裝套件。
npm install bleno
這一行指令即可安裝 bleno
安裝好了套件之後,因為手機上還沒有自己撰寫的程式,所以建議先於iphone上安裝 LightBlue 這套軟體,這套軟體可以連結所有Ble 裝置,並且列出所有 Device 與Service 與 Characteristic , 並且幫助你簡單的寫入與讀取數值。
接個我們先到
Le IoT 想想物聯網
觀看文章寫到,他也是用一個簡單的範例修改的,
那我們先下載這個範例,先不做修改,直接執行,然後打開iphone 上的 LughtBlue 發現可以連線到Raspberry ,真是開心,信心大增。
接著開始修改,這個專案,但是我們發現我們對於藍牙的基礎知識不足,不知道如何修改起。
我先簡單介紹一下藍牙BLE的通訊架構
圖片來自
這裡我們看到BLE裝置他的階層概念,在一個PROFILE下可以有多個SERVICE,一個SERVICE下面 有多個CHARATERISTIC,
什麼是PROFILE ,藍牙裝置可以使用多種通訊方式,例如與鍵盤滑鼠連線方式叫做HID,模擬成串列阜(Rf com) 叫做SPP, HID 與 SPP 就是藍牙的PROFILE 那BLE也是藍牙下的一種方式所以 我們現在使用的是BLE PROFILE。
題外話說一下 關於手機 (CLIENT)的連線流程
尋找身邊的藍牙=>列出所有藍牙=>連線到裝置=>列出所有Service=>連線到Service=> 列出所有CHARATERISTIC==>指定CHARATERISTIC==>開始通訊
例如
IPHONE的開發流程就如下
CBCentralManager ==>Peripherals ==> Service==>Characteristics
例如
Android 的開發流程如下
BluetoothManager.Adapter ==> BluetoothDevice(Gatt) ==> BluetoothGattService==> Characteristic
回到主題,我們再來看Battery 這個專案
main.js 啟動藍牙SERVER(呼叫Bleno 當成ble ProFile)
battery-service.js Service 寫在這裡
battery-level-characteristic.js characteristic寫在這裡
如果有兩個servie 就會有兩個service 檔案
如果有兩個characteristic 就寫兩個 characteristic
以檔案的方式分開架構非常容易懂
Bleno真是一個很棒的架構讚嘆!!
我們可以看到service 都是使用UUID 來當成編號
characteristic 也是使用 UUID 來當成編號
characteristic 看到
properties: ['read','Write' ]
每一個characteristic 都可以簡單的分成幾種通訊,也可以混合,分成[read] [Write] [writeWithoutResponse] [notify]
read 簡單來說就是被動的被要資料,這裡就是手機讀取樹莓派上的資料。當Client需要資料的時候發出要求,SERVER回應資料。
Write 就是由Clinet端傳送資料過來,這裡就是手機傳送訊息過來,如果你需要讓手機發送訊息過來,就需要加入通訊事件。與writeWithoutResponse 不同的是,使用Write ,會立刻主動呼叫read。
writeWithoutResponse,與Write 相同意義,但是射後不理(大誤), 傳送完之後不會觸發read。
通常如果你很確信,資料已經是備妥的,資料來了之後可以立刻返回資料給予使用者,就可以寫Write ,如果資料來了需要一段時間的運算或是處理,那就不適合Write 。這時候就需要notify。
notify 就是由Server主動發訊息給Client, 這裡就是樹莓派發送訊號給手機,但是使用之前Client(手機)需要開啟notify ,才可以由Server傳送訊息給予Clinet, 如上述如果傳送來的資料需要經過一段時間的運算,那就使用writeWithoutResponse,搭配notify 來將資料傳送回手機。
這個範例裡的程式碼示範了所有寫法,剪剪貼貼即可使用
https://github.com/sandeepmistry/bleno/blob/master/test.js#L63
最後一個步驟使用node開啟Socket server,讓其他程式語言可以透過Socket 來連線自己的BLE:
http://www.hacksparrow.com/tcp-socket-programming-in-node-js.html
這個網址上的程式碼非常好用,也感嘆NODE 的威力強大。
將這個TCP Server的程式碼貼於 characteristic.js 上就可以透過其他程式開Socket 與 Ble溝通。
battery-level-characteristic.js characteristic寫在這裡
如果有兩個servie 就會有兩個service 檔案
如果有兩個characteristic 就寫兩個 characteristic
以檔案的方式分開架構非常容易懂
Bleno真是一個很棒的架構讚嘆!!
我們可以看到service 都是使用UUID 來當成編號
characteristic 也是使用 UUID 來當成編號
characteristic 看到
properties: ['read','Write' ]
每一個characteristic 都可以簡單的分成幾種通訊,也可以混合,分成[read] [Write] [writeWithoutResponse] [notify]
read 簡單來說就是被動的被要資料,這裡就是手機讀取樹莓派上的資料。當Client需要資料的時候發出要求,SERVER回應資料。
Write 就是由Clinet端傳送資料過來,這裡就是手機傳送訊息過來,如果你需要讓手機發送訊息過來,就需要加入通訊事件。與writeWithoutResponse 不同的是,使用Write ,會立刻主動呼叫read。
writeWithoutResponse,與Write 相同意義,但是射後不理(大誤), 傳送完之後不會觸發read。
通常如果你很確信,資料已經是備妥的,資料來了之後可以立刻返回資料給予使用者,就可以寫Write ,如果資料來了需要一段時間的運算或是處理,那就不適合Write 。這時候就需要notify。
notify 就是由Server主動發訊息給Client, 這裡就是樹莓派發送訊號給手機,但是使用之前Client(手機)需要開啟notify ,才可以由Server傳送訊息給予Clinet, 如上述如果傳送來的資料需要經過一段時間的運算,那就使用writeWithoutResponse,搭配notify 來將資料傳送回手機。
這個範例裡的程式碼示範了所有寫法,剪剪貼貼即可使用
https://github.com/sandeepmistry/bleno/blob/master/test.js#L63
最後一個步驟使用node開啟Socket server,讓其他程式語言可以透過Socket 來連線自己的BLE:
http://www.hacksparrow.com/tcp-socket-programming-in-node-js.html
這個網址上的程式碼非常好用,也感嘆NODE 的威力強大。
將這個TCP Server的程式碼貼於 characteristic.js 上就可以透過其他程式開Socket 與 Ble溝通。
怎會在手機,跳出留言畫面?
回覆刪除