Repetor WiFi cu legătură GSM de siguranță

Dispozitivele de tip repetor au ca principal scop extinderea acoperirii semnalului pentru o rețea radio. Repetoarele WiFi extind acoperirea unei rețele WiFi astfel încât să nu fie necesară instalarea și managementul mai multor dispozitive de tip AP. În cadrul materialului de față vă propunem implementarea unui dispozitiv repetor WiFi cu o funcționalitate suplimentară față de un repetor standard: dirijarea traficului pe o conexiune de date GSM în cazul în care conexiunea WiFi se întrerupe. Astfel, sistemul se va comporta ca un repetor WiFi în mod obișnuit dar se va transforma într-un router WiFi GSM în cazul în care conexiunea principală are probleme (a se vedea și materialul „Router WiFi GSM utilizând LinkIt Smart 7688”).

Pentru implementare vom utiliza o placă de dezvoltare LinkIt Smart 7688 bazată pe circuitul SoC MediaTek MT7688AN și care rulează distribuția Linux OpenWRT. Această placă de dezvoltare oferă, la un preț redus, toate facilitățile de routare, filtrare și control al traficului TCP/IP oferite de sistemele de operare Linux. Pentru mai multe detalii legate de funcționarea și utilizarea plăcii de dezvoltare LinkIt Smart 7688 puteți consulta wiki-ul oficial. Pentru conexiunea de date GSM vom utiliza un modem USB GSM 3G. Conectarea modemului USB la placa de dezvoltare necesită un adaptor microUSB – USB. Alimentarea sistemului se va face la 5V, minim 500mA – preferabil 1A (orice încărcător de mobil de 1A și mufă microUSB e bun).

2

Placa de dezvoltare LinkIt Smart 7688 oferă posibilitatea de funcționare în mod repetor începând cu versiunea 0.9.4 de firmware. Nu vom utiliza modalitatea de configurare oferită de interfața web, configurarea inițială va fi de Station mode (client WiFi) deoarece vom avea nevoie de conexiunea Internet pentru a instala câteva pachete software suplimentare.

3

După configurarea și repornirea plăcii ne putem conecta la aceasta prin SSH (utilizând PUTTY de exemplu). IP-ul de conectare depinde de rețeaua locală. Vom rula următoarele comenzi pentru instalarea pachetelor software necesare configurării conexiunii de date GSM:

# opkg update

# opkg install comgt kmod-usb-serial kmod-usb-serial-option kmod-usb-serial-wwan usb-modeswitch usbtools

Eventual putem instala și un editor de text suplimentar dacă nu ne place vi :

# opkg install nano

Sistemul va avea două configurații diferite de rețea între care va comuta în cazul întreruperii / restaurării conexiunii WiFi principale. Vom crea în directorul /root două directoare config_wifi și config_3g și în fiecare vom crea 3 fișiere de configurare: firewall, network și wireless (se pot copia din /etc/config pentru a nu le tasta de la zero).

Fișierul network – varianta wifi – nu definește nici o interfață utilizată în funcționalitatea de repetor.

config interface ‘loopback’

option ifname ‘lo’

option proto ‘static’

option ipaddr ‘127.0.0.1’

option netmask ‘255.0.0.0’

config globals ‘globals’

option ula_prefix ‘fdea:6296:e400::/48’

config interface ‘lan’

option force_link ‘1’

option macaddr ‘9c:65:f9:1e:69:77’

option proto ‘static’

option netmask ‘255.255.255.0’

option ip6assign ’60’

option ipaddr ‘192.168.100.1’

option delegate ‘0’

option ifname ‘ra0’

config switch

option name ‘switch0’

option reset ‘1’

option enable_vlan ‘0’

config interface ‘wan’

option proto ‘dhcp’

Fișierul network – varianta 3G – va arăta identic dar va avea în plus definiția interfeței de comunicație GSM (se va adăuga la sfârșitul fișierului anterior). APN-ul și codul pin se vor personaliza în funcție de cartela SIM GSM.

config interface ‘gsm’

option proto ‘3g’

option device ‘/dev/ttyUSB0’

option service ‘umts’

option apn ‘net’

option pincode ‘0000’

Fișierul wireless – varianta WiFi – va defini funcționarea în mod mixt AP+STA. În fișier trebuie personalizate datele de acces la rețeaua WiFi (secțiunea STA) și datele de conectare la repetor (secțiunea AP) – pot fi identice, repetorul poate oferi acces cu aceleași credențiale ca și rețeaua WiFi originală.

config wifi-device ‘radio0’

option type ‘ralink’

option variant ‘mt7628’

option country ‘TW’

option hwmode ’11g’

option htmode ‘HT40’

option channel ‘auto’

option disabled ‘0’

option linkit_mode ‘apsta’

config wifi-iface ‘ap’

option device ‘radio0’

option mode ‘ap’

option network ‘lan’

option ifname ‘ra0’

option encryption ‘psk2’

option seq ‘1’

option ssid ‘xxxxxx’

option key ‘xxxxxx’

config wifi-iface ‘sta’

option device ‘radio0’

option mode ‘sta’

option network ‘wan’

option ifname ‘apcli0’

option led ‘mediatek:orange:wifi’

option ssid ‘xxxxx’

option key ‘xxxxx’

option encryption ‘psk2’

Fișierul wireless – varianta 3G  – va defini funcționarea doar în mod AP. În cazul în care definim aceleași credențiale ca și AP-ul principal, sistemul va suplini conexiunea WiFi și pentru clienții direcți ai AP-ului principal în cazul întreruperii conexiunii principale.

config wifi-device ‘radio0’

option type ‘ralink’

option variant ‘mt7628’

option country ‘TW’

option hwmode ’11g’

option htmode ‘HT40’

option channel ‘auto’

option disabled ‘0’

option linkit_mode ‘ap’

config wifi-iface ‘ap’

option device ‘radio0’

option mode ‘ap’

option network ‘lan’

option ifname ‘ra0’

option encryption ‘psk2’

option seq ‘1’

option ssid ‘xxxxxx’

option key ‘xxxxxx’

Fișierul firewall – variantele WiFi și 3G diferă de fișierul original din /etc/config doar prin linia option network a secțiunii wan.

———————————- WiFi ——————————-

config zone

option name ‘wan’

option network ‘wan wan6’

option output ‘ACCEPT’

option forward ‘REJECT’

option masq ‘1’

option mtu_fix ‘1’

option input ‘ACCEPT’

———————————- 3G ——————————-

config zone

option name ‘wan’

option network ‘gsm’

option output ‘ACCEPT’

option forward ‘REJECT’

option masq ‘1’

option mtu_fix ‘1’

option input ‘ACCEPT’

Scripturile care vor face comutarea între cele două configurații de rețea (între cele două funcționalități ale sistemului) se vor crea în directorul /root sub denumirile: switch și normal (nu uitați să dați drepturi de execuție pe cele două fișiere # chmod +x …). Fișierul switch va face comutarea pe conexiunea GSM în cazul în sistemul nu are conexiune la Internet:

#!/bin/ash

ping -q -c 1 -W 10 8.8.8.8 > /dev/null

if [ $? -ne 0 ]

then

cp -f /root/config_3g/network /etc/config/network

cp -f /root/config_3g/firewall

/etc/config/firewall

cp -f /root/config_3g/wireless

/etc/config/wireless

/etc/init.d/network restart

fi

Scriptul normal va verifica dacă este în modul GSM (prin verificarea conexiunii cu AP-ul principal – scriptul trebuie personalizat cu adresa IP a AP-ului principal) și va reîncerca reintrarea în mod repetor WiFi:

#!/bin/ash

ping -q -c 1 -W 10 XXX.XXX.XXX.XXX > /dev/null

if [ $? -ne 0 ]

then

cp -f /root/config_wifi/network

/etc/config/network

cp -f /root/config_wifi/firewall

/etc/config/firewall

cp -f /root/config_wifi/wireless

/etc/config/wireless

/etc/init.d/network restart

fi

Ambele scripturi vor fi rulate în mod automat de serviciul cron al sistemului de operare. Frecevența de execuție stă la latitudinea utilizatorului, testele au fost realizate cu o frecvență de o dată pe oră (la fix scriptul switch, la și jumătate scriptul normal), conținutul fișierului /etc/crontabs/root fiind:

00 * * * * /root/switch

30 * * * * /root/normal

Sistemul prezentat poate fi folosit în diverse scenarii, de exemplu:

  • Într-o locuință de dimensiuni mari pentru a extinde semnalul WiFi în toate camerele și pentru a oferi o conexiune de siguranță la Internet pentru cazurile de întrerupere a conexiunii principale. În acest caz credențialele de acces pot fi comune între AP-ul principal și repetor.
  • Pentru o rețea de senzori WiFi se poate oferi o rețea WiFi dedicată, eventual o zonă de acoperire specială utilizând o antenă direcțională, și care are legătură la Internet redundantă (ISP / GSM) având în vedere un posibil caracter critic a funcționalității.

Router WiFi GSM utilizând LinkIt Smart 7688 Duo

Chiar dacă implementarea funcționalității de router WiFi GSM utilizând familia de plăci LinkIt Smart 7688 nu este nouă în cadrul lecțiilor noastre, o să încercăm în materialul de față să propunem o versiune îmbunătățită a acestui tip de sistem. Placa de dezvoltare LinkIt Smart 7688 Duo, spre deosebire de placa LinkIt Smart 7688, deține un microcontroler ATmega32U4 ce poate fi utilizat în cadrul sistemului pentru diverse sarcini de timp real (comandă de motoare, interfață utilizator, achiziție de valori de la diverși senzori etc.). În cadrul sistemului nostru vom utiliza microcontrolerul prezent pe placa de dezvoltare pentru implementarea interfeței utilizator, mai exact vom adăuga sistemului un ecran ce va afișa în timp real date despre funcționarea routerului (număr de clienți WiFi, puterea semnalului GSM, traficul prin intermediul routerului).

Pentru configurarea de bază a routerului se vor efectua exact aceeași pași ca și în cazul plăcii LinkIt Smart 7688 (a se vedea și „Router WiFi GSM utilizând LinkIt Smart 7688”), mai exact (pe scurt):

  • Vom configura placa în mod client WiFi pentru a putea instala pachetele necesare funcționării modemului GSM;
  • Vom instala și configura modemul GSM prin definirea unei noi interfețe de rețea;
  • Noua interfață de rețea va fi introdusă în firewall în zoua wan și vom configura pornirea automată a interfeței la pornirea sistemului de operare;
  • Vom reconfigura placa în modul AP setând numele și parola de acces dorită.

Pentru afișare vom utiliza un ecran OLED monocrom ce va comunica cu placa de dezvoltare prin I2C:

  • Alimentarea se va face la 3.3V (3.3V conectat la 3.3V, GND la GND);
  • Pinul Data al afișajului la pinul D2 (SDA) al plăcii de dezvoltare;
  • Pinul Clk al afișajului la pinul D3 (SCL) al plăcii de dezvoltare;
  • Pinul Rst al afișajului la pinul D5 al plăcii de dezvoltare (opțional).

2

Programul (pentru microcontrolerul ATmega32U4) va utiliza bibliotecile Adafruit GFX și Adafruit SSD1306 pentru partea de comunicație cu ecranul OLED și biblioteca Process (Bridge) pentru a comunica cu sistemul de operare OpenWRT.

#include <SPI.h>

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#define OLED_RESET 5

Adafruit_SSD1306 display(OLED_RESET);

#include <Process.h>

Secțiunea setup() va inițializa ecranul OLED și comunicația cu sistemul de operare OpenWRT. Ecranul va afișa mesajul Initializing… pâna la încărcarea și inițializarea sistemului de operare (funcția Bridge.begin() va bloca programul până la stabilirea comunicației cu sistemul de operare).

3

void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.display();

  delay(2000);

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(0,0);

  display.println(“Initializing…”);

  display.display();

  delay(1);

  Bridge.begin();

  delay(1000);

}

Secțiunea loop() este responsabilă cu interogarea sistemului de operare și afișarea răspunsurilor pe ecranul OLED. Pe prima linie este afișată ora și data (utile pentru a verifica dacă sistemul funcționează corect, nu s-a blocat), a doua linie va afișa calitatea semnalului GSM (utilă pentru poziționarea unei antene externe), a treia linie va afișa numărul de clienți WiFi iar ultima linie cantitatea de informație (recepționată și transmisă) transferată prin intermediul conexiunii GSM (informații utile în cazul unui abonament de date cu limitări la datele transferate). Datele sunt împrospătate o dată la 30 de secunde.

4

void loop() {

  Process MyProc;

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(0,0);

  MyProc.runShellCommand(“date +%H:%M”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

  if (c!=’\n’) display.print((char)c);

  }

  display.print(” “);

  MyProc.runShellCommand(“date +%D”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

    if (c!=’\n’) display.print((char)c);

  }

  display.println();

  display.println();

  display.print(“RSSI:”);

  MyProc.runShellCommand(“/root/get_rssi”);

  while (MyProc.available() > 0) {

      char c = MyProc.read();

      if (c!=’\n’) display.print((char)c);

  }

  display.println();

  display.println();

  display.print(“Clients:”);

  MyProc.runShellCommand(“/root/clients”);

  while (MyProc.available() > 0) {

      char c = MyProc.read();

      if (c!=’\n’) display.print((char)c);

  }

  display.println();

  display.println();

  MyProc.runShellCommand(“ifconfig 3g-gsm | grep ‘RX bytes’ | awk ‘{ print $1 $3 $4 }'”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

    if (c!=’\n’) display.print((char)c);

  }

  display.println();

  MyProc.runShellCommand(“ifconfig 3g-gsm | grep ‘RX bytes’ | awk ‘{ print $5 $7 $8}'”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

    if (c!=’\n’) display.print((char)c);

  }

  display.display();

  delay(30000);

}

Este posibil ca legătura dintre microcontrolerul ATmega32U4 și sistemul de operare OpenWRT să fie oprită implicit (să fie oprit serviciul responsabil la nivel de sistem de operare). În acest caz este necesară rularea următoarelor comenzi în linia de comenzi a sistemului de operare:

# uci set yunbridge.config.disabled=’0’

# uci commit

# reboot

Pentru rularea scripturilor de interogare a puterii semnalului și a numărului de clienți este necesară instalarea pachetului bash sub sistemul de operare OpenWRT:

# opkg update

# opkh install bash

Scriptul de interogare a puterii semnalului se va salva în diretorul /root sub denumirea get_rssi (tebuie acordate permisiuni de execuție #chmod +x get_rssi). Scriptul va interpreta o valoare pentru calitatea semnalului mai mare de 25 ca fiind excelentă, între 19 și 25 bună, între 13 și 19 medie, între 7 și 13 slabă și sub 7 foarte slabă. Lipsa semnalului poate însemna atât aflarea într-o zonă fără semnal dar și o problemă cu modemul GSM (deconectat?) sau cu SIM-ul GSM (neintrodus, fără credit?).

#!/bin/bash

rssi=`printf “%s\n” $((/usr/sbin/chat -V -s ” ‘AT+CSQ’ ‘OK’ ” > /dev/ttyUSB2 < /dev/ttyUSB2) 2>&1 | /bin/grep CSQ: | /usr/bin/awk ‘{print $2}’)`

rssi=”${rssi//,/.}”

rssi=$(printf “%.0f” $rssi)

if [ $rssi -gt 25 ]; then

        echo “$rssi Excellent”

elif [ $rssi -gt 19 ] && [ $rssi -le 25 ]; then

        echo “$rssi Good”

elif [ $rssi -gt 13 ] && [ $rssi -le 19 ]; then

        echo “$rssi Average”

elif [ $rssi -gt 7 ] && [ $rssi -le 13 ]; then

        echo “$rssi Low”

elif [ $rssi -gt 0 ] && [ $rssi -le 7 ]; then

        echo “$rssi Very low”

else

        echo “No signal”

fi

Scriptul de interogare a numărului de clienți WiFi se va salva în diretorul /root sub denumirea clients (tebuie acordate permisiuni de execuție #chmod +x clients). Scriptul va verifica numărul de înregistrări ARP din rețeaua WiFi. Atenție!!! Conectarea unui nou client WiFi va conduce la incrementarea imediată a numărului de clienți dar deconectarea nu va conduce la o decrementare decât în momentul în care expiră cache-ul ARP.

nr=0

for ip in $(cat /proc/net/arp | grep -v IP | awk ‘{print

$1}’); do

    nr=$((nr+1))

done

echo $nr

 

Dacă doriți să explorați și alte variante de implementare puteți vedea și „Smart Router With WiFi Connection Visualization”.

ESP8266 Geolocation

Localizarea geografică este o problemă rezolvată cu ajutorul mai multor tehnologii actuale. Tehnologia GPS, cea mai cunoscută și utilizată modalitate de localizare, necesită funcționarea în spații deschise și utilizarea unui receptor specializat. În dispozitivele actuale această tehnologie se utilizează în combinație cu alte metode pentru a crește acuratețea localizării și pentru a oferi posibilitatea de localizare inclusiv în interiorul clădirilor. De exemplu, în telefoanele mobile inteligente, tehnologia GPS este combinată cu triangularizarea semnalelor radio GSM  și WiFi. În cadrul materialului de față vom arăta cum putem utiliza tehnica de localizare bazată pe triangularizarea semnalului WiFi utilizând o placă de dezvoltare WiFi ESP8266 și pe serviciul cloud Google Geolocation API. O astfel de soluție permite realizarea unui dispozitiv de localizare mult mai ieftin decât dispozitivele comerciale bazate pe soluții GPS și care permite localizarea inclusiv în interiorul clădirilor. Singura cerință de funcționare mai specială a dispozitivului este prezența unor rețele WiFi cartografiate de compania Google (cerință îndeplinită cu siguranță în mediul urban).

Pentru implementare am ales o placă de dezvoltare Adafruit Feather HUZZAH dar poate fi utilizată orice placă bazată pe ESP8266. Unul dintre avantajele oferite de placa de dezvoltare aleasă este posibilitatea de alimentare directă de la un acumulator LiPo de 3.7V permițând astfel realizarea unui sistem portabil. Pentru partea de afișare, utilă mai ales în cazul utilizării mobile a dispozitivului implementat, am utilizat un afișaj SHARP Memory Display ce are un consum extrem de redus (4µA @ 3.3V) și un contrast foarte bun.

Cele două componente ale sistemului vor comunica prin intermediul unei conexiuni SPI unidirecționale (doar 3 fire). Asftel, vom conecta:

  • Pinii 3.3V și GND al ecranului la pinii corespondenți ai plăcii de dezvoltare;
  • Pinul CLK al ecranului la pinul 14 al plăcii de dezvoltare;
  • Pinul DI al ecranului la pinul 13 al plăcii de dezvoltare;
  • Pinul CS al ecranului la pinul 5 al plăcii de dezvoltare.

2

Pinul 16 (Wake) al plăcii va fi conectat la pinul RST dacă dorim ca sistemul să intre în modul de consum redus între două localizări (util pentru funcționarea mobilă cu alimentare bazată pe acumulator). Conexiunea trebuie realizată după încărcarea programului pe placa de dezvoltare.

Programul sistemului a fost testat utilizând mediul de dezvoltare Arduino IDE 1.8.5 având instalate extensia ESP8266 Community 2.4.1 și bibliotecile Adafruit GFX 1.2.3, Adafruit SHARP Memory Display 1.0.6 (pentru controlul ecranului) și WifiLocation 1.2.2 (pentru interacțiunea cu Geolocation API).

#include <ESP8266WiFi.h>

#include <WifiLocation.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SharpMem.h>

În cadrul programului trebuie personalizate datele de acces la o rețea WiFi (ssid și passwd) și cheia de acces la serviciile cloud Google (googleApiKey). Pentru a obține cheia de acces trebuie să vă înregistrați ca dezvoltator pe site-ul Google Developers, să activați funcționalitatea GeoLocation API și să solicitați cheia de acces. Accesul este gratuit până la o limită de 2500 de interogări pe zi (evitați o utilizare la un interval mai mic de 30 de secunde).

const char* googleApiKey = “…”;

const char* ssid = “…”;

const char* passwd = “…”;

WifiLocation location(googleApiKey);

#define SHARP_SCK  14

#define SHARP_MOSI 13

#define SHARP_SS   5

Adafruit_SharpMem display(SHARP_SCK, SHARP_MOSI, SHARP_SS, 96, 96);

#define BLACK 0

#define WHITE 1

Directiva debug poate fi utilizată (decomentată) dacă doriți să vedeți mesajele generate de sistem în consola serială.

//#define debug

3

În cadrul secțiunii setup() se va realiza scanarea rețelelor WiFi din zona în care se află sistemul, obținerea coordonatelor geografice de la serviciul cloud de localizare pe baza puterii semnalului fiecărei rețea WiFi observate și afișarea coordonatelor pe ecran (și în consola serială dacă este activată directiva debug). După un ciclu de localizare sistemul va intra în stare de consum redus (deepSleep) pentru 10 minute. Datele afișate vor conține latitudinea și longitudinea precum și acuratețea localizării (exprimată în metri).

4

void setup() {

#ifdef debug

Serial.begin(115200);

#endif

display.begin();

display.clearDisplay();

display.refresh();

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, passwd);

while (WiFi.status() != WL_CONNECTED) {

#ifdef debug

Serial.print(“Attempting to connect to WPA SSID:“);

Serial.println(ssid);

Serial.print(“Status = “);

Serial.println(WiFi.status());

#endif

delay(500);

}

location_t loc = location.getGeoFromWiFi();

#ifdef debug

Serial.println(“Location request data”);

Serial.println(location.getSurroundingWiFiJson());

Serial.println(“Latitude: ” + String(loc.lat, 7));

Serial.println(“Longitude: ” + String(loc.lon, 7));

Serial.println(“Accuracy: ” + String(loc.accuracy));

#endif

display.setTextColor(BLACK);

display.setCursor(12,10);

display.setTextSize(1);

display.println(“Latitude:”);

display.setCursor(5,19);

display.setTextSize(2);

display.println(String(loc.lat, 3));

display.setCursor(12,37);

display.setTextSize(1);

display.println(“Longitude:”);

display.setCursor(5,46);

display.setTextSize(2);

display.println(String(loc.lon, 3));

display.setCursor(12,64);

display.setTextSize(1);

display.println(“Accuracy:”);

display.setCursor(5,73);

display.setTextSize(2);

display.println(String(loc.accuracy));

display.refresh();

ESP.deepSleep(600L*1000000L);

}

void loop() {

}

 

Cameră video GSM

Camerele de supraveghere video sunt deja o tehnologie comună. Ca urmare a creșterii acoperirii și vitezei de comunicație a rețelei Internet majoritatea camerelor de supraveghere sunt camere digitale IP. Instalarea acestora este simplă și este posibilă stocarea înregistrărilor video pe sisteme aflate la mare distanță. O categorie specială de sisteme de supraveghere video sunt camerele ce funcționează în lipsa unei infrastructuri Internet obișnuite (cablu sau WiFi). Este vorba de sistemele de supraveghere ce funcționează în locații izolate, camere de supraveghere a unor zone sălbatice, camere de supraveghere a vânatului etc. Aceste camere pot înregistra doar local imaginile surprinse (pe o memorie internă) sau le pot transmite prin intermediul infrastructurii puse la dispoziție de rețelele de telefonie mobilă ce au o acoperire mult mai mare decât rețelele WiFi / cablu. Materialul de față își propune să prezinte o modalitate de construire a unei astfel de camere video ce permite transmisia imaginilor la distanță prin intermediul unui modem GSM. Soluția este simplă și are un cost mult mai mic decât sistemele comerciale aflate pe piață. În construirea sistemului ne vom folosi de o placă Raspberry Pi Zero (este mai ieftină achiziționarea unui kit format din placă și adaptori decât achiziționarea separată, în cazul sistemului nostrul vom avea nevoie atât de pini cât și de adaptorul microUSB-USB), o cameră video Raspberry Pi versiunea 2 și de un modem GSM USB. Testele au fost realizate utilizând un modem USB Huawei E3131 oferit gratuit la contractarea oricărui alt serviciu de către unul dintre marile companii de servicii Internet și TV din România dar se poate utiliza orice modem USB (de exemplu). Unul dintre avantajele utilizării unui modem USB este posibilitatea utilizării rețelelor de telefonie mobilă exclusiv 3G / 4G.

2

Pentru alimentarea sistemului se poate utiliza o baterie externă USB sau un alimentator de rețea de 5V, minim 1A (se poate utiliza alimentatorul oficial al plăcii Raspberry Pi 3).

Conectarea camerei video necesită un cablu special deoarece conectorul de pe placa Raspberry Pi Zero are o dimensiune mai mică decât conectorul de pe placa Raspberry Pi.

4

ATENȚIE!!! Doar începând cu versiunea 1.3 placa Raspberry Pi Zero are conector CSI.

ATENȚIE!!! Conectorul CSI de pe placa Raspberry Pi Zero este foarte firav (mult mai firav decât cel de pe placa Raspberry Pi), manevrați cu foarte multă grijă sau riscați să distrugeți fizic clema de închidere a mufei.

3

Pentru punerea în funcțiune a sistemului mai aveți nevoie de un card microSD pe care să copiați sistemul de operare (se recomandă utilizarea unui card de memorie de calitate). Se recomandă utilizarea versiunii Lite a sistemului de operare Raspbian pentru a nu încărca microprocesorul cu execuția interfeței grafice utilizator și a altor servicii ce nu sunt necesare. Pentru testare s-a utilizat versiunea 2018-03-13-raspbian-stretch-lite.

Deoarece placa Raspberry Pi Zero nu are nici o conectivitate de rețea și nici nu are suficienți conectori pentru conectarea simultană a mai multor dispozitive USB (tastatură + modem GSM USB) se va apela la conectarea unui convertor serial – USB de 3.3V sau a unui cablu de debug Raspberry Pi. Această modalitate de acces va permite accesarea consolei de comenzi a plăcii direct prin intermediul conexiunii seriale USB. Pentru mai multe detalii se poate consulta și materialul „Raspberry Pi Zero Headless Quick Start”.

5

Funcționarea modemului GSM USB necesită câteva pachete software ce sunt în mod implicit instalate inclusiv în versiunea Lite a sistemului de operare Raspbian. În mod normal, după conectarea fizică a modemului, este necesară adăugării în fișierul /etc/network/interfaces a următoarelor linii:

auto gprs

iface gprs inet ppp

provider gprs

și crearea fișierului gprs în directorul /etc/ppp/peers cu următorul conținut:

connect “/usr/sbin/chat -v -f /etc/chatscripts/gprs -T em”

/dev/ttyUSB0

noipdefault

defaultroute

replacedefaultroute

hide-password

noauth

persist

usepeerdns

După o repornire a plăcii placa Raspberry Pi Zero ar trebui să aibă conectivitate Internet prin intermediul modemului GSM USB (bineînțeles dacă acesta are o cartelă SIM validă). În cazul în care configurația indicată nu funcționează este necesară conectarea temporară (înlocuirea modemului GSM USB) a unei plăci de rețea USB, aducerea la zi a sistemului de operare:

# sudo apt-get update

# sudo apt-get upgrade

și instalarea pachetelor ce deservesc funcționarea conexiunii de rețea prin intermediul modemului GSM USB:

# sudo apt-get install ppp usb-modeswitch usb-modeswitch-data

Alternativ, se poate utiliza o placă Raspberry Pi Zero W dacă nu se dorește realizarea unei camere video GSM ci a unei camere video IP WiFi (camera va transmite imagini prin intermediul unei rețele WiFi obișnuite). Varianta potrivită dacă doriți să realizați o cameră video de supraveghere pentru apartament nu pentru locații izolate. În acest caz kitul conține și cablul pentru conectorul CSI specific Raspberry Pi Zero și o carcasă în care se pot integra cu ușurință placa și camera video. Bineînțeles, este posibilă combinarea celor două soluții de conectare și se poate cerceta posibilitatea de realizare a unui router GSM-WiFi ce include cameră video de supraveghere.

Pentru verificarea funcționării camerei video se poate rula comanda:

# raspistill -o poza.jpg

Dacă comanda anterioară nu returnează nici o eroare, cel mai probabil camera video este conectată corect și funcționează corespunzător.

Pentru transmiterea în rețea a imaginilor preluate de la camera video vom utiliza programul motion iar ca interfață web motioneye. Pentru instalarea celor două programe se recomandă parcurgerea materialului oficial „Install On Raspbian”. Pachetul motion este integrat în distribuția Raspbian dar se recomandă instalarea versiunii indicate în materialul anterior. Camera CSI utilizată în proiectul nostru nu este compatibilă cu software-ul motion din acest motiv trebuie activat un modul la nivel de kernel care să permită utilizarea acesteia ca o cameră USB obișnuită. Acest lucru se realizează prin inserarea următoarei linii în fișierul /etc/modules:

bcm2835-v4l2

Dacă utilizăm o placă Raspberry Pi Zero W putem verifica funcționarea transmiterii de imagini în rețeaua locală accesând adresa IP a plăcii pe portul 8765 (utilizator: admin, fără nici un fel de parolă).

În cazul în care utilizăm Raspberry Pi Zero și modem USB GSM sau în cazul în care dorim să accesăm o placă Raspberry Pi Zero W dintr-o altă rețea decât cea locală, adică dacă dorim să accesăm interfața MotionEye prin Internet, vom utiliza un serviciu ce permite redirectarea conexiunilor. Acest serviciu este disponibil prin intermediul platformei remot3.it și este gratuit (prin înregistrarea unui cont) la un nivel decent de utilizare (8 ore pe zi). Această soluție ne scutește de configurații de rețea complicate precum redirectare de porturi sau achiziționarea de adrese IP fixe de la furnizorul de servicii Internet. Pentru utilizarea efectivă a serviciului este necesară instalarea pachetului weavedconnectd și înregistrarea sistemului sub contul creat pe platformă – procese detaliate în materialul „Installing the remot3.it weavedconnectd daemon on your Raspberry Pi”. În cadrul instalării este necesară definirea unei redirectări pentru interfața web MotionEye (protocol HTTP, port 8765):

6

După parcurgerea acestor operații vom putea accesa interfața web a camerei video de oriunde din Internet prin intermediul platformei remot3.it.

7

O alternativă suplimentară de acces la interfața web a camerei este aplicația mobilă (pentru sistemul de operare Android) Weaved For Raspberry Pi prin intermediul căreia veți putea accesa de la distanță orice serviciu de pe placa Raspberry Pi inclusiv interfața web a camerei video.

8

Cum verificăm acoperirea LoRaWAN TTN

Rețelele radio Long Range (LoRaWAN) permit dezvoltarea de rețele de senzori și de dispozitive IoT pe distanțe de ordinul kilometrilor cu un consum extrem de redus din puntul de vedere al dispozitivelor IoT. Rețelele publice LoRaWAN precum TTN permit utilizarea acestei tehnologii fără a avea grija infrastructurii (a sistemelor gateway ce fac legătura între rețeaua radio și Internet). Totuși, o problemă supărătoarea este dată de încercarea de a răspunde la întrebarea dacă locația unde dorim să poziționăm dispozitivul IoT propriu se află sau nu în acorperirea rețelei TTN (se află sau nu în aria de acoperire a unui gateway public TTN).

La prima vedere răspunsul la această întrebare se poate baza pe harta sistemelor gateway înregistrate pe platforma TTN de către utilizatori. În secțiunea COMMUNITIES a platformei selectăm zona sau orașul unde ne aflăm și putem vedea sistemele gateway din apropierea locului în care ne aflăm și aria aproximativă de acoperire (mai jos putem vedea acest lucru pentru municipiul București, jaloanele roșii indică sisteme gateway inactive):

2

Această metodă de evaluare a zonelor de acoperire nu oferă nici un fel de garanție. Aria de acoperire este estimată iar faptul că un gateway este activ nu semnifică altceva decât faptul că există legătură între acesta și platforma TTN (conexiune Internet) – un gateway activ poate foarte bine să aibă componenta LoRa inactivă. Un alt aspect ce poate conduce la o evaluare greșită este faptul că nu toți utilizatorii își fac publică locația dispozitivelor gateway sau, și mai problematic, introduc coordonate greșite.

O altă variantă de verificare este platforma TTN Mapper ce conține o hartă de acoperire a sistemelor gateway TTN bazată pe măsurători realizate de utilizatori. Această hartă este un mult mai bun punct de plecare în evaluarea unei locații în care puteți poziționa un sistem IoT LoRaWAN dar nici această metodă nu poate indica o acoperire provenită de la un gateway a căror coordonate au fost indicate greșit.

3

Cea mai bună soluție este să realizăm chiar noi măsurătoarea pentru locația dorită. Acest lucru se poate face utilizând un sistem emițător LoRa echipat cu un dispozitiv GPS (de exemplu o placă Seeeduino LoRaWAN with GPS, a se vedea și materialul „Using Seeeduino LoRaWAN with GPS and Loriot.io”) sau, și mai simplu, orice emițător LoRa și un telefon mobil Android.

Nu contează tipul emițătorului LoRa utilizat și nici natura mesajelor trimise către platforma TTN, contează doar ca emițătorul să fie înregistrat în cadrul platformei TTN. Se poate utiliza o placă Arduino Uno și un shield Dragino LoRa (a se vedea materialul „Cum să realizăm un sistem IoT LoRaWAN”) sau putem utiliza o placă LoPy LoRa (a se vedea materialul „LoRa meets ESP32”). Următorul pas, după punerea în funcțiune a nodului emițător TTN, este instalarea aplicației TTN Mapper pe telefonul mobil. La prima pornire a aplicației se va solicita asocierea cu nodul TTN utilizat. Această metodă pleacă de la premisa că nodul TTN și telefonul mobil pe care avem instalată aplicația TTN Mapper se află în aceiași locație. În cazul în care nodul TTN este mobil se poate evalua o zonă mai largă nu doar o locație anume. În momentul în care un pachet LoRa este primit de platforma TTN și provine de la nodul asociat aplicației, aplicația utilizează GPS-ul telefonului mobil pentru a indica platfomei TTN Mapper sistemele gateway ce au recepționat respectivul pachet, puterea semnalului pentru fiecare sistem gateway în parte și coordonatele punctului de unde a fost emis pachetul. Făcând un experiment bazat pe această metodă am obținut următoarele informații din aplicația TTN Mapper într-o locație din București (hartă de mai jos).

4

Experimentul a indicat că locația se află în acoperirea a două sisteme gateway TTN. Unul dintre ele se afla în imediata apropiere și era cunoscut dar cel de al doilea a reprezentat o surpriză fiind poziționat în Ciad.

5

Bineînțeles, este vorba de o eroare de introducere a coordonatelor de către proprietar (cel mai probabil o inversare a latitudinii și longitudinii). Chiar dacă distanța de comunicație în cazul LoRaWAN poate atinge zeci de kilometri nu ne putem aștepta la comunicații la mii de kilometri (e greu de crezut că LRX-BUX-76E5 Palatul telefoanelor se află în Ciad).

6

Astfel, putem vedea că un test de acoperire poate indica prezența unui sistem gateway în aria de acoperire a căruia ne aflăm și pe care nu aveam altfel cum să-l „descoperim”.

Let’s PI: Zero to IoT

Apariția Raspberry Pi Zero a făcut disponibile funcționalitățile familiei Raspberry Pi la o dimensiune și un cost mult mai mici. La jumătatea dimensiunii unei plăci obișnuite Raspberry Pi, varianta Zero oferă un microprocesor BCM2835 la 1GHz frecvență de funcționare, 512MB memorie RAM, ieșire video mini HDMI, port micro USB OTG, conector cameră și toate facilitățile oferite de sistemul de operare Raspbian.

Singura problemă pentru a utiliza această variantă a plăcii Raspberry Pi este conectivitatea de rețea. Fără a apela la versiunea Zero W, ce oferă conectivitate WiFi, putem utiliza placa Raspberry Pi Zero în proiecte IoT fără nici un fel de problemă. Este recomandată achiziționarea unui kit ce include adaptoarele HDMI – mini HDMI și micro USB OTG – USB precum și bareta de pini deoarece ele sunt absolut necesare în utilizarea plăcii Raspberry Pi Zero. Pentru punerea în funcțiune mai sunt necesare și un card microSD pentru sistemul de operare, se recomandă un card de calitate, și un alimentator de 5V.

După copierea imaginii sistemului de operare pe cardul de memorie avem următoarele opțiuni pentru interacțiunea cu placa Raspberry Pi Zero:

  • Conectăm placa la un monitor cu intrare HDMI (prin intermediul adaptorului mini HDMI – HDMI) și la o tastatură USB (prin intermediul adaptorului micro USB – USB). Această variantă de utilizare ne permite utilizarea plăcii de dezvoltare dar nu oferă nici o facilitate de conectare la Internet.
  • Conectăm, prin intermediul adaptorului micro USB – USB, o placă de rețea USB. Interacțiunea cu placa Raspberry Pi Zero se va face în linie de comandă prin intermediul protocolului SSH (utilizând programul PUTTY de exemplu). Majoritatea plăcilor de rețea, mai ales cea indicată, vor fi văzute în mod automat de sistemul de operare Raspbian și nu vor necesita nici o operație de instalare / configurare suplimentară. Pentru a activa serviciul SSH încă de la prima pornire a plăcii este necesară creare unui fișier gol cu numele ssh pe cardul pe care copiem sistemul de operare (a se vedea și „Enable SSH when creating SD card”). Bineînțeles, se poate utiliza un adaptor de rețea WiFi în locul celui Internet dar probabilitatea ca acest tip de adaptoare să necesite operații suplimentare de instalare / configurare este mai mare, cu alte cuvinte nu ne vom putea conecta din prima la placă fără tastatură și monitor.
  • Este posibilă combinarea celor două soluții anterioare dar este necesară utilizarea unui hub USB – placa de dezvoltare are un singur port USB OTG și este necesară conectarea tastaturii și a adaptorului de rețea. Este o soluție ce complică destul de mult utilizarea plăcii, este de preferat achiziționarea unei plăci Raspberry Pi 3.

Vom exemplifica realizarea sistemului IoT utilizând cea de a doua opțiune: placa Raspberry Pi Zero, adaptor micro USB – USB și placă de rețea USB. Ca serviciu IoT vom utiliza serviciul gratuit Robofun IoT iar datele raportate vor proveni de la un senzor digital de temperatură și umiditate SHT11. Conectarea dintre senzorul digital și placa de dezvoltare se face în felul următor:

3

Senzorul se va alimenta la 3.3V, pinul SCK se va conecta la pinul 23 iar pinul DAT la pinul 18. Pentru configurarea și scrierea programului IoT ne vom conecta la placa Raspberry Pi Zero prin SSH utilizând Putty. Este recomandată aducerea la zi a pachetelor software:

# sudo apt-get update

# sudo apt-get upgrade

Programul va fi scris în limbajul Python și va utiliza biblioteca pi-sht1x, pentru instalarea acesteia vom executa:

# sudo apt-get install python3-pip

# pip3 install pi-sht1x

Testele au fost realizate sub Raspbian 9, kernel 4.14.34+, Python 3.5.3 și pi-sht1x 1.0.9. Programul utilizat este următorul (PiZeroIoT.py):

import RPi.GPIO as GPIO

from pi_sht1x import SHT1x

import urllib.request

DATA_PIN = 18

SCK_PIN = 23

with SHT1x(DATA_PIN, SCK_PIN, gpio_mode=GPIO.BCM) as sensor:

temp = sensor.read_temperature()

humidity = sensor.read_humidity(temp)

SENSOR1_TOKEN="…"

SENSOR2_TOKEN="…"

urllib.request.urlopen("http://iot.robofun.ro/api/v1/senzor/"+SENSOR1_TOKEN+"/input?value="+str(temp)).read()

urllib.request.urlopen("http://iot.robofun.ro/api/v1/senzor/"+SENSOR2_TOKEN+"/input?value="+str(humidity)).read()

Variabilele SENSOR1_TOKEN și SENSOR2_TOKEN trebuie completate cu datele obținute în urma definirii a doi senzori în cadrul platformei Robofun IoT. Pentru a executa programul în mod automat la anumite intervale de timp vom crea o intrare în fișierul de configurare a serviciului cron (/etc/crontab) de forma (execuție la 10 minute):

*/10 *  * * *   pi      python3 /home/pi/PiZeroIoT.py

După repornirea sistemului, fără a ne conecta la placă, programul se va executa în mod automat și vom putea vedea graficele pentru temperatură și umiditate în interfața serviciului IoT:

4

5

Senzor IoT temperatura cu transmisie GSM

Construieste-ti sezorul tau de temperatura IoT cu stocare de date in CLOUD. In acest proiect folosim senzorul 1 Wire 18B20 de la Dallas/Maxim si shieldul GSM dual SIM  a-gsmII sau shieldul GSM GNSS dual SIM b-gsmgnss  de la itbrainpower.net. Serviciul CLOUD este oferit gratuit de Robofun.

Necesar timp: 30-45 minute – pregatire hardware si aproximativ 30-60 minutes partea de software si setarile contului cloud.

Nivel de dificultate: intermediar.

Materiale necesare hardware IOT

Despre shieldurile GSM folosite
In acest proiect am folosit, pentru exemplificare, shieldul a-gsmII v2.105, dar exact aceleasi setari hardware se aplica pentru b-gsmgnss v2.105 (interfetele si jumperii sunt plasati in aceleasi pozitii). Mai multe informatii:
documentatie a-gsmII
documentatie b-gsmgnss

Detaliere senzor 18DS20
Lipiti rezistorul de 8.2Kb intre terminalele Vdd (pin3) si DQ (pin2) ale 18B20 ca in imaginea de mai jos. Vezi referinta DALLAS/MAXIM 18B20.

Conectare hardware (toate componentele conectate in poza de mai jos)
Pasi de urmat:

  • lipiti headere (pini) ARDUINO la shieldul GSM a-gsmII
  • plug-in (conectati) sieldul a-gsmII in Arduino UNO
  • plasati jumperul a-gsmII “Power selector” in pozitia “Vin” (referinta)
  • inserati the SIM cardul in SIM socketul primar (slotul SIM aflat in proximitatea PCB). SIM-ul trebuie sa aiba dezactivata procedura de verificare a codului PIN (vezi cum se dezactiveaza verificarea PIN, aici).
  • Lipiti rezistorul de 8.2Kb intre terminalele Vdd (pin3) si DQ (pin2) ale 18B20. Lipiti firele la terminalele senzorului 18B20.
  • Conectati firele 18B20 dupa cum urmeaza: 18B20 Vdd (pin3) la Arduino 5V, 18B20 DQ (pin2) la Arduino D8  si 18B20 GND (pin1) la Arduino GND.
  • conecteaza portul USB al Arduino UNO  la PCul tau

Alimentarea senzorului IOT va fi efectuata centralizat, prin intermediul conectorului de alimentare Arduino UNO.

SOFTWARE
a. Downloadeaza itbpGSMclass library [beta]: “a-gsmII series software IoT REST support for ARDUINO” de la a-gsmII download section, sau “b-gsmgnss series software IoT REST support for ARDUINO” de la b-gsmgnss download section. Pentru a efectua download-ul clasei va trebui sa introduci IMEI-ul (se afla marcat pe modem, sau poate fi citit folosind comanda “AT+CGSN”) si adresa ta de email.

b. Expandati archiva si instalati clasa. Pe scurt, copiati folderul “itbpGSMclass” in “Arduino local user folder” [la mine se afla in: “C:\Users\dragos\Documents\Arduino\libraries”], dupa care restartati mediul Arduino. Mai multe detalii despre intalarea manala de librarii Arduino: Arduino library manual installation.

c. Creaza un folder numit “agsmII_temperature_Robofun_cloud_logger”.

d. Salveaza codul din linkul de mai jos sub denumirea de “agsmII_temperature_Robofun_cloud_logger.ino” in folderul creat mai devreme: Temperature GSM IOT main Arduino code

e. Setari variabile in “agsmII_temperature_Robofun_cloud_logger.ino”:
– tempToken [linia 19] – inlocuieste cu tokenul senzorului tau generat in cloud Robofun
– samplingPeriod [line 29]

f. Setari variabile in “itbpGSMclass library”:
– seteaza SERVER_ADDRESS si SERVER_PORT in itbpGPRSIPdefinition.h pentru ROBOFUN CLOUD, ca mai jos
#define SERVER_ADDRESS “iot.robofun.ro”
#define SERVER_PORT “80”
– seteaza APN, USERNAME si PASSWORD, corespunzator SIM-ului tau, in itbpGPRSIPdefinition.h (pentru ORANGE RO, de exemplu, APN este “INTERNET” sau “NET”, USERNAME este “” si PASSWORD este “”)
– alege modemul itbrainpower folosit in itbpGSMdefinition.h, in acest caz:
#define __itbpModem__ agsmII
– nu uita sa salvezi setarile! 😉

g. alte setari utile >> itbpGSMClassDebug, atDebug on / off si MAX_BUFFER_SIZE… in itbpGSMdefinition.h

CLOUD ROBOFUN. CONT NOU, SENZORI si SETARI
CLOUDul Robofun este un serviciu extrem de simplu de utilizat si este disponibil in mod gratuit. Acesta este disponibil la adresa: https://iot.robofun.ro. Nu intru in detalii – creaza un cont nou si defineste un senzor nou. In interfata senzor, fa scroll down pana la paragraful “TOKEN”.

Copiaza acest cod si  foloseste-l pentru tempToken [linia 19 din “agsmII_…._logger.ino”]. Salveaza. Compileaza.

GATA!

Acest tutorial se bazeaza pe articolul “IoT temperature CLOUD logger with GSM and 1wire sensor howto” care a fost publicat original pe site-ul https://itbrainpower.net