Android Bluetoothプログラミングのポイント---16進数データの送信と受信方法

4140 ワード

最近のandroid Bluetooth開発プロジェクトも終わりに近づき、基本的な機能はすでに完成しており、インタフェースの設計しか残っていない.今は本当にほっとしました!
プログラミングの学習経験が1年しかない菜鳥として、これは私が独自に完成した商業的な製品であり、単片機のBluetoothモジュールとの下層通信にも関連しており、難易度は自然に大きい.最大の難易度は知識点が分からないのではなく、デバッグであり、干渉要因が多すぎるため、ソフトウェアの問題なのかハードウェアの問題なのかを見つけるのが難しいため、コードの中で必ず調整試験点を設置し、問題の問題点を検索しやすいようにしなければならない.
スレッドも考慮の要因です.I/Oに関するプログラミングは、スレッドの問題にかかわるため、小さな難題です.JAvaのスレッドライブラリは確かに便利で使いやすいが、正しく使用するには研究に値する話題であり、最悪の場合、スレッドテクニックをむやみに使用した結果、無駄なスレッドオーバーヘッドを招くことになる.
もちろん、ここのスレッドは非常に簡単で、同期、ロックメカニズムなどの高度な話題はまったく使われていません.基本的なスレッド知識はもう十分です.
Bluetoothモジュールとの通信で最も重要なのは、データの送信と受信です.最下位の操作なので、16進数のデータを送信することが多いです.
進数変換は私たちのプログラマーの必修科目であり、基本的な素質に属しています.ここでは、バイト配列を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;
    }

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

具体的な遅延時間とバイト送信速度は、シングルチップマシンのプログラムの設定を見なければならない.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);
  }

JavaのAPIはread()メソッドが私たちが望んでいるバイト数を読み取ることを保証できないことを明確に教えてくれているので、このように書いたほうがいいです.これにより、16進数データの送信と読み取りを解決できます.