藍牙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 (迅雷下載)
測試時用兩台手機測試,一個作為服務器端,一個作為客戶端。