2011-06-25 84 views
1

我有兩個Android設備,我想要使用藍牙連接,並通過RFCOMM通道傳輸數據。我只有一個一個設備接收數據,而其他設備發送它...兩個Android設備之間的RFCOMM連接?

使用此代碼,我能夠連接到其他設備,並開始收聽RFCOMM通道:

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class }); 
socket = (BluetoothSocket) m.invoke(device, 2); 
socket.connect(); 

class BasicThread implements Runnable{  

     public void run() { 
      try { 
       InputStream stream = socket.getInputStream(); 
       BufferedReader r = new BufferedReader(new InputStreamReader(stream)); 
       while (true){ 
        Log.d("myapp", "now listening..."); 
        latestLine = r.readLine(); 
        Log.d("myapp", latestLine); 
       } 
      } catch (IOException e) { 

      } 
     } 
    } 

    new Thread(new BasicThread()).run(); 

使用其他設備,我實現了一個監聽套接字是這樣的:

Method m = blue.getClass().getMethod("listenUsingRfcommOn", new Class[] { int.class }); 
BluetoothServerSocket socket = (BluetoothServerSocket) m.invoke(blue, 2); 

BluetoothSocket sock = socket.accept(); 

Log.d("myapp", "Connected...\n\n\n\n\n\n\n\n"); 

OutputStream s = sock.getOutputStream(); 
final PrintWriter out = new PrintWriter(s); 

它們都連接上的RFCOMM通道2,都可以看到海誓山盟,然而,第二設備始終保持擋在BluetoothSocket sock = socket.accept();

任何幫助?

+0

是否有一個不使用公共方法的原因http://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html –

+0

也你說如何連接通道2? –

回答

3

好的,我是新手,但我可以試着幫忙。所以這是我的經驗,我設法使用反射連接兩個設備。我的Android手機正在使用方法listenUsingInsecureRfcommOn接收數據,而其他設備是主設備通信並通過BT SPP發送數據。這個方法有問題,因爲它沒有可見的SDP記錄,所以我無法用其他設備檢測到它。因此,我使用Bluecove和Java SE嘗試連接到給定範圍內的每個端口來製作小型嗅探器。下面的代碼:

package application.test; 

import static java.lang.System.out; 

import java.io.InputStream; 
import java.io.PrintStream; 
import java.text.SimpleDateFormat; 

import javax.microedition.io.Connector; 
import javax.microedition.io.StreamConnection; 

public class RfCommClient { 

    public static void main(String args[]) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e1) { 
      e1.printStackTrace(); 
     } 

     String add = "btspp://8C71F894A36D:"; 
     String par = ";authenticate=false;encrypt=false;master=true"; 
     String url = null; 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd;HH-mm-ss-SSS"); 
     for (int i = 1; i < 15; ++i) { 
      try { 
       url = add + i + par; 
       out.format("Time: %s, port = %d\n", sdf.format(System.currentTimeMillis()), i); 
       StreamConnection conn = (StreamConnection) Connector.open(url); 
       PrintStream ops = new PrintStream(conn.openOutputStream()); 
       ops.println("Hi there..."); 

       // response 
       Thread.sleep(1000); 

       InputStream is = conn.openInputStream(); 
       byte[] resp = new byte[5]; 
       int r = is.read(resp); 

       out.println("r = " + r + ", response = " + new String(resp, "US-ASCII")); 

       Thread.sleep(10 * 1000); 
       conn.close(); 
      } catch (Exception e) { 
       out.println("Exception occured, time = " + sdf.format(System.currentTimeMillis()) + ", i = " + i); 
       //e.printStackTrace(); 
      } 
     } 

    } 
} 

我已經學到了一些端口被採取,並且一些端口不能使用(如文檔中說,例如端口0)。例如,我相信端口2是被佔用的,因爲當我向它發送一些數據時,我收到5個以ERR開頭的字符:)。

而另一方面,我的線程仍在等待?! :) 這導致我們注意到另一件事情,端口(或通道)並不總是映射到所需的數字。例如,對於我經常發生的事情,我想發送端口15上的東西,但在Android上,等待端口9的線程收到數據:) 因此,我建議,檢查哪個端口是真正分配的! 您可以使用我發佈的代碼來實現該目標。 另一件事,這裏是一個linkchannelPicker函數,它在使用普通API時選擇通道,如果我沒有弄錯,在一些常量裏面應該代表保留通道。

我只是發現了一些,我的註冊端口的代碼略有不同,這裏是我如何做到這一點:

 Method m = cba.getDeclaredMethod("listenUsingInsecureRfcommOn", int.class); 
     ss = (BluetoothServerSocket) m.invoke(BluetoothAdapter.getDefaultAdapter(), port); 

無論如何,我知道這可能爲時已晚,但是,也許有人在未來有類似的問題。