5

Bluez ソースの plugin/gatt_example.c を拡張して、成功せずに BLE 通知機能を試しています。Bluez ソースに含まれているサンプル Battery Service を使用しています。READ および NOTIFY プロパティを持つ 1 つの特性があります。dbus メソッドを追加して attrib_db_update() を呼び出し、bluetooth デーモンの外部から特性値を更新します。

これで、どのクライアント (Nexus4 と Android 4.3 および iPhone (LightBlue 無料アプリ)) を接続し、通知を開始できます (記述子 CCC 通知フラグを設定します)。(注: ccc 記述子 char にはデフォルトの auth パーミッションがあるため、iPhone から CCC (開始通知) を変更すると bluez がエラーを返すようになります: 権限を承認しません。後で承認を処理する予定なので、一時的にデフォルトのパーミッションを none に変更します、および iPhone は CCC 通知フラグを設定できます)。

問題は、クライアント (Android または iOS の両方) が通知を開始しても、attrib_db_update() を呼び出しても bluez がクライアントに通知を送信しないことです (hcidump で監視し、クライアントにパケットを送信しません)。

質問: attrib_db_update() 以外に、bluez がクライアントに通知を送信するために必要な手順はありますか? サンプルソースへのリンクをいただければ幸いです。PS。bluez をペリフェラル + gatt サーバー構成 (plugin/gatt_example.c のバッテリー サービスと同様) として使用し、その逆ではありません。

ありがとう。

=== 更新 (コメントの書式設定がどのように機能するのかわからないので、ここに更新を追加します。)
プロファイル/アラートのサンプルについて:
はい、質問をする前にプロファイル/アラートを確認しました。もう 1 つの問題は、それらのサンプルを実行できなかったことです (最初に質問した理由の 1 つです)。
profile/alert/server.c: attio_connected_cb() は、server.c の filter_devices_notify() によって登録されるコールバック関数です。btd_device_add_attio_callback() (src/device.c から) を使用します。さらにsrc/device.cをチェックすると、device->attribをチェックして、コールバックを実行する(最初にキューに挿入してからコールバックを実行する)か、デバイスが接続されるまでキューに挿入するかどうかを確認しているようです。
デバッグすると、既にデバイスを接続しているにもかかわらず、device->attrib が空のように見えます。

サンプル アラート プロファイルの実行/デバッグに関心がある場合 (ドキュメントがないため :( )。
次の場合 (564 行あたり) をコメントアウトします。これらのチェックには関心がありません...

    /*
        if (!g_str_equal(alert->srv, sender)) {
            DBG("送信者 %s はカテゴリ %s に登録されていません", sender,
                                    カテゴリー);
            btd_error_invalid_args(msg) を返します。
        }
    */

bluetoothd を実行します: ex. bluetoothd -n -d -p alert
startNotify までデバイスを接続します

他のコンソールからアラートを登録:

    dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.RegisterAlert" string:"simple" objpath:"/org/bluez/AlertAgent1"

新しいアラートを作成:

    dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.NewAlert" string:"simple" uint16:"1" string:"test"

次のbluetoothdのログを取得しました:

    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() ハンドル = 0x001c
    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() ハンドル = 0x0021
    bluetoothd[1928]: profile/alert/server.c:register_alert() RegisterAlert("シンプル", "/org/bluez/AlertAgent1")
    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() ハンドル = 0x001e
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() 0x1b6e718 登録された ATT 接続コールバック
    bluetoothd[1928]: src/device.c:device_set_auto_connect() 10:68:3F:E1:4E:F2 自動接続: 1
    bluetoothd[1928]: src/adapter.c:adapter_connect_list_add() /org/bluez/hci0/dev_10_68_3F_E1_4E_F2 が BlueZ 5.14 の connect_list に追加されました
    Bluetoothd [1928]: src/adapter.c:trigger_passive_scanning()
    bluetoothd [1928]: src/device.c:btd_device_add_attio_callback() device->attrib = false
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() cfunc = true
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() アイドル状態がありません
    bluetoothd[1928]: profile/alert/server.c:new_alert() NewAlert("シンプル", 1, "シンプル")
    bluetoothd[1928]: src/adapter.c:passive_scanning_complete() ステータス 0x03
    bluetoothd[1928]: 開始スキャンの戻りパラメータのサイズが正しくありません

メモ: device.c にデバッグ出力を追加します。device->attrib が空のようです。また、自動接続 (gatt サーバー/ペリフェラルが中央に接続する必要があるのはなぜですか?) は、不明な理由で失敗します。

4

1 に答える 1