跳到主要內容

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















留言

張貼留言

這個網誌中的熱門文章

小四軸飛行器:驅動馬達

等待陀螺儀的這段時間馬達先來了,所以我們開始測試馬達驅動系統飛行器的馬達是透過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?

Google play Game Service Unity 教學

Google Play Gmae Servie Unity教學 概念 我們需要由unity產生兩個資訊 1.package name (com.asssdfream.test2) 2.keystore 的SHA1 然後由 ansdrod developer console 產生兩個資訊回填到Unity中 1.資源檔 2.Client ID(客戶ID) 接著建立測試帳戶即可開始測試
詳細作法標題
1.建立Unity 專案 2.下載https://github.com/playgameservices/play-games-plugin-for-unity SDK,並加入套件 3.將專案設定成Android平台 4.為這個專案的APK