簡體   English   中英

兩個Android設備之間的RFCOMM連接?

[英]RFCOMM connection between two Android devices?

我想使用藍牙連接兩個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(); ,但是,第二個設備始終在BluetoothSocket sock = socket.accept();處保持阻塞狀態BluetoothSocket sock = socket.accept();

有什么幫助嗎?

好的,我是新手,但我可以嘗試提供幫助。 因此,這是我的經驗,我設法使用反射連接了兩個設備。 我的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已被占用,因為當我向它發送一些數據時,我從ERR :)開始收到5個字符。

另一方面,我的線程還在等待嗎? :)這導致我們注意到另一件事,端口(或通道)並不總是映射到所需的數字。 例如,對我來說,經常發生我想在端口15上發送內容的情況,但是在Android上,等待端口9的線程接收到了數據:)所以我建議檢查一下真正分配的端口! 您可以使用我發布的代碼來實現。 另外,這是指向 channelPicker函數的鏈接channelPicker函數在使用普通API時選擇通道,如果我沒記錯的話,某些常量內部應表示保留的通道。

我只是注意到了一點,我注冊端口的代碼略有不同,這是我的操作方法:

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

無論如何,我知道這可能為時已晚,但也許將來有人遇到類似的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM