Xamarin Android 藍牙裝置連線實作

蔡嘉丞 2019/08/06 11:37:55
374

Xamarin Android 藍牙裝置連線實作

 

1:前言:藍牙裝置(BlueTooths Device)是一種透過無線通訊技術,讓行動裝置與固定裝置可以在短距離內交換資訊,其使用2.4ghz-2.485gjzISM頻段進行通訊, 它能夠連結多個裝置,克服同步問題.目前此技術已普遍於生活上的3C產品,如手機與電腦週邊商品(耳機 滑鼠)可穿戴裝置等, 本篇文章的目的在於使用Xamarin Android 完成手機基本的藍牙裝置連接與訊息的傳遞.

 

 

實際操作

在手機上執行藍牙裝置連接無論任何版本都有4件必須完成的主要項目

1:設定藍牙權限

2:搜尋配對裝置或範圍內的裝置

3:連接裝置

4:傳輸資料

 

 

1:設定藍牙權限

第一步是先讓app具有權限使用藍牙裝置如下圖所示,開啟app Bluetooth Bluetooth_Admin 權限,Bluetooth_Admin權限是為了令其他被配可以搜尋到本機藍牙裝置

 

 

如此即可讓app使用藍牙裝置,我們可以在程式碼內部新增一段判別式,若本機具有藍牙裝置且藍牙裝置尚未被開啟則詢問是否啟動藍牙裝置 ,點擊是即會開啟本機藍牙裝置

 

 

        執行後結果,當登入app時如未開啟藍牙裝置時則會詢問是否開啟

 

 

我們也可以預設對外開放搜尋的連線時限,在指定範圍時間內可以讓外部藍牙裝置搜尋到本機藍牙裝置,過了限時的時間後即關閉外部搜尋

2:搜尋配對裝置或範圍內的裝置

 

藍牙裝置初始化後需要先在裝置間進行配對動作,第一次執行配對動作時,會對使用者進行配對要求,雙方裝置會顯示彼此配對流水號,當點選確定時,會記錄對方裝置名稱與MAC位址,我們可以在程式內新增一個類別(Class)繼承 BroadcastReceiver 該類別會在藍牙裝置搜尋到裝置時進行廣播動作,當搜尋到我們想找尋的裝置時進行配置,配置後的裝置會記錄在BluetoothAdapter 中的BondedDevices屬性 ,之後再連線時即可在此取得藍牙裝置資訊。

 

 

上圖中我建立的對象為我自身的筆電,當藍牙搜尋到我筆電裝置時可以取的我筆電名稱與MAC Address 並建立起配對連線

 

 

 

 

裝置配對完成後即可進行通訊,已配對的裝置則無須再進行配對,可至BluetoothAdapter類別中直接取出對應的BluetoothDevice 資訊,我們可以新增以下程式取得已在配對中的藍牙裝置

 

 

 

已存在配對中的裝置即可進行後續的藍牙通訊

 

3:連接裝置

藍牙裝置的連線建立可以簡單的區分成兩種連線概念:主動的Client端連線、被動的Server端連線。在進入程式實作前我們要先了解以下幾個名詞與屬性定義

 

UUID:(Universally Unique Identifier)中文名稱為通用唯一識別碼,這是一串由128bit的字串經演算法組成隨機字串,在藍牙裝置中是用來標誌藍牙設備的服務而非藍牙設備本身,一個藍牙設備可以提供多種服務如:A2DP (藍牙音頻傳輸), HEADFREE(免持機制) SPP (通信接口),每種服務都對應著一組默認的UUID,比如通信街口就有一組(00001101-0000-1000-8000-00805F9B34FB)為大眾所知的UUID,而該組UUID是可以被改變的。

 

BluetoothAdapter:為藍牙裝置訊息交換配接口,透過這個接口可以偵測區域內的藍牙裝置、查詢以配置的裝置列表、用已知的MAC Address 建立BluetoothDevice實體,或產生BluetoothServerSocket用以監聽藍牙裝置間的訊息傳遞。

 

BluetoothSocket:類似TCP Socket 當藍牙裝置完成配對裝置後允許App透過 InputStreamOutputStream做交換資料。

 

BluetoothServerSocket:為開放式的ServerSocket 用來監聽任何傳進來的資料請求,藍牙裝置連線必須有人一方裝置扮演Server方讓Client方傳遞連線請求後,回傳BluetoothSocket給請求連線方已建立裝置的訊息傳導。

 

 

大略了解以上名詞與類別後即可開始實作已Client 連線至藍牙裝置,我們首先需要從已配對的裝置中找出欲連線的裝置(BluetoothDevice)

 

 

搜尋到我們將連線後的裝置,新增一線程(Thread),將搜尋出的BluetoothDevice透過CreateRfcommSocketToServiceRecord屬性回傳BluetoothSocket建立連線,即可進行藍牙連線,其中參數UUID的參數使用的SPP預設ID00001101-0000-1000-8000-00805F9B34FB),此參數可以自行更動,但Client端與Server端兩者溝通的UUID需要一致才能進行訊息的傳遞。

 

 

 

 

作為Server端提供他人連線,將藍牙裝置做主機端供Client端進行連線,我們需要在主機端產生BluetoothServerSocket監聽其他藍牙裝置發來的請求,屬性mBluetoothAdapter.ListenUsingRfcommWithServiceRecord("ASUS_X00QD", UUID.Uuid)會回傳一個目前此裝置的BluetoothServerSocket, UUID 必須與Clinet BlueSocketUUID一致,若兩者不同則無法進行資料傳遞,BluetoothServerSocket建立後再進行等候裝置時程式將會Block直到裝置完成交換請求,所以務必開線程(Thread)去執行該步驟。

 

 

 

ServerSocket建立外部藍牙裝置連線接口後,程式輸出finding Socket 即表示藍牙裝置完成連線請求 ,可進行資訊的傳遞。

 

 

4:傳輸資料

Bluetooth裝置Server端與Client端建立完成後,後續溝通方式單純多了,兩方溝通皆已InputStream OutputStream作為溝通,輸出方將資訊轉為byte [] 形式透過BluetoothSocketOutputStream屬性,寫入該資料二進制位元。接收端則透過BluetoothSocketInputStream屬性讀取即可進行裝置間交換訊息。本次範例則是在建立通訊的同時即送出溝通資料。並在建立連線時及收取通訊資料

 

 

Client

 

 

 

Server

 

 

 

 

 

蔡嘉丞