Înapoi în anii 90 sau trimite un mesaj la un pager prin java

În ciuda transparenței aparente a deciziilor și secundare experiența mea, am decis să descrie în detaliu acțiunile lor, deoarece informațiile de pe internet pe această temă nu este prezentat atât de mult: pe forumuri pentru a răspunde la întrebările și rareori nemetko. Pentru unii, acest text poate economisi foarte mult timp.

Înapoi în anii 90 sau trimite un mesaj la un pager prin java

Pasul 1 - INVITE

Prima etapă - formarea stația de paginare - a fost realizat prin intermediul protocolului SIP și utilizarea corespunzătoare Jain-SIP Java-bibliotecă. Cea mai bună descriere a protocolului de principiile pe care le-am găsit Habré în publicațiile „clienți SIP interacțiune. Partea 1 „și“ SIP Interacțiunea clienților. Partea 2. " și tutorial mai digerabila pe Jane - aici (dar o colecție de exemple de aici a dat mai bine).

Așa cum predpogotovki am creat o clasă:

c câmpurile necesare, care trebuie mai întâi inițializat așa cum este descris în tutorial:

În al doilea caz, trebuie să specificați gazda de la care trimiteți mesajul care inițiază comunicarea:

Un alt element interesant este, de fapt, organismul SDP-mesaje, care este o descriere a ceea ce este necesar pentru comunicarea cu succes. În cazul nostru, se pare ca acest lucru:

Pasul 2 - Autentificare

Dacă am reușit să trimitem dreptul să invite, cel mai bun caz, serverul de destinație ne va trimite mesajul de stare râvnit-OK 200, iar în cel mai rău - va rezolva o identificare chin pic. În al doilea caz, statutul de răspuns este 401 sau 407. Aici este codul prin care este trimis răspunsul. Pentru a sprijini aceasta va avea nevoie de o versiune mai recentă Jain-SIP (de exemplu, 1.2.228). Ar trebui să fie plasat în processResponse (), metoda are ca argument ResponseEvent responseEvt.

Observați patru argument pentru handleChallenge (), fără ca mesajul schimbă formatul va fi nepotrivit și autentificarea eșuează.

Clasele AccountManagerImpl și, de asemenea neohodimo UserCredentialsImpl trebuie să fie anexată de tine, le-am scris pe modelul celor care sunt prezentate aici.

După ce trimiteți datele de înregistrare, ne putem aștepta în condiții de siguranță necesare 200 OK, pe care nu trebuie să uităm să trimită un ACK. Acest tip de mesaj se face foarte simplu:

Pasul 3 - SIP INFO

Următoarea vine distractivă - trimiterea DTMF-semnale (cele apăsând modul touch-tone). La nivel global, se poate face în două protocoale diferite: folosind SIP și RTP. Desigur, la început sa decis să ia calea de rezistență minimă. Pentru fiecare caracter a fost format aici o astfel de cerere, care a trebuit apoi să fie trimise la server:

Procedura în sine este de a trimite pare un pic ciudat (cred, construit pe modelul „prin Zhmerinka la Paris“), dar în rest nu am nimic lucrat. În general, biblioteca mi se părea un pic buggy: foarte des una dintre mai multe soluții care arătau în mare parte la fel, nu a funcționat.

Ce pot să spun? După punerea în aplicare a acestei etape, sa dovedit că nu toate VoIP-Server este la fel de prietenos: a fost suficient de semnalele transmise prin intermediul SIP sigur, ca cineva care nu sunt suficiente, deoarece ele nu produc un sunet, și, prin urmare, trec neobservate. Firește, în conformitate cu legea josnicia scopul meu a fost al doilea tip de server. Prin urmare, ...

Etapa 4. Formarea RTP-pachet

În general, atunci când am dat seama că problema nu poate fi rezolvată de către un SIP-lea, am fost în speranța că cel puțin eu pot folosi o altă bibliotecă care poate nenapryazhno trimite DTMF-semnale. Dar acolo a fost. De obicei, dacă spunem «RTP prin Dzhavu“, ne referim la JMF. Dar, în primul rând, este deja un vechi și nu într-adevăr acceptată. În al doilea rând, este mai potrivit pentru transmiterea mediilor mai complexe. În al treilea rând, tutoriale pe care le-am găsit nu au fost foarte sensibil. Iată un exemplu din documentația, în mijlocul căreia se ridică un anumit rtpSession, urme de care, în primul anumit număr de minute de căutări pot găsi toate eșuat.

O altă opțiune a fost biblioteca libjitsi. reprezentând un dispozitiv întreg. Din împrumut personal prea eșuat, deși există o metodă bună sendDTMF sau ceva de genul asta. Structura de cod este de așa natură încât să se ia sau în totalitate, sau în orice fel. Acesta a fost în cele din urmă a decis în uman normal pentru a face un pachet si trimite-l prin intermediul UDP-sokket.

Deci, aici este un fragment semnificativ din clasa RtpPacket: principalele sale domenii, iar constructorul cu valorile corespunzătoare pentru transmisie DTMF. Ce toate aceste lucruri sunt scrise în mai multe locuri, așa că nu se va repeta. Constat doar că valoarea parametrului SSRC, în principiu, nu este important, dar toate trimise într-o singură sesiune de pachete, acesta trebuie să fie la fel. sarcină utilă număr format din DTMF-pachete (tip sarcină utilă) - 101 (ne-am înregistrat în cazul în care comunicarea a inițiat-SIP).

Cel mai important pas în crearea unui pachet - pentru a completa datele octet matrice. La DTMF, in mod natural formatul său: primul octet - această valoare a semnalului este transmis de fapt (0 la 16), prima jumătate a celui de al doilea octet - diferite supermarket-uri (de obicei, 0), a doua jumătate a celui de al doilea volum bayta- (valoare standard, - 10), celălalt două - această durată (implicit - 160).

Pentru fiecare semnal generat aproximativ 10 pachete (numărul poate varia):

- un prim, inițial, are marcator = 1, restul - 0;
- ultimele trei - trailing, markerul = 0, dar primul bit al doilea bloc de date octet = 1 în pachetul nedefinitive bloc de date pentru transmiterea unui semnal de 1 ar fi:

Și, în cele din urmă ca aceasta:

Marcaj temporal toate DTMF-pachetele care aparțin aceluiași semnal poate rămâne aceeași (să zicem, T). Dar următorul pachet ar trebui să fie:

Etapa 5. RTP-canal

Apoi, așa cum am crezut cu naivitate am putea doar ponadelat de bytes mei DatagramPacket'ov, împinge-le în soclu și a făcut să dispară în server. Dar acolo a fost. Ca răspuns la serverul a continuat să se rupă de comunicare în mijlocul frazei ca și în cazul în care nu a primit niciodată. Un Wireshark, în principiu, nu acceptă mesajele mele pentru RTP, afișarea de ambele UDP simplu.

Etapa 6. RTP-comunicare

De fapt, pentru a înțelege în ce direcție să meargă, a luat o lungă perioadă de timp. Am pus o mulțime de efort în el pentru a re-citit toate specificațiile disponibile și de o sută de ori pentru a verifica în mod corect bagajele. În a șaptea zi, Sharp ochi pe fata mea a observat că standardul RTP-comunicare nu începe imediat pentru a trimite DTMF-date, și că acesta este precedat de un scurt schimb de pachete de la server, care arata oarecum diferit.
format de încărcătură utilă declarată în antetul este 0, nu există date, dar este de fapt sarcină foarte util (sarcină utilă), care are 160 de octeți. Acest set de octeți este diferit pentru toate mesajele de intrare și de ieșire compuse și pare destul de accident. Oricum, nu am putut găsi informații cu privire la modul în care ar trebui să fie configurat astfel încât de fiecare dată când a marcat randomizare lui.

Odată ce am început să trimită aceste pachete de sprijin înainte de fiecare the semnal DTMF, Wireshark a admis în cele din urmă RTP-format. Părea mai bine, dar comunicarea este încă întreruptă, deși serverul acum cu bucurie, de asemenea, a început să-mi arunce „peylodnymi“ pachete.

Nici măcar nu știu ce altceva ar putea face, dar apoi mi-am amintit că RTP are un frate-Lovebird - RTCP. Problema, se pare, a fost într-adevăr în ea: serverul a-mi încerca să trimită ceva, dar a venit la mine raportează în mod constant că portul corespunzător este închis. Din moment ce nu am vrut să deranjez trimiterea mai mult și RTCP-pachet, am început cu deschiderea unui port al chakrelor:

Acest lucru a avut un impact decisiv: abonatul a primit mesajul meu „305 * 1 * 66“ pager!

concluzie

În ultimele rânduri ale cărucioarele mele, aș dori să subliniez faptul că acesta este primul meu post pe Habre, așa că nu mă judeca aspru. Nu m-am un Telematics guru sau orice altceva ia în considerare. Doar atunci când scrieți codul sursă o mulțime de timp petrecut în căutarea de informații. Ceva ce am găsit în caietul de sarcini, care de la început până la sfârșit într-o singură ședință, a fost destul de greu de stăpânit, ceva descris limbaj normal, dar într-un fel de imprimare slab bine în domeniile, ceva ce am făcut la întâmplare. Deci, la un moment dat, am decis că, dacă voi reuși, voi descrie toate acțiunile într-un singur loc și lăsați-l să fie indexat undeva pe Internet.