gattlib: Pass 'adapter' rather than MAC address to gattlib_connect()

pull/166/head
Olivier Martin 2020-04-08 14:10:13 +02:00 committed by Olivier Martin
parent 7107d9f5b4
commit 71c4e71952
4 changed files with 43 additions and 15 deletions

View File

@ -325,14 +325,23 @@ static void get_connection_options(unsigned long options, BtIOSecLevel *bt_io_se
*mtu = GATTLIB_CONNECTION_OPTIONS_LEGACY_GET_MTU(options); *mtu = GATTLIB_CONNECTION_OPTIONS_LEGACY_GET_MTU(options);
} }
gatt_connection_t *gattlib_connect_async(const char *src, const char *dst, gatt_connection_t *gattlib_connect_async(void *adapter, const char *dst,
unsigned long options, unsigned long options,
gatt_connect_cb_t connect_cb, void* data) gatt_connect_cb_t connect_cb, void* data)
{ {
const char *adapter_mac_address;
gatt_connection_t *conn; gatt_connection_t *conn;
BtIOSecLevel bt_io_sec_level; BtIOSecLevel bt_io_sec_level;
int psm, mtu; int psm, mtu;
if (adapter != NULL) {
fprintf(stderr, "Missing support");
assert(0); // Need to add support
return NULL;
} else {
adapter_mac_address = NULL;
}
// Check parameters // Check parameters
if ((options & (GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC | GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM)) == 0) { if ((options & (GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC | GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM)) == 0) {
// Please, set GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC or // Please, set GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC or
@ -350,7 +359,7 @@ gatt_connection_t *gattlib_connect_async(const char *src, const char *dst,
io_connect_arg->user_data = data; io_connect_arg->user_data = data;
if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC) { if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC) {
conn = initialize_gattlib_connection(src, dst, BDADDR_LE_PUBLIC, bt_io_sec_level, conn = initialize_gattlib_connection(adapter_mac_address, dst, BDADDR_LE_PUBLIC, bt_io_sec_level,
psm, mtu, connect_cb, io_connect_arg); psm, mtu, connect_cb, io_connect_arg);
if (conn != NULL) { if (conn != NULL) {
return conn; return conn;
@ -358,7 +367,7 @@ gatt_connection_t *gattlib_connect_async(const char *src, const char *dst,
} }
if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM) { if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM) {
conn = initialize_gattlib_connection(src, dst, BDADDR_LE_RANDOM, bt_io_sec_level, conn = initialize_gattlib_connection(adapter_mac_address, dst, BDADDR_LE_RANDOM, bt_io_sec_level,
psm, mtu, connect_cb, io_connect_arg); psm, mtu, connect_cb, io_connect_arg);
} }
@ -431,12 +440,21 @@ static gatt_connection_t *gattlib_connect_with_options(const char *src, const ch
* @param dst Remote Bluetooth address * @param dst Remote Bluetooth address
* @param options Options to connect to BLE device. See `GATTLIB_CONNECTION_OPTIONS_*` * @param options Options to connect to BLE device. See `GATTLIB_CONNECTION_OPTIONS_*`
*/ */
gatt_connection_t *gattlib_connect(const char *src, const char *dst, unsigned long options) gatt_connection_t *gattlib_connect(void* adapter, const char *dst, unsigned long options)
{ {
const char* adapter_mac_address;
gatt_connection_t *conn; gatt_connection_t *conn;
BtIOSecLevel bt_io_sec_level; BtIOSecLevel bt_io_sec_level;
int psm, mtu; int psm, mtu;
if (adapter != NULL) {
fprintf(stderr, "Missing support");
assert(0); // Need to add support
return NULL;
} else {
adapter_mac_address = NULL;
}
// Check parameters // Check parameters
if ((options & (GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC | GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM)) == 0) { if ((options & (GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC | GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM)) == 0) {
// Please, set GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC or // Please, set GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC or
@ -448,14 +466,14 @@ gatt_connection_t *gattlib_connect(const char *src, const char *dst, unsigned lo
get_connection_options(options, &bt_io_sec_level, &psm, &mtu); get_connection_options(options, &bt_io_sec_level, &psm, &mtu);
if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC) { if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_PUBLIC) {
conn = gattlib_connect_with_options(src, dst, BDADDR_LE_PUBLIC, bt_io_sec_level, psm, mtu); conn = gattlib_connect_with_options(adapter_mac_address, dst, BDADDR_LE_PUBLIC, bt_io_sec_level, psm, mtu);
if (conn != NULL) { if (conn != NULL) {
return conn; return conn;
} }
} }
if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM) { if (options & GATTLIB_CONNECTION_OPTIONS_LEGACY_BDADDR_LE_RANDOM) {
conn = gattlib_connect_with_options(src, dst, BDADDR_LE_RANDOM, bt_io_sec_level, psm, mtu); conn = gattlib_connect_with_options(adapter_mac_address, dst, BDADDR_LE_RANDOM, bt_io_sec_level, psm, mtu);
} }
return conn; return conn;

View File

@ -126,12 +126,18 @@ void get_device_path_from_mac(const char *adapter_name, const char *mac_address,
* @param psm Specify the PSM for GATT/ATT over BR/EDR * @param psm Specify the PSM for GATT/ATT over BR/EDR
* @param mtu Specify the MTU size * @param mtu Specify the MTU size
*/ */
gatt_connection_t *gattlib_connect(const char *src, const char *dst, unsigned long options) gatt_connection_t *gattlib_connect(void* adapter, const char *dst, unsigned long options)
{ {
struct gattlib_adapter *gattlib_adapter = adapter;
const char* adapter_name = NULL;
GError *error = NULL; GError *error = NULL;
char object_path[100]; char object_path[100];
get_device_path_from_mac(src, dst, object_path, sizeof(object_path)); if (gattlib_adapter != NULL) {
adapter_name = gattlib_adapter->adapter_name;
}
get_device_path_from_mac(adapter_name, dst, object_path, sizeof(object_path));
gattlib_context_t* conn_context = calloc(sizeof(gattlib_context_t), 1); gattlib_context_t* conn_context = calloc(sizeof(gattlib_context_t), 1);
if (conn_context == NULL) { if (conn_context == NULL) {
@ -211,13 +217,13 @@ FREE_CONN_CONTEXT:
return NULL; return NULL;
} }
gatt_connection_t *gattlib_connect_async(const char *src, const char *dst, gatt_connection_t *gattlib_connect_async(void *adapter, const char *dst,
unsigned long options, unsigned long options,
gatt_connect_cb_t connect_cb, void* data) gatt_connect_cb_t connect_cb, void* data)
{ {
gatt_connection_t *connection; gatt_connection_t *connection;
connection = gattlib_connect(src, dst, options); connection = gattlib_connect(adapter, dst, options);
if ((connection != NULL) && (connect_cb != NULL)) { if ((connection != NULL) && (connect_cb != NULL)) {
connect_cb(connection, data); connect_cb(connection, data);
} }

View File

@ -2,7 +2,7 @@
* *
* GattLib - GATT Library * GattLib - GATT Library
* *
* Copyright (C) 2016-2019 Olivier Martin <olivier@labapart.org> * Copyright (C) 2016-2020 Olivier Martin <olivier@labapart.org>
* *
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -45,6 +45,8 @@
#endif #endif
typedef struct { typedef struct {
struct gattlib_adapter *adapter;
char* device_object_path; char* device_object_path;
OrgBluezDevice1* device; OrgBluezDevice1* device;
@ -57,6 +59,8 @@ typedef struct {
struct gattlib_adapter { struct gattlib_adapter {
OrgBluezAdapter1 *adapter_proxy; OrgBluezAdapter1 *adapter_proxy;
char* adapter_name;
GMainLoop *scan_loop; GMainLoop *scan_loop;
guint timeout_id; guint timeout_id;
}; };

View File

@ -292,24 +292,24 @@ int gattlib_adapter_close(void* adapter);
/** /**
* @brief Function to connect to a BLE device * @brief Function to connect to a BLE device
* *
* @param src Local Adaptater interface * @param adapter Local Adaptater interface. When passing NULL, we use default adapter.
* @param dst Remote Bluetooth address * @param dst Remote Bluetooth address
* @param options Options to connect to BLE device. See `GATTLIB_CONNECTION_OPTIONS_*` * @param options Options to connect to BLE device. See `GATTLIB_CONNECTION_OPTIONS_*`
*/ */
gatt_connection_t *gattlib_connect(const char *src, const char *dst, unsigned long options); gatt_connection_t *gattlib_connect(void *adapter, const char *dst, unsigned long options);
/** /**
* @brief Function to asynchronously connect to a BLE device * @brief Function to asynchronously connect to a BLE device
* *
* @note This function is mainly used before Bluez v5.42 (prior to D-BUS support) * @note This function is mainly used before Bluez v5.42 (prior to D-BUS support)
* *
* @param src Local Adaptater interface * @param adapter Local Adaptater interface. When passing NULL, we use default adapter.
* @param dst Remote Bluetooth address * @param dst Remote Bluetooth address
* @param options Options to connect to BLE device. See `GATTLIB_CONNECTION_OPTIONS_*` * @param options Options to connect to BLE device. See `GATTLIB_CONNECTION_OPTIONS_*`
* @param connect_cb is the callback to call when the connection is established * @param connect_cb is the callback to call when the connection is established
* @param user_data is the user specific data to pass to the callback * @param user_data is the user specific data to pass to the callback
*/ */
gatt_connection_t *gattlib_connect_async(const char *src, const char *dst, gatt_connection_t *gattlib_connect_async(void *adapter, const char *dst,
unsigned long options, unsigned long options,
gatt_connect_cb_t connect_cb, void* user_data); gatt_connect_cb_t connect_cb, void* user_data);