我知道还有其他主题,但就我而言,我希望
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以建立连接时,它失败了.它检索一个通道错误的Url并抛出异常:javax.bluetooth.BluetoothConnectionException:连接失败;
我该如何解决这个问题?
解决方法
使用时我设法找到了一些电话ServiceRecords:
UUID[] uuidSet = new UUID[1]; uuidSet[0]=new UUID(0x0100); int[] attrIds = { 0x0100 }; System.out.println("\nSearching for service..."); agent.searchServices(attrIds,client);
并且您将在serviceSearch之后两次调用lock.notify(),并在servicesdiscovered函数中将其删除.
您还应该查看服务记录并查找您感兴趣的记录.该URL将说明btgoep://或btspp://
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,它只会找到我的手机默认注册的那些,我的音频网关和电话簿OBEX推送等.
编辑—我有同样的问题,但意识到我还没有实际调用listenUsingInsecureRFCOMMSocket.然后它没有注册服务记录.但在那之后它运作得很好.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。