Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WiFi - add missing scan result getter implementations (BSSID, channel) and the ScanNetworksAdvanced example #815

Merged
merged 2 commits into from
Jan 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions libraries/WiFi/examples/ScanNetworksAdvanced/ScanNetworksAdvanced.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
/*
This example prints the board's MAC address, and
scans for available WiFi networks using the NINA module.
Every ten seconds, it scans again. It doesn't actually
connect to any network, so no encryption scheme is specified.
BSSID and WiFi channel are printed

This example is based on ScanNetworks

created 1 Mar 2017
by Arturo Guadalupi
*/



#include <WiFi.h>

void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}

// scan for existing networks:
Serial.println();
Serial.println("Scanning available networks...");
listNetworks();

// print your MAC address:
byte mac[6];
WiFi.macAddress(mac);
Serial.print("MAC: ");
printMacAddress(mac);
}

void loop() {
delay(10000);
// scan for existing networks:
Serial.println("Scanning available networks...");
listNetworks();
}

void listNetworks() {
// scan for nearby networks:
Serial.println("** Scan Networks **");
int numSsid = WiFi.scanNetworks();
if (numSsid == -1)
{
Serial.println("Couldn't get a WiFi connection");
while (true);
}

// print the list of networks seen:
Serial.print("number of available networks: ");
Serial.println(numSsid);

// print the network number and name for each network found:
for (int thisNet = 0; thisNet < numSsid; thisNet++) {
Serial.print(thisNet + 1);
Serial.print(") ");
Serial.print("Signal: ");
Serial.print(WiFi.RSSI(thisNet));
Serial.print(" dBm");
Serial.print("\tChannel: ");
Serial.print(WiFi.channel(thisNet));
byte bssid[6];
Serial.print("\t\tBSSID: ");
printMacAddress(WiFi.BSSID(thisNet, bssid));
Serial.print("\tEncryption: ");
printEncryptionType(WiFi.encryptionType(thisNet));
Serial.print("\t\tSSID: ");
Serial.println(WiFi.SSID(thisNet));
Serial.flush();
}
Serial.println();
}

void printEncryptionType(int thisType) {
// read the encryption type and print out the name:
switch (thisType) {
case ENC_TYPE_WEP:
Serial.print("WEP");
break;
case ENC_TYPE_WPA:
Serial.print("WPA");
break;
case ENC_TYPE_WPA2:
Serial.print("WPA2");
break;
case ENC_TYPE_NONE:
Serial.print("None");
break;
case ENC_TYPE_AUTO:
Serial.print("Auto");
break;
case ENC_TYPE_WPA3:
Serial.print("WPA3");
break;
case ENC_TYPE_UNKNOWN:
default:
Serial.print("Unknown");
break;
}
}

void print2Digits(byte thisByte) {
if (thisByte < 0xF) {
Serial.print("0");
}
Serial.print(thisByte, HEX);
}

void printMacAddress(byte mac[]) {
for (int i = 0; i < 6; i++) {
if (i > 0) {
Serial.print(":");
}
if (mac[i] < 16) {
Serial.print("0");
}
Serial.print(mac[i], HEX);
}
Serial.println();
}
9 changes: 9 additions & 0 deletions libraries/WiFi/src/WiFi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,15 @@ uint8_t arduino::WiFiClass::encryptionType(uint8_t networkItem) {
return sec2enum(ap_list[networkItem].get_security());
}

uint8_t* arduino::WiFiClass::BSSID(uint8_t networkItem, uint8_t* bssid) {
memcpy(bssid, ap_list[networkItem].get_bssid(), 6);
return bssid;
}

uint8_t arduino::WiFiClass::channel(uint8_t networkItem) {
return ap_list[networkItem].get_channel();
}

int32_t arduino::WiFiClass::RSSI() {
return wifi_if->get_rssi();
}
Expand Down