2

Android 4.3 で Bluetooth デバイスに接続する必要があるアプリケーションを開発しています。

そして、AndroidアプリからCC2541 Keyfobの名前を変更したいです。

私のアイデアは次のとおりです。

1. Android アプリケーションで必要な名前を入力できるプレーン テキストがあります。

2.名前を入力したら、ボタンを押してこのテキストを送信します。

3. CC2541 が Android アプリケーションからこのテキストを受信すると、keyfobdemo.c の次のコードの deviceName[] のテキストが変更されます。

static uint8 deviceName[] =
{
// complete name
0x0b, // length of first data structure (11 bytes excluding length byte)
0x09, // AD Type = Complete local name
0x4b, // 'K'
0x65, // 'e'
0x79, // 'y'
0x66, // 'f'
0x6f, // 'o'
0x62, // 'b'
0x64, // 'd'
0x65, // 'e'
0x6d, // 'm'
0x6f, // 'o'
};

次のような質問:

1.Android アプリ 4.3 で CC2541 キーフォブにテキスト データを送信する方法 ??

2.CC2541側でテキストデータを受信するには??

3.プロファイルを使用する必要がありましたか??

私の英語とこれらの質問について申し訳ありません。

ご指示いただきありがとうございます。


編集

Device Name サービスを取得するために 0x2A00 を使用しようとしましたが、Device_Name 関数を呼び出すと機能しませんでした。

Name_Service が null です。

private static final UUID Device_Name_UUID = UUID.fromString("00002a00-0000-1000-8000-00805f9b34fb");
private static final UUID Write_UUID = UUID.fromString("00001800-0000-1000-8000-00805f9b34fb");





    public void Device_Name(){
        BluetoothGattService Name_Service = mBluetoothGatt.getService(Write_UUID );
        if(Name_Service == null) {
            Log.d(TAG, "Name_Service service not found!");
            return;
        }

        BluetoothGattCharacteristic DeviceName = Name_Service.getCharacteristic(Device_Name_UUID);
        if(DeviceName == null) {
            Log.d(TAG, "DeviceName charateristic not found!");
            return;
        }



    }


Log.v(TAG, "readCharacteristic(DeviceName) = " + mBluetoothGatt.readCharacteristic(DeviceName));

String i = "123";       
DeviceName.setValue(i);
Log.v(TAG, "writeCharacteristic(DeviceName) = " + mBluetoothGatt.writeCharacteristic(DeviceName));

次のログが表示されます。

V/BluetoothLeService( 3680): readCharacteristic(DeviceName) = true
V/BluetoothLeService( 3680): writeCharacteristic(DeviceName) = false
D/audio_hw_primary( 1752): found out /dev/snd/pcmC0D0p
W/audio_hw_primary( 1752): out_write() limiting sleep time 45351 to 23219
W/audio_hw_primary( 1752): out_write() limiting sleep time 34263 to 23219
W/audio_hw_primary( 1752): out_write() limiting sleep time 33696 to 23219
D/BtGatt.btif( 2646): btif_gattc_upstreams_evt: Event 3
I/BtGatt.btif( 2646): set_read_value unformat.len = 13 
D/BtGatt.GattService( 2646): onReadCharacteristic() - address=90:59:AF:0B:8A:AB, status=0, length=13
D/BluetoothGatt( 3680): onCharacteristicRead() - Device=90:59:AF:0B:8A:AB UUID=00002a00-0000-1000-8000-00805f9b34fb Status=0

正常に読み取られ、デバイスの名前を取得できます。

そして、Bluetooth Page-Device Nameを参照します。形式は UTF-8 文字列です。しかし、それは Characteristic false を書き込みます。

4

2 に答える 2

3

Android BLE API についてはわかりませんが、これが Bluetooth Low Energy でどのように機能するかはわかります。

デバイス名は GATT サーバー (cc2541 デバイスのローカル データベース) に保存されます。BLE デバイスに接続すると、ディスカバーを実行してデータベースの構造を把握し、デバイス名の ATT ハンドルを見つけることができるはずです。

GATT サーバーは、UUID (属性のタイプを大まかに定義)、属性ハンドル (GATT サーバーのこのインスタンスで使用される識別子)、および値を持つ属性で構成されます。[1] によると、デバイス名の UUID は 0x2A00 です。したがって、タイプで検索して、この UUID でハンドルを見つけることができます。

UUID を取得したら、Android API で GATT クライアントを使用して、新しい値でこのハンドルに書き込み要求を送信するだけです。

編集: API を見ると、getService(0x18, 0x00) [2] を使用してプライマリ サービス (デバイス名を含む必要があります) を取得し、次に writeCharacteristic[3] を使用して名前を更新する必要があると思います。

[4] から、コードは次のようになります (テストされていません)。

public void writeCharacteristic(byte[] value) {
    BluetoothGattService gap_service = mBluetoothGatt.getService(
            UUID.fromString("00001800-0000-1000-8000-00805F9B34FB"));
    if (gap_service == null) {
        System.out.println("gap_service null";);
        return;
    }
    BluetoothGattCharacteristic dev_name = gap_service.getCharacteristic(
            UUID.fromString("00002A00-0000-1000-8000-00805F9B34FB"));
    if (dev_name == null) {
        System.out.println("dev_name null";);
        return;
    }
    dev_name.setValue(value);
    boolean status = mBluetoothGatt.writeCharacteristic(dev_name);
    System.out.println("Write Status: " + status);
}
于 2013-11-11T18:35:31.630 に答える