Android手機一般以用戶端的角色主動串連SPP協議裝置(接上藍芽模組的數字感應器),串連流程是:
1.使用registerReceiver註冊BroadcastReceiver來擷取藍芽狀態、搜尋裝置等訊息;
2.使用BlueAdatper的搜尋;
3.在BroadcastReceiver的onReceive()裡取得搜尋所得的藍牙裝置資訊(如名稱,MAC,RSSI);
4.通過裝置的MAC地址來建立一個BluetoothDevice對象;
5.由BluetoothDevice衍生出BluetoothSocket,準備SOCKET來讀寫裝置;
6.通過BluetoothSocket的createRfcommSocketToServiceRecord()方法來選擇串連的協議/服務,這裡用的是SPP(UUID:00001101-0000-1000-8000-00805F9B34FB);
7.Connect之後(如果還沒配對則系統自動提示),使用BluetoothSocket的getInputStream()和getOutputStream()來讀寫藍牙裝置。
先來看看本文程式啟動並執行,所選的SPP協議裝置是一款單導聯心電採集表:
本 文程式包含兩個Activity(testBlueTooth和WaveDiagram),testBlueTooth是搜尋建立藍芽串連。 BluetoothAdapter、BluetoothDevice和BluetoothSocket的使用很簡單,除了前三者提供的功能外,還可以通過 給系統發送訊息來控制、擷取藍芽資訊,例如:
註冊BroadcastReceiver:
IntentFilter intent = new IntentFilter();intent.addAction(BluetoothDevice.ACTION_FOUND);// 用BroadcastReceiver來取得搜尋結果intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);registerReceiver(searchDevices, intent);
在BroadcastReceiver的onReceive()枚舉所有訊息的內容:
String action = intent.getAction();Bundle b = intent.getExtras();Object[] lstName = b.keySet().toArray();// 顯示所有收到的訊息及其細節for (int i = 0; i < lstName.length; i++) {String keyName = lstName[i].toString();Log.e(keyName, String.valueOf(b.get(keyName)));}
在DDMS裡面可以看到BluetoothDevice.ACTION_FOUND返回的訊息:
程式另外一個Activity~~~WaveDiagram用於讀取藍芽資料並繪製波形圖,這裡要注意一下JAVA的byte的取值範圍是跟C/C++不一樣的,Android接收到的byte資料要做"& 0xFF"處理,轉為C/C++等值的資料。