歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android藍牙串口通信模板及小trick

Android藍牙操作:與藍牙串口模塊通信,或其他藍牙設備通信。

初涉android的藍牙操作,按照固定MAC地址連接獲取Device時,程序始終是異常終止,查了好多天代碼都沒查出原因。今天改了一下API版本,突然就成功連接了。總結之後發現果然是個坑爹之極的錯誤。

為了這種錯誤拼命查原因浪費大把時間是非常不值得的,但是問題不解決更是揪心。可惜我百度了那麼多,都沒有給出確切原因。今天特此mark,希望後來者遇到這個問題的時候能輕松解決。

下面是我的連接過程,中間崩潰原因及解決辦法。

1:用AT指令獲得藍牙串口的MAC地址,地址是簡寫的,按照常理猜測可得標准格式。

2:開一個String adress= "************" //MAC地址, String MY_UUID= "************"//UUID根據通信而定,網上都有。

3:取得本地Adapter用getDefaultAdapter(); 遠程的則用getRemoteDevice(adress); 之後便可用UUID開socket進行通信。

如果中途各種在getRemoteDevice處崩潰,大家可以查看一下當前的API版本,如果是2.1或以下版本的話,便能確定是API版本問題,只要換成2.2或者以上就都可以正常運行了~   這麼坑爹的錯誤的確很為難初學者。  唉··········  為這種小trick浪費很多時間真是難過。

下面附上Android藍牙操作中用固定MAC地址傳輸信息的模板,通用搜索模式日後再補刪模板:

  1. private BluetoothAdapter mBluetoothAdapter = null;      
  2.       
  3. private BluetoothSocket btSocket = null;      
  4.       
  5. private OutputStream outStream = null;      
  6.       
  7. private InputStream inStream = null;      
  8.       
  9. private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");  //這條是藍牙串口通用的UUID,不要更改       
  10.       
  11. private static String address = "00:12:02:22:06:61"// <==要連接的藍牙設備MAC地址       
  12.       
  13.       
  14. /*獲得通信線路過程*/      
  15.       
  16.       
  17. /*1:獲取本地BlueToothAdapter*/      
  18. mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();      
  19. if(mBluetoothAdapter == null)       
  20. {      
  21.     Toast.makeText(this"Bluetooth is not available.", Toast.LENGTH_LONG).show();      
  22.     finish();      
  23.     return;      
  24. }      
  25. if(!mBluetoothAdapter.isEnabled())       
  26. {      
  27.     Toast.makeText(this"Please enable your Bluetooth and re-run this program.", Toast.LENGTH_LONG).show();      
  28.     finish();      
  29.     return;      
  30. }       
  31.        
  32. /*2:獲取遠程BlueToothDevice*/       
  33.     BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);      
  34. if(mBluetoothAdapter == null)       
  35. {      
  36.     Toast.makeText(this"Can't get remote device.", Toast.LENGTH_LONG).show();      
  37.     finish();      
  38.     return;      
  39. }      
  40.        
  41. /*3:獲得Socket*/            
  42.     try {      
  43.     btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);      
  44. catch (IOException e) {      
  45.       
  46.     Log.e(TAG, "ON RESUME: Socket creation failed.", e);      
  47.       
  48. }      
  49.       
  50. /*4:取消discovered節省資源*/      
  51. mBluetoothAdapter.cancelDiscovery();              
  52.       
  53.       
  54. /*5:連接*/      
  55.       
  56. try {      
  57.       
  58.     btSocket.connect();      
  59.       
  60.     Log.e(TAG, "ON RESUME: BT connection established, data transfer link open.");      
  61.       
  62. catch (IOException e) {      
  63.       
  64.     try {      
  65.         btSocket.close();      
  66.       
  67.     } catch (IOException e2) {      
  68.       
  69.         Log .e(TAG,"ON RESUME: Unable to close socket during connection failure", e2);      
  70.     }      
  71. }       
  72.           
  73. /*此時可以通信了,放在任意函數中*/      
  74. /*  try {   
  75. outStream = btSocket.getOutputStream();   
  76.   
  77. inStream = btSocket.getInputStream(); //可在TextView裡顯示   
  78.   
  79. } catch (IOException e) {   
  80.     Log.e(TAG, "ON RESUME: Output stream creation failed.", e);   
  81. }   
  82.    
  83.    
  84. String message = "1";   
  85.    
  86. byte[] msgBuffer = message.getBytes();   
  87.    
  88. try {   
  89.     outStream.write(msgBuffer);   
  90.    
  91. } catch (IOException e) {   
  92.     Log.e(TAG, "ON RESUME: Exception during write.", e);   
  93. }   
  94. */   

Copyright © Linux教程網 All Rights Reserved