1,bluetoothctl中扫描功能源码分析
// 蓝牙扫描指令,未区分Basic和BLE
static void cmd_scan(const char *arg)
{
dbus_bool_t enable;
const char *method;
if (parse_argument_on_off(arg, &enable) == FALSE)
return;
if (check_default_ctrl() == FALSE)
return;
if (enable == TRUE)
method = "StartDiscovery";
else
method = "StopDiscovery";
if (g_dbus_proxy_method_call(default_ctrl, method,
NULL, start_discovery_reply,
GUINT_TO_POINTER(enable), NULL) == FALSE) {
rl_printf("Failed to %s discovery\n",
enable == TRUE ? "start" : "stop");
return;
}
}
// 蓝牙扫描回调函数
static void start_discovery_reply(DBusMessage *message, void *user_data)
{
dbus_bool_t enable = GPOINTER_TO_UINT(user_data);
DBusError error;
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
rl_printf("Failed to %s discovery: %s\n",
enable == TRUE ? "start" : "stop", error.name);
dbus_error_free(&error);
return;
}
rl_printf("Discovery %s\n", enable == TRUE ? "started" : "stopped");
}
// 在此发现新设备或者新服务
static void proxy_added(GDBusProxy *proxy, void *user_data)
{
const char *interface;
interface = g_dbus_proxy_get_interface(proxy);
if (!strcmp(interface, "org.bluez.Device1")) {
if (device_is_child(proxy, default_ctrl) == TRUE) {
dev_list = g_list_append(dev_list, proxy);
print_device(proxy, COLORED_NEW);
}
}
}
// 删除丢失的设备
static void proxy_removed(GDBusProxy *proxy, void *user_data)
{
const char *interface;
interface = g_dbus_proxy_get_interface(proxy);
if (!strcmp(interface, "org.bluez.Device1")) {
if (device_is_child(proxy, default_ctrl) == TRUE) {
dev_list = g_list_remove(dev_list, proxy);
print_device(proxy, COLORED_DEL);
if (default_dev == proxy)
set_default_device(NULL, NULL);
}
}
}
// 属性变动回调,更新
static void property_changed(GDBusProxy *proxy, const char *name,
DBusMessageIter *iter, void *user_data)
{
const char *interface;
interface = g_dbus_proxy_get_interface(proxy);
if (!strcmp(interface, "org.bluez.Device1")) {
if (device_is_child(proxy, default_ctrl) == TRUE) {
DBusMessageIter addr_iter;
char *str;
if (g_dbus_proxy_get_property(proxy, "Address",
&addr_iter) == TRUE) {
const char *address;
dbus_message_iter_get_basic(&addr_iter,
&address);
str = g_strdup_printf("[" COLORED_CHG
"] Device %s ", address);
} else
str = g_strdup("");
if (strcmp(name, "Connected") == 0) {
dbus_bool_t connected;
dbus_message_iter_get_basic(iter, &connected);
if (connected && default_dev == NULL)
set_default_device(proxy, NULL);
else if (!connected && default_dev == proxy)
set_default_device(NULL, NULL);
}
print_iter(str, name, iter);
g_free(str);
}
}
}
2,hcitool lescan的源码
static struct option lescan_options[] = {
{ "help", 0, 0, 'h' },
{ "static", 0, 0, 's' },
{ "privacy", 0, 0, 'p' },
{ "passiv