android BLE


android4.3 neiはbleを内蔵し、上位appに対応するインタフェースを提供してBLE機能を使用します.
BLEの主なプロトコルおよび用語:
GenericAttribute Profile (GATT)
BLE上位層のプロトコルはすべてGATTに基づいており、BLE接続によって属性値を送信/受信する共通の仕様である.
bluetoothSIGは多くのbleプロトコルを定義している.
AttributeProtocol (ATT)
GATTはATTの上に構築されています.GATT/ATTとも呼ばれています.
ATTはbleデバイス上で動作するので最適化され,可能な限り少ないバイトを占有する.
各属性にはUUIDが指定され、ATTを介して伝送される属性はビット特性(characteristics)またはサービス(services)にフォーマットされる.
Characteristic
1つの特性は、この特性値を記述するために単一の値と0〜n個の記述子(Descriptor)を含む.1つの特性は1つのタイプと見なすことができる.
Descriptor
記述子は、プロパティの値を記述するために使用されるプロパティとして定義されます.
例えば、特性値の取値範囲、特性値の単位等を規定する
Service
サービスはプロパティのセットです.たとえば、心拍数検出サービスには、心拍数測定のプロパティが含まれます.
役割と役割
中心と周辺:BLE接続自体に適用され、中心ロールデバイスはブロードキャストをスキャン/検索し、周辺デバイスロールはブロードキャストを発行する.
GATTserver vs. GATT client:
これは,2つのデバイスが接続を確立した後にどのようにインタラクションするかを決定する.
Android携帯電話とBLEデバイスの違い:携帯電話サポートセンターロール(centralrole)、BLEデバイスサポートperipheralrole.
接続が確立されると、gattデータの相互転送が開始され、転送されたデータの種類の1つに応じてサーバとして機能することができる.
BLEデバイスが携帯電話にデータを報告したい場合は、BLEデバイスのセンサをサーバにする可能性があります.BLEデバイスが携帯電話からのデータを受信する準備ができている場合、携帯電話のセンサーはサービス側として機能します.
以上の例ではandroid appはGATTクライアントであり、GATTclientはGATTサーバからデータを取得する.GATTserverとしてandroidアプリを設計することもできます.
BLE権限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

BLEをサポートしていないデバイスにappを提供するにはandroid:required=「fasle」を設定し、実行時に判断する必要があります.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}

BLEの設定
1:BluetoothAdapterの取得
Bluetooth AdapterはすべてのBluetooth機能に必要で、システム全体に1つのBluetooth Adapterしかなく、Bluetooth Adapterを取得してから様々なBluetoothの操作が可能になります.
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

2:Bluetoothの起動
isEnabled()で起動するかどうかを判断し、起動していない場合は、次のように起動します.
private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

3:BLEデバイスの検索
startLeScanでLEデバイスを検索し、パラメータとしてLeScanCallbackを実現します.
注意:1:検索したデバイスが見つかったら、すぐにスキャンを停止します.
2:スキャンタイムアウトを設定し、ループスキャンを回避します.
public class DeviceScanActivity extends ListActivity {
    private BluetoothAdapter mBluetoothAdapter;
    private boolean mScanning;
    private Handler mHandler;
    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 10000;
    ...
    private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);
            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        ...
    }
...
}

特定のタイプのLEデバイスを検索する必要がある場合は、startLeScan(UUID[],BluetoothAdapter.LeScanCallback()を使用して、デバイスがサポートするサービスのUUID配列を提供する必要があります.LeScanCallback
private LeDeviceListAdapter mLeDeviceListAdapter;
...
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi,
            byte[] scanRecord) {
        runOnUiThread(new Runnable() {
           @Override
           public void run() {
               mLeDeviceListAdapter.addDevice(device);
               mLeDeviceListAdapter.notifyDataSetChanged();
           }
       });
   }
};

注意:クラシックBluetoothを検索するか、BLEを検索するか、両方を同時に検索することはできません.
GATTserver接続
接続ゲートを使用してBLEデバイスのGATTサーバに接続し、
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

BluetoothGattインスタンスが返され、このインスタンスによってGattclientの様々な操作が可能になります.呼び出し元(android app)はGattclientです.GattCallbackは、クライアントに結果を提供するために使用されます.
BLEのプロパティを読み込む
AndroidappがGatt serverに接続されてサービスが見つかった場合、属性の読み書きが可能になります.
ガットの通知を受け取る
通常、BLEデバイスの特性が変更された場合、BLEappは通知される必要があります.
setCharacteristicNotificationメソッドを使用して、プロパティの通知を設定します.
private BluetoothGatt mBluetoothGatt;
BluetoothGattCharacteristic characteristic;
boolean enabled;
...
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
...
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
        UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);

1つのプロパティが通知として使用可能に設定されると、リモートデバイスのプロパティが変更され、onCharacteristicChangedがトリガーされます.
コールバック.
@Override
// Characteristic notification
public void onCharacteristicChanged(BluetoothGatt gatt,
        BluetoothGattCharacteristic characteristic) {
    broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

クライアントを閉じる
BLEデバイスとの通信が終了したら、リソースを解放する必要があります.
public void close() {
    if (mBluetoothGatt == null) {
        return;
    }
    mBluetoothGatt.close();
    mBluetoothGatt = null;
}