MKR1000 scan network è il primo esperimento di scansione delle reti Wifi che ho condotto appena ricevuta.
Il primo test che faccio con l’arduino o genuino uno è il classico “Blink” che mi permette di verificare il corretto funzionamento della board e trasferimento dello sketch.
Ma la MKR1000 merita di più !!
Puoi testare il corretto trasferimento di uno sketch e le funzionalità WiFi contemporaneamente usando lo sketch “scan network” contenuto negli esempi della WiFi101:
in quanto, come hai letto in alcuni miei articoli, gli sviluppatori arduino hanno compiuto un lavoro importantissimo nello sviluppo del codice e delle librerie per uniformare la gestione del WiFi sia della shield WiFi101 sia della MKR1000 in modo da rendere facile a noi lo sviluppo di codici portabili dall’una all’altra .. direi addirittura senza alcuno sforzo.
Lo sketch mkr1000 scan network
lo sketch mkr1000 scan network è presente negli esempi della WiFi101 e lo riporto solo per poterlo anallizzare linea per linea come sempre:
/* This example prints the Wifi shield's MAC address, and scans for available Wifi networks using the Wifi shield. Every ten seconds, it scans again. It doesn't actually connect to any network, so no encryption scheme is specified. Circuit: * WiFi shield attached created 13 July 2010 by dlf (Metodo2 srl) modified 21 Junn 2012 by Tom Igoe and Jaymes Dec */ #include <SPI.h> #include <WiFi101.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 presence of the shield: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don't continue: while (true); } // Print WiFi MAC address: printMacAddress(); // scan for existing networks: Serial.println("Scanning available networks..."); listNetworks(); } void loop() { delay(10000); // scan for existing networks: Serial.println("Scanning available networks..."); listNetworks(); } void printMacAddress() { // the MAC address of your Wifi shield byte mac[6]; // print your MAC address: WiFi.macAddress(mac); Serial.print("MAC: "); Serial.print(mac[5], HEX); Serial.print(":"); Serial.print(mac[4], HEX); Serial.print(":"); Serial.print(mac[3], HEX); Serial.print(":"); Serial.print(mac[2], HEX); Serial.print(":"); Serial.print(mac[1], HEX); Serial.print(":"); Serial.println(mac[0], HEX); } 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); Serial.print(") "); Serial.print(WiFi.SSID(thisNet)); Serial.print("\tSignal: "); Serial.print(WiFi.RSSI(thisNet)); Serial.print(" dBm"); Serial.print("\tEncryption: "); printEncryptionType(WiFi.encryptionType(thisNet)); Serial.flush(); } } void printEncryptionType(int thisType) { // read the encryption type and print out the name: switch (thisType) { case ENC_TYPE_WEP: Serial.println("WEP"); break; case ENC_TYPE_TKIP: Serial.println("WPA"); break; case ENC_TYPE_CCMP: Serial.println("WPA2"); break; case ENC_TYPE_NONE: Serial.println("None"); break; case ENC_TYPE_AUTO: Serial.println("Auto"); break; } }
linee 001-015: sono commenti di introduzione allo sketch e crediti per gli autori;
linee 018-019: includi le due librerie per la comunicazione con il WiFi: SPI e WiFi101
linee 023-026: apri la comunicazione seriale a 9600 baud e attendi che sia attivo un collegamento seriale in quanto lo sketch presume l’apertura di un terminale seriale con cui comunicare.
linee 028-033: utilizza il metodo WiFi.status() per verificare lo stato della scheda WiFi e confronta il risultato con la costante WL_NO_SHIELD che identifica la mancanza della shield, nel caso della MKR1000 scan network non avrai questo tipo di errore in quanto la WiFi non è una shield ma integrata nella scheda; il controllo serve quando usi la WiFi101 con una scheda arduino.
linea 036: richiama la funzione printMacAddress() presente in seguito nello sketch;
linea 039: scrivi sul monitor seriale “Scanning available networks…” come frase per comunicare l’inizio della scansione network;
linea 040: richiama la funzione listNetworks() che è descritta in seguito nello sketch;
linee 043-048: nella funzione loop() esegui con una distanza temporale di 10 secondi le linee simili alla 039 e 040;
linea 050: inizia la funzione printMacAddress() il cui scopo è scrivere sul monitor seriale il mac address della tua mkr1000;
linea 052: imposta un array di tipo byte da 6 elementi;
linea 055: richiama il metodo WiFi.macAddress passandogli l’array mac appena definito. Tale array sarà utilizzato dal metodo stesso per restituire il suo risultato.
linee 056-067: scrivi sul monitor seriale il risultato del mac address intervallato dai “:” in formato HEX (esadecimale);
linea 070: inizia la funzione listNetworks() richiamata dall’ultima linea del setup() e dal loop();
linea 072: scrivi a video “** Scan Networks **”;
linea 073: richiama il metodo WiFi.scanNetworks() che avvia l’MKR1000 scan network vero e proprio e restituisce come risultato il numero di reti rilevate;
linee 074-078: se il valore di numSsid è -1 vuol dire che la scansione delle reti non è riuscita e quindi scrivi sul monitor seriale il “Couldn’t get a wifi connection”;
linee 081-082: scrivi sul monitor seriale il numero di reti rilevate;
linea 085: per ciascuna delle reti rilevate esegui i comendi tra le parentesi graffe;
linee 086-087: scrivi il numero di indice analizzato seguito dalla chiusura di parentesi tonda “)”;
linee 088-091: scrivi sul monitor seriale il valore restituito dal metodo WiFi.SSID a cui passi l’indice corrispondente, seguito dal livello di segnale rilevato con il metodo WiFi.RSSI espresso in dBm;
linee 092-093: scrivi sul monitor seriale il testo “Encryption” spostato di un TAB dall’ultimo valore e ricavato mediante la funzione printEncryptionType() definita in seguito nello sketch;
linea 094: esegui il flush della seriale;
linea 098: inizia la funzione printEncryptionType();
linea 100: usa il comando “switch” per confrontare il valore di thisType che arriva dalla linea 093 attraverso il metodo WiFi.encryptionType sull’indice della rete individuata nel ciclo for alla linea 085;
linee 101-115: in funzione del valore restituito dal metodo WiFi.encryptionType confrontato con le costanti definite nella libreria WiFi101 scrivi sul monitor seriale il tipo di crittografia utilizzato dalla rete WiFi.
Eseguendo il codice sulla mkr1000 vedrai nel monitor seriale qualcosa di simile: