无法连接到android上的蓝牙套接字

Posted

技术标签:

【中文标题】无法连接到android上的蓝牙套接字【英文标题】:unable to connect to bluetooth socket on android 【发布时间】:2012-12-12 00:28:51 【问题描述】:

我正在尝试通过蓝牙将消息从 android 客户端发送到 Mac OS X。 我在 Mac OS X Snow Leopard 上使用 bluecove 2.0.1 Java 蓝牙库。

服务器代码:

public class EchoServer2 
private static final String UUID_STRING = "00001101-0000-1000-8000-00805F9B34FB"; // 32 hex digits
private static final String SERVICE_NAME = "echoserver";

private LocalDevice mLocalDevice;

public EchoServer2() 
    try 
        mLocalDevice = LocalDevice.getLocalDevice();
     catch(IOException e) 
        System.err.print("Error connection to bluetooth");
       


public void start() throws IOException 
    StreamConnectionNotifier connectionNotifier =
        (StreamConnectionNotifier) Connector.open(
                "btspp://localhost:" + UUID_STRING +
                ";name=" + SERVICE_NAME + ";authenticate=false");

    System.out.println("Bluetooth Address: " + mLocalDevice.getBluetoothAddress());

    System.out.println("Waiting for a connection...");
    StreamConnection streamConnection = connectionNotifier.acceptAndOpen();

    System.out.println("Found a new device.");

    RemoteDevice device = RemoteDevice.getRemoteDevice(streamConnection);
    System.out.println("New Device connected: " + device.getFriendlyName(false).toString());

    DataInputStream is = streamConnection.openDataInputStream();

    byte[] bytes = new byte[1024];
    int r;
    while((r = is.read(bytes)) > 0) 
        System.out.println(new String(bytes, 0, r));
    


Android 客户端代码:

public class MainActivity extends Activity 

private static final String TAG = "MainActivity";

EditText editText;
TextView textView;

String send_msg;
String rcv_msg;

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // 32 hex digits

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d(TAG, "onCreate");

    editText = (EditText) findViewById(R.id.edit_msg);
    textView = (TextView) findViewById(R.id.rcv_msg);

    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

    if(adapter == null) 
        textView.append("Bluetooth NOT Supported!");
        return;
    

    // Request user to turn ON Bluetooth
    if(!adapter.isEnabled()) 
        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(intent, RESULT_OK);
    






@Override
public boolean onCreateOptionsMenu(Menu menu) 
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;


public void onClick(View view) 
    Log.d(TAG, "onClick");
    new SendMessageToServer().execute(send_msg);


private class SendMessageToServer extends AsyncTask<String, Void, String> 
    @Override
    protected String doInBackground(String... msg) 
        Log.d(TAG, "doInBackground");

        BluetoothSocket clientSocket = null;
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        mBluetoothAdapter.enable();
        // Client knows the server MAC address 
        BluetoothDevice mmDevice = mBluetoothAdapter.getRemoteDevice("00:25:00:C3:1C:FE");
        Log.d(TAG, "got hold of remote device");
        Log.d(TAG, "remote device: " + mmDevice.getName().toString());

        try 
            // UUID string same used by server 
            clientSocket = mmDevice.createInsecureRfcommSocketToServiceRecord(MY_UUID);

            Log.d(TAG, "bluetooth socket created");

            mBluetoothAdapter.cancelDiscovery();    // Cancel, discovery slows connection

            clientSocket.connect();
            Log.d(TAG, "connected to server");

            DataInputStream in = new DataInputStream(clientSocket.getInputStream());
            DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());

            out.writeUTF(msg[0]);           // Send message to server
            Log.d(TAG, "Message Successfully sent to server");
            return in.readUTF();            // Read response from server
         catch (Exception e) 

            Log.d(TAG, "Error creating bluetooth socket");
            Log.d(TAG, e.getMessage());

            return "";
        

    

    @Override
    protected void onPostExecute(String result) 
        Log.d(TAG, "onPostExecute");
        rcv_msg = result;
        textView.setText(rcv_msg);
    


即使客户端和服务器的UUID 相同,我也无法连接到服务器。 Android 抛出异常:服务发现失败。 但是我可以在服务器上打印远程设备(客户端)的名称。因此acceptAndOpen() 无法接受套接字连接。

请帮助我理解为什么我无法clientSocket.connect();在安卓上?

【问题讨论】:

你解决了吗?我遇到了完全相同的问题,但我似乎无法让它工作。 【参考方案1】:

我猜测一下,这与您使用的 UUID 编号有关。它们仅取决于您使用的设备类型。因此,请确保您查找它们并且它们对于 android 设备是正确的。当我在做android时,这让我很长一段时间。 UUID 不是您设置的。 这是一个链接 How can I get the UUID of my Android phone in an application? 或这个 Android - Get Bluetooth UUID for this device

如果不是这样。 发现两端都失败了吗?你能看到两端的设备吗?你可以在哪一面打印名字? 你可能想看看谷歌的蓝牙示例程序。并以此为起点。

【讨论】:

以上是关于无法连接到android上的蓝牙套接字的主要内容,如果未能解决你的问题,请参考以下文章

使用蓝牙无法同时将超过 4 个从机连接到 master-android

无法通过蓝牙将Arduino Uno连接到Blynk

Expo react-native 将无法连接到 socketio(Android 和 iOS)

Android 手机从蓝牙更改为 BLE 后无法连接到树莓派

Android LocalSocket客户端无法连接到抽象命名空间中的本机服务套接字

Android蓝牙聊天示例无效,无法连接设备