gpt4 book ai didi

android - 初始化 Android(服务器)和 pc(客户端)上的 bluecove 之间的蓝牙连接

转载 作者:太空宇宙 更新时间:2023-11-03 10:54:43 43 4
gpt4 key购买 nike

我知道还有其他相关主题,但就我而言,我希望 Android 设备将蓝牙连接初始化为服务器。我按照文档并以这种方式编写了服务器:

private class AcceptThread implements Runnable {
private final BluetoothServerSocket mmServerSocket;

public AcceptThread() {

BluetoothServerSocket tmp = null;
try {
tmp = mBluetooth.listenUsingRfcommWithServiceRecord(
"myService", mUuid);
} catch (IOException e) { }
mmServerSocket = tmp;
}

public void run() {
BluetoothSocket socket = null;
// Keep listening until exception occurs or a socket is returned
while (true) {
try {
System.out.println("SERVER SOCKET LISTENING");
socket = mmServerSocket.accept();
} catch (IOException e) {
break;
}
// If a connection was accepted
if (socket != null) {
System.out.println("SIGNAL RECEIVED");
// Do work to manage the connection (in a separate thread)
Toast.makeText(getApplicationContext(), "SIGNAL RECEIVED", Toast.LENGTH_LONG).show();
try {
mmServerSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}

/** Will cancel the listening socket, and cause the thread to finish */
public void cancel() {
try {
mmServerSocket.close();
} catch (IOException e) { }
}
}

另一方面,我有发现远程设备和服务的 bluecove API。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Vector;

import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;

/**
* A simple SPP client that connects with an SPP server
*/
public class SampleSPPClient implements DiscoveryListener{

//object used for waiting
private static Object lock=new Object();

//vector containing the devices discovered
private static Vector vecDevices=new Vector();

private static String connectionURL=null;

public static void main(String[] args) throws IOException {

SampleSPPClient client=new SampleSPPClient();

//display local device address and name
LocalDevice localDevice = LocalDevice.getLocalDevice();
System.out.println("Address: "+localDevice.getBluetoothAddress());
System.out.println("Name: "+localDevice.getFriendlyName());

//find devices
DiscoveryAgent agent = localDevice.getDiscoveryAgent();

System.out.println("Starting device inquiry...");
agent.startInquiry(DiscoveryAgent.GIAC, client);

try {
synchronized(lock){
lock.wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}


System.out.println("Device Inquiry Completed. ");

//print all devices in vecDevices
int deviceCount=vecDevices.size();

if(deviceCount <= 0){
System.out.println("No Devices Found .");
System.exit(0);
}
else{
//print bluetooth device addresses and names in the format [ No. address (name) ]
System.out.println("Bluetooth Devices: ");
for (int i = 0; i <deviceCount; i++) {
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(i);
System.out.println((i+1)+". "+remoteDevice.getBluetoothAddress()+" ("+remoteDevice.getFriendlyName(true)+")");
}
}

System.out.print("Choose Device index: ");
BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));

String chosenIndex=bReader.readLine();
int index=Integer.parseInt(chosenIndex.trim());

//check for spp service
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(index-1);
UUID[] uuidSet = new UUID[1];
uuidSet[0]=new UUID("4e3aea40e2a511e095720800200c9a66", false);

System.out.println("\nSearching for service...");
agent.searchServices(null,uuidSet,remoteDevice,client);

try {
synchronized(lock){
lock.wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}

if(connectionURL==null){
System.out.println("Device does not support Simple SPP Service.");
System.exit(0);
}

//connect to the server and send a line of text
StreamConnection streamConnection=(StreamConnection)Connector.open(connectionURL);

//send string
OutputStream outStream=streamConnection.openOutputStream();
PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(outStream));
pWriter.write("Test String from SPP Client\r\n");
pWriter.flush();


//read response
InputStream inStream=streamConnection.openInputStream();
BufferedReader bReader2=new BufferedReader(new InputStreamReader(inStream));
String lineRead=bReader2.readLine();
System.out.println(lineRead);


}//main

//methods of DiscoveryListener
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
//add the device to the vector
if(!vecDevices.contains(btDevice)){
vecDevices.addElement(btDevice);
}
}

//implement this method since services are not being discovered
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
System.out.println(servRecord[0].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false));
if(servRecord!=null && servRecord.length>0){
connectionURL=servRecord[0].getConnectionURL(ServiceRecord.AUTHENTICATE_ENCRYPT,false);
}
synchronized(lock){
lock.notify();
}
}

//implement this method since services are not being discovered
public void serviceSearchCompleted(int transID, int respCode) {
synchronized(lock){
lock.notify();
}
}


public void inquiryCompleted(int discType) {
synchronized(lock){
lock.notify();
}

}//end method



}

客户端找到了设备和服务,但是当从 ServiceRecord 检索 url 以建立连接时失败。它检索一个 channel 错误的 Url,并抛出异常:javax.bluetooth.BluetoothConnectionException: Failed to connect;

我该如何解决这个问题?

最佳答案

我在使用时设法找到了一些电话服务记录:

    UUID[] uuidSet = new UUID[1];
uuidSet[0]=new UUID(0x0100);
int[] attrIds = { 0x0100 };

System.out.println("\nSearching for service...");
agent.searchServices(attrIds, uuidSet, remoteDevice, client);

并且您将在 serviceSearch 之后调用 lock.notify() 两次,在 servicesDiscovered 函数中将其删除。

您还应该翻阅服务记录并寻找您感兴趣的那个。URL 将声明 btgoep://或 btspp://

当通过 for 循环搜索时,使用此代码列出服务名称

 for(int i = 0; i < servRecord.length; i++)
{
String url = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
DataElement serviceName = srs[i].getAttributeValue(0x0100);
if (serviceName != null) {
System.out.println("service " + serviceName.getValue() + " found " + url);
} else {
System.out.println("service found " + url);
}

我遇到了确切的问题,似乎 android api 没有向 SDP 注册 ServiceRecord,因此 Bluecove api 可以找到它。无论我使用什么 UUID,它只会找到我的电话注册为默认的 UUID,即音频网关和电话簿 OBEX 推送等。

编辑---我遇到了同样的问题,但意识到我实际上还没有调用 listenUsingInsecureRFCOMMSocket。然后它没有注册服务记录。但在那之后它工作得很好。

关于android - 初始化 Android(服务器)和 pc(客户端)上的 bluecove 之间的蓝牙连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7470499/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com