Bluetoothのデータ転送の問題
5700 ワード
Bluetoothデータ転送の問題
Bluetoothにとってgoogleはすでに多くのapiをカプセル化しているので使用するのは難しくないが、実際の開発でBluetooth開発が最も頭を悩ませている問題はapiを呼び出す方法ではなく、長い接続、データの継続、ハードウェアの受信速度などのデータのインタラクティブな面である.
Bluetoothを開くにはいくつかの方法がありますか?
まず、いくつかの一般的な開き方を理解します.第1の方法は比較的簡単で、直接システムダイアログボックスを呼び出してBluetoothを起動する:Android Manifestファイルに必要な権限を追加し、高バージョンでも動的な権限を必要としない: 第2の方法は、静かに開いて、方法1のダイアログボックスはありません:Android Manifestファイルに必要な権限を追加します: AndroidManifestに必要な権限を配置する. は、6.0のランタイム権限をjavaで動的に付与する. 最終直接調整apiオープン
Bluetoothデバイスの検索方法
検索には、アクティブ検索とパッシブ検索があります.プロアクティブ検索 Bluetooth Adapterオブジェクトを作成する ペアのBluetoothデバイスのリスト は、送受信ブロードキャスト を定義する.
BluetoothのUUIDは何ですか?何の役に立つの?
UUID(Universally Unique Identifier)は定義を統一的に表す.Bluetoothはシリアルポートを介して送信ATコマンドである、Bluetoothはデフォルトではデータモードである、ATコマンドモードとして設定するが、UUIDは出荷前に設定されている.Bluetoothデバイスの場合、サービスごとに対応するUUID(一意)がある.例えば:
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"が一致することに注意する.
2.クライアントとサービス側のUUIDも同じである.
3.ブルートゥースは下位データ転送に属するので、実際に開発するより多くの送信は16進数データである.
5.大容量バイト配列の送信に注意すべき点.
64バイトの配列を送信する必要があります.一度に送信すると、データ受信の遅延時間が設定されているため、チップマシンでは応答がない可能性があります.Bluetoothモジュールとの通信を円滑にするには、この時間差を考慮することが重要です.バイトの送信速度を調整することは、非常に重要な一歩となります.注目すべきは、データの送信が非常に速いため、単片機ではタイムリーに処理できないため、送信後の遅延は非常に重要である.私たちのシングルチップマシンの遅延は10ミリ秒なので、各バイトを送信した後、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の場合、シングルチップマシン側が応答していないか、バイトが送信されていない場合は、データを取得できるようにサイクルが必要です.
一部参照リンク
Bluetoothにとってgoogleはすでに多くのapiをカプセル化しているので使用するのは難しくないが、実際の開発でBluetooth開発が最も頭を悩ませている問題はapiを呼び出す方法ではなく、長い接続、データの継続、ハードウェアの受信速度などのデータのインタラクティブな面である.
Bluetoothを開くにはいくつかの方法がありますか?
まず、いくつかの一般的な開き方を理解します.
<uses-permission android:name="android.permission.BLUETOOTH" />
//
startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothAdapter.enable(); //
//mBluetoothAdapter.disable(); //
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と同様のデータの送信と受信です.
実際の開発において注意すべき点
注意すべき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);
}
一部参照リンク