蓝牙连接问题

Bluetooth connection problems

我在 PC 上有一个客户端,在平板电脑上有一个服务器。我知道两者的 MAC 地址,这意味着我没有发现。

1. 如果我在客户端使用

connectString = "btspp://" + MACaddress + ":4;authenticate=false;encrypt=false;master=false";

连接正常。

如果我将 CN 号码 (4) 更改为其他任何内容,它都不起作用。这个数字是如何确定的?

2. 如果平板电脑是带有 Android 5.0.2 的三星平板电脑,一切正常 当我使用带有 Android 10 的 Qunyico 平板电脑时,它不起作用。我得到一个错误:连接失败; [10051] 尝试对无法访问的网络执行套接字操作。有什么问题?

PC 上的客户端 – 代码取自“Bluetooth-java-client-master”

public class IrcBluetoothClient {

private static void openConnection(String MACaddress) throws IOException {
// Tries to open the connection.
String connectString = "btspp://" + MACaddress + ":4;authenticate=false;encrypt=false;master=false";

StreamConnection connection = (StreamConnection) Connector.open(connectString);
if (connection == null) {
    System.err.println("Could not open connection to address: " + MACaddress);
    System.exit(1);
}

// Initializes the streams.
OutputStream output = connection.openOutputStream();
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(isr);

// Starts the listening service for incoming messages.
ExecutorService service = Executors.newSingleThreadExecutor();
service.submit(new IncomingMessagesLoggingRunnable(connection));

// Main loop of the program which is not complete yet
LocalDevice localDevice = LocalDevice.getLocalDevice();

while (true) {
    String toSend = reader.readLine();
    byte[] toSendBytes = toSend.getBytes(StandardCharsets.US_ASCII);
    output.write(toSendBytes);
    System.out.println("[" + localDevice.getFriendlyName() + " - " + 
           localDevice.getBluetoothAddress() + "]: " + toSend);

    System.exit(1);
}

平板电脑上的服务器 – 代码取自 https://developer.android.com/guide/topics/connectivity/bluetooth

private static final UUID A_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

public BTacceptConnections( BluetoothAdapter mBluetoothAdapter) {
 // Use a temporary object that is later assigned to mmServerSocket 
 // because mmServerSocket is final. 
BluetoothServerSocket tmp = null; 

try { 
    // A_UUID is the app's UUID string, also used by the client code.
    tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, A_UUID);
} catch (IOException e) { 
    Log.e(TAG, "Socket's listen() method failed", e);
} 
mmServerSocket = tmp;
 

// Closes the connect socket and causes the thread to finish.
public void cancel(){
    try {
        mmServerSocket.close();
    }catch (IOException e){
    }
    runFlag = 1;
}

//***********************************************************************************************
//
// This thread runs all the time listening for incoming connections.
//

    public void run() {
        BluetoothSocket socket = null;
        // Keep listening until exception occurs or a socket is returned.
    
        while (runFlag == 0) {
            try {
                socket = mmServerSocket.accept();
            } catch (IOException e) {
                Log.e(TAG, "Socket's accept() method failed", e);
                break;
            }
    
            if (socket != null) {           // If a connection was accepted
                // A connection was accepted. Perform work associated with
                // the connection in a separate thread.
                // manageMyConnectedSocket(socket);
            }else{
                try {
                   mmServerSocket.close();
                } catch (IOException e) {
                e.printStackTrace();
                } 
           break;
           }
    
         }

I know the MAC addresses for both which means I do not do discoveries.

官方Linux蓝牙协议栈BlueZ uses D-BUS API to establish bluetooth communication. If you check adapter-api,扫描将创建设备对象,您需要建立通信,这意味着发现不是 仅用于检索 MAC 个地址。

你的情况可能是一样的,我建议先做发现。