无法连接到android上的蓝牙插座

时间:2012-12-26 12:41:16

标签: android bluetooth bluecove

我试图通过蓝牙从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();在android?

1 个答案:

答案 0 :(得分: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

如果不是这样的话。 两端的发现都失败了吗?你能看到两端的设备吗?你可以在哪一方打印这个名字? 你可能想看看谷歌的蓝牙示例程序。并用它来帮助你开始。