1. 程式人生 > >Android提高第十二篇之藍芽感測應用

Android提高第十二篇之藍芽感測應用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

本文來自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協議裝置是一款單導聯心電採集表:

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

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

註冊BroadcastReceiver:

[java] view plain copy print ?
  1. IntentFilter intent = new IntentFilter();  
  2. intent.addAction(BluetoothDevice.ACTION_FOUND);// 用BroadcastReceiver來取得搜尋結果  
  3. intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);  
  4. intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);  
  5. intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);  
  6. 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()列舉所有訊息的內容:

[java] view plain copy print ?
  1. String action = intent.getAction();  
  2.             Bundle b = intent.getExtras();  
  3.             Object[] lstName = b.keySet().toArray();  
  4.   
  5.             // 顯示所有收到的訊息及其細節  
  6.             for (int i = 0; i < lstName.length; i++) {  
  7.                 String keyName = lstName[i].toString();  
  8.                 Log.e(keyName, String.valueOf(b.get(keyName)));  
  9.             }  
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++等值的資料。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述