Android与自定义USB蓝牙适配器配对

时间:2018-08-31 19:13:28

标签: bluetooth android-bluetooth bluez

在将android与自定义USB适配器(例如DKBT111)配对时,是否可以强制使用旧式固定引脚输入。从SSP和“ Just works”配对来看,这似乎无法满足我正在使用的安全性要求。

我想保证在没有固定的预设PIN的情况下,没有人能尝试与USB设备配对。我在使用bluetoothctl和Bluez配置控制器时遇到问题。我能得到的最好的结果是6位密码比较,但是在将要连接到USB的盒子上没有显示代码。

我必须更改哪些设置才能为服务器设置PIN,并且任何电话都需要将其配对才能输入?

我在tinycore上使用Bluez。

1 个答案:

答案 0 :(得分:0)

要实现这种情况,您可能需要实现自定义代理。由于您没有Display,因此您必须从options中选择设备的功能之一。

Bluez始终希望使用至少6位PIN码,如果您想限制自己使用4位PIN码,则应使用here指定的“ 0”填充。

对于您的自定义代理,您需要实现“ DisplayPinCode”或“ DisplayPasskey”方法,以返回固定的PIN并使用“ RegisterAgent”进行注册。

要仅限制您的Android设备,您可以在DisplayPinCode / DisplayPasskey中比较设备的MAC地址,该地址获得请求配对为“第一参数目标设备”的设备的MAC地址。 / p>

请注意,“对象设备”是MAC地址作为对象路径,即/ 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;
}

上面的示例是不完整的模板,没有任何特定方法。您需要基于“方法”名称在“ bluez_agent_method_call”内部实现“ DisplayPinCode / DisplayPasskey”。

编辑:相同的固定PIN示例,其详细信息在此question中得到了解答。添加它以供将来参考和完整性。