使用藍牙BLE 讓iphone android 連接樹莓派3 raspberry pi 3

        Raspberry PI 3 終於內建藍牙與網路晶片
這個晶片有點強大,可以同時讓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即可解決。

題外話: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溝通。















留言

張貼留言

這個網誌中的熱門文章

四軸飛行器:飛控板DIY

小四軸飛行器:驅動馬達