|
|
|
![]() |
|
Strumenti |
![]() |
#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 |
![]() |
![]() |
![]() |
#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? |
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#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. |
||
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#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 ![]() Ultima modifica di dawid999 : 31-10-2010 alle 22:29. |
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#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.... |
![]() |
![]() |
![]() |
#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à? ![]() |
![]() |
![]() |
![]() |
#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! |
![]() |
![]() |
![]() |
#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
![]() |
![]() |
![]() |
![]() |
#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"; |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#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!! |
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#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: 00:34.