說明與備忘
1、傳統藍牙指的是那些藍牙4.0以前,藍牙4.0及以後也叫低功耗藍牙;傳統藍牙連接配接方式是無法和低功耗藍牙子產品建立通信通道的,因為通信的協定是不一樣的。低功耗藍牙是用GATT這種屬性傳輸協定,而傳統藍牙則是通過Socket的方式進行資料的傳輸。
2、android 4.3(API 18)版本以下的對應的是傳統藍牙;android 4.3以上的是低功耗藍牙;android 4.3至5.0版本的調用方法和android 5.0以上的調用方法也不一樣;android藍牙權限在6.0以上增加了一個模糊定位的權限,不開啟部分手機無法發出掃描藍牙的廣播。
2、使用場景:Android App通過手機藍牙去連接配接藍牙裝置,即App為主裝置,藍牙裝置為從裝置,或者說App為用戶端,藍牙裝置為服務端;
2、藍牙使用步驟:打開藍牙——搜尋裝置——裝置配對——連接配接裝置——接收發送資料——斷開連接配接關閉藍牙。
3、在實際開發中,搜尋裝置和裝置配對的步驟建議不放在App的藍牙控制流程中,因為該步驟不穩定,很有很能搜尋不到裝置。App中隻需要打開藍牙并從已配對的裝置中去連接配接裝置,沒有已配對的裝置則提醒使用者通過手機的藍牙配對裝置。這樣個人感覺使用者體驗更好。
兩個坑及解決辦法
Android App和傳統藍牙建立Socket連接配接的兩種方式:
1、通過反射調用BluetoothDevice的createRfcommSocket的方法:
BluetoothSocket socket = (BluetoothSocket) dev.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(dev, 1);
該方式的坑在于連接配接不穩定,成功率較低;
2、通過UUID,代碼如下:
String uuidValue = "00001101-0000-1000-8000-00805F9B34FB";
UUID mactekHartModemUuid = UUID.fromString(uuidValue);
BluetoothSocket socket = dev.createRfcommSocketToServiceRecord(mactekHartModemUuid);
該方式的坑在于必須使用Android的SSP(協定棧預設)的UUID:
00001101-0000-1000-8000-00805F9B34FB
才能正常和外部的,也是SSP序列槽的藍牙裝置去連接配接。