我是新手但我可以帮助你。 这是我的经验,我使用反射连接了两个设备。 我的Android手机正在使用方法 listenUsingInsecureRfcommOn 接收数据,而它的他设备是通信的主机,并发送数据。 这个方法有问题,因为它没有可以见的iframe记录,因这里我无法用它的他设备检测到它。 因此,我使用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 = %dn", 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接收数据:所以我建议检查哪个端口。 你可以利用我所发布的代码。 还有一个问题,这里是一个链接到函数,当我在使用普通API时选择通道,如果我没有错误,在某些常量中应该代表保留通道。

我只是注意到,注册端口的代码稍有不同,这是我的方法:Method m = cba.getDeclaredMethod("listenUsingInsecureRfcommOn", int.class);

ss = (BluetoothServerSocket) m.invoke(BluetoothAdapter.getDefaultAdapter(), port);

总之,我知道这可以能太晚了,但是,可以能未来的某个人会有相似的问题。

更多推荐