Android 藍牙連接通訊實作心得
最近因為專案需求,進行了一些藍牙通訊的研究。
首先來看官方線上文件:Bluetooth overview - Connect devices
前面描述開啟藍牙或搜尋、被搜尋……等較為基本的部份先跳過。從連接裝置(Connect devices)這一節開始,首先要將兩個裝置配對,然後使用 BluetoothAdapter 的 getBondedDevices() 方法取得已配對的裝置資訊,並從中取出 MAC address。
接下來我們需要一組 UUID (通用唯一識別號)作為藍牙服務的識別碼。在網路上有許多 UUID 產生器,例如:https://www.uuidgenerator.net/。找一個喜歡的使用即可。
因為藍牙的連接模式是由一個 Client 端主動發起連線給被動監聽的 Server 端,因此程式碼需要分別撰寫 Server 與 Client 端的動作。
首先來看接收藍牙連接的 Server 端程式碼:
接受連接的步驟為:
然後是藍牙連接的 Client 端程式碼:
發起連接的步驟為:
到這邊可以發現到,Client 和 Server 都在第三步驟調用了 manageConnectedSocket(socket) 副程式,但是官方線上文件並沒有進一步說明這個副程式的內容。
所幸我在官方範例程式中找到了藍牙連接的範例程式:BluetoothChat
從中得知,原來是要啟動另一個 Thread:ConnectedThread
而 ConnectedThread 的程式碼如下:
ConnectedThread 透過 BluetoothSocket 取得了 InputStream 和 OutputStream 來處理數據傳輸,然後再透過 read(byte[]) 和 write(byte[]) 方法來讀取和寫入數據。
之後只要在 Activity(或 Fragment)中宣告一個 Handler,就可以用來接收對方傳來的數據並更新 UI;也能直接調用 ConnectedThread 的 write(byte[]) 來寫入數據給對方。
最後附上一張傳輸成功的截圖
首先來看官方線上文件:Bluetooth overview - Connect devices
前面描述開啟藍牙或搜尋、被搜尋……等較為基本的部份先跳過。從連接裝置(Connect devices)這一節開始,首先要將兩個裝置配對,然後使用 BluetoothAdapter 的 getBondedDevices() 方法取得已配對的裝置資訊,並從中取出 MAC address。
接下來我們需要一組 UUID (通用唯一識別號)作為藍牙服務的識別碼。在網路上有許多 UUID 產生器,例如:https://www.uuidgenerator.net/。找一個喜歡的使用即可。
因為藍牙的連接模式是由一個 Client 端主動發起連線給被動監聽的 Server 端,因此程式碼需要分別撰寫 Server 與 Client 端的動作。
首先來看接收藍牙連接的 Server 端程式碼:
接受連接的步驟為:
- 調用 listenUsingRfcommWithServiceRecord(String, UUID) 取得 BluetoothServerSocket
- 調用 accept() 開始監聽連線請求
- 在 manageConnectedSocket(socket) 副程式中管理 socket 連線。這部份後面再詳述。
- 調用 close() 關閉監聽連線請求
然後是藍牙連接的 Client 端程式碼:
發起連接的步驟為:
- 調用 createRfcommSocketToServiceRecord(UUID) 取得 BluetoothSocket。
- 調用 connect() 發起連接
- 在 manageConnectedSocket(socket) 副程式中管理 socket 連線。
到這邊可以發現到,Client 和 Server 都在第三步驟調用了 manageConnectedSocket(socket) 副程式,但是官方線上文件並沒有進一步說明這個副程式的內容。
所幸我在官方範例程式中找到了藍牙連接的範例程式:BluetoothChat
從中得知,原來是要啟動另一個 Thread:ConnectedThread
而 ConnectedThread 的程式碼如下:
ConnectedThread 透過 BluetoothSocket 取得了 InputStream 和 OutputStream 來處理數據傳輸,然後再透過 read(byte[]) 和 write(byte[]) 方法來讀取和寫入數據。
之後只要在 Activity(或 Fragment)中宣告一個 Handler,就可以用來接收對方傳來的數據並更新 UI;也能直接調用 ConnectedThread 的 write(byte[]) 來寫入數據給對方。
最後附上一張傳輸成功的截圖
留言
張貼留言