connman添加获取BSSID(热点/路由器MAC)功能

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 {


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值