2013-10-21 8 views
11

Ho un'applicazione desktop Windows, creata dal mio gestore di rete mobile, che fa tutto con SIP: chiamata, invio messaggio, ecc. Schermata di come questa app invia correttamente MESSAGE (le ultime 4 righe): WiresharkCome inviare un messaggio immediato tramite SIP

MESSAGE richiesta, da un'applicazione desktop, viene inviato come (4 ° linea da dietro):

MESSAGE sip:[email protected] SIP/2.0 
Via: SIP/2.0/UDP LOCALIP:2112;branch=z9hG4bK-d8754z-905183245f478c76-1---d8754z-;rport 
Max-Forwards: 70 
To: "TO"<sip:[email protected]> 
From: "FROM"<sip:[email protected]>;tag=63088d09 
Call-ID: NGVhMDJhYzQwNmExOTQyNThmNjc5OGNmOTViNDUyYWM. 
CSeq: 2 MESSAGE 
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO 
Content-Type: text/plain 
Content-Length: 4 

test 

e la risposta di successo per quello è:

SIP/2.0 407 Proxy Authentication Required 
Via: SIP/2.0/UDP LOCALIP:2112;received=EXTERNALIP;branch=z9hG4bK-d8754z-905183245f478c76-1---d8754z-;rport=2112 
To: "TO"<sip:[email protected]>;tag=c005f0e30133ec730add76fc91f4bea 
From: "FROM"<sip:[email protected]>;tag=63088d09 
Call-ID: NGVhMDJhYzQwNmExOTQyNThmNjc5OGNmOTViNDUyYWM. 
CSeq: 2 MESSAGE 
Content-Length: 0 
Proxy-Authenticate: Digest nonce="3F178051B97E1F5200A3C53D4B",realm="DOMAIN",algorithm=MD5,qop="auth" 

Allora provo a trasmettere identici (e n-varianti) richiesta da PHP, ma ho sempre ricevere SIP/2.0 403 Forbidden invece di SIP/2.0 407 Proxy Authentication Required:

SIP/2.0 403 Forbidden 
Via: SIP/2.0/UDP LOCALIP;received=EXTERNALIP 
To: "TO"<sip:[email protected]>;tag=aprqngfrt-f7ccjj0000020 
From: "FROM"<sip:[email protected]>;tag=8f7be81d 
Call-ID: [email protected] 
CSeq: 1 MESSAGE 
Reason: Q.850;cause=55;text="Call Terminated" 
Content-Length: 0 

La parte divertente è, che se io mando REGISTER richiesta funziona, e ricevo correttamente l'intestazione SIP/2.0 401 Unauthorized con WWW-Authenticate. Ricalco l'autorizzazione e la invio di nuovo. Quindi ricevo SIP/2.0 200 OK. Qual è il modo in cui dovrebbe funzionare con MESSAGE.

Cosa potrebbe essere sbagliato? Cosa mi sono perso? La richiesta MESSAGE necessita di qualche altra richiesta prima (ho già provato prima REGISTER)?
Ho letto RFC 3428 su e giù, ho provato tutti gli esempi possibili, ma senza successo.

+0

Non sono un esperto di 'SIP' e sembra che tu sappia cosa stai facendo. Tutto quello che posso dire è che se credi che stai facendo esattamente come l'altro software (che funziona) senza alcun blocco, direi andare per le cose che potresti fare in modo diverso. Forse la mancata corrispondenza dei caratteri di controllo potrebbe essere un buon inizio, come '\ n' vs' \ n \ r'. – Mehran

+0

@Mehran: Non penso che i diversi tipi di "nuove linee" possano fare alcuna differenza, poiché il metodo "REGISTER" funziona. Se, ad esempio, rimuovo l'intestazione 'CSeq' dalla richiesta, il server SIP restituisce' SIP/2.0 400 Missing CSeq Header' ... Ciò mi dice che la comunicazione è OK. Penso che il metodo 'MESSAGE' sia inviato correttamente, deve essere qualcos'altro ( –

risposta

5

Se si esamina la risposta ricevuta 403, si noterà un'intestazione Reason. La stringa Q.850 all'inizio indica che questo sarebbe un codice di causa definito da ITU-T Recomendation. In particolare, il codice di causa 55 è correlato a ISDN e significa letteralmente "Chiamate in entrata bloccate all'interno di un gruppo di utenti chiusi" (è possibile verificarlo in RFC 3398) e, in genere, significa che, all'interno di un gruppo di membri, la ricezione di chiamata è limitato.

D'altra parte, la causa 55 denota anche un problema all'interno della richiesta, specialmente in relazione a un utente (mittente o destinatario).Diagramma seguente mostra un normale scambio di messaggi tra utenti SIP:

 A    Server    B 
     | REGISTER |    | 
     |--------------->|    | 
     |  200 OK  |    | 
     |<---------------|    | 
     |    | REGISTER | 
     |    |<--------------|   
     |    |  200 OK | 
     |    |-------------->| 
     | MESSAGE  |    | 
     |--------------->| MESSAGE | 
     |    |-------------->| 
     |    |  200 OK | 
     |    |<--------------| 
     |  200 OK  |    | 
     |<---------------|    | 

realtà, stato rigoroso, REGISTER dall'utente A non è necessaria, ma la maggior parte dei sistemi (come IMS) utilizza come un meccanismo di autenticazione. Poi, nel REGISTRO richiesta, intestazioni speciali sono:

Contact: <sip:[email protected]_IP:LOCAL_PORT> 
Expires: REGISTRATION_DURATION 

Tenete a mente che, 200 risposte OK a un registro, possono contenere un Expires: intestazione o un parametro expires all'interno Contact: intestazione che indica accettati tempo di scadenza. Ad esempio:

SIP/2.0 200 OK 
... 
Contact: <sip:[email protected]_IP:LOCAL_PORT>; expires=60 
... 

In questa situazione, è necessario registrare nuovamente prima di questa scadenza (60 secondi nell'esempio).

Tenendo presente che si sta tentando di inviare un SMS a un telefono cellulare, il punto di ricezione è gestito direttamente dal provider di rete MGCF, quindi questo lascia la registrazione del mittente o la richiesta MESSAGGIO.

Chi vostra proposta messaggio originale, URI della richiesta (prima riga del messaggio), dovrebbe essere:

MESSAGE sip:[email protected] SIP/2.0 

perché si riferisce a un'entità la ricezione dei messaggi.

Spero che questo aiuti.

+0

@ Glavić Puoi ottenere alcune informazioni sulla relazione tra i codici Q.850 e SIP in [RFC 3398] (https: // www.ietf.org/rfc/rfc3398.txt). Per quanto riguarda l'URI di richiesta MESSAGE, non dovresti fornire informazioni sul tuo utente (né my_phone_num o username) ma su _destination_, questo è il valore 'TO'. La maggior parte dei server proxy controlla solo questo richiesta URI per l'inoltro dei messaggi e, in realtà, corrisponderebbe al tuo problema, stai cercando di inviare un MESSAGGIO a te stesso. – jcm

+0

@ Glavić Se stai cercando di inviare un SMS, hai provato il formato Tel URI: tel: + invece di sorso: TO @ DOMAIN? – jcm

+0

@ Glavić Causa codice 55, inizialmente, significa una sorta di restrizione su questo utente nel gruppo di lavoro fornito (unità di gestione), ma può anche riferire una incompatibilità utente della richiesta <-->. Dai tuoi messaggi precedenti presumo che tu abbia già registrato gli utenti chiamanti e chiamanti prima di inviare il MESSAGGIO, sbaglio? – jcm

2

Come ho detto nei commenti, non sono un esperto SIP ma un mio amico lo è. Gli ho chiesto del tuo caso e questo è quello che mi ha detto:

Il protocollo SIP è un protocollo di dialogo che significa che ogni comunicazione è un dialogo con un ID di dialogo univoco (qualcosa come l'ID di sessione in HTTP). La differenza tra SIP e HTTP è che l'ID di sessione viene utilizzato tra diverse connessioni TPC/IP (richieste HTTP) mentre l'ID di dialogo viene utilizzato all'interno della stessa connessione TPC/IP ma tra diversi messaggi.

Mi sembra che quello che stai cercando di fare qui sia un po 'come il dirottamento di sessione in HTTP. Mentre è possibile dirottare un ID di sessione in HTTP e inviarlo da un altro client, lo stesso non è per SIP. Secondo il mio amico i server SIP hanno una memoria interna di cui ID di dialogo appartiene a quale connessione e non è possibile inserire i messaggi nel dialogo di qualcun altro solo conoscendo il loro ID di dialogo.

La tua domanda non dice se questo è ciò che effettivamente stai cercando di fare, ma nel caso lo sia, allora devo dire che non puoi. Il fatto che è possibile inviare il comando REGISTER indica che la comunicazione con il server SIP è stata effettuata. Tutto quello che devi fare è avviare il tuo dialogo e portarlo da lì.

+0

Se stai cercando di implementare uno stack SIP in PHP perché non stai usando le librerie disponibili? Eccone uno: https://code.google.com/p/php-sip /. Sono sicuro che puoi trovare molti di questi progetti su Internet – Mehran

+0

Purtroppo no, ma se hai già testato diverse librerie che comunicano con un server SIP senza successo, allora devo dire che hai bisogno di per assicurarmi che il tuo server non stia agendo in modo strano, voglio dire che non tutte le librerie disponibili potrebbero essere malfunzionanti! – Mehran