歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android藍牙串口通信模板及小trick

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

日期:2017/3/1 10:09:34   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved