Autore Topic: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)  (Letto 3899 volte)

markoceri

  • Novellino
  • *
  • Post: 35
    • Mostra profilo
Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« il: Gennaio 12, 2011, 01:52:57 pm »
Questa guida riporta il necessario per controllare da remoto OpenWRT con un semplice SMS. Il sistema ? su gi? da un bel po' ma non ? ancora sfruttato appieno e per non farlo rimanere un progetto morto ho pensato di scrivere una PSEUDO guida   :-D  ... ma arriviamo al dunque ... Ho montato il suddetto firmware su una Fonera 2.0g ( che, come ben sappiamo, presenta una porta USB ) alla quale ho collegato una Vodafone Key ( modello ZTE K3765-Z ) e come programma principale per leggere i messaggi ho utilizzato Gnochii (sito ufficiale http://www.gnokii.org/). Gnokii altro non ? che un programma che comunica con dispositivi modem sfruttando i comandi AT.
Per prima cosa bisogna aver installato i pacchetti per la porta usb e per il funzionamento della pennetta, quindi ci assicuriamo di averli installati. In caso non fossero installati bisogna installarli con:

Codice: [Seleziona]
opkg install kmod-usb-core kmod-usb2 libusb usb-modeswitch usb-modeswitch-data usbutils kmod-usb-serial kmod-usb-serial-option
dopo di che possiamo installare Gnokii digitando:

Codice: [Seleziona]
opkg install gnokii
Ora passiamo alla configuranzione del dispositivo. Tutte le pennette usb utilizzate per navigare inizialmente vengono viste dal sistema come dei lettori CD-ROM quindi quando vengono utilizzate come modem bisogna farle letterarmente " switchare " in modalit? modem. Per farlo utilizzeremo usb_modeswitch che va lanciato con i seguenti parametri:

Codice: [Seleziona]
usb_modeswitch -I -c /etc/usb_modeswitch.conf
dove il file " usb_modeswitch.conf " ? il file di configurazione della Key. Esso cambia da modello a modello ... i parametri vanno inseriti a seconda del " DefaultVendor " e " DefaultVendor " pi? altri paramentri ( TargetVendor, TargetProduct ) ... questo ? quello che uso io per il mio modello

Codice: [Seleziona]
root@FonServer:~# cat usb_modeswitch.conf
########################################################
# ZTE K3765-Z
#

DefaultVendor=  0x19d2
DefaultProduct= 0x2000

TargetVendor=   0x19d2
TargetProduct=  0x2002

# only for reference and 0.x versions
MessageEndpoint=0x01

MessageContent="5553424308E0CC852400000080000C85000000240000000000000000000000"
EnableLogging=1

comunque c'? una cartella relativa al programma ( usb_modeswitch.d ) che contiene gi? molti parametri per molte marche e modelli differenti ( per il mio non c'era e l'ho dovuto fare ). Per far passare la pennetta in modalit? modem all'avvio ho messo il comando nel file custom-user-startup cosicch? non debba farlo in un secondo momento. Lanciando il comando lsusb si vede come la pennetta sia passata in modalit? usb modem ... nel mio caso leggo:

Codice: [Seleziona]
root@FonServer:~# lsusb
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 005: ID 19d2:2002 ONDA Communication S.p.A.
Bus 001 Device 002: ID 1a40:0201 TERMINUS TECHNOLOGY INC.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

la pennetta ? collegata ad unn HUB USB 2.0 come si pu? vedere. Ora passiamo alla configurazione di gnokii. Creare ( se non esiste gi? ) un file chiamato gnokiirc nella cartella /etc configurato nel seguente modo:

Codice: [Seleziona]
root@FonServer:/etc# cat gnokiirc
[global]
model = AT
port = /dev/ttyUSB0
connection = serial

Se la pennetta ? collegata da una diversa porta seriale, modificarla. Con Gnokii installato e configurato, proviamo ad identificare il dispositivo lanciando il comando:

Codice: [Seleziona]
gnokii --identify
attendendo un po' ( se ? andato tutto bene ) dovrebbe mostare un messaggio come questo:

Codice: [Seleziona]
root@FonServer:~# gnokii --identify
GNOKII Version 0.6.21
IMEI         : 353679xxxxxxxxxx
Manufacturer : ZTE INCORPORATED
Model        : K3765-Z
Product name : K3765-Z
Revision     : BD_VDFP673A1V1.0.0B

Bene, tutto ? andato a buon fine ... Questo comando va lanciato la prima volta che si vuole utilizzare il dispositivo, io l'ho messo nel file di sturtup " custom-user-startup " cos? non mi devo ricordare di lanciarlo ...  ora non ci resta che il comando per leggere gli sms:

Codice: [Seleziona]
gnokii --getsms SM 0 END
che non fa altro che leggere i messaggi sulla memoria della sim ( SM sta per sim memory ), dalla cella di memoria 0 fino alla fine. La risposta di tale comando ? la seguente:

Codice: [Seleziona]
root@FonServer:~# gnokii --getsms SM 0 END
GNOKII Version 0.6.21
0. Inbox Message (unread)
Date/time: 07/01/2011 02:21:57 +0100
Sender: +39349xxxxxxx Msg Center: +39349xxxxxxx
Text:
Sms ricevuto !
GetSMS SM 1 failed! (The given location is empty.)
GetSMS SM 2 failed! (The given location is empty.)
GetSMS SM 3 failed! (The given location is empty.)
GetSMS SM 4 failed! (The given location is empty.)
GetSMS SM 5 failed! (The given location is empty.)
GetSMS SM 6 failed! (The given location is empty.)
GetSMS SM 7 failed! (The given location is empty.)
GetSMS SM 8 failed! (The given location is empty.)
GetSMS SM 9 failed! (The given location is empty.)
GetSMS SM 10 failed! (The given location is empty.)
GetSMS SM 11 failed! (The given location is empty.)
GetSMS SM 12 failed! (The given location is empty.)
GetSMS SM 13 failed! (The given location is empty.)
GetSMS SM 14 failed! (The given location is empty.)
GetSMS SM 15 failed! (The given location is empty.)
GetSMS SM 16 failed! (The given location is empty.)
GetSMS SM 17 failed! (The given location is empty.)
GetSMS SM 18 failed! (The given location is empty.)
GetSMS SM 19 failed! (The given location is empty.)
GetSMS SM 20 failed! (The given location is empty.)
GetSMS SM 21 failed! (The given location is empty.)
GetSMS SM 22 failed! (The given location is empty.)
GetSMS SM 23 failed! (The given location is empty.)
GetSMS SM 24 failed! (The given location is empty.)
GetSMS SM 25 failed! (The given location is empty.)
GetSMS SM 26 failed! (The given location is empty.)
GetSMS SM 27 failed! (The given location is empty.)
GetSMS SM 28 failed! (The given location is empty.)
GetSMS SM 29 failed! (The given location is empty.)
GetSMS SM 30 failed! (The given location is empty.)
GetSMS SM 31 failed! (The given location is empty.)
GetSMS SM 32 failed! (The given location is empty.)
GetSMS SM 33 failed! (The given location is empty.)
GetSMS SM 34 failed! (The given location is empty.)
GetSMS SM 35 failed! (The given location is empty.)
GetSMS SM 36 failed! (The given location is empty.)
GetSMS SM 37 failed! (The given location is empty.)
GetSMS SM 38 failed! (The given location is empty.)
GetSMS SM 39 failed! (The given location is empty.)
GetSMS SM 40 failed! (The given location is empty.)
GetSMS SM 41 failed! (The given location is empty.)
GetSMS SM 42 failed! (The given location is empty.)
GetSMS SM 43 failed! (The given location is empty.)
GetSMS SM 44 failed! (The given location is empty.)
GetSMS SM 45 failed! (The given location is empty.)
GetSMS SM 46 failed! (The given location is empty.)
GetSMS SM 47 failed! (The given location is empty.)
GetSMS SM 48 failed! (The given location is empty.)
GetSMS SM 49 failed! (The given location is empty.)

Nel mio caso c'era un solo SMS, le altre celle di memoria erano vuote.
Per rendere il tutto pi? intrigante ho creato uno script che legge gli sms, e se riconosce del testo esegue dei comandi. Il file si chiama getsms.sh e l'ho posto nella cartella /root :

Codice: [Seleziona]
root@FonServer:~# cat getsms.sh
####################################
# GetSMS - controlla la presenza di
# nuovi SMS sulla periferica e se
# riconosce dei comandi esegue delle
# operazioni.
####################################

# Variabili
folder=/root/sms # Cartella di destinazione
newsms=$folder/newsms # Nuovi SMS
dbsms=$folder/dbsms # Database SMS
newcmd=$folder/newcmd # Nuovi comandi
dbcmd=$folder/dbcmd # Database comandi

numsms=3 # Numero di SMS da leggere

# Riempie il file newsms
gnokii --getsms SM 0 $numsms -d > $newsms

# Riempie il file newcmd
grep Text -A1 $newsms | grep -v "Text\|--" > $newcmd

# Conta i comandi
numcmd=$(grep -c "^" $newcmd)

# Se non ci sono nuovi comandi non prosegue
if [ $numcmd -eq 0 ]
then
exit 1
fi

# Analizza i comandi
for ancmd in $(cat $newcmd)
do
case $ancmd
in
On) client on            # Comando da eseguire
echo $ancmd >> $dbcmd;;
Off) client off          # Comando da eseguire
echo $ancmd >> $dbcmd;;
*) ;;
esac
done

# Aggiunge gli sms al database SMS
cat $newsms >> $dbsms

# Svuota i file newcmd e newsms
> $newcmd
> $newsms

exit 0

Lo script ? abbastanza commentato e dovrebbe essere comprensibile ... gli sms una volta letti vengono archiviati in appositi file e vengono cancellati dalla memoria della sim. Fruttando Cron ho impostato che questo script venga avviato ogni 2 minuti, ecco come:

Codice: [Seleziona]
root@FonServer:/etc/crontabs# cat root
# WARNING: this is an auto generated file, please use uci to set cron entries
# this file is generated from /etc/config/crontabs

*/2 * * * * sh /root/getsms.sh

E qui si conclude la parte interessante del sistema ... ma non finisce qui ... c'? una parte INTERESSANTISSIMA ( tanto per fare lo sborone  :-D  ) infatti ...

Nel file getsms.sh quando si riceve il comando " On " oppure " Off " viene eseguito rispettivamente il comando " client on " ovvero " client off ". client ? un eseguibile che ho creato in C e crosscompilato appositamente e che rigira il comando ad un'altra fonera situata in un'altra stanza e che controlla un carico. In pratica ho una fonera 2.0g in una stanza, alla quale ho collegato ( tramite hub usb 2 alimentato esternamente ) un hdd e la vodafone key. La fonera 2g ? collegata in modalit? client al router principale e fornisce connettivit? ad un pc desktop e collega in rete una stampante lan. La fonera2 fa il suo lavoro di gateway sms e di scaricare i torrent dall'1 di notte fino alle 10 di mattina ( impostato tramite cron l'avvio e l'uccisione del processo transmission  : Chessygrin :  ). Poi in un'altra stanza ho un'altra fonera+ ( ne sono circondato ... la mia ? una FONcasa  :-D  ) con DD-WRT ( per ora avevo questa disponibile ed ho utilizzato questa ), anch'essa collegata in client al router principaleche che riceve i comandi dalla fonera 2g tramite un programmino compilato appositamente ( il programma si chiama, guarda caso, server !!! ) ed in base al comando controlla uno dei suoi GPIO per accendere o spegnere lo scandabagno attraverso un rel? ottico !!!   :-D
In pratica ... da fuori casa ... invio un sms con scritto "On" alla vodafon key ... questo viene letto ed interpretato dalla fonera 2.0g che invia il comando alla fonera+ che imposta un GPIO a livello HIGH che mi mette in conduzione il rel? ed infine ... mi si accende lo scaldabagno !!!   :-D  La comodit? ? che posso accendere e spegnere un interruttore da fuori casa, ovunque mi trovi ... non devo sacrificare una fonera 2g per tenerla in bagno ma rendo i tutto decentrato e ognuno svolge piccoli compiti !

Questo ? il sorgente del client:

Codice: [Seleziona]
/********************************
 * File: client.c
 ********************************/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>

#define IP_FON "192.168.0.253"
#define PORT 1745
 
#define MAX 8192 /* in bytes, 8KB */
 
int main(int argc, char *argv[]) {
if (argc < 2)
{
printf("Usage: %s on|off|close\n",argv[0]);
return 1;
}
int sd; /* Il socket descriptor del client */
struct sockaddr_in server_addr; /* l'indirizzo del server */
char buff[MAX]; /* dati di invio e ricezione */
 
/* Utilizzando la struttura hostent si definisce l'indirizzo del server */
struct hostent *hp;
hp = gethostbyname(IP_FON);
 
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
/* successivamente viene memorizzato nella struttura server_addr */
server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) -> s_addr;
 
/* Viene creato il socket descriptor */
if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("Errore nella creazione della socket\n");
exit(1);
}
 
/* Viene connesso al server */
if(connect(sd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
printf("Errore di connessione al server\n");
//exit(1);
}

/* Si inviano alcuni dati */
send(sd, argv[1], strlen(argv[1]), 0);
 
/* Si riceve la risposta */
/*recv(sd, buff, sizeof(buff), 0);
printf("Risposta del server: %s\n", buff);*/
close(sd);
return EXIT_SUCCESS;
}
Questo ? il sorgente del server:

Codice: [Seleziona]
/*************************
 * File: server.c
 ************************/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>

#define PORT 1745
#define MAX 8192 /* in bytes, 8KB */
 
int main()
{
char buff[MAX]; /* dati di invio e ricezione */
struct sockaddr_in server_addr; /* indirizzo del server */
struct sockaddr_in client_addr; /* indirizzo del client */
int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
 
/*
 * Creazione socket descriptor per il server.
 * AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
 */
if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Errore nella creazione del server\n");
return 1;
 
/*
 * Inseriamo nella struttura alcune informazioni
 */
server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
server_addr.sin_port = htons(PORT); /* la porta in ascolto */
server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che ? un server bisogna associargli l'indirizzo della macchina su cui sta girando */
 
/*
 * Assegnazione del processo alla socket tramite la funzione BIND
 */
if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
printf("Errore di binding\n");
  return 1;
/*
 * Si mette in ascolto con un massimo di 20 connessioni
 */
listen (sd_server, 20);
 while(1)
{
/*
 * Essendo un server monothreading, accetter? una sola connessione per volta
 */
int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */
/* Con opportune modifiche si potrebbe vedere anche l'ip del client */
if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
printf("Errore nella chiamata accept\n");
/* si ricevono i dati dal client */
recv(sd_client, buff, sizeof(buff), 0);
if (strncmp(buff,"on",2) == 0)
{
system("echo 1 > /proc/gpio/4_dir");
system("echo 1 > /proc/gpio/3_dir");
system("echo 1 > /proc/gpio/3_out"); // Strutta i pin 3 e 4
system("echo 1 > /proc/gpio/4_out");
}
if (strncmp(buff,"off",3) == 0)
{
system("echo 1 > /proc/gpio/4_dir");
system("echo 0 > /proc/gpio/4_out");
system("echo 1 > /proc/gpio/3_dir"); // Strutta i pin 3 e 4
system("echo 0 > /proc/gpio/3_out");
}
if (strncmp(buff,"close",5) == 0)
{
close(sd_server);       // chiude il server
return EXIT_SUCCESS;
}
/* chiusura del socket descriptor */
close(sd_client);
}
close(sd_server);
 
return EXIT_SUCCESS;
}

Per scaricare entrambi i file compilati cliccare qui
Entrambi funzionano sia su OpenWRT che su DD-WRT ... Non sono ottimizzati ... anzi sono stati codati in fretta e senza farci poi tanta attenzione ... non appena completo tutto faccia delle foto e le inserisco ... ma ormai il tempo che rimane ? poco, quindi credo proprio che rimarr? un progetto morto e non sfruttato appieno   :-(
" Between subtle shading and the absence of light lies the nuance of illusion "

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #1 il: Gennaio 12, 2011, 02:31:03 pm »
Bella realizzazione!! Bravo! Anch'io avevo intenzione di implementare Gnochii su un mio progettino.
L'ambaradan lo utilizzi concretamente o ? stato solo un esperimento?

markoceri

  • Novellino
  • *
  • Post: 35
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #2 il: Gennaio 12, 2011, 03:31:08 pm »
Sarebbe dovuto essere qualcosa di stabile ma dopo le prime prove ... ho smontato la parte relativa al controllo del carico.
" Between subtle shading and the absence of light lies the nuance of illusion "

MikeJ

  • Novellino
  • *
  • Post: 26
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #3 il: Febbraio 09, 2011, 11:23:28 am »
Ciao!
quello che hai fatto mi sembra molto molto interessante.
Io ,per fargli avere l'appeal che merita ,non lo proprorrei per "accendere lo scaldabagno" perch? ......
Invece mi risulta molto utile ad esempio per staccare e riattacare la corrente a router,computer server in caso di blocco della rete.

Secondo me bisognerebbe anche prevedere una versione "standalone":cio? ricevi gli sms e attivi i carichi sulla stessa fonera.
In questo thread ci si chiede( tra le tantissime altra cose) come fare una cosa del genere su una VodafoneStation sul quale ? stato installato Openwrt.
http://www.nabuk.org/f/index.php?topic=2413.300

Michele

markoceri

  • Novellino
  • *
  • Post: 35
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #4 il: Febbraio 09, 2011, 03:11:03 pm »
Quello dello scaldabagno ? stato solo il mio pretesto per la realizzazione ... ma il sistema ? versatilissimo ... il core non ? altro che un sistema che riceve sms e di conseguenza attiva ovvero disattiva dei carichi ... i limiti alle possibili applicazioni sono solo posti dalla fantasia  :-D
" Between subtle shading and the absence of light lies the nuance of illusion "

MikeJ

  • Novellino
  • *
  • Post: 26
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #5 il: Febbraio 09, 2011, 10:10:09 pm »
su ebay la trovo fonera2?
La VS gi? la ho devo mettermi appena ho un po di tempo

markoceri

  • Novellino
  • *
  • Post: 35
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #6 il: Febbraio 09, 2011, 11:02:07 pm »
penso vada snche sulla VS ( o AGPF ) ... bisogna vedere se c'? gnokii nei repo
" Between subtle shading and the absence of light lies the nuance of illusion "


markoceri

  • Novellino
  • *
  • Post: 35
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #8 il: Febbraio 10, 2011, 03:54:05 pm »
Bhe allora il sistema ? perfettamente traslabile dalla Fonera alla VodafoneStation ... con l'unica accortezza di sostituire il comando " client on " ( ovvero client off ) nel file getsms.sh con il comando per abilitare ( ovvero disabilitare ) i vari GPIO ... il resto dovrebbe essere uguale !  :-D
" Between subtle shading and the absence of light lies the nuance of illusion "

riccge

  • Novellino
  • *
  • Post: 30
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #9 il: Febbraio 10, 2011, 05:33:23 pm »
E' secondo voi possibile attivare una connessione via internet key tramite sms?

Ciao.

PS: cosa mi dite di questa JTAG: andr? bene?
h**p://cgi.ebay.it/Xilinx-JTAG-Parallel-Cable-III-FPGA-programmer-LPT-/260732846031?pt=LH_DefaultDomain_186&hash=item3cb4e37fcf#ht_3759wt_1139

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #10 il: Febbraio 10, 2011, 10:00:20 pm »
cosa intendi di preciso? mandi un sms e....

per la jtag.. io ho questa e va molto molto bene.

markoceri

  • Novellino
  • *
  • Post: 35
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #11 il: Febbraio 10, 2011, 10:51:45 pm »
cosa intendi di preciso? mandi un sms e....

... penso switchare la connessione in UMTS. Certo che si pu? fare ! 
" Between subtle shading and the absence of light lies the nuance of illusion "

riccge

  • Novellino
  • *
  • Post: 30
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #12 il: Febbraio 11, 2011, 11:16:34 am »
cosa intendi di preciso? mandi un sms e....

per la jtag.. io ho questa e va molto molto bene.

mando un sms dal mio cell al numero della SIM presente nella Internet Key e la Vodafone Station si connette ad internet tramite la stessa Key (ovviamente adsl non presente) e magari mi invia una email con l'ip pubblico.

markoceri

  • Novellino
  • *
  • Post: 35
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #13 il: Febbraio 11, 2011, 12:39:05 pm »
La cosa ? fattibilissima ... con questo sistema puoi comandare in tutto e per tutto la shell sh di openwrt ... quindi basterebbe associare ad un comando specifico uno script sh che fa il passaggio della connessione in UMTS
" Between subtle shading and the absence of light lies the nuance of illusion "

riccge

  • Novellino
  • *
  • Post: 30
    • Mostra profilo
Re: Controllo remoto da SMS (OpenWRT, Gnokii, Fonera 2g, Key)
« Risposta #14 il: Febbraio 11, 2011, 05:28:29 pm »
Hai qualche esempio o qualche link a cui fare riferimento?