Router WiFi GSM utilizând Raspberry PI Zero W

Plăcile de dezvoltare Raspberry PI sunt cunoscute pentru ușurința cu care se poate implementa un router / gateway TCP/IP grație sistemului de operare Linux ce rulează pe aceste plăci. Placa Raspberry PI 3 ce integrează o interfață de rețea WiFi (pe lângă interfața ethernet clasică) poate sta la baza unui AP WiFi printr-o configurare foarte simplă (a se vedea „Cum putem utiliza placa Raspberry Pi ca Access Point WiFi?”). Chiar dacă implementarea unor astfel de dispozitive (router, gateway sau AP) poate părea la prima vedere doar un exercițiu educațional având în vedere multitudinea de dispozitive comerciale cu aceste funcționalități, realizarea unui sistem de control al comunicațiilor personalizat poate permite implementarea unor funcționalități proprii inedite și de multe ori un cost mai mic decât al dispozitivelor comerciale.

Placa de dezvoltare Raspberry PI Zero W este un membru mai nou al familiei de plăci Raspberry introducând un format mai mic al plăcii și un cost mult mai mic dar fiind limitată din punct de vedere al puterii de calcul și al memorie și neavând interfață de rețea ethernet (doar WiFi). La prima vedere această placă nu am putea să o utilizăm la implementarea unui sistem de tip router având o singură interfață de rețea. Având în vedere dimensiunea, costul și consumul mult mai mici decât al unei plăci Raspberry PI 3 este totuși o alegere foarte bună pentru implementarea unui router WiFi GSM. Pentru aceste lucru avem nevoie de un modem USB GSM (în cadrul testelor s-a utilizat un modem Huawei E3131 dar se poate utiliza orice modem USB GSM, de exemplu). Conectarea modemului la placa de dezvoltare necesită un adaptor microUSB – USB. Bineînțeles, pentru funcționarea sistemului sunt necesare un card microSD pentru sistemul de operare și un alimentator de 5V, 1A.

Punerea în funcțiune a unei plăci Raspberry PI Zero este o provocare din cauza numărului mic de porturi USB. Recomandăm utilizarea unui cablu serial de debug pentru a interacționa mai ușor cu placa de dezvoltare (a se vedea și materialul „Raspberry Pi Zero Headless Quick Start”). Ca sistem de operare vom utiliza Raspbian Lite pentru a nu încărca procesorul plăcii de dezvoltare cu servicii și pachete software inutile (testele au fost realizate utilizând versiunea 2018-03-13-raspbian-stretch-lite).

Chiar dacă în final conexiunea la Internet a sistemului se va face prin intermediul conexiunii modemului USB GSM, pentru a instala pachetele necesare este nevoie să activăm temporar conexiunea WiFi a plăcii de dezvoltare pentru acces la Internet. Astfel în fișierul /etc/wpa_supplicant/wpa_supplicant.conf vom adăuga liniile cu datele de acces la rețeaua WiFi locală (aceste linii vor fi șterse după realizarea configurării de AP):

network={

 ssid=”…”

 psk=”…”

}

Configurarea WiFi se poate face și la nivel card de memorie înainte de prima pornire a sistemului – a se vedea materialul: „Manually setting up Pi WiFi using wpa_supplicant.conf”.

După repornirea sistemului vom instala update-urile sistemului de operare:

# sudo apt-get update

# sudo apt-get upgrade

și pachetele necesare necesare comunicației cu modemul GSM:

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

După conectarea fizică a modemului și o nouă repornire a sistemului putem configura legătura de date GSM. În fișierul /etc/network/interfaces se vor adăuga următoarele linii:

auto gprs

iface gprs inet ppp

provider gprs

Ulterior vom crea fișierul gprs în directorul /etc/ppp/peers cu următorul conținut (cartela SIM utilizată nu avea activat codul PIN):

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

/dev/ttyUSB0

noipdefault

defaultroute

replacedefaultroute

hide-password

noauth

persist

usepeerdns

După o nouă restartare conexiunea de date GSM va deveni funcțională și putem șterge configurația din fișierul /etc/wpa_supplicant/wpa_supplicant.conf și putem trece la configurația AP. Vom instala pachetele software necesare managementului clienților WiFi:

# sudo apt-get update

# sudo apt-get install dnsmasq hostapd

și vom opri pentru moment serviciile până după configurarea corectă a acestora:

# sudo systemctl stop dnsmasq

# sudo systemctl stop hostapd

Interfața de rețea WiFi va avea în configurația de AP adresă IP statică deci vom configura acest lucru în serviciul DHCP (fișierul /etc/dhcpcd.conf):

interface wlan0

    static ip_address=192.168.66.1/24

și vom reporni serviciul:

# sudo service dhcpcd restart

Având în vedere că funcționalitatea de AP necesită oferirea clienților WiFi de configurații dinamice de rețea este necesară configurarea serverului DHCP (dnsmasq). Vom crea un nou fișier de configurare:

# sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig 

# sudo nano /etc/dnsmasq.conf

în care vom indica plaja de adrese IP oferite clienților WiFi:

interface=wlan0   

  dhcp-range=192.168.66.2,192.168.66.20,255.255.255.0,24h

În fișierul serviciului de management AP (/etc/hostapd/hostapd.conf) vom introduce următoarea configurație (personalizând, bineînțeles, datele de conectare la AP):

interface=wlan0

driver=nl80211

ssid=…

hw_mode=g

channel=7

wmm_enabled=0

macaddr_acl=0

auth_algs=1

ignore_broadcast_ssid=0

wpa=2

wpa_passphrase=…

wpa_key_mgmt=WPA-PSK

wpa_pairwise=TKIP

rsn_pairwise=CCMP

și vom referi fișierul în fișierul de configurare principal al serviciului hostapd (/etc/default/hostapd):

DAEMON_CONF=”/etc/hostapd/hostapd.conf”

După aceste configurări putem porni cele două servicii:

# sudo systemctl start hostapd

# sudo systemctl start dnsmasq

Pentru ca sistemul să retransmită pachetele din rețeaua WiFi în rețeua Internet este necesar să achivăm rutarea pachetelor TCP/IP – în fișierul /etc/sysctl.conf vom decomenta următoarea linie:

net.ipv4.ip_forward=1

Ultimul pas este configurarea serviciului de filtrare a pachetelor (iptables). Vom adăuga și salva o regulă de MASQUERADE:

sudo iptables -t nat -A  POSTROUTING -o ppp0 -j MASQUERADE

sudo sh -c “iptables-save > /etc/iptables.ipv4.nat”

și o vom executa la fiecare repornire a sistemului prin adăugarea următoarei linii în fișierul /etc/rc.local înainte de linia exit 0:

iptables-restore < /etc/iptables.ipv4.nat

După o ultimă repornire routerul WiFi GSM este funcțional.

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”.

Router WiFi GSM utilizând LinkIt Smart 7688

Asigurarea conexiunii la Internet în cazul absenței unei conexiuni terestre (prin cablu sau fibră optică) se poate face, bineînțeles, apelând la serviciile oferite de companiile de telefonie mobilă prin intermediul unei cartele SIM ce oferă transfer de pachete de date. Există multe opțiuni comerciale pentru implementarea acestei facilități de routare între o rețea de date WiFi și o rețea GSM: routere WiFi GSM, telefoane mobile ce funcționează ca AP (tethering) ș.a.m.d. dar majoritatea acestor soluții nu oferă o flexibilitate sau un control al conexiunilor foarte bune. Din acest motiv realizarea unui router „personalizat” se poate dovedi și o soluție mult mai ieftină și o metodă de a implementa mecanisme de filtrare, autentificare, control al conexiunilor mult mai sofisticate.

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 – testele au fost realizate utilizând un modem Huawei E220 dar se poate utiliza orice alt modem USB GSM compatibil. 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

La punere în funcțiune a plăcii de dezvoltare aceasta funcționează în mod AP. Ne vom conecta la AP-ul LinkIt_Smart_7688_XXXXXX și apoi la interfața de administrare web (IP 192.168.100.1).

3

La prima conectare se va stabili parola utilizatorului root (contul de administrare a sistemului de operare).

4

Pentru a putea instala pachetele software necesare funcționării modemului USB GSM vom configura placa de dezvoltare ca și client WiFi – Station Mode (pentru a avea conexiune Internet).

ATENȚIE!!! Placa de dezvoltare are definită implicit o interfață de rețea cu IP-ul 192.168.100.1 . Orice încercare de a introduce placa de dezvoltare într-o rețea ce oferă prin DHCP adrese IP în clasa 192.168.100.0/24 va eșua.

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

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

# opkg install nano

Având conectat modemul USB GSM vom reporni placa de dezvoltare. Ne vom reconecta prin SSH și vom verifica dacă modemul este recunoscut de sistemul de operare în mod corect (vom rula comanda dmesg).

6

În cazul în care modemul este recunoscut corect de sistemul de operare vom regăsi în jurnalul de pornire a sistemului de operare (consultat anterior cu ajutorul comenzii dmesg) linii care indică instalarea modemului GSM ca dispozitiv specific USB (ttyUSB0 de exemplu). În cazul în care modemul este văzut ca alt tip de dispozitiv (de stocare în masă – memorie usb de exemplu) înseamnă că pachetul usb-modeswitch care se ocupă de autoconfigurarea modemului nu are în baza de date proprie modelul de modem utilizat. Este recomandat să căutăm un modem care să fie deja în baza de date a pachetului software. Configurarea manuală a modemului este destul de dificilă. Pentru mai multe informații se poate parcurge materialul „Use 3g/UMTS USB Dongle for WAN connection”.

Pentru a putea accesa Internetul prin intermediul modemului USB GSM este nevoie să avem o cartelă SIM funcțională (se poate testa prealabil modemul pe un sistem de calcul obișnuit) și să realizăm următoarele configurări în fișierele sistemului de operare. În fișierul /etc/config/network vom adăuga la final (pinul și APN-ul sunt specifice cartelei SIM utilizate):

config interface ‘gsm’

        option proto ‘3g’

        option service ‘umts’

        option device ‘/dev/ttyUSB0’

        option apn ‘net’

        option pincode ‘0000’

În fișierul /etc/config/firewall vom adăuga noua interfață de rețea în categoria wan :

config zone

        option name ‘wan’

        list network ‘gsm’

        …

Pentru ca intefața GSM să fie pornită automat după repornirea sistemului vom adăuga în fișierul /etc/rc.local linia ifup gsm (comanda de pornire a conexiunii GSM) înainte de linia exit 0 .

ifup gsm

exit 0

După finalizarea configurării conexiunii GSM (se poate reporni sistemul și verifica prin intermediul comenzii route dacă există conexiune Internet GSM) se va trece sistemul în configurație AP din interfața web de administrare (se va stabili numele și parola de acces pentru rețeaua WiFi).

7

După o ultimă repornire a sistemului routerul WiFi GSM este gata de utilizare. Acesta va oferi adrese în clasa 192.168.100.0/24 și vom putea accesa interfața de administrare prin intermediul adresei IP 192.168.100.1 . Pentru configurări avansate (firewall, port-forwarding) se poate accesa consola Luci specifică sistemului de operare OpenWRT (link în interfața de administrare, încercuit cu roșu în imaginea precedentă).

În cazul în care se efectuează modificări ale sistemului de operare care conduc la stări nefericite din care nu știm cum să ieșim, există întotdeauna posibilitatea de a reseta placa la setările inițiale și de a relua procesul de configurare de la început. Pentru resetarea plăcii la setările inițiale se va ține apăsat minim 20 de secunde butonul WiFi Reset.

9

O posibilă îmbunătățire a sistemului nostru este adăugarea unei antene WiFi externe pentru creșterea puterii semnalului. Placa are un conector special I-PEX pentru acest lucru dar utilizarea acestuia necesită dezlipirea de pe placă a unei rezistențe (imagine de mai jos).

10

Cum sa realizăm localizarea obiectelor utilizând balize Bluetooth

Problema localizării unui obiect sau a unei persoane are soluții variate adaptate în funcție de domeniul de utilizare și de infrastructura tehnică pe care se bazează. Localizarea prin GPS este utilizată la ora actuală pe scară largă pentru localizare pe întreg cuprinsul globului. Această metodă este îmbunătățită prin implementarea unor mecanisme complementare precum aGPS ce îmbunătățesc precizia de localizare. Totuși, există cazuri în care localizarea prin GPS este dificilă dacă nu imposibilă, cel mai bun exemplu fiind localizarea în interiorul unei clădiri. În aceste cazuri se utilizează, cel mai adesea, metode de localizare bazate pe triangularizarea unui semnal radio. Semnalul radio poate fi bazat pe frecvențe și modulații speciale sau larg răspândite (precum semnalul WiFi). Ne propunem să explorăm această metodă utilizând cea mai simplă și ieftină soluție: localizarea bazată pe balize radio Bluetooth. În cadrul procesului de localizare vor fi implicate două tipuri de sisteme: balize radio Bluetooth și receptor radio bluetooth. Baliza radio Bluetooth are rolul de a emite un semnal radio la un interval de timp fix. Acest semnal radio va reprezenta elementul pe care se va realiza localizarea. Receptorul radio are rolul de a recepționa semnalul radio și, pe baza puterii acestuia, de a determina distanța aproximativă față de emițător (baliza radio). Având în vedere distanța maximă pe care poate să o acopere semnalul radio Bluetooth o astfel de metodă poate fi folosită pentru localizarea în incinte sau zone cu raza de câteva zeci de metri sau, în spații deschise, pâna la o sută de metri. Există două scenarii posibile de localizare: mai multe balize ce permit localizarea receptorului radio pe baza distanței față de fiecare baliză în parte sau mai multe sisteme de recepție ce permit localizarea unei balize pe baza distanței față de fiecare de fiecare sistem de recepție radio (în acest caz trebuie să existe o formă de comunicație între sistemele receptor pentru a realiza triangularizarea semnalului radio).

Algoritmul de triangularizare a poziției în funcție de distanțele dintre sisteme este în afara ariei de acoperire a acestui material. Soluția propusă acoperă doar partea de măsurare a puterii semnalului radio de către receptorul radio Bluetooth. Pentru mai multe informații puteți să consultați articolul: „DIY localization using radio frequency beacons”.

Pentru implementarea unei balize radio bluetooth se poate apela la orice sistem ce include un modul radio Bluetooth (de exemplu Bettle BLE sau Feather BLE) sau, o variantă mult mai ieftină și mai simplă, se poate utiliza un dispozitiv de urmărire de tip iTag.

2

Acest tip de dispozitiv este disponibil comercial cu prețuri pornind de la 2$ și este gândit pentru a fi folosit împreună cu telefonul mobil pentru a localiza diverse lucruri în imediata apropiere (chei sau chiar animale de companie). Telefonul mobil are rolul de receptor radio Bluetooth și va măsura distanța până la dispozitivul iTag (localizarea este bazată doar pe distanță și pe mișcarea telefonului mobil – ne depărtăm de obiectul căutat crește distanța, ne apropiem scade distanța). Dispozitivul iTag nu este altceva decât un dispozitiv Bluetooth programabil ce este produs în serie – are un preț foarte mic. Pentru a vedea ce conține un astfel de dispozitiv se poate parcurge articolul: „Cheap Ebay BLE Tag Teardown (iTag via iTracing app)”.

Pentru implementarea receptorului radio (în cazul în care dorim o soluție de localizare bazată pe un sistem personalizat sau nu dorim să fim dependenți de aplicația mobilă oferită de producătorii dispozitivului iTag) se poate utiliza orice placă de dezvoltare cu modul radio bluetooth încorporat și, foarte important, care permite măsurarea puterii semnalului recepționat. Una dintre variante este placa Raspberry Pi 3, se poate vedea și articolul „Beacon tracking with Node.js and Raspberry Pi”. O altă variantă, mai ieftină și care permite realizarea unor sisteme de recepție compacte, este utilizarea plăcilor de dezvoltare bazate pe microprocesorul ESP32 ce integrează un modul radio Bluetooth.

3

Grație bibliotecii ESP32 BLE Arduino se poate implementa orice tip de comunicație bluetooth cu ajutorul circuitului ESP32 și a mediului de dezvoltare Arduino IDE (toate celelalte bibloteci bluetooth sunt proprietar sau implică medii de dezvoltare scumpe).

Implementarea propusă pentru receptorul radio a fost testată pe o placă de dezvoltare Sparkfun ESP32 Thing utillizând Arduino IDE 1.8.5, Arduino core for ESP32 WiFi chip 0.0.1 și biblioteca ESP32 BLE 0.4.7.

#include <BLEDevice.h>

static BLEAddress *pServerAddress;

BLEScan* pBLEScan;

BLEClient*  pClient;

bool deviceFound = false;

Sistemul va scana timp de 30 de secunde după dispozitive Bluetooth ce se găsesc în vecinătate. Pentru fiecare dispozitiv găsit se va afișa, în consola serială, textul emis ca identificator și puterea semnalului recepționat (RSSI).

4

int scanTime = 30;

class MyAdvertisedDeviceCallbacks: public

BLEAdvertisedDeviceCallbacks {

      void onResult(BLEAdvertisedDevice advertisedDevice)

{

  Serial.print(“BLE Advertised Device found: “);

     Serial.println(advertisedDevice.toString().c_str());

      pServerAddress = new

 BLEAddress(advertisedDevice.getAddress());

      Serial.print(“RSSI: “);

      Serial.println(advertisedDevice.getRSSI());

}

};

void setup() {

  Serial.begin(115200);

  Serial.println(“Scanning…”);

  BLEDevice::init(“”);

  pClient  = BLEDevice::createClient();

  pBLEScan = BLEDevice::getScan();

  pBLEScan->setAdvertisedDeviceCallbacks(new

MyAdvertisedDeviceCallbacks());

  pBLEScan->setActiveScan(true);

}

Scanarea se va relua la fiecare 60 de secunde.

void loop() {

  Serial.println();

  Serial.println(“BLE Scan restarted…..”);

  deviceFound = false;

  BLEScanResults scanResults = pBLEScan->start(30);

  delay(6000);

}

Programul dat ca exemplu poate fi un bun punct de plecare pentru triangularizarea poziției pe baza puterii semnalului emis de baliza radio Bluetooth.

Carte „10(zece) proiecte Internet of Things” în format electronic

Carte „10(zece) proiecte Internet of Things” în format electronic.

240 de pagini cu proiecte despre Internetul obiectelor utilizând plăci de dezvoltare Arduino, Raspberry Pi și ESP8266.

Cartea poate fi cumpărată din magazinul 10proiecte iar plata se va face utilizând portalul PayPal. Formatul electronic permite accesul complet la formatul PDF al cărții cu posibilitate de tipărire și extragere de conținut.

banner

10ProiecteIoT_Cuprins

10ProiecteIoT_PrezentareProiecte

Puteți comanda cartea în format tipărit de pe site-ul Robofun la prețul de 39RON.

Solar Power WiFi Test

Implementarea unui proiect cu alimentare solară prezintă mai multe avantaje printre care, bineînțeles, se evidențiază independența de rețeaua electrică tradițională. În același timp un astfel de proiect ridică și multe probleme legate de dimensionarea soluției de alimentare și alegerea componentelor potrivite. Care este dimensiunea panoului solar? Ce soluție de stocare a energiei electrice alegem? Ce soluție de încărcare a acumulatorilor este cea mai potrivită? Acestea sunt câteva dintre întrebările la care vom încerca să răspundem în cadrul acestui proiect. Chiar dacă se poate face o evaluare inițială la nivel teoretic, în cadrul testului nostru vom alege varianta testării efective a soluției alese și evidențierea avantajelor și a punctelor slabe ale acesteia.

Ca soluție de maximizare a eficienței captării energiei solare și de încărcare a acumulatorului vom utiliza o componentă MPPT: Sunny Buddy – MPPT Solar Charger.

2

Această componentă permite conectarea unei celule solare cu ieșirea între 6V și 20V și încărcarea unui acumulator LiIon sau LiPo cu o singură celulă (3.7V). Curentul maxim de încărcare este de 450mA deci este necesară utilizarea unui acumulator de capacitate minimă 450mAh. În testul nostru vom utiliza o celulă solară de 2.5W / 9V și un acumulator LiPo de 800mAh. Pentru a supraveghea procesul de încărcare / descărcare a acumulatorului vom utiliza o placă de dezvoltare Adafruit Feather HUZZAH ce va raporta datele măsurate prin intermediul conexiunii WiFi către serviciul cloud iot.robofun.ro. Placa de dezvoltare se va alimenta de la acumulatorul LiPo conectat la componenta MPPT și va servi ca element de descărcare pentru acesta. Pentru o acuratețe mai bună a măsurătorilor vom utiliza o componentă ce va monitoriza nivelul de încărcare a bateriei: LiPo Fuel Gauge. Componenta de monitorizare se va intercala între ieșirea componentei MPPT și alimentarea plăcii de dezvoltare și va raporta prin intermediul unei magistrale I2C nivelul de încărcare a bateriei.

3

Diagrama de interconectare între componentele sistemului de test este următoarea:

4

Înainte de realizarea montajului și punerea lui în funcțiune este recomandată parcurgerea documentațiilor oficiale ale componentelor utilizate:

Atenție!!! Schema precedentă este schema finală de test. În momentul programării plăcii de dezvoltare trebuie să deconectăm alimentarea plăcii prin intermediul componentei de măsurare (să deconectăm placa de dezvoltare de componenta LiPo Fuel Gauge) și să deconectăm pinul Reset de pinul Wake (GPIO16) – firul galben.

Programul sistemului a fost dezvoltat și testat utilizând Arduino IDE 1.8.5, extensia ESP8266 Community 2.4.0 și biblioteca LiFuelGauge 1.0.

#include <Wire.h>

#include <ESP8266WiFi.h>

#include <ESP8266HTTPClient.h>

#include <LiFuelGauge.h>

În cadrul programului trebuie personalizate datele de conectare la rețeaua WiFi (variabilele ssid[] și pass[]).

char ssid[] = “…”;

char pass[] = “…”;

LiFuelGauge gauge(MAX17043);

Secțiunea setup() se va ocupa cu inițializarea comunicației cu modulul de măsurare a tensiunii din acumulator și cu inițializarea comunicației WiFi.

void setup() {

  gauge.reset();

  WiFi.mode(WIFI_STA);

  WiFi.hostname(“ESP_SolarMeter”);

  WiFi.begin(ssid, pass);

  byte retry = 0;

  while ((WiFi.status() != WL_CONNECTED) && (retry<10)) {

    delay(1000);

    retry++;

    if (retry==10) ESP.restart();

  }

}

Secțiunea loop() conține partea de citire a măsurătorilor efectuate de componenta LiPo Fuel Gauge și de trimiterea acestor măsurători către serviciul IoT. În cadrul programului trebuie personalizate cheile de autentificare (SENZOR_TOKEN1 și SENZOR_TOKEN2) obținute în urma înregistrării gratuite pe iot.robofun.ro. Postarea măsurătorilor se va face la un interval de o oră. Între măsurători sistemul va funcționa în mod de consum redus (deepSleep) pentru a minimiza consumul de energie și maximiza durata de funcționare.

void loop() {

  float batPercentage = gauge.getSOC();

  float batVoltage = gauge.getVoltage(); 

  String SENSOR_TOKEN1=”…”;

  String SENSOR_TOKEN2=”…”;

  HTTPClient http;

  String data =

String(“http://iot.robofun.ro/api/v1/senzor/&#8221;) + SENSOR_TOKEN1 + “/input?value=” + String(batVoltage, DEC);

  http.begin(data);

  int httpCode = http.GET();

  delay(100);

  http.end();

  data = String(“http://iot.robofun.ro/api/v1/senzor/&#8221;) + SENSOR_TOKEN2 + “/input?value=”  + String(batPercentage, DEC);

  http.begin(data);

  httpCode = http.GET();

  delay(100);

  http.end();

  ESP.deepSleep(3600L*1000000L);

}

Testarea sistemului va indica următoarele lucruri esențiale în funcționarea acestuia:

  • Sistemul de încărcare solar este capabil să înmagazineze într-o zi însorită suficientă energie pentru funcționarea sistemului pentru 24 de ore – sistemul poate funcționa autonom într-o perioadă însorită. Mai jos este graficul furnizat de serviciul iot.robofun pentru o succesiune de două zile însorite consecutive. Se poate observa că sistemul recuperează energia consumată peste noapte în timpul zilei.

5

6

  • Peste noapte sistemul pierde circa 30% din capacitatea acumulatorului. Asta înseamnă că sistemul poate funcționa circa trei zile fără reîncărcare (zile fără soare / înorate).

7

  • După epuizarea completă a energiei din acumulator sistemul nu este capabil să repornească singur chiar dacă urmează o zi însorită. Acest lucru este cauzat de curentul mare necesar la inițializarea plăcii de dezvoltare (peste 450mA, peste curentul furnizat de componenta Sunny Buddy). Sistemul nu va reuși să intre în mod de consum redus pentru a lăsa acumulatorul să se reîncarce și va rămâne într-o secvență infinită de inițializare ce va opri procesul de reacumulare a energiei solare.

Testul relevă posibilitatea limitată de funcționare a sistemului propus. Acesta poate funcționa o perioadă nedeterminată de timp în mod autonom atâta timp cât nu apare o succesiune de mai mult de două zile complet înnorate. Curentul mare necesar la inițializarea plăcii de dezvoltare blochează reluarea procesului de reîncărcare solară. Totuși, cu un alt consumator ce necesită un curent mai mic de inițializare, sistemul ar putea funcționa autonom și și-ar putea relua activitatea după o perioadă lungă fără lumină solară.