martedì 29 novembre 2016

Giocherellando con Twitter

Oggi mi sono divertito ad installare e far girare un programma Python rimediato su github , TweetMonitor.
Il programma in questione non fa grandi cose, ma crea un canale con Twitter e monitora un (o una serie di) Tag,  che l'utente sceglierà alla partenza dello script.

Ciò che dobbiamo fare per installare il programma è piuttosto semplice, intanto installiamo git:
sudo apt-get install git

e poi facciamo il clone del repository
git clone https://github.com/upgoingstar/TweetMonitor


adesso abbiamo bisogno di installare pip che e' un sistema per l'installazione tipo apt-get, digitiamo quindi il comando:
sudo apt-get install python-pip


e dunque installiamo tweeppy con:
sudo pip install tweepy

Serve ancora la libreria elasticsearch
sudo pip install elasticsearch

entriamo nella cartella del programma con:
cd TweetMonitor/

editiamo con nano il file tweetmonitor.py per inserire i dati di autenticazione ricavati sul sito  https://dev.twitter.com/.

Riporto qui di seguito gli screenshot di come ottenere i dati necessari, ma potete seguire anche la guida di sparkfun a quersto indirizzo:













 e adesso via! chiamando il comando:
sudo python tweetmonitor.py -k ferrari

il parametro -k indica al programma quale Tag seguire, in questo caso "ferrari" ma possiamo scegliere qualsiasi termine vogliamo. Si possono anche monitorare più più termini, basta separarli con la virgola

Ecco cosa accade nella shell:
pi@EasyMeteo01:~/TweetMonitor $ sudo python tweetmonitor.py -k ferrari
----- Twitter bot kicked off ------
>>verZACeee posted: RT @HotFreestyle: Tyler The Creator and A$AP Rocky in the Ferrari https://t.co/XsGGLfdzrV
>>Ferrarinogazou posted: Ferrari画像 フェラーリ 高級車 スーパーカー RT https://t.co/9wYbkZvKtK
>>dannybelkin posted: This looks preposterous https://t.co/qADf8fr6be
>>genfe2 posted: RT @isragus78: Que bestia el Ferrari por detras !!!! Como vamos a disfrutar en los test de Bcn...@genfe2 @JaumeCiurana https://t.co/hLGcDde…
>>Reg_Spotter posted: T777SAT #2004 #Ferrari 360 #Modena  #Rare #uk #car #cars  #us #usa #numberplate #reg_spotter https://t.co/zkRsAmRzEA



Buon divertimento
TecnoGeppetto

Alcuni link interessanti sull'argomento:
https://www.sparkfun.com/news/1320
https://learn.sparkfun.com/tutorials/raspberry-pi-twitter-monitor?_ga=1.122161035.1620156107.1480440805


Rilevare la Temperatura interna di Raspberry Pi

In questi giorni sto mettendo le basi per la costruzione di una Stazione Meteo (l'ennesima, ma prima o poi verrà fuori qualcosa di molto buono).
Una delle impostazioni del sistema operativo Debian consente di controllare la temperatura del microprocessore.
Questa informazione è importante per poter mettere in campo delle contromisure in caso di surriscaldamenti del sistema.
Se la nostra Stazione Meteo verrà posizionata all'esterno sotto al sole, potrebbe subirne l'effetto riscaldante, soprattutto nella bella stagione, e raggiungere delle temperature tali che potrebbero danneggiare il sistema.

Con questa semplice istruzione, possiamo leggere il valore della temperatura interna e decidere per esempio di far partire la ventilazione forzata per refrigerare la scatola ed il suo contenuto.

Direttamente da shell digitare:

cat /sys/class/thermal/thermal_zone0/temp | cut -c1-2

Otterremo questo:
pi@EasyMeteo01:~ $ cat /sys/class/thermal/thermal_zone0/temp | cut -c1-2
33
pi@EasyMeteo01:~ $

Infatti nel momento in cui sto scrivendo la mia Raspberry Pi ha una temperatura interna di 33 gradi centigradi.
L'istruzione cut -c1-2  consente di leggere solamente i primi due caratteri di ciò che rende il comando, se omettiamo questa istruzione, otteniamo:
pi@EasyMeteo01:~ $ cat /sys/class/thermal/thermal_zone0/temp
33628
pi@EasyMeteo01:~ $

Numero che rappresenta la lettura della temperatura interna in millesimi di grado.

Stay Tuned
TecnoGeppetto

domenica 27 novembre 2016

Installare client VPN su distribuzione debian Lite per Raspberry Pi

L'avventura di oggi e' stata quella di installare il Client VPN su una distribuzione fresca fresca di Debian-Lite appena scaricata dal sito originale .
L'operazione è molto semplice, ma come sempre, c'è sempre qualcosa da sapere per portarla a termine con esito positivo.
La distribuzione Lite distribuita dal sito originale infatti non contiene tutti i pacchetti necessari perchè tutto funzioni subito, ma per ottenere il risultato dobbiamo installare alcuni pacchetti indispensabili.
Dopo i classici:
    1  sudo apt-get update
    2  sudo apt-get upgrade
Installiamo il programma principale OpenVpn che sarà quello che gestisce l'operazione:
    3  sudo apt-get install openvpn

Nella distribuzione completa già questa operazione e' sufficiente per far partire tutto, ma nella Lite, manca un componente essenziale, il Driver per Tun/Tap.
Per andare verso il buon fine il comando precedente deve essere sostituito da questo più completo che installa tutto il necessario ed anche qualcosa di più che ci servirà in seguito per proseguire nel progetto (git e zip)

    4  sudo apt-get install openvpn openssl module-init-tools zip dos2unix git
Poi con facciamo partire il driver necessario
    5  command modprobe tun
 
A questo punto un bel reboot che non guasta!

    6  sudo reboot
Poi ci spostiamo nella cartella che contiene le chiavi per la registrazione corretta in rete. (queste chiavi devono essere state preventivamente fornite dal server VPN, si tratta di 4 file che contengono le chiavi crittografate ed il file di configurazione di OpenVpn in questo caso le mie sono contenute in una cartella dal nome "client15"
    7  cd client15/

Con il comando successivo facciamo partire il programma OpenVpn in modo che vada a leggere il file di configurazione e con quello assuma le chiavi necessarie, con l'aggiunta del comando "&" , mandiamo l'operazione in back ground, in maniera da non occupare la finestra di terminale ed essere costretti ad aprirne un'altra.
    8  sudo openvpn --config client.ovpn &
A questo punto, se le chiavi sono state riconosciute dal sistema e tutto è  andato nel verso giusto, siamo entrati nella VPN di cui avevamo le chiavi.
Conoscendo alcuni indirizzi interniu della rete sara' facile vedere se tutto e' OK, anche soltanto pingando il server, per esempio
    9  ping 10.8.0.1

Con ifconfig  possiamo vedere tutte le caratteristiche della nostra configurzione di rete
   10 ifconfig


Questo è quello che mi risponde il comando sulla mia Raspberry Pi che sto utilizzando per gli esperimenti:
pi@EasyMeteo01:~ $ ifconfig
eth0      Link encap:Ethernet  HWaddr XXXXXXXXXXXXX
          inet addr:192.168.22.160  Bcast:192.168.22.255  Mask:255.255.255.0
          inet6 addr: fe80::cf20:4124:4cb8:cb7f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25261 errors:0 dropped:8 overruns:0 frame:0
          TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:20997554 (20.0 MiB)  TX bytes:1178247 (1.1 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.58  P-t-P:10.8.0.57  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:1000 errors:0 dropped:0 overruns:0 frame:0
          TX packets:813 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:68543 (66.9 KiB)  TX bytes:110167 (107.5 KiB)

pi@EasyMeteo01:~ $

In grassetto ho evidenziato la nuova configurazione che ho creato con l'operazione descritta sopra, il server mi ha assegnato l'IP  inet addr:10.8.0.58 

Per far partire la connessione alla accenzione del pc, possiamo aggiungere il comando sopra nel file rc.local che viene letto ad ogni boot del sistema
Quindi editiamo il file con :
   11  sudo vi /etc/rc.local

Ed aggiungiamo in fondo prima del comando  exit 0 , i comandi necessari, nel mio caso (che ho chiamato la cartella client15):

#dati per impostazione VPN
cd /home/pi/client15
sudo openvpn --config client.ovpn &

In questo modo alla prossima accensione del sistema la Raspberry Pi sarà connessa ad internet nella rete locale ed anche loggata nella rete VPN privata in automatico.

Primi passi per la costruzione di una Stazione Meteo

Preparare il sistema alla lettura dei sensori


Dopo aver installato il Client VPN  sulla nostra distribuzione Debian-Lite scelta per l'occasione, il passo successivo per ottenere una Stazione Meteo, e' quello di collegare i primi sensori alla Raspberry Pi e cominciare ad ottenere le prime letture dei dati.

Per fare questo ci sono da fare alcune operazioni hardware e software. La parte hardware la tratterò successivamente, adesso mi concentro su che cosa ho fatto per poter leggere i dati dal lato sofware.
Alla distribuzione scelta per il progetto, mancano alcune istruzioni necessarie per far funzionare il sistema, dobbiamo installare un paio di pacchetti e configurarli perchè la Raspberry Pi  si accorga del sensore che intanto ho collegato alla GPIO disponibile sulla scheda.


    1  sudo apt-get install -y python-smbus
    2  sudo apt-get install -y i2c-tools
    3  sudo raspi-config

Con il comando raspi-config abbiamo fatto partire il programma di configurazione interno di Raspberry.  Qui dobbiamo abilitare la porta I2C, che di default non e' abilitata,
Dal menù principale scegliere 8 Advanced Option,
Quindi scegliere la I2C come evidenziato in figura.

Quindi modificare manualmente con un editor di testo il file modules:
    4  sudo nano /etc/modules

Per inserire prima della fine del file questi due parametri:
i2c-bcm2708 i2c-dev

Chiudere e salvare il file.
Adesso manca ancora una operazione, dobbiamo modificareil file:
    5  sudo nano /boot/config.txt

Al quale dobbiamo aggiungere due parametri, in fondo al file scrivere:
dtparam=i2c1=on
dtparam=i2c_arm=on


Chiudere e salvare il file.

Comunicare col sensore

Adesso siamo pronti per partire e finalmente leggere i primi dati. Rebootiamo la Raspberry.
    6  sudo reboot
 
Con il comando successivo possiamo controllare se il dispositivo collegato alla porta I2C è regolarmente ricevuto dalla macchina
     7  sudo sudo i2cdetect -y 1   
(SOLO nel caso si stia usando una Raspberry Pi modello A, l'ultimo parametro dovrà essere 0 -zero-  quindi: sudo sudo i2cdetect -y 0 )

Nel caso del sensore BMP180, che ho scelto di utilizzare come sensore di temperatura e pressione, se correttamente collegato, il sistema risponderà con l'indirizzo 0x77


Preparare il Software

   Per installare il pacchetto messo a disposizione da Adafruit, che contiene una serie di esempi di utilizzo del sensore BMP180 che ho utilizzato, è necessario aggiungere una serie di pacchetti aggiuntivi non presenti nella distribuzione, quindi  digitare:
    1  sudo apt-get install git build-essential python-dev python-smbus
Poi scaricare il Software di Adafruit
    2  git clone https://github.com/adafruit/Adafruit_Python_BMP.git

Entrare nella cartella
    3  cd Adafruit_Python_BMP/

Installare il programma Adafruit, ed allo scopo Adafruit ha preparato un file auto installante che partirà col comando:
    4  sudo python setup.py install

Al termine delle operazioni automatiche, entrare nella cartella degli esempi e far partire il programma di test:
    5  cd examples/
    6  sudo python simpletest.py

Questo programma renderà a video  la lettura del sensore BMP180 collegato, formattando il testo in modo che possa essere facilmente letto dall'utente

Abbiamo finalmente ricevuto la prima lettura dei dati disponibili sul sensore scelto.

sabato 9 luglio 2016

Hacking firmware La Fonera Atheros AR2315

Frugando nei cassetti è saltata fuori una vecchia Fonera, un Access Point che Fon ha commercializzato qualche anno fa ad un prezzo particolarmente conveniente (per l'epoca) e che consentiva di collegarsi alla rete Fon in tutto il mondo per assicurarsi una connessione WiFi gratis.
Ormai nei cassetti da almeno 7 - 8 anni e' venuto il momento di passarla in rassegna e di tentare di utilizzarla in qualche modo.
In giro per la rete si trovano molti articoli su come modificarne il firmware ed installare OpenWrt, il noto programma di gestione per Router.
Ho quindi tentato anche io la strada dell'hacking.
La maggior parte degli articoli la mettono giu' complicata, considerando la connessione seriale al connettore ICSP come una cosa estremamente difficile ed onerosa; Io non ho trovato tutta questa difficolta, devo essere sincero, anzi, e' stato piu' pesante il lavoro di lettura ed analisi dei tanti sistemi alternativi alla semplice connessione seriale, che sconsiglio proprio di percorrere le strade proposte nella maggior parte dei Blog, che indicano come preferibile la strada di  modificare il firmware originale facendo un down-grade, per utilizzare un bug di una vecchia versione Fon ed ottenere i privilegi di root.

Semplicemente collegando un convertitore seriale alla porta ICSP, facilmente individuabile all'interno del circuito,  si ottiene immediatamente la possibilita' di comunicare con il Bootloader della macchina.

Hardware

ArchitectureMIPS 4KEc
Vendorn/a
BootloaderRedBoot
System-On-ChipAtheros AR2315
CPU Speed183 MHz
Flash size8 MiB
RAM16 MiB
WirelessIntegrated Atheros 802.11b/g
Ethernet1x RJ45
USBNo
SerialYes
JTAGNo
 
Puoi guardare la foto del mio circuito i cavi sono collegati cosi:
Grigio -- GND
Viola  --      RX
Arancio ----TX

Qui invece sono riportate le connessioni viste da dietro della scatola:
+-------------------+
|GND| . |TXD|RXD| . |
|VCC| . | . | . | . |
+-------------------+
+-----+ +--------+    +---+
|Power| |Ethernet|    |Ant|
Collegato il tutto e fatto partire il programma di lettura dei dati ricevuti su seriale (per Windows per esempio Putty e in Linux o MacOsx puoi usare Minicom) questo riportato qui di seguito e' quello che dovresti leggere
+PHY ID is 0022:5521
Ethernet eth0: MAC address xx:xx:xx:xx:xx
IP: 0.0.0.0/255.255.255.255, Gateway: 0.0.0.0
Default server: 0.0.0.0
RedBoot(tm) bootstrap and debug environment [ROMRAM]
Non-certified release, version v1.3.0 - built 16:57:58, Aug  7 2006
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
Board: ap51
RAM: 0x80000000-0x81000000, [0x80040450-0x80fe1000] available
FLASH: 0xa8000000 - 0xa87f0000, 128 blocks of 0x00010000 bytes each.
== Executing boot script in 1.000 seconds - enter ^C to abort
^C
RedBoot>



RedBoot> fis list
Name              FLASH addr  Mem addr    Length      Entry point
RedBoot           0xA8000000  0xA8000000  0x00030000  0x00000000
rootfs            0xA8030000  0xA8030000  0x00700000  0x00000000
vmlinux.bin.l7    0xA8730000  0x80041000  0x000B0000  0x80041000
FIS directory     0xA87E0000  0xA87E0000  0x0000F000  0x00000000
RedBoot config    0xA87EF000  0xA87EF000  0x00001000  0x00000000

Il firmware piu' aggiornato al momento in cui scrivo lo puoi trovare a questo indirizzo

Scarica i due file e passali nella cartella su cui punta il server TFTP che avrai gia' predisposto magari leggendo questa guida che ho fatto proprio ieri

Con questa istruzione setterai il numero IP del AP  (-l)ocal  e quello del server dove si collegherà con la prossima istruzione per scaricare il firmware (il tuo server TFTP) (-h)ost

RedBoot> ip_address -h 192.168.0.2 -l 192.168.0.1/24
Con questa istruzione il AP si collega al Server TFTP e si scarica il novo Firmware:

RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma
Using default protocol (TFTP)
Raw file loaded [...], assumed entry at [...]
Questa istruzione serve per cancellare dalla Flash memory il precedente firmware (sei sicuro???)



RedBoot> fis init
Poi si installa il nuovo :

RedBoot> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7
... Erase from 0xa8730000-0xa87e0000: ...........
... Program from 0x80041000-0x800f1000 at 0xa8730000: ...........
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Stessa cosa per le partizioni:
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs
Using default protocol (TFTP)

Raw file loaded 0x80041000-0x80200fff, assumed entry at 0x80041000


RedBoot> fis create rootfs
... Erase from 0xa8030000-0xa8730000: ................................................................................................................
... Program from 0x80041000-0x80741000 at 0xa8030000: ..............................................................................................................
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
il comando sotto serve per controllare che tutto sia andato a buon fine
fconfig -l -n
Nel caso che il parametro  boot_script_data  sia diverso da 

.. fis load -l vmlinux.bin.l7 
.. exec
Allora :
RedBoot> fconfig boot_script_data 
boot_script_data: 
.. fis load -l vmlinux.bin.1
.. exec
Enter script, terminate with empty line
>> fis load -l vmlinux.bin.l7
>> exec
>> 
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot> 
A questo punto si puo' resettare il nostro nuovo AP
RedBoot> reset
Adesso dovresti trovare il tuo nuovo Access Point con OpenWrt che risponderà chimandolo con un browser web all'indirizzo:
http://192.168.1.1

E' inutile dire che devi avere i parametri corretti per poterlo collegare nella configurazione della tua scheda di rete.









venerdì 8 luglio 2016

RS485 + FTDI232 + Arduino test di linea

Per un nuovo progetto  in questi giorni ho dovuto testare il funzionamento di una connessione RS485 attraverso un cavo lungo più di 100 metri.

Se cercate un po' in giro ci sono tanti tutorial sul funzionamento di questo metodo di trasmissione. Anche io non ho fatto altro che leggere qualche tutorial in giro e poi costruire il semplice circuito composto da 2 moduli RS485 che si parleranno a distanza attraverso il cavo.

La teoria dice che circuiti come quello riportato nello schema qui sotto possono raggiungere i 1200 metri senza problemi di decadimento della comunicazione, ma considerato che il progetto e' particolarmente importante in termini di sicurezza, e' stato fondamentale per me poter mettere sotto stress la comunicazione per poter controllare il regolare funzionamento anche sulla tratta di circa 100 metri di cui ho necessità.


Come si può vedere nello schema sia in testa che in fondo al cavo sono previsti dei carichi, che nel nostro caso sono già inseriti nel modulo che ho scelto per questo progetto.
Infatti nel modulino della LC Electronics di cui riporrto lo schema qui a fianco, ci sono già tutte le resistenze che servono per il corretto funzionamento del circuito.
Durante i test ho anche potuto sperimentare che il modulo e' anche molto sensibile alle sovratensioni, infatti prolungati periodi di sovra alimentazione anche di solo 1 volt in piu' hanno provocato la rottura del Max232 che e' l'integrato contenuto nel circuito del modulo.










Dopo aver fatto i primi test collegando un adattatore seriale USB-TTL come interfaccia tra il pc ed il modulo RS485, utilizzando un FTDI232, poi ho scelto di costruire un sistema basato su Arduino che si preoccupi di mantenere sempre viva la comunicazione e che segnali eventuali anomalie, nel caso la comunicazione non andasse a buon fine.

Il circuito e' molto semplice, dal FTDI232 prendiamo la alimentazione per il modulo collegando VCC e GND , nel caso del MASTER i due PIN  DE  ed RE devono essere collegati anch'essi a GND, mentre DI ed RO  rispettivamente a TX  ed RX della seriale.
DI -- TX   ed    RO -- RX

Per il modulo scelto per essere SLAVE (quello che trasmette l'informazione) si dovra' solamente collegare i PIN  DE ed RE a Vcc anziche' a GND

DE+RE --- GND (master), in questo modo abbiamo ottenuto un circuito che consente di trasmettere solamente in un verso l'informazione ( da Master a Slave ) che vengono definiti appunto scegliendo di mettere allo stato BASSO  DE ed RE  per il Master ed allo stato ALTO per lo Slave.
Per le prime prove va bene, ovviamente, ma per poter testare meglio in tutti e due i "sensi di marcia", per non fare lo switch degli stati a mano, ho preferito montare un circuito basato su Arduino.

Ho quindi montato il circuito che dal lato master invia un messaggio contenente un carattere (1), poi si mette in ascolto,  se riceve un carattere stabilito come ACK (7) fa lampeggiare il suo LED collegato al PIN13, altrimente ripete l'invio del messaggio.

Dal lato Slave, il modulo sta sempre in ascolto, quando riceve un messaggio stabilito (1) si mette in trasmissione, mandando un segnale convenzionale (7) per confermare l'avvenuta ricezione, e poi torna subito in ricezione per attendere il nuovo messaggio.

Prendendo l'alimentazione dei moduli RS485 direttamente da Arduino, ho lasciato fare lo switch degli stati al PIN 3  ed ho utilizzato questi due programmini per gestire la comunicazione:

**************************************

// software per lo SLAVE



void setup() {
  Serial.begin(57600);
  pinMode(3, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(3,LOW);
  digitalWrite(13,LOW);
}

void loop() {
 while (Serial.available()) {
    digitalWrite(3,LOW);
    delay(1);
    char c = Serial.read();  //gets one byte from serial buffer
    if (c == '1') {
           
     // fai quello che devi fare
    digitalWrite(3,HIGH);
    delay(10);
    Serial.print(7);
    delay(1);
    digitalWrite(3,LOW);
 
   
    }else{
   
        // fai quello che devi fare se non e' arrivato il carattere giusto
    for(int i=1 ; i=10 ; i++){
    digitalWrite(13,HIGH);
    delay(100);
    digitalWrite(13,LOW);
    delay(100);
    }
    }
  }

}

 ***********************************************************


// software per lo MASTER



void setup() {
  Serial.begin(57600);
  pinMode(3, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(3,HIGH);
  digitalWrite(13,LOW);
}

void loop() {
 // while (Serial.available()) {
 
    digitalWrite(3,HIGH);
    delay(10);
    Serial.println(1);
    delay(1);
 
      digitalWrite(3,LOW);
      delay(1);
      char c = Serial.read();  //gets one byte from serial buffer
      if (c == '7') {

        // fai quello che devi fare
   // Serial.print("sentito il ACK");
      lampeggia();
   

 
      }
   
    }

  }
void lampeggia(){
  for(int i=1 ; i<3 i="" p="">    digitalWrite(13,HIGH);
    delay(100);
    digitalWrite(13,LOW);
    delay(100);
  }
}
















Creare un server TFTP in 4 mosse su Ubuntu

Durante uno degli ultimi hack (peraltro tuttora in corso!) ho avuto la necessita' di creare un server tftp per poter far fare un veloce upload del nuovo firmware al mio device sotto tortura.


In pratica il server in oggetto e' un semplice server ftp automatico che mette a disposizione i file (in questo caso del nuovo firmware) a qualsiasi device che si colleghi con il protocollo tftp. Non e' previsto blocco di password, non e' previsto upload da parte del device, ma soltanto la semplice funzione di download alla connessione. 
Avevo gia' fatto altre prove del genere in passato, per modificare il firmware dei vecchi telefonini WiFi Aladino, telefoni Voip che la Telecom commercializzava un decennio fa'.

Ok veniamo alle 4 mosse da percorrere per installare il server sul sitema Ubuntu e farlo girare.

Prima di tutto si dovra' scaricare il software necessario con apt-get


sudo apt-get install xinetd tftpd tftp
dopodiche' creiamo un file di configurazione con Vim (per esempio oppure con nano)

sudo vi /etc/xinetd.d/tftp

inserendo questi comandi


service tftp
{
protocol        = udp
port            = 69
socket_type     = dgram
wait            = yes
user            = nobody
server          = /usr/sbin/in.tftpd
server_args     = /tftpboot
disable         = no
}

Adesso creiamo la cartella che conterra' i file da condividere e sistemiamo i permessi con:
sudo mkdir /tftpboot
sudo chmod -R 777 /tftpboot
sudo chown -R nobody /tftpboot

ora si fara' ripartire il server appena creato con il comando

sudo service xinetd restart

Adesso possiamo gi' fare le prime prove inserendo nella cartella /tftpboot appena creata un file di test (per esempio proprio test )

e da un'altra macchina nella propria rete si potrà chiamare il nuovo server e prelevare il file test
cosi:

tftp IP_SERVER
tftp> get test
Sent 159 bytes in 0.0 seconds

tftp> quit

cat test










mercoledì 22 giugno 2016

Ascoltare radio in web steaming da shell

Nel mio continuo girovagare in cerca di novita' tecnologiche, ho trovato questo programma che in modo molto semplice e veloce consente di ascoltare le tue stazioni radio in streaming preferite.


Il sistema funziona da shell, non ha interfaccia grafica, ma in fondo non serve per ascoltare la radio!

Si istalla semplicemente con questo comando
 
 
sudo apt-get install mpd mpc
 
Caricato il programma sul sistema, basta aggiungere con 

mpc add "link"   

il link delle stazioni radio che piu' ci piacciono che il sistema comincera' a riprodurre lo streaming sugli altoparlanti del sistema.

Con 

mpc help

avremo la lista di tutti i comandi disponibili.
 



RPi 5,0 HDMI 800x480 con TouchScreen

La battaglia comincia:
Trovare una soluzione stabile e funzionante che consenta l'utilizzo del monitor 5 pollici HDMI per Raspberry Pi.
Una bella sfida, perche' ogni volta che mettiamo mano alla scoperta di qualche pezzo hardware un po' "diverso" dal solito, ci si scontra con la mancanza di informazioni o, peggio con una quantita' di informazioni errate, che fanno perdere un mare di tempo, prima di trovare la strada giusta.
Ma a me e' sempre piaciuto andare ad esplorare nuove strade ed evitare di rimanere legato alle solite cose sulle quali sperimentano un po' tutti, quindi eccomi qui alla ricerca.

La maggior parte delle buone informazioni sul funzionamento di hardware dedicato al meraviglioso campo della hobbistica elettronica, la fornisce Adafruit.
In questo caso pero', forse per il prezzo un po' alto del device,

Per l'istallazione ho seguito questa guida, ma per farla funzionare correttamente importante e' aggiungere queste istruzioni del file config.txt nella cartella /boot della Raspberry Pi con la distribuzione debian classica (Jessy)

hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0

Poi aggiungere  in basso al documento queste due istruzioni qui per attivare il Touch Screen

dtparam=spi=on
dtoverlay=ads7846,penirq=25,speed=10000,penirq_pull=2,xohms=150



con  questa istruzione si istalla il sistema per la calibrazione dello schermo, molto utile per associare al tocco del pennino la corretta posizione
 
 sudo apt-get install -y xinput-calibrator
 
 
Un altro link utile per rendere funzionante l'istallazione e' questo


 

 
 
 Nel caso di utilizzo solo in Terminale si puo' diminuire la memoria dedicata alla GPU
gpu_mem=32
framebuffer_ignore_alpha=1
framebuffer_swap=1
disable_overscan=1
init_uart_clock=16000000
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0
 
 

 
 

Tastiera Virtuale per Raspberry Pi TouchScreen

 Ho assemblato qualche giorno fa un sistema composto con Raspberry Pi B2 e schermo TFT Touch screen, condito con RaspiCam e, ancora nei progetti ma non montato,  di amplificatore BF e altoparlanti, batteria di alimentazione da 10Ampere, e chissa' quante altre diavolerie mi inventero'!!!

Una delle cose di cui ho sentito subito l'esigenza e' una tastiera virtuale che consentisse di operare sul sistema anche attraverso lo schermo touch.
L'operazione di installazione come sempre non e' stata delle piu' veloci, ma poi , alla fine sono riuscito ad arrivare in fondo utilizzando questa guida.














RPi WebCam Interface

Sempre alla ricerca di qualche applicazione interessante ho scoperto questa che aiuta moltissimo nella costruzione di un  sistema di monitoraggio tramite RaspiCam. Da quando lo ho scoperto, la mia stampante 3D e' costantemente sotto il suo occhio vigile, cosi posso comandarla da remoto e controllare se la stampa impostata, si svolge regolarmente anche quando non sono li di persona.

Istallare il sistema e' semplicissimo.
Partendo da una nuova immagine debian su Raspberry Pi

sudo apt-get update
sudo apt-get dist-upgrade

Poi, se l'istruzione  git  non e' ancora stata caricata nel sistema:

sudo apt-get install git

Quindi:

git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
cd RPi_Cam_Web_Interface
chmod u+x *.sh
./install.sh

A questo punto il sistema e' installato e potete gia' utilizzarlo chiamando da un browser web l'indirizzo IP della Raspberry Pi, anche dal telefonino come faccio io.



http://elinux.org/RPi-Cam-Web-Interface

ESP8266 i comandi AT

L' ESP8266 appena scartato dalla confezione originale dovrebbe avere gia' caricato il firmware di default che consente di comunicare attraverso semplici comandi AT Hayes compatibili, quelli dei vecchi modem telefonici, per capirsi. I vecchi appassionati della prima ora di internet se li ricordenranno sicuramente.

 Girovagando in rete ho trovato questo link dove vengono riepilogati tutti i comandi in maniera dettagliata.

Room-15

Riporto qui di seguito un copia ed incolla piu' significativo, rimandando al link sopra per un approfondimento  maggiore

I comandi AT riconosciuti dal modulo ESP8266


Index of all known AT commands

Basic WiFI layer TCPIP Layer
AT AT+CWMODE AT+CIPSTATUS
AT+RST AT+CWJAP AT+CIPSTART
AT+GMR AT+CWLAP AT+CIPSEND
AT+GSLP AT+CWQAP AT+CIPCLOSE
ATE AT+CWSAP AT+CIFSR
AT+CWLIF AT+CIPMUX
AT+CWDHCP AT+CIPSERVER
AT+CIPSTAMAC AT+CIPMODE
AT+CIPAPMAC AT+CIPSTO
AT+CIPSTA AT+CIUPDATE
AT+CIPAP +IPD

Line termination

ESP8266 expects  or CarriageReturn and LineFeed at the end of each command, but just ; seems to work too.

Command variants

Each command can have up to 4 variants changing the function of it. You can chose between them by appending one of four possible values to the end of the root command itself. These four appendices can have the following values "",=,"?",=?
Type Example Description
Test AT+CIPSTART=? Query the range of values (So far only AT+CWMODE=? uses it)
Query AT+CMD? Returns the current value of the parameter.
Set AT+CMD=Parameter Set the value of user-defined parameters in commands and run.
Execute AT+CMD Runs commands with no user-defined parameters.
Note:
  • Not all AT commands support all 4 variants.
  • [] = default value, not required or may not appear.
  • String values require double quotation marks, for example: AT+CWSAP="ESP756190","21030826",1,4.
  • Baud rate = 115200
  • AT instruction ends with “\r\n”

Commands

AT - Test AT startup

Variant Command Response Function
Execute AT OK Test if AT system works correctly

AT+RST - Restart module

Variant Command Response Function
Execute AT+RST OK Reset the module

ESP-01 Output after reset:

 ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 24444, room 16
tail 12
chksum 0xe0
ho 0 tail 12 room 4
load 0x3ffe8000, len 3168, room 12
tail 4
chksum 0x93
load 0x3ffe8c60, len 4956, room 4
tail 8
chksum 0xbd
csum 0xbd

ready

ESP-12 Output after reset:

\0x04B1\0x85 \0xff\0x13:'\0xe0;\0xcc;!G\0xfa\0x11\0xa9R\0xc6\0x83\0x01\0xd9\0x81
[Vendor:www.ai-thinker.com Version:0.9.2.4]

ready

AT+GMR - View version info

Variant Command Response Function
Execute AT+GMR version, OK Print firmware version
Parameters:
  • version: firmware version number
ESP-01 output:
00160901
ESP-12 output:
0018000902-AI03

AT+GSLP - Enter deep-sleep mode

Variant Command Response Function
set AT+GSLP=time time OK Enter deep sleep mode for time milliseconds
parameters:
  • time: Time to sleep in milliseconds
Example:
AT+GSLP=1500
Note:
Hardware has to support deep-sleep wake up (Reset pin has to be High).

ATE - Enable / Disable echo

Variant Command Response Function
Execute ATE0 OK Disable echo (Doesn’t send back received command)
Execute ATE1 OK Enable echo (Sends back received command before response)
Note:
I haven’t had any luck with this command yet. Both ATE0 and ATE1 return no this fun.
ATE returns OK
This changed with ESP-12 where the command functions exactly as expected!

AT+CWMODE - WIFI mode(station, AP, station + AP)

Variant Command Response Function
Test AT+CWMODE=? +CWMODE:(1-3) OK List valid modes
Query AT+CWMODE? +CWMODE:mode OK Query AP’s info which is connect by ESP8266.
Execute AT+CWMODE=mode OK Set AP’s info which will be connect by ESP8266.
Parameters:
  • mode: An integer designating the mode of operation either 1, 2, or 3.
    1 = Station mode (client)
    2 = AP mode (host)
    3 = AP + Station mode (Yes, ESP8266 has a dual mode!)
Notes:
ESP-12 came configured as host with ssid set to ESP_A0A3F2, no password, channel 1 You can use AT+CWSAP? to find the current settings.

AT+CWJAP - Connect to AP

Variant Command Response Function
Query AT+CWJAP? + CWJAP:ssid OK Prints the SSID of Access Point ESP8266 is connected to.
Execute AT+CWJAP=ssid,pwd OK Commands ESP8266 to connect a SSID with supplied password.
Parameters:
  • ssid:String, AP’s SSID
  • pwd:String, not longer than 64 characters
Example:
AT+CWJAP="my-test-wifi","1234test"  
Example AT+CWJAP?
+CWJAP:"my-test-wifi"  

AT+CWLAP - Lists available APs

Variant Command Response Function
Set AT+CWLAP=ssid,mac,ch +CWLAP:ecn,ssid,rssi,mac OK Search available APs with specific conditions.
Execute AT+CWLAP AT+CWLAP:ecn,ssid,rssi,mac OK Lists available Access Points.
Parameters:
  • ecn:
    • 0 = OPEN
    • 1 = WEP
    • 2 = WPA_PSK
    • 3 = WPA2_PSK
    • 4 = WPA_WPA2_PSK
  • ssid: String, SSID of AP
  • rssi: signal strength
  • mac: String, MAC address
Note:
On ESP-01 I have had no luck with the set version of this command (AT+CWLAP=...). If you know what it does please let me know.
On ESP-12, the Set version of the command allows to see if a certain SSID, with certain MAC on certain channel exists. If it doesit is returned as one line of the Execute version of this command.
Example AT+CWLAP:
+CWLAP:(3,"CVBJB",-71,"f8:e4:fb:5b:a9:5a",1)
+CWLAP:(3,"HT_00d02d638ac3",-90,"04:f0:21:0f:1f:61",1)
+CWLAP:(3,"CLDRM",-69,"22:c9:d0:1a:f6:54",1)
+CWLAP:(2,"AllSaints",-88,"c4:01:7c:3b:08:48",1)
+CWLAP:(0,"AllSaints-Guest",-83,"c4:01:7c:7b:08:48",1)
+CWLAP:(0,"AllSaints-Guest",-83,"c4:01:7c:7b:05:08",6)
+CWLAP:(4,"C7FU24",-27,"e8:94:f6:90:f9:d7",6)
+CWLAP:(2,"AllSaints",-82,"c4:01:7c:3b:05:08",6)
+CWLAP:(3,"QGJTL",-87,"f8:e4:fb:b5:6b:b4",6)
+CWLAP:(4,"50EFA8",-78,"74:44:01:50:ef:a7",6)
+CWLAP:(0,"optimumwifi",-78,"76:44:01:50:ef:a8",6)
+CWLAP:(3,"BHQH4",-95,"18:1b:eb:1a:af:5b",6)
+CWLAP:(3,"NETGEAR49",-86,"84:1b:5e:e0:28:03",7)
+CWLAP:(3,"ngHub_319332NW00047",-56,"20:e5:2a:79:b1:2f",11)
+CWLAP:(3,"BFZR4",-73,"18:1b:eb:1d:c3:91",11)
+CWLAP:(1,"5FFVL",-82,"00:26:b8:b5:c0:f2",11)
+CWLAP:(3,"59G6D",-77,"00:7f:28:6d:91:7b",11)
+CWLAP:(3,"N16FU",-53,"20:cf:30:ce:60:fe",11)
+CWLAP:(3,"ITS",-82,"90:72:40:21:5f:76",11)
+CWLAP:(3,"ITS",-79,"24:a2:e1:f0:04:e4",11)
Example AT+CWLAP="N16FU","20:cf:30:ce:60:fe",11:
+CWLAP:(3,"N16FU",-53,"20:cf:30:ce:60:fe",11)

AT+CWQAP - Disconnect from AP

Variant Command Response Function
Execute AT+CWQAP OK Disconnect ESP8266 from the AP is currently connected to.
Note:
After running this command, if you run AT+CWJAP? it still shows the AP you were connected to before.

AT+CWSAP - Configuration of softAP mode

Variant Command Response Function
Query AT+CWSAP? +CWSAP:ssid,pwd,ch,ecn OK Query configuration of ESP8266 softAP mode.
Set AT+CWSAP=ssid,pwd,ch,ecn OK Set configuration of softAP mode.
Parameters:
  • ssid: String, ESP8266’s softAP SSID
  • pwd: String, Password, no longer than 64 characters
  • ch: channel id
  • ecn:
    • 0 = OPEN
    • 2 = WPA_PSK
    • 3 = WPA2_PSK
    • 4 = WPA_WPA2_PSK
Example
AT+CWSAP="esp_123","1234test",5,3
AT+CWSAP? => +CWSAP:"esp_123","1234test",5,3

AT+CWLIF - List clients connected to ESP8266 softAP

Variant Command Response Function
Execute AT+CWLIF [ip,other] OK List information on of connected clients.
Parameters:
ip: IP address of a client connected to the ESP8266 softAP other: Other info, look at example. I don’t know what it means yet.
Example (ESP-01):
AT+CWLIF

192.168.4.100,3fff50b4:3fff50ba:3fff50c0:3fff50c6:3fff50cc:3fff50d2

OK
Example (ESP-12):
AT+CWLIF

192.168.4.100,c0:ee:fb:25:33:ec

OK
I ran the command after connecting to the ESP8266 with my cellphone.

AT+CWDHCP - Enable/Disable DHCP

Variant Command Response Function
Set AT+CWDHCP=mode,en OK Enable or disable DHCP for selected mode
Parameters:
  • mode:
    • 0 : set ESP8266 as a softAP
    • 1 : set ESP8266 as a station
    • 2 : set both ESP8266 to both softAP and a station
  • en:
    • 0 : Enable DHCP
    • 1 : Disable DHCP
Note:
This command doesn’t seem to work on firmware 00160901 (ESP-01) nor 0018000902-AI03 (ESP-12).

AT+CIPSTAMAC - Set MAC address of ESP8266 station

Variant Command Response Function
Query AT+CIPSTAMAC? +CIPSTAMAC:mac OK Print current MAC ESP8266’s address.
Execute AT+CIPSTAMAC=mac OK Set ESP8266’s MAC address.
Parameters:
  • mac: String, MAC address of the ESP8266 station.
Example:
AT+CIPSTAMAC="18:aa:35:97:d4:7b"
Note:
This command doesn’t seem to work on firmware 00160901

AT+CIPAPMAC - Set MAC address of ESP8266 softAP

Variant Command Response Function
Query AT+CIPAPMAC? +CIPAPMAC:mac OK Get MAC address of ESP8266 softAP.
Execute AT+CIPAPMAC=mac OK Set mac of ESP8266 softAP.
Parameters:
  • mac: String, MAC address of the ESP8266 softAP.
Example:
AT+CIPAPMAC=”2c:aa:35:97:d4:7b”
Note:
This command doesn’t seem to work on firmware 00160901

AT+CIPSTA - Set IP address of ESP8266 station

Variant Command Response Function
Query AT+CIPSTA? +CIPSTA:ip OK Get IP address of ESP8266 station.
Execute AT+CIPSTA=ip OK Set ip addr of ESP8266 station.
Parameters:
  • ip: String, ip address of the ESP8266 station.
Example:
AT+CIPSTA=”192.168.101.108”
Note:
This command doesn’t seem to work on firmware 00160901

AT+CIPAP - Set ip address of ESP8266 softAP

Variant Command Response Function
Query AT+CIPAP? +CIPAP:ip OK Get ip address of ESP8266 softAP.
Execute AT+CIPAP=ip OK Set ip addr of ESP8266 softAP.
Parameters:
  • ip: String, ip address of ESP8266 softAP.
Example:
AT+CIPAP="192.168.5.1"
Note:
This command doesn’t seem to work on firmware 00160901

AT+CIPSTATUS - Information about connection

Variant Command Response Function
Test AT+CIPSTATUS=? OK
Execute AT+CIPSTATUS STATUS:status +CIPSTATUS:id,type,addr,port,tetype OK Get information about connection.
Parameters:
  • status
    • 2: Got IP
    • 3: Connected
    • 4: Disconnected
  • id: id of the connection (0~4), for multi-connect
  • type: String, “TCP” or “UDP”
  • addr: String, IP address.
  • port: port number
  • tetype
    • 0 = ESP8266 runs as a client
    • 1 = ESP8266 runs as a server
Note:
On ESP-01 this command returns STATUS:1 instead (no extra info, but status changes) On 0018000902-AI03 this command returns STATUS:2 instead (no extra info, but status changes)

AT+CIPSTART - Establish TCP connection or register UDP port and start a connection

Variant Command Response Function
Set AT+CIPSTART=type,addr,port OK Start a connection as client. (Single connection mode)
Set AT+CIPSTART=id,type,addr,port OK Start a connection as client. (Multiple connection mode)
Test AT+CIPSTART=? [+CIPSTART:(id)(“type”),(“ip address”),(port)] OK List possible command variations)
Parameters:
  • id: 0-4, id of connection
  • type: String, “TCP” or “UDP”
  • addr: String, remote IP
  • port: String, remote port

AT+CIPSEND - Send data

Variant Command Response Function
Test AT+CIPSEND=? OK
Set AT+CIPSEND=length SEND OK Set length of the data that will be sent. For normal send (single connection).
Set AT+CIPSEND=id,length SEND OK Set length of the data that will be sent. For normal send (multiple connection).
Execute AT+CIPSEND Send data. For unvarnished transmission mode.

Normal Mode

Parameters:
  • id: ID no. of transmit connection
  • length: data length, MAX 2048 bytes

Unvarnished Transmission Mode

Wrap return “>” after execute command. Enters unvarnished transmission, 20ms interval between each packet, maximum 2048 bytes per packet. When single packet containing “+++” is received, it returns to command mode.

AT+CIPCLOSE - Close TCP or UDP connection

Variant Command Response Function
Test AT+CIPCLOSE=? OK
Set AT+CIPCLOSE=id OK Close TCP or UDP connection.For multiply connection mode
Execute AT+CIPCLOSE OK Close TCP or UDP connection.For single connection mode
Parameters:
  • id: ID no. of connection to close, when id=5, all connections will be closed.
Note:
In server mode, id = 5 has no effect!

AT+CIFSR - Get local IP address

Variant Command Response Function
Test AT+CIFSR=? OK
Execute AT+CIFSR +CIFSR:ip OK Get local IP address.
Parameters:
  • ip: IP address of the ESP8266 as an client.
Example AT+CIFSR:
10.101.10.134

AT+CIPMUX - Enable multiple connections or not

Variant Command Response Function
Set AT+CIPMUX=mode OK Enable / disable multiplex mode (up to 4 conenctions)
Query AT+CIPMUX? +CIPMUX:mode OK Print current multiplex mode.
Parameters:
  • mode:
    • 0: Single connection
    • 1: Multiple connections (MAX 4)
NOTE:
This mode can only be changed after all connections are disconnected. If server is started, reboot is required.

AT+CIPSERVER - Configure as server

Variant Command Response Function
Set AT+CIPSERVER=mode[,port] OK Configure ESP8266 as server
Parameters:
  • mode:
  • 0: Delete server (need to follow by restart)
  • 1: Create server
  • port: port number, default is 333
NOTE:
  1. Server can only be created when AT+CIPMUX=1
  2. Server monitor will automatically be created when Server is created.
  3. When a client is connected to the server, it will take up one connection,be gave an id.

AT+CIPMODE - Set transfer mode

Variant Command Response Function
Query AT+CIPMODE? +CIPMODE:mode OK Set transfer mode,normal or transparent transmission.
Set AT+CIPMODE=mode OK Set transfer mode,normal or transparent transmission.
Parameters:
  • mode:
  • 0: normal mode
  • 1: unvarnished transmission mode

AT+CIPSTO - Set server timeout

Variant Command Response Function
Query AT+CIPSTO? +CIPSTO:time Query server timeout.
Set AT+CIPSTO=time OK Set server timeout.
Parameters:
  • time: server timeout, range 0~7200 seconds

AT+CIUPDATE - update through network

!!! Don’t run this unless you know what you’re doing !!!

### !!! It will likely brick your device !!! Attempts to self-update from the internet.
Variant Command Response Function
Execute AT+CIUPDATE +CIPUPDATE:n OK Start update through network
Parameters:
-n:
- 1: found server
- 2: connect server
- 3: got edition
- 4: start update
Example:
AT+CIUPDATE

+CIUPDATE: 1
+CIUPDATE: 2
+CIUPDATE: 3
+CIUPDATE: 4

\0x02\0x8cl\0x8el\0x8e\0x1cp\0x0c\0x8c\0xf2nn\0xee\0x00l\0x8c\0x8el`
\0x02\0x90\0x12\0x12nnl\0x8cl`\0x02\0x0e\0x02nr\0x8e\0x92\0x92n\0x0c\0x0c
\0x02\0x8c\0x92`\0x02`
\0xf2n\0x0c\0x0c\0x0c\0x9e\0xe0b\0x82nl\0x8c\0x0c\0x8c
\0xf2nn\0xee\0x00\0x0c\0x8e\0x0elp\0xf2n\0xe0\0x10\0x02\0x0c
\0x0cr\0x8c\0x9c\0x9c\0xe2\0xe0\0x0c\0x0c\0x0c
\0x0cb\0x0cn\0xe2|\0x02\0xec\0xecl\0x8c\0x0cb\0x8c\0xf2nn
...forever