DIY智能插座(五) -- Android客戶端

手機客戶端主要涉及藍牙編程,涉及到幾個概念:

Service’s UUID : 標示服務類型,例如藍牙打印服務、藍牙音頻傳輸服務、藍牙串口服務,只有正確配置這個UUID,才能正常連接,對於藍牙串口(SPP)服務,對應的UUID爲:00001101-0000-1000-8000-00805F9B34FB

藍牙主/從模式:藍牙主設備一般可以連接多個設備,例如你的電腦、手機都是這樣,而一般的設備,例如藍牙耳機、藍牙鼠標、藍牙POS機等,都是作爲從設備。主設備會主動發配對、連接請求,從設備響應這些請求。當然許多設備既可以做主,也可以做從,手機、電腦就是主從可以切換的。

知道這些概念就可以進行Android編程了,當然前提是你得會android編碼 ~~

對於android藍牙編程,只要搞熟悉了套路,還是so easy的,主要涉及幾個類:

BluetoothAdapter:主要用於描述本機藍牙適配器,封裝了許多藍牙狀態信息、藍牙操作(開、關、掃描等)
BluetoothDevice:對遠端藍牙設備的描述,例如MAC地址、設備名稱、是否綁定等,都可以通過這個類獲取
BluetoothServerSocket:作爲服務端套接字,用來監聽是否有數據接收
BluetoothSocket:藍牙套接字,數據發送接收都是通過這個對象來實現,其實和網絡編程都是比較類似的,很好理解。

由於藍牙編程和網絡編程類似,涉及到堵塞,所以需要和UI線程分離,用單獨的線程實現藍牙的數據收發。簡要的編程步驟如下:

1)藍牙適配器的獲取:

BluetoothAdapter mBluetoothAdapter = null;
mBluetoothAdapter  = BluetoothAdapter.getDefaultAdapter();

2)連接到遠端設備

//Name for the SDP record when creating server socket
private static final String NAME_SECURE = "BluetoothSecure";
private static final String NAME_INSECURE = "BluetoothInsecure";
//Service's UUID 
private static final UUID MY_UUID =
        UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

String address =  "A1:A2:A3:A4:A5:A6"; //對應遠端MAC地址
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);//創建藍牙設備
BluetoothSocket mmSocket;
mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID); //安全方式連接
//mmSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);//非安全方式連接

 mmSocket.connect(); //開始連接

3)藍牙監聽(接受連接)

BluetoothServerSocket mmServerSocket;
InputStream mmInStream;
OutputStream mmOutStream;

mmServerSocket =mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, MY_UUID);//安全方式
//mmServerSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, MY_UUID); //非安全方式

BluetoothSocket mmSocket = mmServerSocket.accept();  //開始監聽

4)藍牙讀寫

 InputStream mmInStream = mmSocket.getInputStream();  //輸入流
 OutputStream mmOutStream = mmSocket.getOutputStream(); //輸出流

  byte[] buffer = new byte[4096];
  int bytes = 0;                  
  Read from the InputStream
  bytes = mmInStream.read(buffer);  //將輸入流讀入buffer數組

  mmOutStream.write(buffer); //將buffer寫到數據流

基本上藍牙編程就按照這幾步數來就行了,當然,由於藍牙編程和Socket網絡編程十分類似,會出現阻塞現象,所以不要放在UI線程,應該另起單獨的線程完成上述操作。後面會放上完整的代碼,裏面有具體實現步驟。一般將這些後臺數據操作的部分另起一個文件,作爲一個Service也是挺好的。說完了藍牙編程部分,簡要看一下UI部分吧:

這裏寫圖片描述 這裏寫圖片描述

四個開關用ListView實現,點擊菜單欄的“Connect a device”會彈出掃描界面,點擊item,會獲取MAC地址,然後會連接到該設備。程序在剛啓動時,會發送狀態請求碼,即0x60(參看第一節),查詢退出前的開關狀態。爲了避免每次開啓程序時還要手動連接一次,可以將mac地址通過SharedPreferences的方式進行保存,開啓程序後讀取保存的mac字段,然後自動連接即可。

最後欣賞一下完成後的圖片和視頻演示吧~~~~
這裏寫圖片描述

視頻演示:

附上Android Apk源代碼地址:
https://github.com/lonely-geek/bluetooth-switch

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章