Для реализации такого сценария вам может потребоваться реализовать пользовательский агент. Поскольку у вас нет дисплея, вы должны выбрать одну из возможностей вашего устройства из опции .
Bluez всегда ожидает не менее 6-значного PIN-кода, если вы хотите ограничить себя 4-значным PIN-кодом, тогда вам следует набирать «0», как указано здесь .
Для вашего пользовательского агента вам нужно реализовать метод " DisplayPinCode " или " DisplayPasskey ", возвращающий фиксированный PIN-код и регистрирующий его с помощью " RegisterAgent ".
Для ограничения только вашего Android-устройства вы можете сравнить MAC-адрес вашего устройства в DisplayPinCode / DisplayPasskey, который получает MAC-адрес устройства, запрашивающего сопряжение, как «Первый аргумент объект устройства ».
Обратите внимание, что "объектное устройство" - это MAC-адрес в виде пути к объекту, т.е. формат i / e / org / bluez / hciX / dev_AA_BB_CC_XX_YY_ZZ.
#include <glib.h>
#include <gio/gio.h>
#include "agent.h"
#define AGENT_PATH "/org/bluez/AutoPinAgent"
static void bluez_agent_method_call(GDBusConnection *conn,
const gchar *sender,
const gchar *path,
const gchar *interface,
const gchar *method,
GVariant *params,
GDBusMethodInvocation *invocation,
void *userdata)
{
g_print("Agent method call: %s.%s()", interface, method);
}
static const GDBusInterfaceVTable agent_method_table = {
.method_call = bluez_agent_method_call,
};
int bluez_register_agent(GDBusConnection *con)
{
GError *error = NULL;
guint id = 0;
GDBusNodeInfo *info = NULL;
static const gchar bluez_agent_introspection_xml[] =
"<node name='/org/bluez/SampleAgent'>"
" <interface name='org.bluez.Agent1'>"
" <method name='Release'>"
" </method>"
" <method name='RequestPinCode'>"
" <arg type='o' name='device' direction='in' />"
" <arg type='s' name='pincode' direction='out' />"
" </method>"
" <method name='DisplayPinCode'>"
" <arg type='o' name='device' direction='in' />"
" <arg type='s' name='pincode' direction='in' />"
" </method>"
" <method name='RequestPasskey'>"
" <arg type='o' name='device' direction='in' />"
" <arg type='u' name='passkey' direction='out' />"
" </method>"
" <method name='DisplayPasskey'>"
" <arg type='o' name='device' direction='in' />"
" <arg type='u' name='passkey' direction='in' />"
" <arg type='q' name='entered' direction='in' />"
" </method>"
" <method name='RequestConfirmation'>"
" <arg type='o' name='device' direction='in' />"
" <arg type='u' name='passkey' direction='in' />"
" </method>"
" <method name='RequestAuthorization'>"
" <arg type='o' name='device' direction='in' />"
" </method>"
" <method name='AuthorizeService'>"
" <arg type='o' name='device' direction='in' />"
" <arg type='s' name='uuid' direction='in' />"
" </method>"
" <method name='Cancel'>"
" </method>"
" </interface>"
"</node>";
info = g_dbus_node_info_new_for_xml(bluez_agent_introspection_xml, &error);
if(error) {
g_printerr("Unable to create node: %s\n", error->message);
g_clear_error(&error);
return 0;
}
id = g_dbus_connection_register_object(con,
AGENT_PATH,
info->interfaces[0],
&agent_method_table,
NULL, NULL, &error);
g_dbus_node_info_unref(info);
//g_dbus_connection_unregister_object(con, id);
return id;
}
Приведенный выше пример является неполным шаблоном без каких-либо специальных методов. Вам необходимо реализовать «DisplayPinCode / DisplayPasskey» внутри «bluez_agent_method_call» на основе имени «метода», которое приходит в качестве аргумента.
РЕДАКТИРОВАТЬ: Тот же пример для фиксированного ПИН-кода с более подробным ответом на этот вопрос . Добавление его для дальнейшего использования и полноты.