Pages: [1] 2   Go Down
Author Topic: Apriporta con Arduino e Asterisk!  (Read 3379 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti sto acquistando un Arduino e una scheda ethernet per esso.
Le mie conoscenze in ambito programmazione sono C e GTK+.

Avevo pensato di fare un apriporta con arduino e la relativa scheda ethernet.

Cercando su internet ho trovato qualcosa...
Utilizzo un server Asterisk con qualche interno...
vorrei poter interfacciare arduino con asterisk in modo che quando chiamo ad esempio al *0123 mi apre il portone di casa...spesso dimentico le chiavi smiley-lol

Tutto ciò è fattibile?

1) Come configuro asterisk?
2) e arduino?

Su internet ho trovato questi files:
Code:
arduino_call.pde  arduino_call.php  extensions_custom.conf
arduino_call.php:
Code:
<?php
// Arduino Call
// Modified By: Dan Wagoner - www.nerdybynature.com
// Date: 08/31/09
// A script written to create a call for asterisk file when accessed. The
// original intent is to have an arduino connect, triggereing a phone call.

$remote_ip=$_SERVER["REMOTE_ADDR"];

// Change the values below to reflect your setup
$arduino_ip "192.168.15.6";
$asterisk_outgoing "/var/spool/asterisk/outgoing/";
$asterisk_tmp "/tmp/";
$asterisk_toext "703"// the extension you want to call.
$asterisk_context "arduino_call";
$asterisk_cid "'Arduino' <000>"// the from caller id you'd like to display.

if ($remote_ip == $arduino_ip){
        
// create the file in a temp location
        
$arduinocallfile "/$asterisk_tmp/arduino_call.txt";
        
$arduinocall fopen($arduinocallfile'w') or die("can't open file");
        
$arduinocall_data "Channel: SIP/$asterisk_toext\nContext: $asterisk_context\nExtension: s\nCallerID: $asterisk_cid";
        
fwrite($arduinocall$arduinocall_data);
        
fclose($arduinocall);

        
// chmod, chown and chgrp the file to asterisk:asterisk
        
chmod ("/$asterisk_tmp/arduino_call.txt"0666);
        
chown ("/$asterisk_tmp/arduino_call.txt""asterisk");
        
chgrp ("/$asterisk_tmp/arduino_call.txt""asterisk");

        
// move the file to /var/spool/asterisk/outgoing
        
rename("/$asterisk_tmp/arduino_call.txt""/$asterisk_outgoing/arduino_call.call");
}
else{
// The request didn't come from the Arduino...banished!
echo "unauthorized access";
}
?>

extensions_custom.conf:
Code:
[arduino_call]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Flite("Hello! This is your arduino!")
exten => s,n,Hangup

se non erro, questa extensions dovrei metterlo sul mio asterisk no?

e la pagina php? la hosto sul server dove risiede asterisk?

secondo me manca qualcosa..
Grazie in anticipo a tutti!
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5491
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non conosco Php e non ti so rispondere in merito però da queste parti girano due guro dei database e quindi uppo per vedere una loro risposta smiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 9
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non so dirti come funzioni quel file php perchè non ho idea di come lavori asterisk, sicuramente non si interfaccia con dei database, quindi devi hostarlo sulla stessa macchina che ti fa girare asterisk.
e non puoi lanciarlo con il comando "php file.php" ma devi installare un demone (tipo Apache)... cerca LAMPP su Google, dovrebbe fare al caso tuo
Logged

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2290
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
io ho fatto una cosa del genere ma più semplice. sulla falsa riga del contenuto del mio EDIT

Innanzitutto, questo script php non fa eseguire un bel niente ad Arduino, ma viene lanciato da Arduino.
Sostanzialmente ti basta utilizzare lo sketch di esempio WebClient, e far puntare Arduino all'ip del server in cui è installato tale script php, ed eseguirlo (
Code:
client.println("GET /arduino_call.php HTTP/1.0");
).

In ogni caso, il file php va messo nel server Asterisk e questo si capisce da :
Code:
// chmod, chown and chgrp the file to asterisk:asterisk
asterisk è proprio lo user utilizzato per eseguire asterisk.

Nel link che hai passato, viene utilizzato FreePBX, il quale ha già interfaccia web php, pertanto non ci son da installare pacchetti aggiuntivi.
Qui dentro:
/var/spool/asterisk/outgoing
ci vanno le chiamate in uscita (i call file qui presenti vengono processati da Asterisk), pertanto lo script php non fa altro che:

verificare che l'ip che si connette sia quello di Arduino:
Code:
($remote_ip == $arduino_ip)

creare un file in cui viene definita una chiamata:
Code:
       $arduinocallfile = "/$asterisk_tmp/arduino_call.txt";
        $arduinocall = fopen($arduinocallfile, 'w') or die("can't open file");
        $arduinocall_data = "Channel: SIP/$asterisk_toext\nContext: $asterisk_context\nExtension: s\nCallerID: $asterisk_cid";

sistemarne gli attributi di ownership, rinominarlo e posizionarlo in tale cartella.
Code:
      // chmod, chown and chgrp the file to asterisk:asterisk
        chmod ("/$asterisk_tmp/arduino_call.txt", 0666);
        chown ("/$asterisk_tmp/arduino_call.txt", "asterisk");
        chgrp ("/$asterisk_tmp/arduino_call.txt", "asterisk");
       // move the file to /var/spool/asterisk/outgoing
        rename("/$asterisk_tmp/arduino_call.txt", "/$asterisk_outgoing/arduino_call.call");

Questo file definisce una chiamata all'interno $asterisk_toext (703) utilizzando il context $asterisk_context (arduino_call) mostrando come Caller ID $asterisk_cid ('Arduino' <000>)

Il context definito:
Code:
[arduino_call]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Flite("Hello! This is your arduino!")
exten => s,n,Hangup

non fa altro che definire una sequenza di comandi da eseguire;
alla risposta, attendere 1 secondo, quindi recitare (Flite è festival-lite, un text to speech)
"Hello! This is your arduino!"
per poi riagganciare (Hangup)

doo questa spiegazione cmq approsimativa, torno alle tue domande:

Quote
1) Come configuro asterisk?
smiley-eek questa non è una domanda che si risolve brevemente, Asterisk non è proprio un giocattolino.
Ti consiglio innanzitutto di installarti una FreePBX o una Trixbox CE - che hanno un'interfaccia web e pertanto facilitano la configurazione - e di iniziare a fare un poca di esperienza.

Quote
2) e arduino?
per il codice per il php di cui sopra, ti ho spiegato all'inizio cosa dovresti utilizzare.

Ah, naturalmente anche conoscere php aiuta.

EDIT
Mi son riguardato bene il link che hai girato; nel file da scaricare il file php non è quello da te postato, ma questo:

Code:
#!/usr/bin/php -q

<?php
// Arduino Control
// Original Author: Kate Hartman - http://itp.nyu.edu/~kh928/phonesandobjects.html
// Modified By: Dan Wagoner - www.nerdybynature.com
// Date: 03/11/09
// An AGI script written to connect to your Arduino and send control messages.
// This script could easily be modified to recieve information from an Arduino
// as well.

require("phpagi.php");
$agi = new AGI();

// Change the values below to reflect your setup
$arduino_ip "tcp://192.168.15.15";
$arduino_port 23;
$ttsengine 0//enter 0 for flite, 1 for cepstral
$enter_prompt "please enter L E D value. enter zero for off, 1 for on, and 2 for blink.";
$sending_prompt "sending information to the ar dwee no";
$error_prompt "error, please try again.";

//open a socket to the Arduino's IP address and port
$fp fsockopen($arduino_ip$arduino_port$errno$errstr);

if (!
$fp) {
   
speak($error_prompt);
   exit();
}

$continue true;
while(
$continue){
   
speak($enter_prompt);
   
$return $agi->get_data('beep'100001);
   if ((
$return['result'] >= 0) and ($return['result'] <= 2)){
      
speak($sending_prompt);
      
$ascii chr($return['result']); //convert that # to ASCII
      
fwrite($fp$ascii); //send that through the socket to the Arduino
   
}
   else{
      
speak($error_prompt);
}
}
fclose($fp);

// Speak function
function speak($text){
global 
$agi;
    if (
$ttsengine == 0){
                
$agi->text2wav($text);
        }else {
                
$agi->swift($text);
        }
}

?>

mi è venuto male alle dita a sviscerare il primo script, per questo faccio un riassunto  smiley-lol
Sostanzialmente quest è uno script AGI (Asterisk Gatewy Interface), che permette di generare un IVR (i fantomagici risponditori automatici con menu infiniti  smiley-razz).

A chiamata (semplificazione), risponde e:
- apre un socket con Arduino
Code:
$fp = fsockopen($arduino_ip, $arduino_port, $errno, $errstr)
- legge il testo $enter_prompt,
- invia ad arduino il valore ottenuto dal tasto premuto dall'utente:
Code:
fwrite($fp, $ascii); //send that through the socket to the Arduino

Lato Arduino ci dovrà essere uno sketch sulla falsa riga dell'esempio WebServer, che ascolterà sulla porta 23 dell'indirizzo 192.168.15.15 (in questo caso, naturalmente).
Se leggiamo il codice Arduino, si capisce meglio:

Code:
/*
 * Asterisk Controlling Arduino Example
 *
 * A basic example displaying the ability of Asterisk
 * open-source PBX to control an LED on an Arduino with
 * an ethernet shield.
 *
 * Dan Wagoner
 * http://www.nerdybynature.com
 */

#include <Ethernet.h>

int LEDpin = 4;      //LED set to pin 4
int x;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //must give WIZnet a MAC
byte ip[] = { 192, 168, 15, 15 };      //must configure WIZnet IP
Server server = Server(23);      //TCP port the server is listening on
           //I'm using telnet, but you could use any
void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);      //for troubleshooting purposes (not needed)
  pinMode(LEDpin, OUTPUT);
}

void loop () {
Client client = server.available();     //client connects to server

if (client){     //if connection present
  x = client.read();     //read information coming from server
  Serial.println(x);}     //print to serial (troublshooting only)
  
if (x == 0){     //if information sent is a zero
  digitalWrite(LEDpin, LOW);}     //turn of LED
else if (x == 1){           //if information sent is a one
  digitalWrite(LEDpin, HIGH);}     //turn on LED
else if (x == 2){           //if information sent is a two
  digitalWrite(LEDpin, HIGH);     //blink the LED
  delay(500);
  digitalWrite(LEDpin, LOW);
  delay(500);}
}


EDIT 2
roxdragon_linux, ora mi torna in mente dove ho visto questo nick.
Insomma, da vocesuip sei arrivato qui?  smiley-lol

Per la cronaca, posto il link della discussione originale lato Forum Asterisk  smiley-razz
http://www.vocesuip.com/viewtopic.php?f=3&t=13193
« Last Edit: September 30, 2011, 06:08:49 pm by pitusso » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, pitusso si si... ci siamo sentiti anche su gmail...

Ottima spiegazione! complimenti e grazie ancora..

ho un po di dimestichezza con asterisk... diciamo che ho configurato anche un ATA SPA3102 e i vari trunk ed extensions

Vorrei sapere se per arduino dovrei fare un trunk...
[xxx];arduino
user = xxx
pass = zzz
etc...etc...

Ho gia un webserver! quindi posso hostarla li la pagina se serve...

Non ho capito come funziona
http://www.domotichome.net/

Ho android, ho installato il programmino ma non so come si usa... configuro l ip di arduino e poi?

P.S Domanda stupida: posso mettere ip statico ad arduino?? c'è qualche impostazione?
« Last Edit: September 30, 2011, 07:43:27 pm by roxdragon_linux » Logged

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2290
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,

Quote
Vorrei sapere se per arduino dovrei fare un trunk...

non serve fare un trunk ad hoc, è sufficiente un'extension.

Quote
Ho gia un webserver! quindi posso hostarla li la pagina se serve...

quale pagina? Lo script chiamato da Arduino nel primo script, va messo nel server Asterisk in quanto genera un file che viene fisicamente posizionato in una coda.
Se tale script lo metti su un altro server, devi poi pensare al modo di trasferire tale file sul server * (rsync, scp, etc).
Il secondo, invece, va messo proprio sul server Asterisk.

Quote
Non ho capito come funziona
http://www.domotichome.net/

Ho android, ho installato il programmino ma non so come si usa... configuro l ip di arduino e poi?

qui sei OT, il thread si chiama "Apriporta con Arduino e Asterisk!", e domotichome non utilizza Asterisk.
Ti conviene aprire un altro topic.

Cmq nel sito linkato, c'è una spiegazione del funzionamento (ci son pure dei video).
Se poi vuoi qualche info in più, qui:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1281726774
il thread alla base di tutto.

Quote
P.S Domanda stupida: posso mettere ip statico ad arduino?? c'è qualche impostazione?

se intendi ad Arduino in quanto Arduino + Ethernet Shield in una rete locale, la risposta è naturalmente sì.
Se intendi invece Arduino + Ethernet Shield in rete non locale, allora devi necessariamente configurare un port-forwarding sul tuo router/fw, ed utilizzare eventualmente un servizio tipo dyndns perchè sia raggiungibile univocamente.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 157
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie pitusso!
quindi acquisto arduino... la prima cosa che dovrò fare qual'è???
 con tutti questi passaggi mi confondo..
Grazie
Logged

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2290
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
come già discusso privatamente, ti servono:
1 x Arduino UNO
(oppure se vuoi risparmiare qualche eur: Arduino 2009)

1 x Ethernet Shield
che ti serve per mettere in rete Arduino
Per Arduino e Ethernet Shield, puoi trovare una lsita dei rivenditori ufficiali qui: http://arduino.cc/en/Main/Buy (io solitamente acquisto da www.watterott.com)

1 x scheda relais
che ti permette fisicamente di pilotare carichi o simulare il contatto chiuso di un interruttore
Se vuoi, puoi realizzare anche in autonomia una scheda relays, ma mi sembra di capire che è meglio se ti butti su qualcosa di già pronto.
Ultimamente mi è capitato di acquistare su ebay da un venditore che ha cosine interessanti, tra cui relais board:
http://shop.ebay.it/davelgl/m.html?_nkw=relay&_sacat=0&_odkw=&_osacat=0&_trksid=p3911.c0.m270.l1313

+ cavetteria e alimentatore, eventualmente breadboard (per aiutarti nella prototipazione) con cavetti idonei, eventuale cavo di rete

Lato sw devi scaricarti l'IDEE di Arduino da qui:
http://arduino.cc/en/Main/Software
dove puoi trovare anche eventuali guide per l'installazione.

Per fare i primi passi con Arduino, ti consiglio di guardarti gli esempi presenti nell'IDE , e qui:
http://arduino.cc/en/Tutorial/HomePage
Logged

Milan, Italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 332
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
l'esempio che hai postato invia una chiamata tramite arduino, cambiando lo stato di un ingresso fa partire la chiamata.
Penso che quello che vuoi fare tu sia l'esatto contrario, associare un evento ad un numero telefonico quando viene chiamato.
Per esempio chiamo l'interno 123 e viene aperta la porta.
Penso che Asterisk lo possa fare con il comando System()
exten => 200,2,System(/qui_ci_metti_il_comando)

se su arduino ci metti un webserver in ascolto puoi usare un comando tipo
exten => 200,2,System(/usr/bin/curl http://arduinoip/apriporta)

quando ricevi la richiesta per l'url apriporta attivi per mezzo secondo il pin collegato alla serratura.

Alberto
Logged


0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2290
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
l'esempio che hai postato invia una chiamata tramite arduino, cambiando lo stato di un ingresso fa partire la chiamata.
infatti il codice che che ha postato fa esattamente questo.

Quote
Penso che quello che vuoi fare tu sia l'esatto contrario, associare un evento ad un numero telefonico quando viene chiamato
Nell' EDIT della mia prima risposta ho postato codice dello stesso autore che serve appunto a fare ciò, con in più una parte IVR (con AGI).
Logged

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Look link.
http://www.nerdybynature.com/index.php/2009/03/using-asterisk-to-controll-your-arduino/
Logged

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2290
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-grin
thank you flico, that was exactly the resource we're talking about.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
l'esempio che hai postato invia una chiamata tramite arduino, cambiando lo stato di un ingresso fa partire la chiamata.
Penso che quello che vuoi fare tu sia l'esatto contrario, associare un evento ad un numero telefonico quando viene chiamato.
Per esempio chiamo l'interno 123 e viene aperta la porta.
Penso che Asterisk lo possa fare con il comando System()
exten => 200,2,System(/qui_ci_metti_il_comando)

se su arduino ci metti un webserver in ascolto puoi usare un comando tipo
exten => 200,2,System(/usr/bin/curl http://arduinoip/apriporta)

quando ricevi la richiesta per l'url apriporta attivi per mezzo secondo il pin collegato alla serratura.

Alberto


quindi fatemi capire... arduino ha un webserver?
non ho ben capito...

la parte di asterisk ok... con una chiamata system "contatto" arduino.. e poi? come faccio la pagina apriporta su arduino??

@pitusso ho acquistato tutto come già sai!

Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

arduino può essere programmato per comportarsi come web server. negli skect di esempio cerca, sotto ethernet, "WebServer"
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2290
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao
Nella mia prima risposta, nel mio EDIT, c'è tutta la parte di codice Arduino e php necessaria per rispondere alla tua esigenza.
Perlomento, uno dei modi.

Puoi però fai una chiamata diretta ad Arduino, la parte php non ti serve, e lo sketch sostanzialmente cambia.

La chiamata diretta ad Arduino la puoi fare secca, ovvero chiamata senza nessun parametro: in questo modo puoi gestire solo 1 evento.
Per chiamata diretta intendo:
http://arduinoip/

Se invece la chiamata la effettui usando una GET o url  specifica, allora potrai gestire quanti eventi vuoi.
Per esempio:
http://arduinoip/?L1
http://arduinoip/?L2
http://arduinoip/?L3
lato arduino sarà possibile distinguere questi 3 casi, e gestire conseguentemente 3 eventi diversi.
Per esempio la prima url farà aprire il cancello, la seconda accendere la luce, la terza la farà spegnere, etc etc

Una buona lettura propedeutica è questa, guarda (e prova) soprattutto l'esempio di KrashNet
http://arduino.cc/forum/index.php/topic,50723.0.html

Un altro approfondimento lo trovi qui:
http://www.scienceprog.com/getting-hands-on-arduino-ethernet-shield/

o facendo una ricerca sul forum stesso.

Il passo successivo sarà, invece di pilotare led, pilotare un relè per arrivare al tuo scopo.

Quel che posso caldamente consigliarti, ora che Arduino e l'Eth Shield ti sono arrivati, è di giocare con Arduino (qui http://arduino.cc/en/Tutorial/HomePage trovi molti esempi base), e quindi con il suo webserver (http://arduino.cc/en/Tutorial/WebServer).
Vedrai che poi, rileggendo il codice postato nei post precedenti e in quelli linkati, ti sarà tutto molto più chiaro.
Logged

Pages: [1] 2   Go Up
Jump to: