Android藍牙開發教程(二)——連接藍牙設備

在上一篇中已經介紹如何搜索附近可連接的藍牙設備,如果你還沒閱讀過,建議先看看上一篇文章Android藍牙開發教程(一)——搜索藍牙設備

獲取到設備後就可以開始處理藍牙設備之間的連接。

在上一篇教程中我們將搜索到的藍牙設備展示在列表中,現在我們爲列表項增加上點擊事件。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (bTAdatper.isDiscovering()) {
                    bTAdatper.cancelDiscovery();
                }
                BluetoothDevice device = (BluetoothDevice) adapter.getItem(position);
                //連接設備
                connectDevice(device);
            }
        });

當我們點擊了列表項後,如果藍牙設備當前處於搜索狀態,則取消搜索。獲取到列表項相對應的藍牙設備後調用連接方法。

 /**
     * 連接藍牙設備
     */
    private void connectDevice(BluetoothDevice device) {

        text_state.setText(getResources().getString(R.string.connecting));

        try {
            //創建Socket
            BluetoothSocket socket = device.createRfcommSocketToServiceRecord(BT_UUID);
            //啓動連接線程
            connectThread = new ConnectThread(socket, true);
            connectThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

可以看到,在connectDevice()方法中,首先用一個TextView提示連接狀態,然後用我們選擇的設備調用createRfcommSocketToServiceRecord(UUID uuid)獲取BluetoothSocket。最後開啓一個線程去處理BluetoothSocket。

這裏需要注意的是傳入的UUID。UUID是Universally Unique Identifier的縮寫,它是在一定的範圍內(從特定的名字空間到全球)唯一的機器生成的標識符。我們在連接藍牙設備的時候,必須確保兩個設備的UUID是相同的。通常UUID是16字節128位長的數字,通常以36字節的字符串表示,示例如下:

3F2504E0-4F89-11D3-9A0C-0305E82C3301。

 //如果是自動連接 則調用連接方法
                if (activeConnect) {
                    socket.connect();
                }
                text_state.post(new Runnable() {
                    @Override
                    public void run() {
                        text_state.setText(getResources().getString(R.string.connect_success));
                    }
                });

在創建線程的時候我們會傳入布爾變量activeConnect做標識,區分是自動連接還是被動連接。當是自動連接狀態,則調用BluetoothSocket的connect()進行連接。

而被動連接的做法主要是開啓一個監聽線程,監聽是否有設備連接到我們的設備上,具體代碼如下:
listenerThread = new ListenerThread();
        listenerThread.start();
在onCreate()方法中開啓監聽線程
private BluetoothServerSocket serverSocket;
        private BluetoothSocket socket;

        @Override
        public void run() {
            try {
                serverSocket = bTAdatper.listenUsingRfcommWithServiceRecord(
                        NAME, BT_UUID);
                while (true) {
                    //線程阻塞,等待別的設備連接
                    socket = serverSocket.accept();
                    text_state.post(new Runnable() {
                        @Override
                        public void run() {
                            text_state.setText(getResources().getString(R.string.connecting));
                        }
                    });
                    connectThread = new ConnectThread(socket, false);
                    connectThread.start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

監聽線程中的代碼很簡單,首先是獲取BluetoothServerSocket,這裏需要用到UUID必須確保和自動連接所用到的UUID是相同的,而對於NAME就沒什麼要求。接着我們就調用accept()方法。這個方法會阻塞住當前的線程,直到有設備連接上來。當有設備連接上來,則可以獲取到對應的BluetoothSocket。到這裏被動連接就成功了。接着我們只要把獲取到的BluetoothSocket交由連接線程ConnectThread去處理就行了。

歡迎繼續閱讀下一篇

Android藍牙開發教程(三)——藍牙設備相互通訊

發佈了32 篇原創文章 · 獲贊 111 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章