BLE:連結物聯網與智慧裝置最重要的橋樑

評論
評論

於 2015 年 1 月 12 日由 Adrian Stevens 提交。

簡介

藍芽 LE (BLE) 通訊因具有低成本和低能耗等優勢,被越來越多用於商用產品和娛樂領域的應用。 如果希望實現 Android 手機或平板電腦與 Intel® Edison 或 Intel® Galileo 專案之間的通信,藍芽* LE (BLE) 無疑是最佳選擇。

本文主要為您介紹如何使用免費的軟體工具和低成本、即時可用的硬體編寫程式碼和連接硬體,以建立 Intel Edison 與配備藍芽 4.0 的 Android 裝置之間的 BLE 通訊。

什麼是 BLE?

藍芽低能耗 (BLE),藍芽 LE,或 BLE(也稱智慧型藍芽)是一種無線個人網域技術,由藍芽 Special Interest Group 設計與市場推廣。它主要針對健康醫療、健身、安全、自動化和家庭娛樂等領域的應用。

藍芽 LE 最初由諾基亞於 2006 年推出,當時稱為 Wibree。2010 年,通過藍芽版本 4.0,藍芽 LE 加入了藍芽標準當中。

相比于標準藍芽連接, BLE 可顯著降低裝置的能耗,同時提供常規藍芽的大部分連線性以及約一半的連接範圍(大約 15 米/50 英尺)。安裝電池的裝置如果使用藍芽 LE,可在不充電或更換電池的情況下使用數年。比如,Estimote 所推出的 Beacon 裝置宣稱,其電池壽命可長達三 (3) 年 (www.estimote.com)。

硬體

儘管我們的專注點在於 Intel Edison,但本篇文章的大部分內容也適用於英特爾 Galileo。就 IoT 項目而言,我們使用的感應器和控制來自於 Seeed Studio 的 Grove 系統。具體來說,我們將使用:
• 帶有 Arduino breakout 主機板的 Intel Galileo。
• Seeed Grove – Starter Kit Plus Intel® IoT Edition For Galileo GEN 2。
• Seeed Grove BLE。
• 執行 Android 4.3 或更新版本的 Androi 裝置(我使用的是 Lenovo TAB S8-50)
• 以 PC 來執行 Windows* 7 或 8(我使用的是 Dell XPS12)

關於硬體的幾點說明如下:

  1. Grove Starter Kit 主要針對 Intel Galileo 而設計,但它同時也適用於 Edison。您還可以單獨購買 Grove 元件,但工具套件更加經濟實惠。
  2. 在開發過程中我使用的是 Lenovo Android 平板電腦,但其他執行 Android 4.3 並支援藍芽 4.0 的 Android 裝置也均可行。
  3. 我使用 Dell XPS12 為 Intel Edison 和 Android 項目(以及本文)編寫程式碼。採用 Mac 或 Linux 系統也可進行開發。

軟體

我使用下列幾款免費的軟體工具。如欲查看本範例,您應根據需要下載並安裝下列軟體工具:

Arduino IDE for Intel® Edison

Android Studio

Android SDK

Windows、Mac 和 Linux 系統均可提供上述軟體,不過我將特別介紹在 Windows 系統的安裝。

更進一步瞭解相關硬體

Intel® Edison

Intel® Edison 是低成本、通用型計算平臺系列的首款硬體。經過專門設計,它有助於快速、輕鬆地建立 IoT 專案的原型,同時還可提供商業化的產品路徑。

Intel®Edison 使用 22 奈米 Intel®SoC,包含執行速度高達 500MHz 的雙核 Intel® Atom™ 處理器。 它支援 40 個 GPIO,並包含 1GB LPDDR3 RAM、4 GB EMMC 資料存儲,以及雙頻 Wi-Fi*和藍芽功能。

就內部系統而言,Edison 能執行完整的 Linux 內核系統。為了能發揮 Edison 的最佳性能,您可能希望編寫硬體等級的 Linux 程式碼。

但 Edison Linux 還以 Linux 程式的形式包含 Arduino 的應用。簡單來說,這意味著您可以編寫熟悉的 Arduino 草稿碼,並在 Edison 主機板上執行這些的草稿碼。 這就是我們下面將要進行的操作步驟。

學習關於 Intel Edison 相關資料,可參照以下網頁:

http://www.intel.com/content/www/us/en/do-it-yourself/edison.html

Arduino Breakout 主機板

Intel Galileo 的 Arduino breakout 主機板主要有兩種用途。 第一,它提供更大的原型構建平臺,以容易存取 IO 針腳的相關資訊。第二,它提供可相容 Arduino 的硬體平臺,這表示我們能夠同時使用標準的 Arduino 遮罩器和 Intel Edison(與 Intel Galileo 的用法類似)。圖 1 為安裝於 Arduino breakout 主機板的 Edison。

Grove Starter Kit Plus

該工具套件的全名為「Grove Starter Kit Plus -- Intel® IoT Edition for Intel® Galileo Gen 2 Developer Kit」,最初針對 Intel Galileo 第二代主機板而設計。幸運的是,它透過 Arduino breakout 主機板可完全相容 Intel Edison。

該工具套件(如圖 2 所示)主要在借由感應器、制動器和遮罩器來簡化執行過程和原型的建立。它包含一個可相容 Arduino 的遮罩器以及四個標準化針腳連接器。這些連接器可供應給連接傳輸線的 IO 連接端,其中的傳輸線也可輕易連接套件內的感測器和控制器。這表示您可輕易建力專案,無需受到電線連接的阻礙,也無需擔心極性接錯的問題。

學習或購買有關於工具套件的相關訊息,可參照以下網頁:

http://www.seeedstudio.com/depot/Grove-starter-kit-plus-Intel-IoT-Edition-for-Intel-Galileo-Gen-2-p-1978.html

Grove 工具套件的生產商 Seeed Studios 在網頁線上提供許多有用資源。

我建議可從以下網頁連結複製或下載關於 Sketchbook Starter repo:
http://Github.com/Seeed-Studio/Sketchbook_Starter_Kit_V2.0

並能將 Grove Wiki 頁面設定為儲存書籤:
http://www.seeedstudio.com/wiki/index.php?title=Main_Page#Grove

圖二為 Grove Starter Kit Plus -- Intel® IoT Edition for Intel® Galileo Gen 2 Developer Kit

Grove BLE V1

我們將使用 Grove 藍芽低能耗 v1 模組,該模組不包含在入門工具套件中,但可透過 Grove 遮罩器和連接器傳輸線相容角針。 它還是一種成本相對較低的 BLE 附件,在本文所提到的裝置當中,它的成本最低。

Grove BLE v1 是依照准德州儀器的 工業標準 CC2540 來開發。許多其他設備均使用這種晶片。如果您有其他的 TI CC2540 BLE 模組,如 RedBear BLE Mini ,您可以輕易的修改示例的程式碼。

學習關於 Grove BLE v1 可參照以下網頁連結:
http://www.seeedstudio.com/wiki/index.php?title=Grove_BLE_v1&uselang=en

請注意, Intel® Edison 確實包含支援 Wi-Fi 和 藍芽 4.0/BLE 的內建無線模組,但 Grove BLE 模組可大大簡化軟硬體的設置。使用 Grove BLE(圖 3)表示這些項目可輕輕易的與 Intel Edison 搭配。

偵錯 Android 裝置

已添加 BLE 支援至 Android 4.3(API 等級:18)。 您需要執行 4.3 或更新版本的裝置來透過 BLE 進行通訊。

學習更多關於 Android BLE 參照以下網頁連結:
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html

如果之前沒有 Android 開發經驗,您需要在手機或平板電腦上啟用開發人員選項,然後將其用於執行和偵錯您的軟體。開啟應用程式設置,將視窗拉至底部,選擇 “About device”,然後點擊建立編號七次,即可將開發人員選項解鎖。

現在,設置下方應顯示 Developer Options,請務必確認為「USB debugging」。

學習更多關於 Android 開發人員選項參照以下網頁連結:

安裝軟體並開始編寫程式碼

Intel® Galileo 的 Arduino IDE

您需要下載符合 Arduino IDE 的版本,以將 Sketches 佈署至 Intel Edison 或 Galileo。本文撰寫之時的版本為 1.5.3,可參照以下網頁連結:
https://software.intel.com/en-us/get-started-arduino-install

Intel® Edison 驅動程式

您還需要從上述連結下載和安裝 Intel Edison 驅動程式。它位元於「Driver Software」下方頁面的最後一個連結。本文撰寫之時的版本為 1.0.0。

如需其他說明,下列連結提供了有用的入門指南:
https://oftware.intel.com/iot/getting-started

Android Studio

Android Studio 是一款 Android 開發的全新 Java IDE,基於 IntelliJ IDEA  (https://www.jetbrains.com/idea/)。 儘管目前還只是測試版,但它性能穩定且功能完備。如果您習慣使用 Eclipse 或 IntellliJ IDEA 來做 Java Android 開發,那您應該可以輕易理解下列關於兩者程式的用法。

Android Studio 可透過 Android SDK 來大幅簡化安裝流程。只需下載、解壓縮檔,然後在 bin 資料夾中執行 studio.exe 即可。

學習更多關於 Android Studio 可參照以下網頁連結:
https://developer.android.com/sdk/installing/studio.html

Android SDK

您可能需要下載其他 SDK 軟體套件。為此,請在 Android Studio 的工具列中點選「SDK Manager」。 關於 Android SDK 設定,我們在此不做介紹, 如需瞭解更多詳情請參考以下列連接:
https://developer.android.com/sdk/installing/adding-packages.html

如果之前安裝過 Android SDK,您可以設定 Android Studio,並將其安排在正確的路徑,如圖 4 所示。

在 Android Studio 中,點選 Configure -> Project Defaults -> Project Structure,並設置路徑。

圖 圖四為在 Android* Studio 設定 SDK 路徑

測試 Intel® Edison

在開始執行以下步驟之前,請確認您能夠執行 Blink 範例當中的 sketch。它位於 examples -> 01.Basics -> Blink 檔案夾中的 Arduino IDE 下載軟體套件當中。

關於 Edison 入門指南可參照以下網頁連結:
https://communities.intel.com/community/makers/edison/getting-started

Android Hello World

安裝 Android Studio 後,請確認您能夠建立新專案,並在 Android 裝置當中執行該項目。

  1. 與您的 PC 連接 Android 裝置。
  2. 開啟 Android Studio。
  3. 選擇 "New Project…"。
  4. 選擇名稱和位置,並點選 "Next" 3 次 (API 15/Blank Activity)。
  5. 點選 Finish,並等待項目完成建立(可能需 20 多秒的時間)。
  6. 將綠色 Play 圖示移動到工具列中的
  7. 選擇您的裝置,並按下 "OK"

如果所有操作步驟都正確,您的 Android 螢幕上會顯示 "Hello world!”(圖 5)

BLE 是如何運作?

BLE 根據需要提供的短資料,然後關閉連接線路。這是藍芽 LE 實現低耗能的原因之一。 相比于常規藍芽的傳統配對方法,BLE 裝置僅在需要收發資訊時進行連結。

BLE 的通信方式極其嚴密。 設備顯示收發資料的服務,後者包含稱之為特性的內容,以定義可共用的資料。如需獲得更多相關資訊,其特性可包含描述符號來定義資料。例如,您可以擁有一項標記為 " 心跳速率監測" 的服務,該服務包含 " 心跳速率量測" 等特性。

大多數的藍芽 LE API 都支援搜尋本地裝置和發現有關這些裝置的服務、特性與描述符。

BLE 關鍵術語與概念

下面簡單介紹啟動 BLE 項目之前應該瞭解的關鍵 BLE 術語與概念。

通用屬性設定檔

GATT 通用屬性設定檔是關於通過藍芽低能耗連結收發少量資料稱為" 屬性" 的通用規範。 當前所有的 LE 應用通用屬性設定檔均以 GATT 為基礎。藍芽技術聯盟 (SIG) (https://www.bluetooth.org) 對 BLE 裝置的通用屬性設定檔數量進行了預先定義。 這些通用屬性設定檔是關於描述裝置使用方法的規範。

屬性協議

屬性協定 (ATT) 指 GATT 的建構基礎。 ATT 是專門針對 BLE 裝置而設計的優化型協議。 ATT 能通信能盡可能發送少量字元組的資料。所有屬性均帶有通用唯一通用識別碼 (UUID),為標準的 128 位元串 ID,是以唯一的方式識別資訊。 ATT 傳輸的屬性為被格式化的特性和服務(定義如下)

特性

特性包含一個單一的數值以及 0 或多個描述符(見下文)來描述特性的數值。

描述符

描述符指定義了的屬性,可描述特徵值。 它們可能是人類可讀的描述,可注明單位或測量,或定義可接受的數值範圍。

服務

服務主要表示特性的集合。下列連結提供了現有 GATT 的設定檔列表:
https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx

將數據從 Android 傳送至 Intel® Edison

首要條件

本文的內容將假設您有一個 Intel Edison 與 Android 開發而設置和配置的開發系統。請確認您已完成下列步驟,並檢示先前內容。

  • 安裝 Intel Arduino* IDE。
  • 安裝 Intel Edison 驅動程式。
  • 安裝 Android Studio。
  • 安裝 Android SDK。
  • 在 Intel Edison 上佈署和執行 Blink 示範。
  • 佈署和執行空白 Hello world Android 項目。

Android 當中的 BLE

您可以到以下網頁連結,從 GitHub 下載完整的項目:
https://github.com/adrianstevens/Edison_to_Android_BLE/tree/master/Android/BLEConnect

但我建議您建立自己的專案,並參考上述連結逐行寫入程式碼。

建立新的項目

開啟 Android Studio(或選擇 IDE),並建立一個空白新的 Android 應用程式,並將其命名為 BLEConnect 。請務必將最低 SDK 設置為 API 18。否則,您將無法使用 BLE API。

圖 / 圖六為建立一個新的 Android 應用程式

接下來開啟 AndroidManifest.xml,並在 標籤上方添加下列內容,以添加所需的許可權:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

設置 UI

為了讓事情簡化,我們只使用原始設定版面,但我們需要為 TextView 設置一個 ID 。 開啟 layout -> activity_main.xml,選擇 TextView,並將 ID 設置為 mainText,以便我們在程式碼當中引用該 ID。

圖七為設定 TextView 的 ID

MainActivity

就該專案而言,程式碼的其餘部分將進入 MainActivity。如果您逐行新增程式碼,那麼請注意,Android Studio 將自動檢測您所沒輸入到的資料,並提醒您完成新增。
範例代碼的功能如下:

  1. 檢查 BLE 支援 Android 的裝置。
  2. 搜索附近的 BLE 的裝置。
  3. 識別和連結 Grove BLE 模組。
  4. 為已知通訊服務搜索可用的服務。
  5. 尋找通訊服務的傳輸特性。
  6. 透過將數值寫入特性來發送訊息。

我在此不一一介紹每行程式碼,只介紹一些核心概念

類別等級變數與靜態參數值

我們在連結 BLE 模組、搜索服務和發送消息的過程中保存了一些數值。我們還將為 Grove BLE v1 (TI CC2540) 新增部分已知的靜態參數值。如果您使用其他的模組,可能需要進行調整。具體而言,我建議定義收發訊息特性,例如:
CHARACTERISTIC_TX = "0000ffe1-0000-1000-8000-00805f9b34fb"
CHARACTERISTIC_RX = "0000ffe1-0000-1000-8000-00805f9b34fb"

狀態輔助方法

為了簡化過程,我們在之前標記的 TextView 上顯示我們的進度。程式碼包含一種簡單的輔助方法,名為 statusUpdate,幫助我們將狀態訊息寫入螢幕和控制台。它還可返回至 UI 執行緒,以便我們安全從任一執行緒調用該方法。

連結 BLE 裝置

為引用 Bluetooth Manager,我們首先應查看裝置是否提供 BLE,呼叫 getSystemService 以引用 Bluetooth Manager (BluetoothManager),然後呼叫 getAdapter() 的方法以引用 BluetoothAdapter 專案。或者,您還可以直接從 Bluetooth Manager 類別來使用靜態説明方法 getDefaultAdapter。

搜尋附近的 BLE 裝置

在搜尋裝置時,我們使用計時器搜尋特定時間段。 我們可呼叫藍芽管理專案中的 startLeScan,並傳入至回呼專案,以瞭解是否搜索到裝置。

API 持續掃描裝置,因此,我們可能會在每台裝置的 LeScanCallback 中接收到多個通知,所以在儲存之前,我們應確認該裝置入口的唯一特性。我們還要檢查模組的裝置名稱,並保存引用。就本範例而言,我們實際上不需要將裝置保存在列表中。
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord)
{…}

尋找通訊服務

大多數的 BLE 裝置都會顯示一個或多個服務以供通訊與互動。 Grove BLE 中的 TI CC2540 包含一個 ID 為 “0000ffe0-0000-1000-8000-00805f9b34fb” 的關鍵服務。接下來,我們將尋找並保存引用的服務。

首先,我們需要連結裝置。為了瞭解連線時間或尋找到服務的時間,我們需要 BluetoothGattCallback 專案,並覆蓋 onConnectionStateChanged 與 onServicesDiscovered。

請注意,使用 onConnectionStateChanged 方法時,如果獲悉連接成功,我們可呼叫 mBluetoothGatt.discoverServices() 搜尋服務。識別到所需的服務後,我們可以繼續發送訊息。
@Override
public void onConnectionStateChange (BluetoothGatt gatt, int status, int newState)
{…}

@Override
public void onServicesDiscovered (BluetoothGatt gatt, int status)
{…}

許多其他方法可以被覆蓋。請參閱其中的檔案如以下連結所示:
https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html

發送訊息

在範常式式碼中提供了一種 sendMessage 方法。我們透過 UDID 識別到所需的特性後,呼叫該特性的 setValue。最後,我們呼叫 BluetoothGatt 當中的 writeCharacteristic,從而輸入特性值,以發送相關資料。

有許多 setValue 多載,但實際上可用一種更簡單的多載來發送字串,不過由於大多數 BLE 通訊以位元組的形式來發送指令,因此這種範例更加有用。

現在開始設定 Intel Edison。

採用 Grove Breakout 與 BLE 模組來設定 Intel® Edison

首先開始組裝基本相關硬體。若您還沒準備好,那麼請將 Intel Edison 安裝至 Arduino breakout 主機板。

接下來,將遮罩器底部的針腳對準 Arduino breakout 主機板來安裝 Grove 遮罩器。然後將 Grove BLE v1 連接至 UART 序列埠端。

圖 圖八為 Grove 遮罩器與 BLE 模組連結的 Intel® Edison

我們的第一個 Sketch

我們現在要在 Android 裝置和 Intel Edison 之間進行簡單的序列通訊。但我們還希望看到收發的內容,因此我們使用 Arduino IDE 內建的 Serial Monitor。

我們可以透過以下連結找到完整的 sketch 版本:
https://github.com/adrianstevens/Edison_to_Android_BLE/tree/master/Sketches/SimpleSerial

開 啟 vIntel Arduino IDEv,並建立新的 vsketch。 並將其保存並命名為 “SimpleSerial”。與其他 Arduino 相容主機板不同是 Intel Edison 提供兩個序列埠。Edison 透過 Grove BLE 收發資料的同時,這有助於我們實現 PC 與 Edison 之間的通訊傳輸。透過連接 PC 的 microUSB 可存取 UART 序列埠。我們使用 Grove 遮罩器上的 UART 連接端來連接至 BLE 模組。

在 Intel Edison 上完成佈署後,我們的 sketch 可自動執行。它會先執行 setup() 函數,然後連續地呼叫 loop() 函數。這有助於我們讀取和響應序列埠連接在輸入端的訊息。

序列埠連接的初始化

Grove BLE 的原始設定的通訊速度為 9600 波特,因此,我們從該原始設定值開始。我們需要設定兩個序列埠埠,以使用該速度。還需向 Grove BLE 發送多個 AT 指令,以將其更新為最新狀態。這些均可顯示在 sketch 的 setup() 函數中。

請注意,我們要首先設定 “Serial”,即為 microUSB 埠的 UART,然後是“Serial1”,即連接至 Grove BLE 的 UART。

迴圈

我們在該 sketch 的所有操作的目的為讀取來自序列埠的資料,然後將該資料發送至另一埠。為此,我們將呼叫序列埠的 read() 函數,為我們提供單一字元,然後在另一序列埠呼叫 print()。

Edison 迴圈的執行速度非常快,因此我們通訊速度可輕易達到 9600 波特。

佈署 Sketch

請點擊 Arduino IDE 的確認鍵(選擇項目,並設置好所有的 typo。確認後,請確認 Intel Edison 已連接至 PC,並上傳 sketch(如右箭頭表示)。傳輸完成後,sketch 開始執行迴圈,然後我們可連接 Android 的應用程式。現在請開啟 Arduino IDE 的 Serial Monitor(如右上角的放大鏡圖示),然後可以開始收發資料了。

一旦 Sketch 在 Intel Edison 開始執行後,即可執行 Android BLEConnect 應用程式。您應該可以看到在 serial monitor 當中顯示“Hello Grove BLE”的訊息。

如果無法執行,可能是 Android 應用程式的問題。檢查狀態顯示,它會告知出問題的原因。

GitHub repo 當中有一個 sketch 可將訊息顯示於 Grove LCD。請確認您的 Grove 遮罩器的電壓設置為 5V,並將 LCD 顯示器與 I2C 連接。

圖 / 圖九為在 Android*手機所執行的 BLEConnect

圖 / 圖十為 Adruino IDE Serial Monitor 接收 BLEConnect 的訊息

展望未來

建立相對較複雜的專案代表須將架構融入 Android 的程式碼與 sketch。我建議將大部分 Android BLE 的程式碼轉入服務端,以從 UI 中提取,並簡化多種活動和項目的使用。建立更進階的 sketche 同時,您希望開始使用 Arduino Time Library,以便模您能模擬執行多個迴圈,並同時接收資料 (http://playground.arduino.cc/Code/Time)。
我將有關範例添加至 GitHub 存儲庫當中 (https://github.com/adrianstevens/Edison_to_Android_BLE),並在下一篇文章中討論這些概念。

關於作者

Adrian Stevens 擁有超過 14 年的行動應用程式的開發經驗,尤其擅長於 C# 和 C++ 跨平臺的開發。 Adrian 專精於使用者介面架構、音訊/訊號處理、感應器和數學等相關領域。Adrian 長期任職於加拿大溫哥華,他對技術研究抱有極大的熱情,並極具創業精神。他同時還在 Meetup 上進行 C# 跨平臺開發。

Adrian 從 2001 開始為 Palm Pilot 和 Pocket PC 等平臺開發行動應用程式。後來成功創立了精品行動開發工作室。目前,Adrian 擔任行動與跨平臺應用程式的講師,教授相關開發架構和開發策略。

索引

 

測試英特爾® Edison

關於作者

 

更多精選文章.....

歡迎加入「Inside」Line 官方帳號,關注最新創業、科技、網路、工作訊息

好友人數

精選熱門好工作

客服服務品質稽核專員

樂購蝦皮股份有限公司
臺北市.台灣

獎勵 NT$20,000

西餐廚師Commis1,2,3,副領班

Sugar Pea
臺北市.台灣

獎勵 NT$4,000

系統架構師

GliaCloud 集雅科技股份有限公司
臺北市.台灣

獎勵 NT$20,000

評論