Skip to content

Commit 89257a1

Browse files
committed
Merge pull request #97 from sandeepmistry/bssid-remote-mac
Use m2m_wifi_get_connection_info to get BSSID/remote MAC
2 parents 3b4e5a9 + 9d620b7 commit 89257a1

File tree

4 files changed

+66
-18
lines changed

4 files changed

+66
-18
lines changed

examples/AP_SimpleWebServer/AP_SimpleWebServer.ino

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,26 @@ void loop() {
7676
status = WiFi.status();
7777

7878
if (status == WL_AP_CONNECTED) {
79+
byte remoteMac[6];
80+
7981
// a device has connected to the AP
80-
Serial.println("Device connected to AP");
82+
Serial.print("Device connected to AP, MAC address: ");
83+
WiFi.APClientMacAddress(remoteMac);
84+
Serial.print(remoteMac[5], HEX);
85+
Serial.print(":");
86+
Serial.print(remoteMac[4], HEX);
87+
Serial.print(":");
88+
Serial.print(remoteMac[3], HEX);
89+
Serial.print(":");
90+
Serial.print(remoteMac[2], HEX);
91+
Serial.print(":");
92+
Serial.print(remoteMac[1], HEX);
93+
Serial.print(":");
94+
Serial.println(remoteMac[0], HEX);
8195
} else {
8296
// a device has disconnected from the AP, and we are back in listening mode
8397
Serial.println("Device disconnected from AP");
84-
}
98+
}
8599
}
86100

87101
WiFiClient client = server.available(); // listen for incoming clients
@@ -154,4 +168,5 @@ void printWifiStatus() {
154168
// print where to go in a browser:
155169
Serial.print("To see this page in action, open a browser to http://");
156170
Serial.println(ip);
171+
157172
}

keywords.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ subnetMask KEYWORD2
3434
gatewayIP KEYWORD2
3535
SSID KEYWORD2
3636
BSSID KEYWORD2
37+
APClientMacAddress KEYWORD2
3738
RSSI KEYWORD2
3839
encryptionType KEYWORD2
3940
getResult KEYWORD2

src/WiFi.cpp

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,26 @@ static void wifi_cb(uint8_t u8MsgType, void *pvMsg)
140140
if (scan_ssid_len) {
141141
memcpy(WiFi._scan_ssid, (const char *)pstrScanResult->au8SSID, scan_ssid_len);
142142
}
143-
if (WiFi._bssid) {
144-
memcpy(WiFi._bssid, (const char *)pstrScanResult->au8BSSID, 6);
145-
}
146143
WiFi._resolve = pstrScanResult->s8rssi;
147144
WiFi._scan_auth = pstrScanResult->u8AuthType;
148145
WiFi._status = WL_SCAN_COMPLETED;
149146
}
150147
break;
151148

149+
case M2M_WIFI_RESP_CONN_INFO:
150+
{
151+
tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg;
152+
153+
if (WiFi._remoteMacAddress) {
154+
// reverse copy the remote MAC
155+
for(int i = 0; i < 6; i++) {
156+
WiFi._remoteMacAddress[i] = pstrConnInfo->au8MACAddress[5-i];
157+
}
158+
WiFi._remoteMacAddress = 0;
159+
}
160+
}
161+
break;
162+
152163
default:
153164
break;
154165
}
@@ -605,19 +616,38 @@ char* WiFiClass::SSID()
605616

606617
uint8_t* WiFiClass::BSSID(uint8_t* bssid)
607618
{
608-
int8_t net = scanNetworks();
609-
610-
_bssid = bssid;
611-
memset(bssid, 0, 6);
612-
for (uint8_t i = 0; i < net; ++i) {
613-
SSID(i);
614-
if (strcmp(_scan_ssid, _ssid) == 0) {
615-
break;
616-
}
619+
if (_mode == WL_AP_MODE) {
620+
return macAddress(bssid);
621+
} else {
622+
return remoteMacAddress(bssid);
617623
}
618-
619-
_bssid = 0;
620-
return bssid;
624+
}
625+
626+
uint8_t* WiFiClass::APClientMacAddress(uint8_t* mac)
627+
{
628+
if (_mode == WL_AP_MODE) {
629+
return remoteMacAddress(mac);
630+
} else {
631+
memset(mac, 0, 6);
632+
return mac;
633+
}
634+
}
635+
636+
uint8_t* WiFiClass::remoteMacAddress(uint8_t* remoteMacAddress)
637+
{
638+
_remoteMacAddress = remoteMacAddress;
639+
memset(remoteMacAddress, 0, 6);
640+
641+
m2m_wifi_get_connection_info();
642+
643+
// Wait for connection or timeout:
644+
unsigned long start = millis();
645+
while (_remoteMacAddress != 0 && millis() - start < 1000) {
646+
m2m_wifi_handle_events(NULL);
647+
}
648+
649+
_remoteMacAddress = 0;
650+
return remoteMacAddress;
621651
}
622652

623653
int32_t WiFiClass::RSSI()

src/WiFi101.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class WiFiClass
7979
uint32_t _gateway;
8080
int _dhcp;
8181
uint32_t _resolve;
82-
byte *_bssid;
82+
byte *_remoteMacAddress;
8383
wl_mode_t _mode;
8484
wl_status_t _status;
8585
char _scan_ssid[M2M_MAX_SSID_LEN];
@@ -141,6 +141,7 @@ class WiFiClass
141141
int32_t RSSI();
142142
uint8_t encryptionType();
143143
uint8_t* BSSID(uint8_t* bssid);
144+
uint8_t* APClientMacAddress(uint8_t* mac);
144145
int8_t scanNetworks();
145146
char* SSID(uint8_t pos);
146147
int32_t RSSI(uint8_t pos);
@@ -167,6 +168,7 @@ class WiFiClass
167168

168169
uint8_t startConnect(const char *ssid, uint8_t u8SecType, const void *pvAuthInfo);
169170
uint8_t startAP(const char *ssid, uint8_t u8SecType, const void *pvAuthInfo, uint8_t channel);
171+
uint8_t* remoteMacAddress(uint8_t* remoteMacAddress);
170172
};
171173

172174
extern WiFiClass WiFi;

0 commit comments

Comments
 (0)