本文來自HTTP://blog.csdn.net/hellogv/ ,引用必須注明出處!

上次介紹了Android利用麥克風採集並顯示類比信號,這種採集手段適用于無IO控制、單純讀取信號的情況。如果感應器本身需要包含控制電路(例如採集血氧信號需要紅外和紅外線交替發射),那麼感應器本身就需要帶一片主控IC,片內採集並輸出數位信號了。Android手機如何在不改硬體電路的前提下與這類數位感應器交互呢?可選的通信方式就有USB和藍牙,兩種方式各有好處:USB方式可以給感應器供電,藍牙方式要自備電源;USB介面標準不一,藍牙普遍支援SPP協定。本文選擇藍牙方式做介紹,介紹Android的藍牙API以及藍牙用戶端的用法。
在Android 2.0,官方終於發佈了藍牙API(2.0以下系統的非官方的藍牙API可以參考這裡:HTTP://code.google.com/p/android-bluetooth/)。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協定設備是一款單導聯心電採集表:

14185743_CyZd  

本文的代碼較多,可以到這裡下載:HTTP://www.pudn.com/downloads305/sourcecode/comm/android/detail1359043.html

本文套裝程式含兩個Activity(testBlueTooth和WaveDiagram),testBlueTooth是搜索建立藍牙連接。BluetoothAdapter、BluetoothDevice和BluetoothSocket的使用很簡單,除了前三者提供的功能外,還可以通過給系統發送消息來控制、獲取藍牙資訊,例如:

註冊BroadcastReceiver:


源碼copy to clipboard列印?
01.IntentFilter intent = new IntentFilter();
02.intent.addAction(BluetoothDevice.ACTION_FOUND);// 用BroadcastReceiver來取得搜尋結果
03.intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
04.intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
05.intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
06.registerReceiver(searchDevices, intent);
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()枚舉所有消息的內容:


源碼copy to clipboard列印?
01.String action = intent.getAction();
02. Bundle b = intent.getExtras();
03. Object[] lstName = b.keySet().toArray();
04.
05. // 顯示所有收到的消息及其細節
06. for (int i = 0; i < lstName.length; i++) {
07. String keyName = lstName[i].toString();
08. Log.e(keyName, String.valueOf(b.get(keyName)));
09. }
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返回的消息:


14185744_KON2  


程式另外一個Activity~~~WaveDiagram用於讀取藍牙資料並繪製波形圖,這裡要注意一下JAVA的byte的取值範圍是跟C/C++不一樣的,Android接收到的byte資料要做"& 0xFF"處理,轉為C/C++等值的資料。


原文連結:HTTP://blog.csdn.net/hellogv/article/details/6036849
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()