connman中,通过“GetServices”方法得到的wifi列表中,没有wifi热点的BSSID信息(热点/路由器的MAC地址)。
BSSID 是指站点的 MAC 地址,(STA)在一个接入点,(AP)在一个基础架构模式, BSS 是由 IEEE 802.11-1999 无线局域网规范定义的。这个区域唯一地定义了每个 BSS 。在一个 IBSS 中,BSSID 是一个本地管理的 IEEE MAC 地址,从一个 46 位的任意编码中产生。
做wifi定位功能时,需要将周围热点的BSSID和信号强度传送到服务器做位置计算,通过以下修改,来获取热点BSSID信息:(以下基于connman 1.35版本修改,不同版本可能存在差异)
diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index db61595..f6bb7e0 100644
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -313,6 +313,7 @@ const char *g_supplicant_network_get_identifier(GSupplicantNetwork *network);
const char *g_supplicant_network_get_path(GSupplicantNetwork *network);
const void *g_supplicant_network_get_ssid(GSupplicantNetwork *network,
unsigned int *ssid_len);
+const unsigned char *g_supplicant_network_get_bssid(GSupplicantNetwork *network);
const char *g_supplicant_network_get_mode(GSupplicantNetwork *network);
const char *g_supplicant_network_get_security(GSupplicantNetwork *network);
dbus_int16_t g_supplicant_network_get_signal(GSupplicantNetwork *network);
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 4f79012..ffca810 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -1160,6 +1160,14 @@ const char *g_supplicant_network_get_identifier(GSupplicantNetwork *network)
return network->group;
}
+const unsigned char *g_supplicant_network_get_bssid (GSupplicantNetwork *network)
+{
+ if (!network || !network->best_bss)
+ return (unsigned char *)"";
+
+ return network->best_bss->bssid;
+}
+
const char *g_supplicant_network_get_path(GSupplicantNetwork *network)
{
if (!network || !network->path)
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 34c16df..d9d7ab4 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -2657,6 +2657,7 @@ static void network_added(GSupplicantNetwork *supplicant_network)
struct wifi_data *wifi;
const char *name, *identifier, *security, *group, *mode;
const unsigned char *ssid;
+ const unsigned char *bssid;
unsigned int ssid_len;
bool wps;
bool wps_pbc;
@@ -2686,6 +2687,7 @@ static void network_added(GSupplicantNetwork *supplicant_network)
return;
ssid = g_supplicant_network_get_ssid(supplicant_network, &ssid_len);
+ bssid = g_supplicant_network_get_bssid(supplicant_network);
network = connman_device_get_network(wifi->device, identifier);
@@ -2710,6 +2712,8 @@ static void network_added(GSupplicantNetwork *supplicant_network)
connman_network_set_blob(network, "WiFi.SSID",
ssid, ssid_len);
+ connman_network_set_blob(network, "WiFi.BSSID",
+ bssid, 6);
connman_network_set_string(network, "WiFi.Security", security);
connman_network_set_strength(network,
calculate_strength(supplicant_network));
diff --git a/src/network.c b/src/network.c
index ed56210..762ef16 100644
--- a/src/network.c
+++ b/src/network.c
@@ -92,6 +92,7 @@ struct connman_network {
bool wps;
bool use_wps;
char *pin_wps;
+ unsigned char bssid[6];
} wifi;
};
@@ -1965,6 +1966,8 @@ int connman_network_set_blob(struct connman_network *network,
network->wifi.ssid_len = size;
} else
network->wifi.ssid_len = 0;
+ } else if (g_str_equal(key, "WiFi.BSSID") && size == 6) {
+ memcpy(network->wifi.bssid, data, size);
} else {
return -EINVAL;
}
@@ -1988,6 +1991,11 @@ const void *connman_network_get_blob(struct connman_network *network,
*size = network->wifi.ssid_len;
return network->wifi.ssid;
}
+ else if (g_str_equal(key, "WiFi.BSSID")) {
+ if (size)
+ *size = 6;
+ return network->wifi.bssid;
+ }
return NULL;
}
diff --git a/src/service.c b/src/service.c
index 02cd51f..87a3cd3 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2403,6 +2403,14 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
append_ethernet, service);
break;
case CONNMAN_SERVICE_TYPE_WIFI:
+ {
+ const unsigned char *bssid = connman_network_get_blob(service->network, "WiFi.BSSID", NULL);
+ char* bssidString = g_strdup_printf("%02x:%02x:%02x:%02x:%02x:%02x",
+ bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
+ connman_dbus_dict_append_basic(dict, "BSSID",
+ DBUS_TYPE_STRING, &bssidString);
+ g_free(bssidString);
+ }
case CONNMAN_SERVICE_TYPE_ETHERNET:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_GADGET:
diff --git a/tools/supplicant.h b/tools/supplicant.h
index 556dc7d..c4924f4 100644
--- a/tools/supplicant.h
+++ b/tools/supplicant.h
@@ -120,6 +120,7 @@ struct supplicant_network;
struct supplicant_interface *supplicant_network_get_interface(struct supplicant_network *network);
const char *supplicant_network_get_name(struct supplicant_network *network);
const char *supplicant_network_get_identifier(struct supplicant_network *network);
+const unsigned char *supplicant_network_get_bssid(struct supplicant_network *network);
enum supplicant_mode supplicant_network_get_mode(struct supplicant_network *network);
struct supplicant_callbacks {