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 サーバー/ペリフェラルが中央に接続する必要があるのはなぜですか?) は、不明な理由で失敗します。