2017-04-18 40 views
1

DBUS APIを使用してGATT通知を送信する方法を教えてもらえますか?現在私はbluez5.43を使用しています。私はサービスを登録し、通知を送信しようとしています。私はtoolsディレクトリの下にあるgatt-service.cのリファレンスを取ってきました。ソースコードを見ると、その特性にはいくつかの特性メソッドが登録されています。それらの1のうちdbus apiがbluezでGATT通知を送信するために

GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chr_start_notify) 

ですが、私はchr_start_notify

に移動したとき、私は

static DBusMessage *chr_start_notify(DBusConnection *conn, DBusMessage *msg, void *user_data) 
{ 
    return g_dbus_create_error(msg, DBUS_ERROR_NOT_SUPPORTED, "Not Supported"); 
} 

以下の誰もが、少なくともこれを処理するための任意のDBUSのAPIがある私に言うことができます参照してください、またはdbusはGATTサーバ通知をまだサポートしていませんか?

答えて

0

私も同じ問題がありましたが、回避策が見つかりました。

あなたの特性に通知を有効にすると、この2次の行は、特性現在の値を設定しますとのbluezがスタックにそれを処理し、すべての加入者

gatt_characteristic1_set_value(interface,value); 
g_dbus_interface_skeleton_flush(G_DBUS_INTERFACE_SKELETON(interface)); 

を通知しますあなたのクライアント場合は、一例として、実行することができますスレッドはX秒ごとにこの関数を呼び出し、クライアントにはX秒ごとに通知されます。

EDIT:

GattCharacteristic1はC Dバス・オブジェクトは、XMLファイルからgdbus、コード生成によって作成されます。 https://developer.gnome.org/gio/stable/gdbus-codegen.html

お手伝いすると、これは私がBlueZ API docにしたがって書いた私のxmlファイルです。

<?xml version="1.0" encoding="UTF-8"?> 
<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd"> 
    <interface name="org.bluez.GattCharacteristic1"> 
     <property name="UUID" type="s" access="read" /> 
     <property name="Service" type="o" access="read" /> 
     <property name="Value" type="ay" access="read" /> 
     <property name="Notifying" type="b" access="read" /> 
     <property name="Flags" type="as" access="read" /> 

     <method name="ReadValue"> 
      <arg name="options" type="a{sv}" direction="in" /> 
      <arg name="value" type="ay" direction="out" /> 
     </method> 
     <method name="WriteValue"> 
      <arg name="value" type="ay" direction="in" /> 
      <arg name="options" type="a{sv}" direction="in" /> 
     </method> 
     <method name="StartNotify"/> 
     <method name="StopNotify"/> 
    </interface> 
</node> 

あなたはGATTのbluezオブジェクトを記述するXMLファイル(org.bluez.GattCharacteristic1.xmlという名前を)持ってたら、今すぐ "C Dバスオブジェクト"

gdbus-codegen --generate-c-code org_bluez_gatt_characteristic_interface --interface-prefix org.bluez. org.bluez.GattCharacteristic1.xml 

を生成するために、GBUS-コード生成を使用します

あなたのソースコードにCとHファイルを追加し、次の行は、私はDバス

const char* char_flags[] = {"read", "write", "notify", "indicate", NULL}; 

GattCharacteristic1* interface = gatt_characteristic1_skeleton_new(); 
// dbus object properties 
gatt_characteristic1_set_uuid(interface,UUID); 
gatt_characteristic1_set_service(interface,service_name); 
gatt_characteristic1_set_value(interface,value); 
gatt_characteristic1_set_notifying(interface,notifying); 
gatt_characteristic1_set_flags(interface,flags); 
// get handler (for example), please read doc from gdbus-codegen provide above. 
g_signal_connect(interface, 
     "handle_read_value", 
     G_CALLBACK(dbus_client_on_handle_gatt_characteristic_read_value), 
     NULL); 
// register new interface on object 
g_dbus_object_skeleton_add_interface(object,G_DBUS_INTERFACE_SKELETON(interface)); 
// exports object on manager 
g_dbus_object_manager_server_export(server_manager,object); 
時に1つのGATTのbluez特性を作成する方法を示しています

必要に応じてフラグを編集してください。インタフェースオブジェクトにポインタを置いて、最初の答えで私が提供する行を使用してください。 GBusの文書は十分に文書化されていますので、必要なものをすべて見つけることができれば幸いです。

+0

ちょっとフランソワ、情報ありがとう。より詳細な情報を提供できますか?gatt_characteristic1_set_value APIが見つかりませんでした。どこに宣言されているのですか?また、ここでインターフェイスとはどういう意味ですか? –

+0

私は現在bluez5.43を使用していますが、コードでgatt_characteristic1_set_value宣言を見つけることができませんでした –

関連する問題