Ich versuche, ein Profil mit Bluez über D-Bus/Gio zu registrieren. Wenn ich RegisterProfile anrufe, geht alles gut. Ich überprüfe mein GError und es ist NULL und mein Rückgabewert ist ein leerer GVariant. Ich habe viele Dinge ausprobiert, aber hier ist mein letzter Code. Wenn ich es ausführe, druckt es "g_dbus_connection_call_sync succeeded", aber ich kann mein neues Profil in D-Bus nicht sehen, indem ich d-Füße benutze, und ich kann mich nicht mit meinem Testgerät verbinden. Ich weiß, dass der Code auf dem Testgerät funktioniert, oder zumindest funktioniert es mit Straight Bluez, aber ich versuche herauszufinden, wie man Bluez mit D-Bus verwendet.Wie registriere ich ein Profil mit Bluez mit dbus/gio?
Hier ist mein Code .h-Datei:
#ifndef BT_SERVER_H
#define BT_SERVER_H
#include <glib.h>
#include <gio/gio.h>
// ---------------------------------------------------------------------------
class BTProfile
{
public:
BTProfile();
void init();
void destroy();
static void method_call(GDBusConnection *connection,
const gchar *sender, const gchar *object_path,
const gchar *interface_name, const gchar *method_name,
GVariant *parameters, GDBusMethodInvocation *invocation,
gpointer user_data);
static GVariant *get_property(GDBusConnection *connection,
const gchar *sender, const gchar *object_path,
const gchar *interface_name, const gchar *property_name,
GError **error, gpointer user_data);
static gboolean set_property(GDBusConnection *connection,
const gchar *sender, const gchar *object_path,
const gchar *interface_name, const gchar *property_name,
GVariant *value, GError **error, gpointer userData);
protected:
GDBusConnection *bus_connection;
};
Hier ist meine CPP-Datei:
#include <stdio.h>
#include "bt_server.h"
static const char *serial_service_class_uuid =
"00001101-0000-1000-8000-00805F9B34FB";
static const char *my_service_uuid =
"E62C4DCA-9ABC-11E5-8994-FEFF819CDC9F";
static const gchar btp_introspection_xml[] =
"<node>"
" <interface name='org.bluez.Profile1'>"
" <method name='Release' />"
" <method name='NewConnection'>"
" <arg type='o' name='device' direction='in' />"
" <arg type='h' name='fd' direction='in' />"
" <arg type='a{sv}' name='fd_properties' direction='in' />"
" </method>"
" <method name='RequestDisconnection'>"
" <arg type='o' name='device' direction='in' />"
" </method>"
" </interface>"
"</node>";
static const GDBusInterfaceVTable btp_interface_vtable =
{
BTProfile::method_call,
BTProfile::get_property,
BTProfile::set_property
};
BTProfile::BTProfile() : bus_connection(NULL)
{
}
// ---------------------------------------------------------------------------
void BTProfile::init()
{
GError *error = NULL;
GDBusNodeInfo *introspection = g_dbus_node_info_new_for_xml(
btp_introspection_xml, &error);
if (!error)
{
GDBusInterfaceInfo *interface_info = g_dbus_node_info_lookup_interface(
introspection, "org.bluez.Profile1");
bus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
if (!error)
{
g_dbus_connection_register_object(bus_connection,
"/org/bluez/myprofile", interface_info, &btp_interface_vtable,
this, NULL, &error);
if (!error)
{
GVariantBuilder builder;
g_variant_builder_init(&builder, G_VARIANT_TYPE_DICTIONARY);
g_variant_builder_add(&builder, "{sv}", "Name",
g_variant_new("s", "myprofile"));
g_variant_builder_add(&builder, "{sv}", "Service",
g_variant_new("s", serial_service_class_uuid));
g_variant_builder_add(&builder, "{sv}", "Channel",
g_variant_new("q", 1));
g_variant_builder_add(&builder, "{sv}", "RequireAuthentication",
g_variant_new("b", FALSE));
g_variant_builder_add(&builder, "{sv}", "Role",
g_variant_new("s", "client"));
g_variant_builder_add(&builder, "{sv}", "Version",
g_variant_new("q", 1));
g_variant_builder_add(&builder, "{sv}", "AutoConnect",
g_variant_new("b", true));
g_dbus_connection_call_sync(bus_connection, "org.bluez",
"/org/bluez", "org.bluez.ProfileManager1",
"RegisterProfile", g_variant_new("(osa{sv})",
"/org/bluez/myprofile", my_service_uuid, &builder),
NULL, G_DBUS_CALL_FLAGS_NONE, G_MAXINT, NULL, &error);
if (!error)
{
g_print("g_dbus_connection_call_sync succeeded\n");
}
else
{
g_print("g_dbus_connection_call_sync failed: %s\n",
error->message);
g_error_free(error);
}
}
else
{
g_print("g_dbus_connection_register_object failed: %s\n",
error->message);
g_error_free(error);
}
}
else
{
g_print("g_bus_get_sync failed: %s\n", error->message);
g_error_free(error);
}
}
else
{
g_print("g_dbus_node_info_new_for_xml failed: %s\n", error->message);
g_error_free(error);
}
}
// ---------------------------------------------------------------------------
void BTProfile::destroy()
{
if (bus_connection)
{
g_object_unref(bus_connection);
}
}
// ---------------------------------------------------------------------------
void BTProfile::method_call(GDBusConnection *connection, const gchar *sender,
const gchar *object_path, const gchar *interface_name,
const gchar *method_name, GVariant *parameters,
GDBusMethodInvocation *invocation, gpointer user_data)
{
g_print("handle_method_call: called\n");
g_dbus_method_invocation_return_value(invocation, NULL);
}
// ---------------------------------------------------------------------------
GVariant *BTProfile::get_property(GDBusConnection *connection,
const gchar *sender, const gchar *object_path, const gchar *interface_name,
const gchar *property_name, GError **error, gpointer user_data)
{
g_print("get_property: called\n");
return NULL;
}
// ---------------------------------------------------------------------------
gboolean BTProfile::set_property(GDBusConnection *connection,
const gchar *sender, const gchar *object_path, const gchar *interface_name,
const gchar *property_name, GVariant *value, GError **error,
gpointer userData)
{
g_print("set_property: called\n");
return false;
}
Ich bin ein wenig verloren da, wie ich keine Fehlerinformationen erhalten. Danke an alle.
EDIT: Nach dem Graben um fand ich die dbus bluetooth.conf Datei, hier ist mein:
<!-- This configuration file specifies the required security policies
for Bluetooth core daemon to work. -->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- ../system.conf have denied everything, so we just punch some holes -->
<policy user="root">
<allow own="org.bluez"/>
<allow send_destination="org.bluez"/>
<allow send_interface="org.bluez.Agent1"/>
<allow send_interface="org.bluez.MediaEndpoint1"/>
<allow send_interface="org.bluez.MediaPlayer1"/>
<allow send_interface="org.bluez.ThermometerWatcher1"/>
<allow send_interface="org.bluez.AlertAgent1"/>
<allow send_interface="org.bluez.Profile1"/>
<allow send_interface="org.bluez.HeartRateWatcher1"/>
<allow send_interface="org.bluez.CyclingSpeedWatcher1"/>
<allow send_interface="org.bluez.GattCharacteristic1"/>
<allow send_interface="org.bluez.GattDescriptor1"/>
<allow send_interface="org.bluez.ProfileManager1"/>
<allow send_interface="org.bluez.Device1"/>
<allow send_interface="org.freedesktop.DBus.ObjectManager"/>
<allow send_interface="org.freedesktop.DBus.Properties"/>
</policy>
<policy at_console="true">
<allow send_destination="org.bluez"/>
</policy>
<!-- allow users of lp group (printing subsystem) to
communicate with bluetoothd -->
<policy group="lp">
<allow send_destination="org.bluez"/>
</policy>
<policy context="default">
<deny send_destination="org.bluez"/>
</policy>
</busconfig>
Ich habe ProfileManager1 und Device1 zu, aber noch kein Glück. Weiß jemand, was ich hier vermisse? Ich kann Profile unter Verwendung von Straight Bluez registrieren und verwenden, also weiß ich, dass es ein Bluez/Dbus-Problem ist.
Ich würde gerne das Endergebnis sehen, wenn es Ihnen nichts ausmacht zu teilen. Ich bin auch daran interessiert zu wissen, dass Sie mit Ihrem 'GVariantBuilder' oben mit' g_variant_builder_init (& builder, G_VARIANT_TYPE_DICTIONARY) 'initialisieren. Sollte es nicht 'g_variant_builder_init (& builder, G_VARIANT_TYPE_ARRAY)' 'sein? –