web-dev-qa-db-ja.com

Bluetooth経由のAndroidアプリでRaspberry Piに接続する方法

アプリを使用して、Bluetooth経由でスマートフォンをRaspberry Piに接続するのに問題があります。

私の状況:

Raspberry PiをベースにしたBluetooth制御可能アプリケーションを開発しています。 bluetooth経由でRaspberry Piに接続し、アプリ「bluetoothターミナル」を使用してRFCOMMソケット経由でデータを送受信できます。 Raspberry Piは常にRFCOMM接続をリッスンしています。

私の目標:

ユーザーがBluetooth経由でRaspberry Piに接続できるアプリを開発したい。アプリは、piと通信できるようにRFCOMMソケットを開く必要があります。

私の問題:

私のアプリはRaspberry Piに接続できず、Raspberry PiのUUIDがわからないので、それが問題になると思います。

私のコード:

Javaプログラミングはまったく新しいので、何かおかしなことがあれば修正してください。これは私が接続しようとしている方法です。

        public void BTConnect() {

    final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothSocket socket = null;
    String RPi_MAC = "XX:XX:XX:XX:XX:XX";

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    // If there are paired devices
    if (pairedDevices.size() > 0) {

        // Loop through paired devices
        for (BluetoothDevice device : pairedDevices) {
            if (device.getAddress().equals(RPi_MAC)) {
                try {
                    socket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
                } catch (IOException e0) {
                    Log.d("BT_TEST", "Cannot create socket");
                    e0.printStackTrace();
                }

                try {
                    socket.connect();
                } catch (IOException e1) {
                    try {
                        socket.close();
                        Log.d("BT_TEST", "Cannot connect");
                        e1.printStackTrace();
                    } catch (IOException e2) {
                        Log.d("BT_TEST", "Socket not closed");
                        e2.printStackTrace();
                    }
                }
            }
        }
    }
}

接続するボタンをクリックすると、これはAndroid studio:

   W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
   D/BT_TEST: Cannot connect
   W/System.err: Java.io.IOException: read failed, socket might closed or timeout, read ret: -1
   W/System.err:     at Android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.Java:599)
   W/System.err:     at Android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.Java:610)
   W/System.err:     at Android.bluetooth.BluetoothSocket.connect(BluetoothSocket.Java:333)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity.BTConnect(MainActivity.Java:80)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity$1.onClick(MainActivity.Java:39)
   W/System.err:     at Android.view.View.performClick(View.Java:4856)
   W/System.err:     at Android.view.View$PerformClick.run(View.Java:19956)
   W/System.err:     at Android.os.Handler.handleCallback(Handler.Java:739)
   W/System.err:     at Android.os.Handler.dispatchMessage(Handler.Java:95)
   W/System.err:     at Android.os.Looper.loop(Looper.Java:211)
   W/System.err:     at Android.app.ActivityThread.main(ActivityThread.Java:5373)
   W/System.err:     at Java.lang.reflect.Method.invoke(Native Method)
   W/System.err:     at Java.lang.reflect.Method.invoke(Method.Java:372)
   W/System.err:     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1020)
   W/System.err:     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:815)

要約:

AndroidアプリからRaspberry Piに接続できるようにするには、次のようにします。

  • Raspberry PiのUUIDを知る必要がある場合は、どうすればわかりますか?
  • Androidアプリで別のアプローチを使用する必要がありますか?

この問題を修正する方法を知りたいので、どんな助けでも感謝します。

9
R_Zee

素早い回答

これで始めた方法と同様に、Bluetooth接続にはデバイスアドレスサービスUUIDの両方が必要です。

デバイスアドレス(ex:00:72:02:97:33:2C)は、ペアのデバイスから取得できます(または検出を許可することにより)。Androidサンプルアプリをご覧ください。

UUID(ex:00001101-0000-1000-8000-00805F9B34FB)は通常、特定の識別子でBluetoothサービスが実行されているサーバー部分で定義されます。

その最後の部分を避けて、単純なデータをやり取りしたいだけなら、Bluetoothシリアルポートを使用するデフォルトに依存できます。 From Android Bluetoothドキュメント:

ヒント:Bluetoothシリアルボードに接続する場合は、よく知られているSPP UUID 00001101-0000-1000-8000-00805F9B34FBを使用してみてください。ただし、Androidピアに接続している場合は、独自の一意のUUIDを生成してください。

詳しくは

Androidのドキュメントとサンプルコード

AndroidサンプルBluetoothChatは、2台のデバイス間の双方向通信を処理する方法の良い例です。Android.

Android Bluetoothドキュメントhttps://developer.Android.com/guide/topics/connectivity/bluetooth.html

Bluetoothチャットサンプルhttps://developer.Android.com/samples/index.html 。 [ファイル]> [新規]> [サンプルプロジェクト]を選択し、BluetoothチャットをAndroid Studio。

Android= Raspberry PiへのBluetooth接続(Python&Android code)

Raspberry Piでこのようなサービスを開始する方法は、このPython例: http://blog.davidvassallo.me/2014/05/11/Android-linux -raspberry-pi-bluetooth-communication / 。オンラインで利用できる多くのサンプルの1つに過ぎません。この例には、Androidコード。

シリアルポートのデフォルトUUIDの使用(C++コード)

C++コードを使用してRaspberry Piにそのようなことを実装する場合は、 http://people.csail.mit.edu/albert/bluez-intro/x502.html からドキュメントをお勧めします。

そのリンクには、サーバーとクライアントの両方のサンプルコードがあります。これはRFCOMM仕様とデフォルトのシリアルポートUUIDを使用しているため、UUIDを指定する必要はありません。

BlueTerm Androidオープンソースアプリ(Androidコード)

Androidからこれに接続する方法を調べると、おそらくBlueTerm Androidアプリが見つかります。これはオープンソースのアプリです。 https://github.com/johnhowe/BlueTerm/tree/master/src/es/pymasde/blueterm にあるすべてのソースでは、このシリアルポートサービスのUUIDを見つけることができます。

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

完全なBluetoothSerialServiceクラスは、メッセージをUIに戻す処理など、Bluetooth接続を管理するための優れた方法です。

8
hcpl

LinuxでBluetoothを使用するには、接続ポートを指定する必要があると思います。

      try {
            Method m = remoteDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
            try {
                BluetoothSocket tmp = (BluetoothSocket)m.invoke(remoteDevice, 1);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
1
Charein

uuidを知る必要はありません。クライアントとサーバーの両方で使用するuuidを設定する必要があります

0
Josue Martinez