Bluetoothのデータ転送の問題


Bluetoothデータ転送の問題
Bluetoothにとってgoogleはすでに多くのapiをカプセル化しているので使用するのは難しくないが、実際の開発でBluetooth開発が最も頭を悩ませている問題はapiを呼び出す方法ではなく、長い接続、データの継続、ハードウェアの受信速度などのデータのインタラクティブな面である.
Bluetoothを開くにはいくつかの方法がありますか?
まず、いくつかの一般的な開き方を理解します.
  • 第1の方法は比較的簡単で、直接システムダイアログボックスを呼び出してBluetoothを起動する:Android Manifestファイルに必要な権限を追加し、高バージョンでも動的な権限を必要としない:
  • <uses-permission android:name="android.permission.BLUETOOTH" />
    //       
    startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
  • 第2の方法は、静かに開いて、方法1のダイアログボックスはありません:Android Manifestファイルに必要な権限を追加します:
  • AndroidManifestに必要な権限を配置する.
  • は、6.0のランタイム権限をjavaで動的に付与する.
  • 最終直接調整apiオープン
  • BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    mBluetoothAdapter.enable(); //  
    //mBluetoothAdapter.disable(); //  

    Bluetoothデバイスの検索方法
    検索には、アクティブ検索とパッシブ検索があります.
  • プロアクティブ検索
  • Bluetooth Adapterオブジェクトを作成する
  • ペアのBluetoothデバイスのリスト
  • は、送受信ブロードキャスト
  • を定義する.

    BluetoothのUUIDは何ですか?何の役に立つの?
    UUID(Universally Unique Identifier)は定義を統一的に表す.Bluetoothはシリアルポートを介して送信ATコマンドである、Bluetoothはデフォルトではデータモードである、ATコマンドモードとして設定するが、UUIDは出荷前に設定されている.Bluetoothデバイスの場合、サービスごとに対応するUUID(一意)がある.例えば: :00001104-0000-1000-8000-00805F9B34FB
    :00001106-0000-1000-8000-00805F9B34FB
    Bluetoothを使用したデータ転送方法
    Bluetoothモジュール通信の最も重要な点は、Socketと同様のデータの送信と受信です.
  • ネットワークでは、SocketおよびServer Socketを使用してクライアントおよびサービス側のデータの読み書きを制御します.
  • であり、Bluetooth通信もクライアントとサービス側Socketによって行われる.BluetoothクライアントSocketはBluetoothSocket、Bluetoothサービス側SocketはBluetoothServer Socketです.この2つのクラスはandroidですbluetoothパッケージにあります.
  • BluetoothSocketでもBluetoothServer Socketでも、UUID(グローバル一意識別子、Universally Unique Identifier)が必要です.UUIDはSocketのポートに相当し、BluetoothアドレスはSocketのIPに相当します.

  • 実際の開発において注意すべき点
    注意すべき1.I/Oプログラミングに関わるため、両端の符号化"utf-8"が一致することに注意する必要がある.2.クライアントとサービス側のUUIDも同じである.3.ブルートゥースは下位データ転送に属するので、実際に開発するより多くの送信は16進数データである.4.I/Oプログラミングに関わるため、スレッド制御(同期、ロック機構)の使用に注意する必要がある.5.大容量バイト配列の送信に注意すべき点.6.ユーザーのより良い健康診断のために流量の過度な浪費を避けるために、ブロック式のInputStreamを使って読み取る.
    1.I/Oプログラミングに関わるため、両端の符号化"utf-8"が一致することに注意する.os.write("datas....".getBytes("utf-8"));
    2.クライアントとサービス側のUUIDも同じである.
    //   Socket
    device.createRfcommSocketToServiceRecord(MY_UUID);
    //   Socket
    mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);

    3.ブルートゥースは下位データ転送に属するので、実際に開発するより多くの送信は16進数データである.
    public static String bytesToHexString(byte[] bytes) {
            String result = "";
            for (int i = 0; i < bytes.length; i++) {
                String hexString = Integer.toHexString(bytes[i] & 0xFF);
                if (hexString.length() == 1) {
                    hexString = '0' + hexString;
                }
                result += hexString.toUpperCase();
            }
            return result;
        }

    5.大容量バイト配列の送信に注意すべき点.
    64バイトの配列を送信する必要があります.一度に送信すると、データ受信の遅延時間が設定されているため、チップマシンでは応答がない可能性があります.Bluetoothモジュールとの通信を円滑にするには、この時間差を考慮することが重要です.バイトの送信速度を調整することは、非常に重要な一歩となります.注目すべきは、データの送信が非常に速いため、単片機ではタイムリーに処理できないため、送信後の遅延は非常に重要である.私たちのシングルチップマシンの遅延は10ミリ秒なので、各バイトを送信した後、10ミリ秒遅延して次のバイトを送信することを選択しました.
     for (byte b : bytes) {
         out.write(b);
         Thread.sleep(10);
     }

    6.ユーザーのより良い健康診断のために流量の過度な浪費を避けるために、ブロック式のInputStreamを使って読み取る.
    InputStreamを使用する場合は、InputStreamの読み取りがブロックされていることに注意してください.この点は一般的には私たちのプログラムに影響しませんが、この状況を覚えておくことはコードの設計にとって非常に重要であり、特にユーザーの体験を考慮する際に重要です.パラメータなしread()は、ストリームから1バイトずつしか読み取らないので効率は非常に低いですが、単純で整数値を読み取るような場合はread()を使うといいですが、16進文字列なら?InputStreamを使用する.read(byte[]b)またはInputStream.read(byte[]b,int off,int len)メソッドは,一度に複数バイトを読み取ることができる.複数のバイトを読み込む場合、InputStreamをよく使用します.AVailable()メソッドは、データストリーム内の可読バイトの個数を取得する.ローカルデータを読み取る場合、この方法は非常によく機能しますが、非ローカルデータを読み取る場合、100バイト、90バイト、さらには0バイトを読み出すなど、バイト漏れの問題が発生する可能性があります.0の場合、シングルチップマシン側が応答していないか、バイトが送信されていない場合は、データを取得できるようにサイクルが必要です.
      int count = 0;
      while (count == 0) {
       count = in.available();
      }
      byte[] bytes = new byte[count];
      in.read(bytes);
                90            。      ,        :
      byte[] bytes = new byte[count];
      int readCount = 0; //             
      while (readCount < count) {
       readCount += in.read(bytes, readCount, count - readCount);
      }

    一部参照リンク