跳到主要內容

使用藍牙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

最近 我有時會問自己為什麼要從Arduino 開始弄非控板,而不去買已經整體弄好的Multiwii 非控板,其實主要是自己組裝出來的樂趣, 學習過程中嘗試透過各種資源與方法解決問題的能力 ,其實MAKER的資源很多,但怎麼應用這些資源裁示值得學習的,凌爸學習東西喜歡直接做,做的過程當中,自然就會了解WHY與HOW,這遠比看書學習的效果高上很多。 零件陸陸續續一包一包來了,發現郵費比零件貴太多~~~~@@,今天先把非控板黏在冰棒棍上,如下 正面   背面 上至下分別是 Arduino Nano,MPU6050(GY521),藍芽模組(4.0),至於固定的方式目前只是用一條雙面膠讓他們黏在上面,因為我還在考慮是否使用藍芽模組4.0還是2.1 ,2.1的好處是ARDUINO的燒錄與調適可以直接透過藍牙,如果是使用4.0就只能飛行與設定,不能燒入Arduino,但是藍牙4.0的優點是iphone 也可以控制,所以目前就先黏上藍牙4.0。 第一步 先讓Arduino 與 GY521通訊起來,這樣的開始就會特別有感覺,由於想要呈現比較高質感的電路圖,發現一套很棒的軟體  http://fritzing.org/home/   fritzing 這一套電路圖軟體居然是OPEN SOURCE的,且畫出來的畫面很棒又簡單,也推薦給妳試試看,其實我蠻害怕畫電路圖的因為PROTEL太龐大了,我又不是本科系的所以電路圖對我來說太恐怖, fritzing玩起來像是玩具一樣,完全消除我心中的恐懼感。真是太感謝了,也學習到快速畫電路圖的技巧。 GY521與ARDUINO的通訊很簡單,透過I2C的連線方式即可,其實我並不太知道I2C是什麼,但是維基百科說( https://zh.wikipedia.org/zh-tw/I%C2%B2C ),他是一種並聯通訊,所以我們ARDUINO上的SCL、SDA,連結到裝置的SCL、SDA之間就可以透過I2C資料傳遞。由圖可以 知道 A5 是SCL A4 是SDA 圖片網址 http://www.pighixxx.com/test/portfolio-items/nano/ 連接圖如下 A5 是SCL A4 是SDA 電源 5V 與接地 然後還有一個INT 我還沒搞懂。先這樣焊接了

小四軸飛行器:驅動馬達

等待陀螺儀 的這段時間馬達先來了,所以我們開始測試馬達驅動系統飛行器的馬達是透過 Arduino 發出 PWM 訊號,傳送給驅動器 ( 小型為 MOS FET ,大型為電調 ) 控制馬達的轉速,達到控制飛行器。為了測試我們的驅動電路,我們先寫一個簡單的 PWM 控制,讓 PWM 輸出值越來越大,到大極限的時候,又慢慢地變小,如果我們的驅動電路可以正常運作時我們應該可以聽到馬達的聲音漸漸地變大,然後漸漸地變小。 測試馬達之前我們先學習 Arduino 的 PWM ,學習的過程當中我參考了下面的網站 http://coopermaa2nd.blogspot.tw/2011/07/6-pwm.html http://coopermaa2nd.blogspot.tw/2011/07/61-pwm-modes-part1.html 感謝 Cooper Maa 。       一開始我們先使用一個 LED 正腳接再 PWM Nano 的 D3 ,然後負腳接到 GND ,接著寫讓 PWM 變大變小的程式 然後又找到如下網站 葉難 :Arduino 練習 : 呼吸燈 http://yehnan.blogspot.tw/2012/02/arduino_16.html 使用網站上的程式碼,我們可以看到燈慢慢亮起來,又慢慢的暗下去, 如果看到這樣的結果代表我們的 PWM 範例程是可以動作。 當呼吸燈完成了,代表我們的程式碼是沒有問題的 ( 如果有問題就是電路的問題 ) ,接下來只要把 LED 腳換成馬達控制腳,就可以測試我們的驅動。 查詢了一下 SI2302 ,由下表可以知道為什麼選用這個 IC ,這張表是在某個賣場抓到的 http://taiwan.tmall.com/item/20689248199.htm? 型號 電流 電壓 標示 極性 封裝 2SK3018 100MA 30V KN N 通道 SOT23 2N70