|
|
|
|
Strumenti |
31-10-2010, 01:09 | #1 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
[SIP] impostazione messaggio REGISTER
Ciao a tutti, sto cercando di fare un client Sip in modo da inviare delle chiamate. per adesso sono ancora all'inizio e ho creato un pezzo di codice java dove tramite socket spedisco il messaggio di registrazione presso un server Voip ( in questo caso asterisk).
Il tutto è così organizzato: ---pc portatile dove c'è il codice java tramite il quale invio la richiesta di REGISTER ---pc fisso dove è installato asterisk (su winXp) che serve per ricevere la richiesta di registrazione. ovviamente entrambi i pc sono nella stessa sottorete. Inoltre posto qua sotto come ho impostato la richiesta di REGISTER: Codice:
"REGISTER sip:192.168.1.107 SIP/2.0\r\n" + "CSeq: 10 REGISTER\r\n" + "Via: SIP/2.0/UDP 192.168.1.102:5060;branch=z9hG4bKcdb10d3435e84f30b9db93d3c586600a;rport\r\n" + "User-Agent: Ekiga/3.2.6\r\n"+ "From: <sip:test@192.168.1.107>;tag=50e55856-7fe2-df11-84da-00166f29b76e\r\n" + "Call-ID: 2537450899@"+name_host+"\r\n"+ //"auth=test:test@192.168.1.102\r\n"+ "To: <sip:test@192.168.1.107>\r\n" + "Contact: <sip:test@192.168.1.102>;q=1\r\n"+ "Allow: INVITE,ACK,CANCEL,BYE,OPTIONS,INFO\r\n"+ "Expires: 3600\r\n"+ "Content-Length: 0\r\n"+ "Max-Forwards: 70\r\n"+ "\r\n"; Codice:
[test] type=friend username=test secret=test host=dynamic ho inoltre usando ekiga sul pc portatile in modo da effettuare la registrazione tramite ekiga sempre su asterisk riesco ad ottenere la registrazione, quindi ciò significa che asterisk è settato in modo corretto penso! Inoltre ho sniffato i pacchetti tramite wireshark in modo da vedere come era impostata la REGISTER inviata da ekiga e ricopiarla nel mio codice java....ma questo a quanto pare non è servito a molto in quanto non mi viene ancora autorizzata la registrazione! qualcuno ha qualche idea o sa suggerirmi qualcosa?? grazie ragazzi |
31-10-2010, 09:30 | #2 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
Ciao,
quando sei in console asterisk (asterisk -r) puoi lanciare: sip debug ip IP_MACCHINA_CLIENT in questo modo puoi tracciare lo scambio dei pacchetti direttamente sulla console che secondo me è piu comodo. Nelle prime prove puoi rimuovere "secret" dalla conf dell'utente cosi rendi le cose piu semplici (sip reload per ricaricare la nuova configurazione). Facendo questo riesci a postare prima lo scambio dei pacchetti completo tra ekiga e asterisk e poi quello tra il tuo client ed asterisk? |
31-10-2010, 12:11 | #3 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
ciao grazie mille per la risposta...ho dato i comandi che dicevi tu su asterisk e inoltre ho dato anche "set verbose 10" e "set debug 10" in modo da vedere meglio ciò che non andava. Inoltre ho provato a togliere la password al file di configurazione di asterisk e ho notato che la registrazione va a buon fine!!
Ho notato però che quando eseguo il client java da linux ubuntu, con wireshark ricevo solo i 3 pacchetti SIP, mentre quando avvio il client sip java su windows ricevo anche altri 2 pacchetti ICMP ( destination unreachable ) e inoltre non capisco perchè ma il mio client java non riceve più niente nonostante i pacchetti girano nella rete! comunque ti mando i file in allegato zip. ciao e grazie ancora |
31-10-2010, 18:37 | #4 | ||
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
trovato il problema.
controlla bene il trace sip di ekiga: 1)ekiga manda la richiesta di registrazione 2)asterisk risponde 100 (sto verificando) 3)asterisk risponde 401 che indica uno stato di non autorizzato in quanto nel punto 1 la richiesta di registrazione non conteneva i dati di autentificazione 4)a questo punto ekiga rimanda la stessa registrazione del punto 1 ma con un header leggermente differente, infatti puoi notare il seguente campo: Authorization: Digest username="test", realm="asterisk", nonce="41ab5f99", uri="sip:192.168.1.107", algorithm=MD5, response="6a0abae62541274e3476ddacc5d9efdb" il trace sip del tuo client è quasi identico fino al punto 3 ma quando asterisk ti nega la registrazione è perchè nel tuo register non c'era l'authorization ma un campo non riconosciuto: auth:test:test@192.168.1.107 Expert Info (Note/Undecoded): Unrecognised SIP header (auth) A livello di client dovresti gestire l'eccezione di una risposta 401 in modo da rimandare la richiesta di registrazione fornendo il pacchetto con l'header corretto. ps: da rfc3261: Quote:
Quote:
Ultima modifica di dawid999 : 31-10-2010 alle 19:30. |
||
31-10-2010, 21:07 | #5 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
Grazie della risposta....lo stavo notando anche io questo particolare, però mi è stato detto che teoricamente dovrebbe accettare la registrazione anche senza autenticazione cifrata(MD5), infatti a questo punto mi conviene non mettere la password così non ho questo problema; altrimenti devo gestire il primo pacchetto 401 (non autorizzato), e a quanto ho capito devo ricostruire una Register però con un campo nuovo: Authorization composto dallo stesso valore di nonce che c'è nel pacchetto precedente con risposta 401; inoltre c'è anche un altro parametro "response" composto da una sequenza che sembra una stringa MD5 che però non so come ottenere!
Stavo però provando almeno a riuscire a prendere il valore di nonce del pacchetto 401 e stavo pensando in java come potrei fare a leggere da una stringa, tipo una specie di "sscanf() di C! provo comunque a postare nel forum d java questo problema. Grazie ancora dell'interessamento e delle risposte |
31-10-2010, 22:20 | #6 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
la response viene costruita nel seguente modo (prendo come esempio l'authorization del tuo dump citato sopra):
Codice:
1) md5sum di utente:realm:password 2) md5sum di tipo_di_richiesta:uri 3 md5sum di primo_md5sum:nonce:secondo_md5sum se vuoi provare con la shell linux puoi fare cosi: Codice:
echo -n test:asterisk:test|md5sum 412325717cf44c1b4a628b2742d096a9 - echo -n REGISTER:sip:192.168.1.107|md5sum 6d949cc6a4174c6fe87c21634c98eb0a - echo -n 412325717cf44c1b4a628b2742d096a9:41ab5f99:6d949cc6a4174c6fe87c21634c98eb0a|md5sum 6a0abae62541274e3476ddacc5d9efdb - quando generi hash in questo modo non scordarti il parametro -n al comando echo che evita la newline altrimenti sarà tutto sballato. ps: relativamente alla copia del valore di nonce non saprei darti una risposta (non so nulla di java )ma non dovrebbe essere particolarmente impegnativo,con un opportuna espressione regolare dovresti poterla matchare Ultima modifica di dawid999 : 31-10-2010 alle 22:29. |
01-11-2010, 01:35 | #7 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
wow....grazie mille per questa informazione...per quanto riguarda il problema di java sono riuscito a risalire al nonce anche se in maniera abbastanza grezza e ho impostato la nuova REGISTER però ovviamente senza il campo response perchè non sapevo come ottenerlo, infatti la risposta da parte di asterisk è:
Codice:
SIP/2.0 403 Forbidden (Bad auth) From: <sip:test@192.168.1.107> To: <sip:test@192.168.1.107>;tag=as1a02a93a Call-ID: 2537450899 CSeq: 2 REGISTER User-Agent: Asterisk PBX Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY Content-Length: 0 proverò a predere il valore realm e a generare il response e vediamo come andrà! ti ringrazio molto per questa risposta...domani proverò il tutto se avrò tempo e ti faccio sapere... grazie ancora |
01-11-2010, 22:54 | #8 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
ciao, ho provato a inserire nella seconda register anche il parametro response calcolato come mi hai suggerito, ma purtroppo ancora non riesco ad ottenere l'autorizzazione!! eppure la richiesta mi sembra quasi identica a quella inviata da ekiga, apparte il parametro Via che non metto perchè altrimenti asterisk mi scarta tutti i pacchetti e non risponde niente bloccando il client!
Inoltre noto che nella prima register di ekiga, non viene inviato il parametro "auth"; se io però non effettuo l'invio di questo parametro, asterisk non mi ritorna il nonce, quindi non posso comporre il campo Authorization!! Comunque per vedere meglio la sessione allego sotto i pacchetti della mia ultima register. ciao e grazie ancora |
02-11-2010, 11:50 | #9 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
ciao,
credo che il problema sia la response generata dal tuo client, facendo la procedura manualmente ottengo un hash differente: Codice:
echo -n test:asterisk:test|md5sum 412325717cf44c1b4a628b2742d096a9 echo -n REGISTER:sip:192.168.1.107|md5sum 6d949cc6a4174c6fe87c21634c98eb0a echo -n 412325717cf44c1b4a628b2742d096a9:78b5eab5:6d949cc6a4174c6fe87c21634c98eb0a|md5sum 16c39bdf606e0b0586252ef7b4166f4a |
02-11-2010, 12:31 | #10 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
ohhhhhhh yeahhhhhh....sisi avevo notato anche io poco fa....avevo scordato di inserire il nonce tra le due stringhe ottenute con md5 infatti veniva diverso...
perfetto adesso funziona e mi da l'OK! grazie mille del supporto.... |
02-11-2010, 14:07 | #11 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
di nulla
se non sono troppo curioso è qualche progetto per il lavoro o solo un proof of concept per soddisfare la propria curiosità? |
02-11-2010, 14:56 | #12 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
si in realtà è per un progetto per il tirocinio, però avendo appena iniziato, ancora non capivo bene come funzionava...però piano piano ci sto arrivando...
tu ti occupi di queste cose per lavoro o le hai imparate per curiosità personale?? grazie ancora dell'aiuto! |
02-11-2010, 15:00 | #13 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
per lavoro, ormai sono piu di 3 anni che guardo passare questi pacchetti, da lunedi a venerdi
|
04-11-2010, 14:50 | #14 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
Ciao visto che vedi questi pacchetti tutti i giorni...dai un'occhiata a come ho impostato la INVITE:
Codice:
"INVITE sip:"+number_dest+"@"+addr_dest+"\r\n"+ "Via: Sip/2.0/UDP "+addr_src+":5060;branch=z9hG4bKF58\r\n" + "From: <sip:"+number_src+"@"+addr_dest+">\r\n" + "To: <sip:"+number_dest+"@"+addr_dest+"\r\n"+ //"Date: Mon, 16 Apr 2007 16:29:23 GMT\r\n"+ "Call-ID: 7813A33A-EB6E11DB-A8D6A80C-51810900@"+addr_src+"\r\n"+ "CSeq: 101 INVITE\r\n"+ //"Supported: 100rel,timer\r\n"+ //"Min-SE: 1800\r\n"+ //"Cisco-Guid: 2014312576-3949859291-2286288913-550194080\r\n"+ "User-Agent: My_pc\r\n"+ "Expires: 180\r\n"+ "Content-Type: application/sdp\r\n"+ "Content-Length: 247\r\n"+ "Contact: <sip:"+number_dest+"@"+addr_src+":5060>\r\n"+ "Max-Forwards: 70\r\n"+ "Allow: INVITE, OPTIONS, BYE, CANCEL, ACK, PRACK, COMET, REFER, SUBSCRIBE, NOTIFY, INFO, UPDATE, REGISTER\r\n"+ "Transport = udp\r\n"+ //"Remote-Party-ID: <sip:"+number_dest+"@"+addr_src+">;party=calling;screen=no;privacy=off\r\n"+ //"Allow-Events: telephone-event\r\n"+ "v = 0\r\n"+ "o = SIPPS 105015165 105015162 IN IP4 "+addr_src+"\r\n"+ "s = SIPcall\r\n"+ "c = IN IP4 "+addr_src+"\r\n"+ "t = 0 0\r\n"+ "m = audio 30000 RTP/AVP 0 8\r\n"+ "a = rtpmap:0 pcmu/8000\r\n"+ "a = rtpmap:8 pcma/8000\r\n"; |
04-11-2010, 20:44 | #15 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
cosi a prima occhiata dovresti impostare la from nel seguente modo:
Codice:
sip:numerochiamante@ipcentralinosorgente:porta la contact nel seguente modo: Codice:
sip:numerochiamante@ipcentralinosorgente:porta il contact indica al chiamato in che modo può contattare il chiamante ma la comuniazione non è diretta, avviene tramite asterisk quindi l'indirizzo deve essere quello del centralino e non direttamente quello del client, ci pensa poi asterisk a girare la chiamata nel modo corretto. per il resto mi sembra ok, ti da qualche problema? ps: potresti anche semplificarlo inizialmente, questo è un invite di twinkle: Codice:
INVITE sip:200@192.168.1.228 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.228:5061;rport;branch=z9hG4bKnvjeoqua Max-Forwards: 70 To: <sip:200@192.168.1.228> From: "100" <sip:100@192.168.1.228>;tag=ycbzi Call-ID: awokaqdbckofqop@optimus CSeq: 976 INVITE Contact: <sip:100@192.168.1.228:5061> Content-Type: application/sdp Allow: INVITE,ACK,BYE,CANCEL,OPTIONS,PRACK,REFER,NOTIFY,SUBSCRIBE,INFO,MESSAGE Supported: replaces,norefersub,100rel User-Agent: Twinkle/1.4.2 Content-Length: 254 v=0 o=twinkle 873730701 530370633 IN IP4 192.168.1.228 s=- c=IN IP4 192.168.1.228 t=0 0 m=audio 8000 RTP/AVP 8 0 3 101 a=rtpmap:8 PCMA/8000 a=rtpmap:0 PCMU/8000 a=rtpmap:3 GSM/8000 a=rtpmap:101 telephone-event/8000 a=fmtp:101 0-15 a=ptime:20 Ultima modifica di dawid999 : 04-11-2010 alle 21:41. |
05-11-2010, 20:10 | #16 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
ho modificato l'INVITE come detto da te in questo modo:
Codice:
"INVITE sip:"+number_dest+"@"+addr_dest+" SIP/2.0\r\n"+ "Via: SIP/2.0/UDP "+addr_dest+":5060;rport;branch=z9hG4bKnvjeoqua\r\n"+ "Max-Forwards: 70\r\n"+ "To: <sip:"+number_dest+"@"+addr_dest+">\r\n"+ "From: "+number_dest+" <sip:"+number_dest+"@"+addr_src+">;tag=ycbzi\r\n"+ "Call-ID: "+number_dest+"@"+addr_src+"\r\n"+ "CSeq: 976 INVITE\r\n"+ "Contact: <sip:"+number_dest+"@"+addr_src+":5060>\r\n"+ "Content-Type: application/sdp\r\n"+ "Allow: INVITE,ACK,BYE,CANCEL,OPTIONS,PRACK,REFER,NOTIFY,SUBSCRIBE,INFO,MESSAGE\r\n"+ "Supported: replaces,norefersub,100rel\r\n"+ "User-Agent: My_pc\r\n"+ "Content-Length: 254\r\n"+ "\r\n"+ "2v=0\r\n"+ "o=My_pc 105015165 105015162 IN IP4 "+addr_src+"\r\n"+ "s=-\r\n"+ "c=IN IP4 "+addr_src+"\r\n"+ "t=0 0\r\n"+ "m=audio 8000 RTP/AVP 8 0 3 101\r\n"+ "a=rtpmap:8 PCMA/8000\r\n"+ "a=rtpmap:0 PCMU/8000\r\n"+ "a=rtpmap:3 GSM/8000\r\n"+ "a=rtpmap:101 telephone-event/8000\r\n"+ "a=fmtp:101 0-15\r\n"+ "a=ptime:20\r\n"+ "\r\n"; Codice:
exten => 100,1,Answer exten => 100,n,Echo exten => 100,n,Hangup con questa configurazione asterisk mi risponde che l'indirizzo è incompleto: Codice:
SIP/2.0 484 Address Incomplete Via: SIP/2.0/UDP 192.168.1.228:5061;branch=z9hG4bKnvjeoqua;received=192.168.1.102;rport=44864 From: 100 <sip:100@192.168.1.102>;tag=ycbzi To: <sip:200@192.168.1.228>;tag=as4245b09d Call-ID: 100@192.168.1.102 CSeq: 976 INVITE User-Agent: Asterisk PBX Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY Content-Length: 0 Ultima modifica di MrX87 : 05-11-2010 alle 20:12. |
05-11-2010, 23:44 | #17 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
nel sip.conf dove hai definito l'utente dovresti specificare quale contesto in extensions.conf deve utilizzare come dialplan con il parametro:
context=miocontesto quindi in extensions.conf definisci il contesto scrivendo [miocontesto] exten => 100,1,Answer exten => 100,n,Echo exten => 100,n,Hangup dopo ogni modifica al sip.conf devi rilanciare sip reload e per modifiche su extensions.conf extensions reload (o forse dialplan reload, non ricordo) o semplicemente fai ripartire asterisk Ultima modifica di dawid999 : 05-11-2010 alle 23:46. |
06-11-2010, 00:50 | #18 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
ho apportato le modifiche che dici e ancora lo stesso problema. comunque penso sia una errata configurazione di asterisk, perchè ho provato ad utilizzare ekiga per ricevere la chiamata e sniffando i pacchetti mi da il Ringing, poi ovviamente si interrompe la connessione con la Bye penso perchè non c'è scambio di informazioni e quindi viene chiuso il canale.
Un solo dobbio ho sulla INVITE, nel parametro Call-ID io l'ho impostato così: Codice:
"Call-ID: 126541651@"+addr_src+"\r\n"+ Infine tramite l'INVITE devo chiamare un numero, ovvero number_dest nel mio caso, ma da quale parametro della invite si capisce quale numero si deve chiamare?? posto comunque qua sotto la parte del Message Header della INVITE: Codice:
"INVITE sip:"+number_dest+"@"+addr_dest+":5060 SIP/2.0\r\n"+ "Via: SIP/2.0/UDP "+addr_src+":5060;rport;branch=z9hG4bKnvjeoqua\r\n"+ "Max-Forwards: 70\r\n"+ "To: <sip:"+number_dest+"@"+addr_dest+":5060>\r\n"+ "From:<sip:"+number_src+"@"+addr_src+":5060;user="+user+">;tag=ycbzi\r\n"+ "Call-ID: 126541651@"+addr_src+"\r\n"+ "CSeq: 976 INVITE\r\n"+ "Contact: <sip:"+addr_src+":5060>\r\n"+ "Content-Type: application/sdp\r\n"+ "Allow: INVITE,ACK,BYE,CANCEL,OPTIONS,PRACK,REFER,NOTIFY,SUBSCRIBE,INFO,MESSAGE\r\n"+ "Supported: replaces,norefersub,100rel\r\n"+ "User-Agent: My_pc\r\n"+ "Content-Length: 254\r\n"+ grazie ancora dei consigli!! |
10-11-2010, 22:19 | #19 |
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
sono riuscito a far funzionare anche l'INVITE....era un problema di configurazione di asterisk nel file extension.conf e nel sip.conf...adesso tocca capire un pò come funziona l'RTP per il trasferimento dati una volta avviata la chiamata!
Se c'è qualcuno che mi sa dare qualche dritta....lo ringrazio! ciao a tutti |
11-11-2010, 21:40 | #20 |
Senior Member
Iscritto dal: Nov 2006
Messaggi: 557
|
sorry per la mancata risposta ma ero un po preso, relativamente all'rtp non saprei darti suggerimenti specifici perchè non me lo sono mai studiato a fondo però la documentazione ufficiale potrebbe essere un buon punto di partenza
http://www.ietf.org/rfc/rfc3550.txt |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:16.