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地址傳輸信息的模板,通用搜索模式日後再補刪模板:
- private BluetoothAdapter mBluetoothAdapter = null;
-
- private BluetoothSocket btSocket = null;
-
- private OutputStream outStream = null;
-
- private InputStream inStream = null;
-
- private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //這條是藍牙串口通用的UUID,不要更改
-
- private static String address = "00:12:02:22:06:61"; // <==要連接的藍牙設備MAC地址
-
-
- /*獲得通信線路過程*/
-
-
- /*1:獲取本地BlueToothAdapter*/
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- if(mBluetoothAdapter == null)
- {
- Toast.makeText(this, "Bluetooth is not available.", Toast.LENGTH_LONG).show();
- finish();
- return;
- }
- if(!mBluetoothAdapter.isEnabled())
- {
- Toast.makeText(this, "Please enable your Bluetooth and re-run this program.", Toast.LENGTH_LONG).show();
- finish();
- return;
- }
-
- /*2:獲取遠程BlueToothDevice*/
- BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
- if(mBluetoothAdapter == null)
- {
- Toast.makeText(this, "Can't get remote device.", Toast.LENGTH_LONG).show();
- finish();
- return;
- }
-
- /*3:獲得Socket*/
- try {
- btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
- } catch (IOException e) {
-
- Log.e(TAG, "ON RESUME: Socket creation failed.", e);
-
- }
-
- /*4:取消discovered節省資源*/
- mBluetoothAdapter.cancelDiscovery();
-
-
- /*5:連接*/
-
- try {
-
- btSocket.connect();
-
- Log.e(TAG, "ON RESUME: BT connection established, data transfer link open.");
-
- } catch (IOException e) {
-
- try {
- btSocket.close();
-
- } catch (IOException e2) {
-
- Log .e(TAG,"ON RESUME: Unable to close socket during connection failure", e2);
- }
- }
-
- /*此時可以通信了,放在任意函數中*/
- /* try {
- outStream = btSocket.getOutputStream();
-
- inStream = btSocket.getInputStream(); //可在TextView裡顯示
-
- } catch (IOException e) {
- Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
- }
-
-
- String message = "1";
-
- byte[] msgBuffer = message.getBytes();
-
- try {
- outStream.write(msgBuffer);
-
- } catch (IOException e) {
- Log.e(TAG, "ON RESUME: Exception during write.", e);
- }
- */