mirror of https://github.com/labapart/gattlib
gattlib: Introduce 'gattlib_get_rssi_from_mac()'
parent
a9cd2d3c1a
commit
a52f66834a
|
@ -554,6 +554,11 @@ int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi)
|
||||||
return GATTLIB_NOT_SUPPORTED;
|
return GATTLIB_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gattlib_get_rssi_from_mac(void *adapter, const char *mac_address, int16_t *rssi)
|
||||||
|
{
|
||||||
|
return GATTLIB_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
int gattlib_get_advertisement_data(gatt_connection_t *connection, gattlib_advertisement_data_t **advertisement_data,
|
int gattlib_get_advertisement_data(gatt_connection_t *connection, gattlib_advertisement_data_t **advertisement_data,
|
||||||
uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size)
|
uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,7 +93,28 @@ gboolean on_handle_device_property_change(
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_object_path_from_mac(const char *adapter_name, const char *mac_address, char *object_path, size_t object_path_len)
|
void get_device_path_from_mac_with_adapter(OrgBluezAdapter1* adapter, const char *mac_address, char *object_path, size_t object_path_len)
|
||||||
|
{
|
||||||
|
char device_address_str[20 + 1];
|
||||||
|
const char* adapter_path = g_dbus_proxy_get_object_path((GDBusProxy *)ORG_BLUEZ_ADAPTER1_PROXY(adapter));
|
||||||
|
|
||||||
|
// Transform string from 'DA:94:40:95:E0:87' to 'dev_DA_94_40_95_E0_87'
|
||||||
|
strncpy(device_address_str, mac_address, sizeof(device_address_str));
|
||||||
|
for (int i = 0; i < strlen(device_address_str); i++) {
|
||||||
|
if (device_address_str[i] == ':') {
|
||||||
|
device_address_str[i] = '_';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force a null-terminated character
|
||||||
|
device_address_str[20] = '\0';
|
||||||
|
|
||||||
|
// Generate object path like: /org/bluez/hci0/dev_DA_94_40_95_E0_87
|
||||||
|
snprintf(object_path, object_path_len, "%s/dev_%s", adapter_path, device_address_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void get_device_path_from_mac(const char *adapter_name, const char *mac_address, char *object_path, size_t object_path_len)
|
||||||
{
|
{
|
||||||
char device_address_str[20 + 1];
|
char device_address_str[20 + 1];
|
||||||
const char* adapter;
|
const char* adapter;
|
||||||
|
@ -132,7 +153,7 @@ gatt_connection_t *gattlib_connect(const char *src, const char *dst, unsigned lo
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
char object_path[100];
|
char object_path[100];
|
||||||
|
|
||||||
get_object_path_from_mac(src, dst, object_path, sizeof(object_path));
|
get_device_path_from_mac(src, 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) {
|
||||||
|
@ -1344,7 +1365,8 @@ int gattlib_notification_stop(gatt_connection_t* connection, const uuid_t* uuid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi) {
|
int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi)
|
||||||
|
{
|
||||||
gattlib_context_t* conn_context = connection->context;
|
gattlib_context_t* conn_context = connection->context;
|
||||||
|
|
||||||
if (rssi == NULL) {
|
if (rssi == NULL) {
|
||||||
|
@ -1356,6 +1378,39 @@ int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi) {
|
||||||
return GATTLIB_SUCCESS;
|
return GATTLIB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gattlib_get_rssi_from_mac(void *adapter, const char *mac_address, int16_t *rssi)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
char object_path[100];
|
||||||
|
|
||||||
|
if (rssi == NULL) {
|
||||||
|
return GATTLIB_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adapter != NULL) {
|
||||||
|
get_device_path_from_mac_with_adapter((OrgBluezAdapter1*)adapter, mac_address, object_path, sizeof(object_path));
|
||||||
|
} else {
|
||||||
|
get_device_path_from_mac(NULL, mac_address, object_path, sizeof(object_path));
|
||||||
|
}
|
||||||
|
|
||||||
|
OrgBluezDevice1* bluez_device1 = org_bluez_device1_proxy_new_for_bus_sync(
|
||||||
|
G_BUS_TYPE_SYSTEM,
|
||||||
|
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
|
||||||
|
"org.bluez",
|
||||||
|
object_path,
|
||||||
|
NULL,
|
||||||
|
&error);
|
||||||
|
if (error) {
|
||||||
|
fprintf(stderr, "Failed to connection to new DBus Bluez Device: %s\n",
|
||||||
|
error->message);
|
||||||
|
g_error_free(error);
|
||||||
|
return GATTLIB_ERROR_DBUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
*rssi = org_bluez_device1_get_rssi(bluez_device1);
|
||||||
|
return GATTLIB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int gattlib_get_advertisement_data(gatt_connection_t *connection, gattlib_advertisement_data_t **advertisement_data,
|
int gattlib_get_advertisement_data(gatt_connection_t *connection, gattlib_advertisement_data_t **advertisement_data,
|
||||||
uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size)
|
uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -55,4 +55,7 @@ typedef struct {
|
||||||
|
|
||||||
gboolean stop_scan_func(gpointer data);
|
gboolean stop_scan_func(gpointer data);
|
||||||
|
|
||||||
|
void get_device_path_from_mac_with_adapter(OrgBluezAdapter1* adapter, const char *mac_address, char *object_path, size_t object_path_len);
|
||||||
|
void get_device_path_from_mac(const char *adapter_name, const char *mac_address, char *object_path, size_t object_path_len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -10,14 +10,15 @@ args = parser.parse_args()
|
||||||
|
|
||||||
EDDYSTONE_COMMON_DATA_UUID = 'FEAA'
|
EDDYSTONE_COMMON_DATA_UUID = 'FEAA'
|
||||||
|
|
||||||
|
|
||||||
def on_discovered_ble_device(device):
|
|
||||||
print("Find Eddystone device %s" % device.id)
|
|
||||||
|
|
||||||
|
|
||||||
# Use default adapter
|
# Use default adapter
|
||||||
default_adapter = adapter.Adapter()
|
default_adapter = adapter.Adapter()
|
||||||
|
|
||||||
|
|
||||||
|
def on_discovered_ble_device(device, user_data):
|
||||||
|
rssi = default_adapter.get_rssi_from_mac(device.id)
|
||||||
|
print("Find Eddystone device %s (RSSI:%d)" % (device.id, rssi))
|
||||||
|
|
||||||
|
|
||||||
# Scan for 30 seconds
|
# Scan for 30 seconds
|
||||||
default_adapter.open()
|
default_adapter.open()
|
||||||
default_adapter.scan_enable(on_discovered_ble_device, 30, uuids=[EDDYSTONE_COMMON_DATA_UUID])
|
default_adapter.scan_enable(on_discovered_ble_device, 30, uuids=[EDDYSTONE_COMMON_DATA_UUID])
|
||||||
|
|
|
@ -97,3 +97,7 @@ gattlib_register_on_disconnect.argtypes = [c_void_p, py_object, py_object]
|
||||||
# int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi)
|
# int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi)
|
||||||
gattlib_get_rssi = gattlib.gattlib_get_rssi
|
gattlib_get_rssi = gattlib.gattlib_get_rssi
|
||||||
gattlib_get_rssi.argtypes = [c_void_p, POINTER(c_int16)]
|
gattlib_get_rssi.argtypes = [c_void_p, POINTER(c_int16)]
|
||||||
|
|
||||||
|
# int gattlib_get_rssi_from_mac(void *adapter, const char *mac_address, int16_t *rssi)
|
||||||
|
gattlib_get_rssi_from_mac = gattlib.gattlib_get_rssi_from_mac
|
||||||
|
gattlib_get_rssi_from_mac.argtypes = [c_void_p, c_char_p, POINTER(c_int16)]
|
||||||
|
|
|
@ -67,3 +67,11 @@ class Adapter:
|
||||||
def scan_disable(self):
|
def scan_disable(self):
|
||||||
ret = gattlib.gattlib_adapter_scan_disable(self._adapter)
|
ret = gattlib.gattlib_adapter_scan_disable(self._adapter)
|
||||||
handle_return(ret)
|
handle_return(ret)
|
||||||
|
|
||||||
|
def get_rssi_from_mac(self, mac_address):
|
||||||
|
if isinstance(mac_address, str):
|
||||||
|
mac_address = mac_address.encode("utf-8")
|
||||||
|
|
||||||
|
rssi = c_int16(0)
|
||||||
|
gattlib_get_rssi_from_mac(self._adapter, mac_address, byref(rssi))
|
||||||
|
return rssi.value
|
||||||
|
|
|
@ -350,6 +350,20 @@ void gattlib_register_indication(gatt_connection_t* connection, gattlib_event_ha
|
||||||
*/
|
*/
|
||||||
int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi);
|
int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to retrieve RSSI from a MAC Address
|
||||||
|
*
|
||||||
|
* @note: This function is mainly used before a connection is established. Once the connection
|
||||||
|
* established, the function `gattlib_get_rssi()` should be preferred.
|
||||||
|
*
|
||||||
|
* @param adapter is the adapter the new device has been seen
|
||||||
|
* @param mac_address is the MAC address of the device to get the RSSI
|
||||||
|
* @param rssi is the Received Signal Strength Indicator of the remote device
|
||||||
|
*
|
||||||
|
* @return GATTLIB_SUCCESS on success or GATTLIB_* error code
|
||||||
|
*/
|
||||||
|
int gattlib_get_rssi_from_mac(void *adapter, const char *mac_address, int16_t *rssi);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Function to retrieve Advertisement Data of the GATT connection
|
* @brief Function to retrieve Advertisement Data of the GATT connection
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue