藍牙傳輸項目(藍牙socket通信)


藍牙socket通信,參考了

http://blog.csdn.net/lovoo/article/details/51576246

的博客,了解到進行通信的幾個重要步驟:

1)首先開啟藍牙

2)搜索可用設備

3)創建藍牙socket,獲取輸入輸出流

4)讀取和寫入數據

其中 開啟藍牙 和 搜索設備 不需多說,可以咯看我的博客  http://www.cnblogs.com/sovagxa/p/7620380.html   

 

創建藍牙socket,獲取輸入輸出流:

(1)確定一個服務器端,一個客戶端。

(2)服務器端serversocket等待接收客戶端的連接,若一直沒有連接,則為阻塞狀態,故等待連接的代碼應該放在子線程中進行

(3)服務器端接受連接之后返回一個socket來管理對話,用outputstream和inputstream進行接收和發送

(4)客戶端選擇一個服務器(遠程藍牙設備device)用socket嘗試連接,若服務器端一直沒有接受連接,則為阻塞狀態,故嘗試連接的代碼應該放在子線程中進行

(5)客戶端嘗試連接成功后使用該socket管理對話,用outputstream和inputstream進行接收和發送

(6)接收黛娜要一直循環檢測接收,故要放在子線程中,當服務器接收連接或個護短連接成功時開始執行

 

客戶端嘗試連接代碼:

    /**
     * 客戶端,進行連接的線程
     * @author Administrator
     *
     */
    class ClientThread extends Thread{
        @Override
        public void run(){
            try {
                //創建一個socket嘗試連接,UUID用正確格式的String來轉換而成*
                socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                Utils.sonUiStateMsg("正在連接,請稍后......");
                //該方法阻塞,一直嘗試連接*
                socket.connect();
                Utils.sonUiStateMsg("連接成功");
                //進行接收線程
                new ReadMsg().start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Utils.sonUiStateMsg("連接失敗");
                e.printStackTrace();
            }
        }
    }

 

 

 服務器端等待連接代碼    

 

 /**
   * 服務端,接收連接的線程 *
@author Administrator * */ class ServiceThread extends Thread{ @Override public void run(){ try { //先用本地藍牙適配器創建一個serversocket * serSocket= bluetoothAdapter.listenUsingRfcommWithServiceRecord(bluetoothAdapter.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); Utils.sonUiStateMsg("正在等待連接"); if(socket!=null){Utils.sonUiStateMsg("連接成功");} //等待連接,該方法阻塞* socket=serSocket.accept(); Utils.sonUiStateMsg("連接成功");
new ReadMsg().start(); } catch (IOException e) { // TODO Auto-generated catch block // Toast.makeText(getApplicationContext(), "IOExeption", 1).show(); System.out.println("IOExeption"); Utils.sonUiStateMsg("連接失敗"); e.printStackTrace(); } } }

 

 

循環接收消息代碼:

    /**
     * 循環讀取信息的線程
     * @author Administrator
     *
     */
    class ReadMsg extends Thread{
        @Override
        public void run(){
            byte[] buffer = new byte[1024];//定義字節數組裝載信息
            int bytes;//定義長度變量
            InputStream in=null;
            try {
                //使用socket獲得輸入流*
                in = socket.getInputStream();
                //一直循環接收處理消息*
                while(true){
                    if((bytes=in.read(buffer))!=0){
                        byte[] buf_data = new byte[bytes];
                        for (int i = 0; i < bytes; i++){
                            buf_data[i]=buffer[i];
                        }
                        String msg=new String(buf_data);//最后得到String類型消息
                        Utils.sonUiInfoMsg(msg);
                    }
                    
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Utils.sonUiStateMsg("連接已斷開");
            }finally{
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

 

 

 發送消息代碼:

    /**
     * 發送消息
     * @param msg:發送的消息
     */
    public void sendMessage(String msg) {
        if(socket==null){Toast.makeText(getApplicationContext(), "未建立連接", 0).show();return;}//防止未連接就發送信息
        try {
            //使用socket獲得outputstream*
            OutputStream out=socket.getOutputStream();
            out.write(msg.getBytes());//將消息字節發出
            out.flush();//確保所有數據已經被寫出,否則拋出異常
            Toast.makeText(getApplicationContext(), "發送:"+msg, 0).show();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "發送失敗", 0).show();
        }
    }

 

 以上代碼中注釋最后*號的都是核心代碼

項目下載鏈接 https://files.cnblogs.com/files/sovagxa/%E8%93%9D%E7%89%99%E4%BC%A0%E8%BE%93.rar  (迅雷下載)

測試時用兩台手機測試,一個作為服務器端,一個作為客戶端。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM