Introduction: Sistem De Cartografiere a Rețelelor WiFi

Cartografierea retelelor WiFi este procedeul prin care se doreste gasirea retelelor WiFi, iar apoi localizarea acestora cu ajutorul GPS-ului. In urma cartografierii se pot obtine informatii despre retelele WiFi existente cum ar fi: numarul acestora, coordonatele aproximative, numele lor sau tipul de securitate.

Functionare pe scurt: cand se gaseste o retea WiFi, se stocheaza locatia si detaliile retelei, iar rezultatele vor fi afisate pe o harta.

Step 1: Raspberry Pi 3 B+

Primul pas a fost achizitionarea unui Raspberry Pi 3 B+.

Specificatii (sursa) :

  • SoC: Broadcom BCM2837B0 quad-core A53 (ARMv8) 64-bit @ 1.4GHz
  • GPU: Broadcom Videocore-IV
  • RAM: 1GB LPDDR2 SDRAM
  • Networking: Gigabit Ethernet (via USB channel), 2.4GHz and 5GHz 802.11b/g/n/ac Wi-Fi
  • Bluetooth: Bluetooth 4.2, Bluetooth Low Energy (BLE)
  • Storage: Micro-SD
  • GPIO: 40-pin GPIO header, populated
  • Ports: HDMI, 3.5mm analogue audio-video jack, 4x USB 2.0, Ethernet, Camera Serial Interface (CSI), Display Serial Interface (DSI)
  • Dimensions: 82mm x 56mm x 19.5mm, 50g

Step 2: Alfa Network AWUS036NHA

Urmatorul pas a fost achizitionarea unui adaptor WiFi. Chiar daca aceasta versiune de Pi vine cu WiFi, am dorit ceva cu antena externa pentru o localizare mai precisa. Dupa o documentare pe internet am ajuns la concluzia ca cea mai buna solutie este un adaptor de la Alfa Network. Am ales un Alfa Network AWUS036NHA.

Acesta are urmatoarele caracteristici (sursa):

  • Compatible with IEEE 802.11n, 802.11b/g/n wireless standards
  • 2.4GHz frequency band, MIMO (Multiple Input Multiple Output)
  • Complies with Universal Serial Bus Rev. 2.0 specifications
  • High speed transfer TX data rate up to 150 Mbps
  • Supports WPS by S/W
  • Supports wireless data encryption with 64/128-bit WEP, WPA, WPA2, TKIP, AES
  • Wide Range coverage
  • Compliant with FCC Part 15.247 for US, ETS 300 328 for Europe
  • Supports driver for Windows 2000, XP 32/64, Windows7, Vista 32/64, Linux (2.4.x/2.6.x), Mac (10.4.x/10.5.x) Power PC & PC

Specificatii (sursa):

  • Wireless: IEEE 802.11b/g/n
  • USB 2.0 standard
  • Detachable 5dBi RP-SMA Antenna
  • Ralink 3070 chipset

Step 3: GPS Neo-6M

De asemenea, am achizitionat un GPS pentru a furniza date despre locatie. Am ales GPS Neo-6M.

Caracteristici (sursa):

  • A complete GPS module with an active antenna integrated, and a built-in EEPROM to save configuration parameter data
  • Built-in 25 x 25 x 4mm ceramic active antenna provides strong satellite search capability
  • Equipped with power and signal indicator lights and data backup battery.4) Power supply: 3-5V; Default baud rate: 9600bps
  • Interface: RS232 TTL

Step 4: Alte Elemente

Pe langa cele mentionate mai sus am mai avut nevoie de:

  • Cablu LAN - pentru conectarea placuteri Raspberry Pi 3 B+ la laptop;
  • USB network adapter - pentru conectarea cablului la laptop (in cazul meu, pentru ca nu dispun de port LAN);
  • Baterie externa pentru a alimenta placuta;
  • Fire mama-mama;
  • 16 x 2 LCD;

  • CardSD 16GB;

  • Potentiometru;

Step 5: Conectivitate

  • Raspberry Pi 3 B+ -- Laptop

Se conecteaza cu ajutorul cablului LAN si a adaptorului USB network.

  • Raspberry Pi 3 B+ -- Alfa Network AWUS036NHA

Cablul USB al adaptorului WiFi se introduce intr-un port USB al placutei.

  • Raspberry Pi 3 B+ ---> GPS Neo-6M

VCC (3.3V) ---> VCC

RXD ---> TXD

TXD ---> RXD

GND ---> GND

Se folosesc fire mama-mama.

  • LCD ---> Raspberry Pi 3 B+

1. Pin 1 (Ground) ---> ground rail.

2. Pin 2 (VCC/5v) ---> positive rail.

3. Pin 3 (V0) ---> middle wire of the potentiometer.

4. Pin 4 (RS) ---> GPIO25 (Pin 22)

5. Pin 5 (RW) ---> ground rail.

6. Pin 6 (EN) ---> GPIO24 (Pin 18)

7. Pin 11 (D4) ---> GPIO23 (Pin 16)

8. Pin 12 (D5) ---> GPIO17 (Pin 11)

9. Pin 13 (D6) ---> GPIO18 (Pin 12)

10. Pin 14 (D7) ---> GPIO22 (Pin 15)

11. Pin 15 (LED +) ---> positive rail.

12. Pin 16 (LED -) ---> ground rail.

Step 6: Setup

Avand toate elementele hardware, am trecut la configurare. Primul pas a fost instalarea sistemului de operare pe Raspberry Pi. In cazul meu sistemul era deja instalat pe cardul microSD, singura modificare a fost activarea SSH-ului.

Urmatorul pas a fost configurarea laptopului pentru a trimite retea catre Raspberry Pi.

In Control Panel\Network and Internet\Network Connections am modificat proprietatile WiFi-ului la care eram conectat, bifand Allow other network users to connect through this computer's internet connection si selectand Ethernet2.

Dupa aceasta setare, in acelasi folder am verificat proprietatile Ethernet2 - Internet Protocol Version 4(TCP/IPv4) pentru a vedea ce IP foloseste Ethernet2. Astfel, am observat ca Raspberry Pi-ul va avea mereu un ip intre 192.168.137.1-254. Cu ajutorul programului Advance IP Scanner, cautand in acest domeniu, am reusit sa ma conectez la placuta prin Putty.

*Raspberry Pi-ul nu are setat un IP static, acesta se schimba la fiecare conecare a firului.

*La fel de usor, prin Putty m-am conectat apoi utilizand numele placutei afisat la prima rulare al Advance IP Scanner.

Step 7: GPSD

Dupa conectare, am actualizat sistemul, deoarece acesta putea fi in urma cu actualizarile. Am folosit:

sudo apt-get update

Cu sistemul actualizat, am instalat programele de care mai aveam nevoie. Am rulat:

sudo apt-get install -y screen gpsd libncurses5-dev libpcap-dev tcpdump libnl-dev gpsd-clients python-gps

Aceasta comanda instaleaza GPSD, pe care l-am modificat configurat apoi. Ruland

sudo nano /etc/default/gpsd

am modificat setarile astfel:

START_DAEMON="true"

GPSD_OPTIONS="-n"

DEVICES="/dev/ttyS0" <-- singura modificare pe care am facut-o

USBAUTO="true"

GPSD_SOCKET="/var/run/gpsd.sock"

*Se poate modifica /dev/ttyS0cu calea catre locul de unde ia gps-ul datele

Step 8: Kismet

Urmatorul pas a fos de a descarca Kismet.

wget http://www.kismetwireless.net/code/kismet-2016-07-R1.tar.xz

Kismet este un detector de WiFi, Bluetooth, etc.

Acestia sunt urmatorii pasi pe care i-am facut:

tar -xvf kismet-2016-07-R1.tar.xz
cd kismet-2016-07-R1/

./configure

make dep

make

sudo make install

Pentru a nu fi intrebat de fiecare data ce WiFi sa fie folosit, am decis sa editez fisierul de configurare al Kimset.

ifconfig

De obicei daca se exista un WiFi extern, acesta este pe wlan1

sudo nano /usr/local/etc/kismet.conf

Am adaugat:

ncsource=wlan1

De asemenea, am observat ca in output-ul vor fi fisiere care nu sunt utile pentru acest proiect asaca am moficiat logtypes in felul urmator:

logtypes=gpsxml,netxml

Step 9: LCD

Pentru afisarea pe LCD am folosit libraria AdaFruit.

git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git

cd ./Adafruit_Python_CharLCD
sudo python setup.py install

Pentru afisarea coordonatelor pe LCD am folosit acest script in python.

*Din motive de portabilitate am ales eliminarea LCD-ului.

Step 10: Testare GPS

Urmatorul pas a fost testarea GPS-ului.

Am creat o copie a cmdline.txt.

sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt

Am editat cmdline.txt si am eliminat interfata seriala, stergand console=ttyAMA0,115200.

sudo nano /boot/cmdline.txt

sudo reboot

Dupa reboot, am verificat baud rate-ul de la ttyS0:

sudo stty -F /dev/ttyS0 -a

Am setat baud rate-ul manual la 9600

sudo stty -F /dev/ttyS0 9600

Am testat printr-un simplu cat:

sudo cat /dev/ttyS0

Se primeau date incontinuu, deci gps-ul receptiona si baud rate-ul era corect setat.

Am dat start la GPSD:

sudo gpsd /dev/ttyS0 -F /var/run/gpsd.sock

Datele primite se pot afisa usor prin

cgps -s

sau

gpsmon


*Alte comenzi folositoare au fost:

sudo service gpsd restart

sudo service gpsd start

sudo service gpsd stop

sudo killall gpsd

Step 11: Proba Dispozitiv

Primul lucru pe care l-am facut a fost sa creez un director de teste:

mkdir ~/test
cd ~/test

Am deschis GPSD (in caz ca este inchis) si Kismet:

sudo stty -F /dev/ttyS0 9600

sudo cat /dev/ttyS0

sudo gpsd /dev/ttyS0 -F /var/run/gpsd.sock

screen -S kismet

sudo kismet

Dupa ce s-a deschis am apasat YES si START.

In aceste momente Kismet ruleaza si achizitioneaza date. In centru se pot oberva informatiile GPS, iar in dreapta se observa numarul de retele gasite. Am creeat un nou screen pentru Kimset, pentru a-i putea da timp sa achizitioneze date (CTRL + A / D).

Pentru a reconecta screen-ul:

screen -r kismet

Kismet inca ruleaza. In acest mod, putem porni Kismet si apoi deconectam placuta de la laptop. Cat timp Raspberry Pi-ul va fi alimentat, Kismet va rula. Astfel, se vor cartografia toate retelele receptionate in cazul deplasarii de la un punct la altul.

Step 12: Rezultate

Dupa inchiderea Kismet, toate datele au fost scrise in directorul curent (numit test). Se pote verifica existenta celor 2 fisiere XML pe care Kismet le-a creat prin comanda:

ls

Se afiseaza:

Kismet-20190409-17-43-54-1.gpsxml

Kismet-20190409-17-43-54-1.netxml

Cautand pe internet, am gasit un script care pregateste datele, salvadu-le intr-un fisier hartaWiFi.kml care poate fi importat in Google Maps (de exemplu).

wget https://gist.githubusercontent.com/ScottHelme/5c6869e17c3e9c8b2034dc8fc13e180b/raw/31c2d34f66748b6bd26415fd7d120c06b3d92eaf/netxml2kml.py -O netxml2kml.py

Am rulat scriptul:

python netxml2kml.py --kml -o hartaWiFi *xml

Acum, fisierul hartaWiFi.kml este creat si gata a fi incarcat pe Google Maps sau alt mediu in care se pot plota fisiere kml.

Step 13: Export Rezultate 1

Primul lucru pe care l-am facut a fost sa copiez de pe Raspberry Pi fisierul hartiWiFi.kml, folosind WinSCP, local, pe laptop.

    Am creat o noua harta in Google Maps (link) si am importat fisierul hartiWiFi.kml.

    Rezultatul se poate vedea in poze. In urma cartografierii si incarcarii fisierului in Google Maps, vor aparea informatii despre localizare, nume, tipul retelei, dar nu numai.

    Step 14: Export Rezultate 2

    O alta metoda de a afisa datele a fost sa creez pe laptop un fisier .html unde am importat harta cu acest cod.

    Am incarcat fisierul .kml pe drive iar apoi am generat un link, utilizand Direct Link Generator. Link-ul generat l-am incarcat in cod la url:

    var kmlLayer = new google.maps.KmlLayer({

    url: '--------------',

    suppressInfoWindows: true,

    map: map });

    Rezultatele se pot vedea in poza.