scieee Open visual document viewer

Cognitive network scenario through a SIP proxy server

Somoza de la Osa, Jordi

Abstract

[ANGLÈS] Implementation of two different session establishment scenarios to the solution of adding a new Cognitive Transport Service layer, implemented with SIP and NRDL, to solve the problem of the lack of communication between applications and network.

Full text

Mas e Thesis Cogni i e Ne wo k Scena io h ough a SIP P oxy Se e Au ho Jo di Somoza de la Osa Thesis ad iso s F anco Callega i Wal e Ce oni Aldo Campi Dipa imen o di Ele onica, In o ma ica e Sis emis ica Uni e si à di Bologna, Facol à di Ingegne ia Ap il 2012 KEY WORDS SIP P oxy Nex Gene a ion Ne wo k Cogni i e T anspo Se ice laye GRATITUDE Abo e all, I'd like o hank my pa en s – Julio and Bea iz – and my b o he Vic o o always suppo ing me h ough all hese yea s. Secondly, I'd like o hank he 'Palace os' – E ik, Vic o , C ispins, Ta i, Gasu, Agu, Fa ga and Bo des - o always unde s anding and encou aging me. I'd also like o hank my iends and pa ne s – Vicenç, Vi ginia, Ch is ian, Al a o and many o he s – o all he laughs we had o- ge he . I wan ed also o hank all he people I' e me in Bologna o all he expe iences I' e had his yea . Basically I'd like o hank e e yone who has 'su e ed' my lack o ime h ough all hese yea s. And las bu no leas , I'd like o hank my supe iso s – F anco Cal- lega i, Wal e Ce oni and Aldo Campi – o all he dedica ion and help hey' e p o ided me du ing he p epa a ion o his p ojec . CONTENTS 1. In oduc ion...........................................................................................................................3 2. The s eps o he new cogni i e ne wo k in as uc u e.........................................................5 2.1 Why SIP and NRDL?..............................................................................................6 2.2 Al e na i es o In e ac ion.......................................................................................6 2.3 The Applica ion-o ien ed Module...........................................................................7 2.4 Resou ce Managemen ............................................................................................8 3. NRDL (Ne wo k Resou ce Desc ip ion Language) and SIP (Session Ini ia ion P o ocol)...................................................................................................................................9 3.1 NRDL.....................................................................................................................9 3.1.1 Secu i y...................................................................................................12 3.2 SIP.........................................................................................................................12 3.2.1 B ie Desc ip ion abou SIP....................................................................13 3.2.2 Session Es ablishmen and End o Session............................................13 3.2.3 SIP Heade Fields...................................................................................14 3.2.4 Lis o SIP Responses Codes..................................................................15 4. Simula ion Scena io............................................................................................................16 4.1 S anda d Session Es ablishmen ...........................................................................16 4.2 UPDATE Du ing Session Es ablishmen ..............................................................18 5. Implemen a ion...................................................................................................................20 5.1 S eps Followed......................................................................................................20 5.1.1 Web In e ace.........................................................................................20 5.1.2 Sou ce and Reques Po s and IP............................................................21 5.1.3 REGISTER Me hod...............................................................................22 5.1.4 SIP P oxy Implemen a ion.....................................................................23 5.1.5 Sa ing and Modi ying NRDL Code......................................................24 5.1.6 SIP Heade Implemen a ion...................................................................25 5.1.7 Sending he UPDATE............................................................................27 5.1.8 Responding P ope ly..............................................................................27 5.2 P oblems Found....................................................................................................28 5.3 Execu ion o Simula ions......................................................................................29 5.3.1 Synch onous Mode (S anda d Session Es ablishmen )..........................30 5.3.2 Synch onous Mode (UPDATE Du ing Session Es ablishmen )............30 1 6. Resul s.................................................................................................................................32 6.1 S anda d Session Es ablishmen ...........................................................................32 6.1.1 Call.........................................................................................................32 6.1.2 Mig a ion................................................................................................33 6.1.3 End.........................................................................................................33 6.2 UPDATE Du ing Session Es ablishmen ..............................................................34 6.2.1 Call.........................................................................................................34 7. Conclusion and Fu u e........................................................................................................37 8. Re e ences...........................................................................................................................38 Annexes..................................................................................................................................39 A. Synch onous Mode (UPDATE Du ing Session Es ablishmen )............................39 B. phpse app sc ip s..................................................................................................40 index.php.............................................................................................40 C. 10.10.10.66 UA sc ip s...........................................................................................41 C.I es somoza_s anda d.................................................................................41 in i e.php.............................................................................................41 mig .php..............................................................................................42 bye.php................................................................................................45 index.php.............................................................................................46 Socke SIP.class.php.............................................................................56 Clien SIP.class.php..............................................................................59 C.II es somoza_upda e...................................................................................85 Clien SIP.class.php..............................................................................85 D. 10.10.10.67 UA sc ip s.........................................................................................111 D.I es somoza_s anda d...............................................................................111 clien 2.php.........................................................................................111 Clien SIP.class.php............................................................................122 D.II es somoza_upda e.................................................................................148 Clien SIP.class.php............................................................................148 2 1. In oduc ion. Nowadays, he In e ne is based on IP anspo se ice, p o iding an end- o-end connec ion be ween applica ions and ocusing on packe ou ing. Al hough i is ue ha he use o he In e ne P o ocol has been a g ea success o he in e connec ion o ne wo ks using di e en p o ocols a he anspo laye , such as TCP o UDP among o he s, and con ibu ed o de elop he ne wo k o ne wo ks we cu en ly ha e, he way he In e ne is has la ely been discussed. The eason is no ano he ha i has e ol ed so much ha he ne wo k i sel has o be econside ed. The in oduc ion in he ne wo k o unc ions and sub-blocks non exis ing a he ime he In e ne was concei ed, such as NATs o i ewalls, and he e olu ion o applica ions ha e conside ably con ibu ed o expand his hough . Mo e and mo e, applica ions equi e e ec i e suppo o QoS and la ge scale p o isioning, which leads hem o he need o being mo e ne wo k-awa e and o he ne wo k o be mo e applica ion-awa e. A his momen , hese applica ions communica e end- o-end and he esou ce managemen is p o ided by cen alized applica ions. Ne e heless, conside able o e head is added leading o a high ine iciency o he ne wo k due o he lack o da a-speed abo e all. Fo his eason, a new signaling laye was necessa y. This new signaling laye had o be able o make applica ions capable o in e ac ing wi h he ne wo k in o de o eques he esou ces needed. This akes us o a p oblem. How will applica ions and ne wo k communica e? Un il now, as a consequence o he OSI model, he ne wo k and he applica ions did no communica e wi h each o he . The applica ion laye in a node, only alked wi h he applica ion laye o ano he node, and he same wi h he ne wo k laye . I is now necessa y o he ne wo k laye and he applica ion laye o communica e. The applica ion has o be capable o explaining o he ne wo k which esou ces i needs and he ne wo k has o be capable o elling he applica ion whe he o no his esou ces a e a ailable. This is why a new Cogni i e T anspo Se ice laye was p oposed on op o he adi ional anspo laye . This CTS laye will pe mi applica ions and ne wo k in e ac and will be di ided in o wo sub- laye s; he session laye and he p esen a ion laye . The session laye has o be implemen ed wi h a session-o ien ed p o ocol, capable o p o iding secu i y and e ol ed enough o be us ed, in his case, he Session O ien ed P o ocol. On he o he side, he p esen a ion laye will be based on he Ne wo k Resou ce Desc ip ion Language. The NRDL will be used as a se ices desc ip ion language and as a se ice nego ia ion p o ocol and will be he ac ual link be ween ne wo k and applica ions. 3 The aim o his hesis is o implemen wo di e en scena ios o es he iabili y o he solu ion p oposed. To do so, we a e going o es ablish a session be ween wo hos s which a e going o communica e h ough a SIP P oxy based on an OpenSIPs dis ibu ion. This SIP P oxy is going o a end he calle esou ces eques and, once he session is es ablished we a e going o mig a e a VM be ween he hos s. The mig a ion was implemen ed in a p e ious wo k. These simula ions a e going o be de eloped wi h wo Linux con igu ed machines E he ne connec ed, and he languages used o implemen he di e en componen s will be php, ja asc ip and h ml o he use in e ace. 4 2. The s eps o he new cogni i e ne wo k in as uc u e. Due o he change expe imen ed by he In e ne h ough he las yea s, and he need o ha ing applica ions capable o changing, on demand, he se -up o connec i i y se ice wi h speci ic cha ac e is ics ac oss high capaci y anspo ne wo ks, a new p o ocol laye was needed. Nowadays, he e is no a widely accep ed way o implemen ha . Howe e , i has been p o ed ha combining wo echnologies cu en ly a ailable such as he Session Ini ia ion P o ocol (SIP) and he Ne wo k Resou ce Desc ip ion Language (NRDL) we can each his objec i e. SIP is no able o p o ide se ices on i s own, bu b ings he possibili y o use i o implemen se ices. On he o he hand, is NRDL he language which allows applica ions say o he ne wo k wha esou ces do hey need, and he ne wo k say which applica ions a e a ailable. This combina ion o echnologies will allow applica ions exchange messages wi h he ne wo k, in o de o make eques s o he nego ia ion and ese a ion o esou ces on he ne wo k, b inging a new signaling laye called Cogni i e T anspo Se ice (CTS) laye . This new anspo laye should be implemen ed by decoupling he signaling p o ocol and is di ided in o wo sub-laye s: - The session laye , implemen ed by he session-o ien ed p o ocol SIP. - The P esen a ion laye , which uses NRDL. 5 Fig. 1 Cogni i e T anspo Se ice (CTS) laye 2.1 Why SIP and NRDL? The choice o SIP o implemen he new session laye was d i en by he nex s a emen s: - The necessi y o ha ing a signaling p o ocol, which is esponsible o de ining he syn ax used o se ice nego ia ion, session-o ien ed. SIP is able o ini ia e, modi y and e mina e sessions. - The need o ha ing a secu e session p o ocol, including au hen ica ion, au ho iza ion and accoun ing (AAA). - SIP is nowadays a widely e ol ed p o ocol due o i s adop ion by 3GPP o be he main p o ocol in IP Mul imedia Subsys em a chi ec u e. The choice o NRDL o be used in he new p esen a ion laye was d i en by he nex s a emen s: •I is neu al o he session p o ocol used. •I is able o ep esen ne wo k esou ces as well as a ibu es o a communica ion. Acco ding o his, he only di e ence be ween he p oposed solu ion and he cu en In e ne would be ha be o e he exchange o da a, he e would be a anspo se ice eques . This means ha be o e sending he da a, he sende applica ion will p epa e a NRDL documen , encapsula ed on he body o a SIP message, which will go h ough he ne wo k by means o a SIP session, and will allow he sende and ecei e o nego ia e and a ange he ne wo k se ice needed o es ablish he communica ion. When he NRDL documen a i es o he ecei e , i e i ies he ne wo k se ices eques ed by he sende and p epa es ano he NRDL documen as an answe , ac ing as an ACK. This NRDL documen con ains, apa om he ne wo k se ices om he ecei e poin o iew, i s local po and o he in o ma ion ha he sende would need. O cou se, he exchange on in o ma ion will be held un il he ne wo k se ices a e inally es ablished o canceled. F om ha momen being, he exchange o da a will ake place un il he session is closed. The e is no ye a Call-se up ime ecommenda ion speci ically o his ype o communica ion, bu he ecommenda ions by he ITU-T o a gene al Call-se up ime is be 7.5 s. 2.2 Al e na i es o In e ac ion. As men ioned be o e, when a calle wan s o s a a SIP session wi h a callee wi h speci ic ne wo k se ices, i p epa es a NRDL documen , sends i embedded in a SIP INVITE message o an in e media e node which p ocesses i , sends i o he nex node, and wai s o he callee con i ma ion. Howe e , he e a e se e al al e na i es o his no mal beha io which would be: - S a a ull ese a ion o ne wo k esou ces aking in o accoun ha i he callee does no accep he call hey would be eleased. This beha io is use ul when he se -up ime is a 6 3.2.1 B ie Desc ip ion abou SIP. SIP was bo n in 1996 in o de o me ge Session Ini ia ion P o ocol (SIP) and Simple Con e ence Ini ia ion P o ocol (SCIP). SIP is a ansac ion o ien ed p o ocol, meaning ha i is composed o eques - esponse sequences. I wo ks wi h a numbe o eliable and un eliable anspo p o ocols such as TCP, UDP o SCTP and uses he e ansmission in o de o p o ide eliabili y o e UDP. In his simula ion we a e using UDP. I pe mi s he econ igu a ion o sessions and enables se e s o main ain a minimal s a e in o. Fig. 5 SIP session es ablishmen . 3.2.2 Session Es ablishmen and End o Session. As a i s app oxima ion o he exchange o messages aking pa in his simula ion and as a b ie explana ion o how a session is es ablished and inished be ween wo Use Agen s, I will explain how i is done be ween wo use agen s wi h a P oxy be ween he wo o hem. In ano he sec ion, I will alk abou he ac ual messages low aking pa in his simula ion. All SIP con e sa ions ini ia e wi h an INVITE message sen by he calle , which needs o be esponded wi h a 200OK message and con i med, again by he calle wi h an ACK. This is known as he h ee-way handshake. I is impo an o no ice ha he callee epo s, be o e sending he 200 OK, i s s a us changes. In o de o end a dialog, he calle sends a BYE message o he callee, esponded wi h a 200 OK. This would be how a session is es ablished and ended, howe e , o he messages exchange could ake place. In ou case, we will use a SIP P oxy in o de o pa se and nego ia e ne wo k se ices wi h he in o ma ion embedded in o he SIP body wi h he NRDL. 13 3.2.3 SIP H eade Fields. Reco d- ou e: Reco d- ou e is an op ional ield. This ield is inse ed by he p oxy and con ains i s di ec ion. Wi h his inse ion, he p oxy in o ms he Use Agen s (UA) ha i wishes o s ay on he pa h o all u he messages. In some cases, his ield could be ini ialized wi h a p e-exis ing ou e se . Via: This ield shows he anspo p o ocol used and he eques ou e. In a gene al case, each p oxy would add a line o his ield. In ou case, we will only ha e, a he mos , wo lines. I is impo an o ema k ha , as he esponse ollows he pa h, he co esponding Via line is dele ed. F om: This ield shows he calle add ess. Each F om ield con ains a F om ag, which iden i ies he UA. To: This ield shows he callee add ess. As he F om ield, i con ains he To ag, which iden i ies he UA and is no added o he heade un il he UA i sel does. Fig. 6 SIP heade . Call_ID: Unique iden i ie o each call and con ains he hos add ess. I mus be he same o all he messages wi hin a ansac ion. Cseq: This ield begins wi h a andom numbe and iden i ies each messages exchange. Fo example, he INVITE and i s co esponding esponses will ha e he same iden i ie . And he same o he BYE o he UPDATE messages and i s esponses. Con ac : This ield shows he con ac add ess o i s UA and i s po . Con en ype: Con ains a desc ip ion o he message body. Max Fo wa ds: This ield is used o limi he numbe o p oxies ha can o wa d he eques un il i eaches he inal use . This coun is dec emen ed by each se e ha o wa ds he eques . The ecommended ini ial alue in his case is 70. Use Agen : This ield shows he clien agen who deals he communica ion. Con en leng h: Leng h o he body. 14 3.2.4 Lis o SIP Responses Codes. 100-199 In o ma ional esponses. 200-299 Success ul esponses. 300-399 Redi ec ion esponses. 400-499 Clien Failu e esponses. 500-599 Se e Failu e esponses. 600-699 Global Failu e esponses. 15 4. Simula ion Scena io. In his p ojec , in o de o es and p o e his solu ion o he p oblem exposed, we a e going o se ou wo possible scena ios whe e we a e going o see he possibili ies ha he use o SIP and NRDL o e . The wo scena ios will be he synch onous mode wi h a s anda d session es ablishmen and wi h an UPDATE du ing he es ablishmen o session. In bo h modes we will ha e wo UA communica ing h ough a P oxy Se e which will cap u e he messages sen by he UAs and ac in consequence making changes in he ne wo k. We will also mig a e a VM be ween bo h UA a e he session is es ablished. The main di e ence will be ha , while in he i s case he es ablishmen o session will ake place acco ding o he calle ini ial eques s, in he second case he callee UA will p o ide in o ma ion o he calle o o ce him o send an UPDATE o make some changes on he eques s made be o ehand wi h he INVITE message. 4.1. S anda d Session Es ablishmen . 16 Fig. 7 Session Es ablishmen Be o e s a ing any session, as hey communica e h ough a P oxy Se e , he i s hing ha he UAs mus do is egis e o he P oxy sending a message wi h he REGISTER me hod. In his message, hey mus speci y a Use Name and a Passwo d in o de o p o ide secu i y o he session i sel . I he P oxy accep s he e minal eques ing egis a ion, i will send back a 200 OK which will con i m he UA ha he egis a ion has aken place. A e he wo UAs a e egis e ed, he calle will send an INVITE message o he p oxy. This INVITE message will be embedded wi h a NRDL code in i s body, con aining he ne wo k eques s o ne wo k changes demanded. In o de o p e en he calle o send ano he INVITE message, he P oxy will send wo 100 esponses. I i did no , while he P oxy was looking o ne wo k esou ces, he UA could hink he message had been los . Once he P oxy o wa ds he INVITE message, he callee eads i and modi ies he code adding i s local po , he ne wo k se ices eques ed om i s poin o iew and o he in o ma ion ha he calle could need. A his poin , when he callee has accep ed he session es ablishmen , he P oxy will check whe he he NRDL code has he p ope s uc u e o no and make he ne wo k esou ces ese a ion o he changes eques ed. A e i is done, he P oxy will o wa d he 200 OK sen by he callee, o he calle o le i know ha he ese a ion was made. In esponse, he calle will send a message wi h he me hod ACK o he callee o le i also know ha he ese a ion was made. A his poin , he session will be es ablished and bo h he calle and he callee will be able o exchange messages in a secu e way. Fig. 8 Session end Once he calle wan s o end he session, i sends a message wi h he BYE me hod o he callee h ough he p oxy. When he message ge s o he P oxy, i checks again whe he he NRDL body is co ec o no and undoes he change made du ing he session es ablishmen . When he BYE ge o he callee, i esponds wi h a 200 OK. A his poin , he session is ended. 17 4.2 UPDATE Du ing Session Es ablishmen . 18 Fig. 9 Session es ablishmen wi h UPDATE. Again, as in he o he simula ion scena io, as he communica ion akes place be ween wo Use Agen s wi h a P oxy in he middle, SIP pe mi s o egis e he e minals o add secu i y o he ansac ions. The mechanism is he same in e e y case. A e he egis a ion, he calle send an INVITE message o he p oxy wi h i s ne wo k eques s embedded in o he body o he message wi h he NRDL code. Again, he P oxy sends wo 100 esponses o ale he calle ha he possible delay is no because o he INVITE message loss, ha i is because o he esea ch o esou ces eques ed. A e i , he P oxy o wa ds he INVITE message o he callee. I is a his poin when he callee sends a 183 Session in p og ess esponse o he calle o con ey in o ma ion abou he p og ess o he call. Fo his eason, he calle UA sends an UPDATE message o he callee o make some changes o he ne wo k eques s acco ding o he in o ma ion sen be o ehand wi h he 183 esponse. When he callee UA ecei es he UPDATE message, i esponds wi h a 200 OK modi ying he NRDL body embedded in he UPDATE and, a his poin , he p oxy, a e checking whe he he NRDL code is well s uc u ed and applying he changes eques ed, o wa ds he message o he calle UA. I is impo an o say ha he callee esponds wi h wo 200 OK a his poin . The i s one applies o he UPDATE message sen by he calle , and he second one o he INVITE message. The di e ence emains, abo e all, a he de ini ion o he me hod and ags p esen on i s heade s. I is impo an o send he UPDATE 200 OK esponse be o e he INVITEs one. We mus end he UPDATE ansac ion be o e ending he INVITE one. A e i , he calle UA sends a message wi h he ACK me hod o indica e he calle ha he session has been es ablished. A e he communica ion has aken place, once he calle wan s o end he session, i sends a BYE message o he p oxy, ha a e checking i s co ec ness undoes he changes made du ing he session es ablishmen and o wa ds i o he calle , which sends a 200 OK wi h he BYE me hod in o de o end he session. 19 5. Implemen a ion. In his sec ion he way he simula ion scena io was implemen ed, he p oblems ound and he way he simula ions ha e o be execu ed is desc ibed. 5.1 S eps Followed. 5.1.1 Web In e ace. When we i s go his P ojec , he i s hing we wan ed o do was o change he way he messages low was displayed in he web b owse in o de o make i mo e use - iendly and a ac i e o he eye o he one pe o ming he simula ions. Fi s o all, he e was no di e en ia ion be ween he messages sen by one UA and he o he . We wan ed o display each o hem in di e en colo s. The i s we did was c ea e a unc ion ha would look o a chain in o ano he chain. This way, inding a di e ence be ween he messages sen by one UA and he o he , we would only ha e o look o his di e ence in e e y message and hen display any o hem in a di e en colo depending whe he i was ound o no . In ou case, as we wan ed o di e en ia e he messages acco ding o UA sending he message, we would ha e o see he di e ence be ween he di e en F om heade s. Secondly, when displayed, all he in o ma ion was showed a he i s ins ance. We wan ed o show i s he i s line o he message showing which i was and hen be able o display he whole heade and he body o any message by clicking on i . To do ha , we c ea ed a unc ion which would show o hide a ex when execu ed. 20 Fu he mo e, as he messages low was an a ay, we would i s ha e o spli he a ay, sepa a ing e e y message om he o he s adding p e iously an speci ic sen ence, in ou case “Rispos a ice u a”, when adding a new message o he message low a ay. And hen, di ide e e y message be ween he eques o esponse iden i ie and he es o he message. In ou case, he a iable in is he posi ion o he wo d sepa a ing he heade and he ail o he message. We mus ake in o accoun ha no all messages i s heade elemen is he same. Because o his, we had o a y he in a iable in some cases. The esul o his was: 5.1.2 Sou ce and Reques Po s and IP. The nex s ep was o change he way he wo UA communica ed. Un il hen, he wo UA we e 21 Fig. 10 Web in e ace esul . communica ing di ec ly wi h hei public IP add esses which we e 137.204.107.66 and 137.204.107.67. The UA would now be communica ing h ough an E he ne cable. Thei IP add esses would be 10.10.10.66 and 10.10.10.67 and hei co esponding po s would be 50601 o he calle UA and 5060 o he callee UA. To change his we had o go o he class Socke de ined in Socke SIP.class.php, change he a iable $s c_ip o each UA wi h he new IP add ess and check i he a iable $s c_po was well de ined. Now, we wan ed hem o communica e h ough a P oxy Se e which would ha e o deal wi h he eques s made by he calle and he esponses sen by he callee. This P oxy is placed in 10.10.10.66:5060. To ha e his change made we had o con igu e he a iable $ eques Po o each UA socke class o be 5060 and se he p oxy IP add ess wi h he unc ion de ined in Clien SIP.class.php called se P oxy($p oxy) be o e he INVITE is sen . No e ha he a iable $p oxy has he o ma o an IP add ess, in his case 10.10.10.66. 5.1.3 REGISTER Me hod. A his poin , he simula ion scena io ha was al eady unning did almos he same he synch onous mode wi h a s anda d session es ablishmen had o do. The only di e ence, apa om he p esence o a SIP P oxy be ween hem, was ha he wo UA would ha e o egis e be o e s a ing he session es ablishmen . To do so we added REGISTER o he lis o allowed me hods and de ined a unc ion called egis e a he Clien SIP class. This unc ion has o be execu ed be o e he INVITE is sen . The e is he e a di e ence be ween when do we execu e he unc ion in he calle UA and he callee UA. In he case o he calle , we execu e he unc ion when we wan o s a he session and send he INVITE, igh be o e i is sen . Howe e , in he case o he callee, as we do no know when he INVITE will be sen , he egis e unc ion is execu ed a he ime we open he socke o lis en o he incoming messages. Tha is why, la e on when we will see he esul s, we will see ha he REGISTER message om he callee ge s always o he P oxy be o e he calle REGISTER eques 22 Some imes opensips c ashes due o an e o in he p ocessing o he SIP packe . This could be because o some hing missing in a heade o a message which is supposed o ha e body is emp y. To sol e his you ha e o eboo he sys em, execu e he commands included in he ile / oo /i con ig. x in o de o ac i a e he aliases o he loopback in e ace and s a he opensips se ice wi h he command: % opensipsc l s a Ano he p oblem we ound was ha , once you ha e execu ed he simula ion, you can no eboo he i ual machine loca ed a he callee UA no mally. The eason is s ill unknown, bu o do so, you ha e o kill he p ocess. The i s s ep would be ind he co esponding p ocess. We would ecommend o execu e he line “ps –eL | g ep Vi ”. The command “ps –eL ” selec s all he p ocesses being execu ed, p in s in o ma ion abou all he ligh weigh p ocesses and makes a lis o hem. On he o he hand, he command “g ep Vi ” il e s all he p ocesses ha con ain he chain “Vi ”. The nex s ep is killing he p ocess. No e ha he co ec p ocess o kill is he one execu ing he co esponding i ual machine, in ou case he one named Video. To kill he p ocess you ha e o execu e he line “kill -9 PID” whe e PID is he one associa ed o he p ocess o kill and -9 indica es ha he signal you wan o end o he p ocess is SIGKILL, as he command kill i sel does no kill a p ocess. Finally, he i ual machine emains in ABORTED s a e. You jus ha e o open and close i no mally. Ano he p oblem ha we had was ha he Remo e Desk op Viewe may ge s uck some imes. To ix i , you only ha e o close he connec ion and connec no mally again. As i is only a emo e desk op, once you connec again, you will ha e e e y hing as you le i , so i is no a big deal. The e was also a p oblem o pe missions. As seen be o e, we some imes ha e o execu e he unc ion sys em() o execu e commands in o a sc ip , which needs oo pe missions. To his end, we ha e o change he /e c/sudoe s ile o gi e apache his pe missions. 5.3 Execu ion o Simula ions. We a e now going o explain how o pe o m bo h simula ions. I would seem o be easy, bu he ac o ha ing ound some p oblems du ing he p ocess encou ages me o explain wi h e e y de ail how o execu e he simula ions. Fi s o all, i is necessa y o open a i ual desk wi h he wo se e s used. To do so, open he Remo e Desk op Viewe applica ion and connec o 137.204.107.66:3 and 137.204.107.67:3. Then, open a e minal in bo h se e s and ype: % xhos + 29 This command disables he access con ol allowing any hos o access o he se e . In o he wo ds, i will allow us o use g aphical in e aces o ou applica ions, in ou case, Vi ualbox. Then, connec as a oo wi h you passwo d yping: % sudo su - Open Vi ualbox wi h he g aphical in e ace. No e, in his case, ha we will only be able o in e ac wi h ou VM Video i we open Vi ualbox as a oo : % i ualbox & (137.204.107.66) %Vi ualbox & (137.204.107.67) Open he VM Video in he 137.204.107.66 se e and lea e he 137.204.107.67 swi ched o , as we a e going o mig a e he i s VM o he second one. Now, bo h machines a e p epa ed so nex s ep is execu ing he simula ions. 5.3.1 Synch onous Mode (S anda d Session Es ablishmen ). To execu e his simula ion, open you local hos s web b owse and go o: h p://137.204.107.66/ es somoza_s anda d/ (Execu es 137.204.107.66 sc ip ) and h p://137.204.107.67/php-sip/ es somoza_s anda d/clien 2.php (Execu es 137.204.107.67 sc ip ) I e e y hing is ine, when execu ing he 137.204.107.67 sc ip , i will keep loading he page. This means ha he sc ip has been well execu ed and ha he machine is lis ening o an incoming connec ion. I his does no happen, i means ha he las ime he simula ion was execu ed, i ended ab up ly. To sol e his p oblem, you ha e o es a he h pd se ice yping: % /e c/ini .d/h pd es a No e ha only a use wi h oo pe missions will be able o es a he h pd se ice. Now we ha e he web in e ace o execu e he simula ion. P ess Call o es ablish a session be ween bo h UA. The messages low will be displayed. P ess Mig azione o pe o m he mig a ion and Bye o end he session. In o de o es i he SIP P oxy has done he changes eques ed, in ou case a change a he IPTables, ping he co esponding IP a e he es ablishmen o session and a e he end o session. I e e y hing wo ks ine, you will no be able o ping any 173.194.35.0/24 IP a e he es ablishmen o session bu you will be able o do so a e he end o session. 5.3.2 Synch onous Mode (UPDATE Du ing Session Es ablishmen ). To execu e his simula ion he p ocess is he same as wi h he s anda d session es ablishmen . The 30 only di e ence will be, ob iously, ha we will ha e o execu e di e en sc ip s. To do so, open you web b owse and go o: h p://137.204.107.66/ es somoza_upda e/ (Execu es 137.204.107.66 sc ip ) and h p://137.204.107.67/php-sip/ es somoza_upda e/clien 2.php (Execu es 137.204.107.67 sc ip ) In o de o es i he SIP P oxy has done he changes eques ed, in ou case a change a he IPTables, ping he co esponding IP a e he es ablishmen o session and a e he end o session. I e e y hing wo ks ine, you will no be able o ping any 173.194.35.0/24 IP excep om 173.194.35.159 a e he es ablishmen o session bu you will be able o do so a e he end o session. 31 6. Resul s. In his sec ion we a e going o explain exac ly wha do we ge when execu ing he simula ions. Once explained in p e ious sec ions wha was he objec i e o he hesis, wha kind o simula ions we would implemen , how we did ha and how o execu e he simula ions, i will be easy o unde s and wha happens when we execu e e e y s ep o he simula ion. 6.1 S anda d Session Es ablishmen . Be o e s a ing he communica ion, bo h UA open a socke . In he case o he calle UA, i co esponds o 10.10.10.66:50601 and will be used o send all he eques s o he P oxy whose socke is 10.10.10.66:5060 and is con inuously lis ening o a possible connec ion. In he case o he callee, when execu ing he php sc ip , i opens a socke wi h i s co esponding IP and po , 10.10.10.67:5060, and s a s lis ening. 6.1.1 Call. In his case, bo h UA egis e hemsel es o he SIP P oxy by sending a REGISTER eques wi h a Use Name and a Passwo d. As he P oxy accep s bo h e minals, i sends back a 200 OK esponse o each o hem indica ing ha hey ha e been egis e ed. A e he calle UA ecei es he egis e con i ma ion i s a s he es ablishmen o session. I , hen, sends an INVITE message o he SIP P oxy wi h he NRDL code embedded o i s body, indica ing he ne wo k eques s i is making o es ablish he session. When he P oxy ecei es he INVITE message, i s a s looking o esou ces a he ne wo k in o de o p o ide he calle UA he session i is demanding. I is no an objec i e o his hesis o implemen he code ha does so. While he P oxy is looking o esou ces, i sends a 100 T ying and 100 Gi ing a y o he calle UA. This esponses indica e he calle UA ha he INVITE message has no been los h ough he ne wo k and ha he delay in he esponse is caused by he heo e ically esea ch o esou ces. Once he P oxy has checked i i is able o p o ide he ne wo k eques , in his case we suppose i is, i o wa ds he in i e o he callee UA. I is now ime o he callee o accep o decline he in i a ion due o i s capaci y o es ablish he session. I i is able o es ablish he session, we assume i is, he callee UA sa es he NRDL code ecei ed in o de o modi y i in case i was necessa y and esponses wi h a 200 OK wi h he INVITE me hod o indica e he P oxy o which eques he esponse co esponds. I is now ime o he P oxy o sa e he esou ces eques ed and con i med by bo h Use Agen s o make he changes demanded. In ou case, he ne wo k eques is going o be a change a he IPTables, a new ule o d op all he messages coming om 173.194.35.0/24. In o de o check his, we ping his hos a e he session is es ablished. 32 A e he esou ces a e ese ed, he SIP P oxy o wa ds he esponse and he calle UA sends an ACK o he callee in o de o con i m ha he session is es ablished. 6.1.2 Mig a ion. Once he session is es ablished, i is ime o mig a e he VM Video om he calle o he callee. To do so, he calle UA opens a socke and sends he . di ile, which con ains all he da a o he Video VM, and he log ile, which con ains all he in o ma ion o he VM. A his poin , he Video VM has mig a ed om he Calle UA o he Callee UA. 6.1.3 End. Once he VM has mig a ed, he calle ends he session. To do so, i sends a BYE eques o he callee. When he SIP P oxy ge s he message, and be o e o wa ding i o he callee, i eleases he esou ces ese ed o his session, in ou case, dele es he ule a he IPTables. Finally, he callee sends a 200 OK esponse o he calle o con i m ha he session has ended. To es i he change a he IPTables has been made, we jus ping he hos again. 33 Fig. 11 Ping a e he session es ablishmen . Fig. 12 Video VM mig a ion. 6.2 UPDATE Du ing Session Es ablishmen . In his simula ion scena io, basically he only hing ha changes is he es ablishmen o session. Fo his eason, in o de no o be edundan , i is he only hing we a e going o explain. 6.2.1 Call. 34 Fig. 13 Ping a e he end o session. Fig. 14 Session es ablishmen wi h an UPDATE messages low as showed on he web b owse .. A e he call is execu ed, bo h UA egis e o he SIP P oxy by sending a REGISTER eques wi h hei Use Name and Passwo d. This is an op ion SIP o e s in o de o p o ide secu i y o he session. Once a UA is egis e ed, i can eely in e ac wi h he SIP P oxy. A e he egis a ion is accep ed, he P oxy sends a 200 OK esponse o he Use Agen s o con i m he egis a ion. Then, he calle UA sends he INVITE eques o he callee wi h all i s ne wo k eques s, embedded o he body o he message as an NRDL code, o es ablish a new session. A his ime, he SIP P oxy sends he 100 T ying and 100 Gi ing a y o he calle be o e o wa ding he message in o de o p e en i o esend he INVITE message while he P oxy is looking heo e ically o esou ces. A e he esea ch, he INVITE message is o wa ded. Now, a e heo e ically analyzing he session esou ces demand, he callee UA sends a 183 Session in p og ess esponse o he calle wi h in o ma ion abou i sel in o de o change he se -up o he session. We a e going o suppose in his case, ha in he INVITE message he calle wan ed o d op all he messages coming om 173.194.35.0/24 bu he callee asks he calle o accep 173.194.35.159 among all he IP amily. I is hen ime o he calle UA o send an UPDATE message wi h he new in o ma ion o he P oxy. The callee now sends wo 200 OK esponses. The i s one ega ding o he UPDATE eques . Be o e o wa ding i o he calle , he P oxy adds a ule o he IPTables. The second 200 OK esponse co esponds o he INVITE me hod, and he P oxy adds he co esponding ule o he IPTables be o e o wa ding he esponse. Finally, he calle UA sends an ACK message in o de o con i m ha he session is es ablished. In o de o es i he ules we e added, we ping 173.194.35.159 and 173.194.35.160. A e he session is es ablished, he mig a ion akes place he same way i did wi h he s anda d session es ablishmen . Again, he ules a e dele ed when he BYE message goes h ough he SIP P oxy. 35 Fig. 15 Ping a e he session es ablishmen . 36 Fig. 16 Ping a e he end o session. 7. Conclusion and Fu u e. The aim o his wo k was o es whe he he solu ion o implemen he new Cogni i e T anspo Se ice laye wi h SIP and NRDL wo ked wi h wo di e en es ablishmen o session scena ios be ween wo hos s h ough a SIP P oxy based on an OpenSIPs dis ibu ion. I has been widely p o ed ha he solu ion p oposed wo ks h ough a SIP P oxy, which is capable o in e cep ing he messages going h ough i , iden i y hem and ac in consequence wi h e e y single eques o esponse, making any change on he ne wo k. Fu he mo e, i has been p o ed and explained how we ha e o change he code in o de o es ablish di e en scena ios, pe o m di e en ne wo k changes and change he NRDL code a hos ge s om he eques s and esponses. The mig a ion implemen ed in ano he p ojec , is also pe o med pe ec ly no ma e how he session was es ablished, which changes we e made o whe he he e is a SIP P oxy be ween hos s o no . Ne e heless, in he u u e will be he applica ions he ones which will ha e o be capable o changing he se -up o connec i i y se ices wi h speci ic cha ac e is ics o e high-capaci y anspo ne wo ks. The implemen a ion o hese new kind o applica ions could be mo e o less easy, bu anyway he esul o he combina ion o he new ne wo k, now applica ion-awa e, and he new amily o ne wo k-awa e applica ions could lead o a mo e e icien way o using he ne wo k and esou ces a ailable in i . In any case, his is no he end o he es o his solu ion. In his p ojec we implemen ed wo synch onous scena ios, bu he e a e many o he s. A synch onous scena io is he one in which in he session es ablishmen , he SIP P oxy is able o p o ide he esou ces eques ed by he calle UA, howe e , he session es ablishmen could be asynch onous. An asynch onous session es ablishmen is he one in which when he calle UA asks o he esou ces needed o es ablish he session, his esou ces a e no a ailable. In his case, when ecei ing he INVITE, he SIP P oxy will look o esou ces and ejec he eques when ealizing i can p o ide hem. A e a ce ain ime, he calle UA will send an UPDATE wi h he eques and will no s op sending UPDATES un il he SIP P oxy accep s he eques and o wa ds i o he callee UA. One hing is clea , he In e ne has o e ol e and his solu ion is p o ing i sel o be a good possibili y o change he e iciency o he ne wo k and he pe o mance o applica ions in he u u e. 37 8. Re e ences. [1] “Applica ion Scena ios o Au oma ed T anspo Se ice in he Fu u e In e ne ”, Wal e Ce oni, Aldo Campi, F anco Callega i, DEIS Uni e si y o Bologna, Cesena, I aly. [2] “Ne wo k Resou ce Desc ip ion Language”, A. Campi, F. Callega i, DEIS Uni e si y o Bologna, Via Venezia 54, 47023 Cesena (FC) ITALY. [3] “Con igu a ion o Ne wo k Resou ces o Fu u e In e ne applica ion Se ices”, F. Callega i, W. Ce oni, B. Ma ini, M. Gha baoui, A. Campi, P. Cas oldi, DEIS Uni e si y o Bologna, CNIT, Scuola Supe io e San 'Anna. [4] “Au oma ed T anspo Se ice Managemen in he Fu u e. In e ne : Concep s and Ope a ions”, F anco Callega i, Aldo Campi, Wal e Ce oni. [5] “PHP Manual”, A ailable: h p://php.ne /manual/en/index.php. [6] “Mig azione di Macchine Vi uali in uno Scena io di Re e O ien a a ai Se izi”, Tesi di Lau ea di: Robe o Mo ini, Alma Ma e S udio um Uni e si à di Bologna. [7] “P ác icas de labo a o io de Telemá ica II, Fil ado de paque es y NAT”, Mónica Aguila , Juanjo Alins, Osca Espa za, Jose L. Muñoz, Ma cos Pos igo, An oni X. Val e de, ENTEL, Uni e si a Poli ècnica de Ca alunya. [8] “SIP Tu o ial”, Jö g O , Helsinki Uni e si y o Technology. [9] “Pa se NRDL su A chi e u a clien -se e in PHP”, Robe o Mo ini, Uni e si à di Bologna. 38 else{ echo da e('h:i:s')." Il ile è aggio na o, in io dell'OK. n"; socke _w i e($sock,"OK"); } } $ c =socke _ ead($sock,1024); echo da e('h:i:s')." Rice u a la po a su cui esegui e la mig azione: ".$ c ." n"; echo da e('h:i:s')." Esecuzione del comando di elepo ing sulla po a ".$ c ." n"; sleep(5); sys em("sudo VBoxManage con ol m ".$_GET['nome']." elepo --hos ".$sck- >ge Reques Hos ()." --po ".$ c )." n"; echo da e('h:i:s')." Mig azione esegui a n"; $ c =socke _ ead($sock,1024); echo da e('h:i:s')." Rice u o: ".$ c ." n"; socke _close($sock); ?> bye.php <?php equi e_once("Clien SIP.class.php"); equi e_once("Socke SIP.class.php"); session_s a (); i (isse ($_SESSION['clien ']) && isse ($_SESSION['socke '])){ i (isse ($_GET['bye'])){ /*$b n = $_GET['bu on']; $aq = s pos($b n, "["); $cq = s pos($b n, "]"); $end = $cq - $aq; $index = subs ($b n, $aq, $end);*/ $ esCode = ""; $cln = $_SESSION['clien ']; $sck = $_SESSION['socke ']; $sockNew = new Socke ($sck->ge S cPo ()); //C eo la nuo a socke di comunicazione $sockNew->se Reques Hos ('10.10.10.66'); //Recupe o l'ip del des ina a io $sockNew->se Reques Po ($sck->ge Reques Po ()); // ecupe o la po a del des ina a io $cln ->se NewSocke ($sockNew); //Passo all'is anza del clien la nuo a socke $cln ->se Me hod('BYE'); y{ $ esCode = $cln ->send(); }ca ch(Excep ion $e){ echo "Bye e o : ".$e; } $sockNew->closeSocke (); $ esCode .= " Chiama a e mina a.--".$cln ->ge MessageFlow(); $_SESSION = a ay(); session_des oy(); //echo $ esCode." Chiama a e mina a."; echo $ esCode; } }else{ 45 echo "Nessuna is anza memo izza a"; } ?> index.php <?php session_s a (); ?> <h ml> <head> < i le> Clien - SIP </ i le> <sc ip ype=" ex /ja asc ip "> unc ion sendIn i e(){ /*Pe me e di e e ua e l'handshake a chiaman e e chiama o. Ri o na il isul a o dell'handshake insieme ad in o mazioni aggiun i e ( lusso messaggi)*/ a o mDa i = documen . o ms[0]; a sBody = ge Reques Body( o mDa i); //i (window.XMLH pReques ){ a oXMLH p = new XMLH pReques (); //C eazione ogge o XMLH pReques pe e e ua e chiama e asinc one //}else{ // ale ("no xmlh p eques "); //} oXMLH p.open("pos ", o mDa i.ac ion, ue); oXMLH p.se Reques Heade ("Con en -Type", "applica ion/x-www- o m-u lencoded"); oXMLH p.on eadys a echange = unc ion(){/*Ges isce lo s a o della ichies a HTTP*/ i (oXMLH p. eadyS a e == 4){ i (oXMLH p.s a us == 200){ a s a usG = documen .ge Elemen ById("lblS a usG"); a b nBye = documen .ge Elemen ById("b nBye"); a b nMig = documen .ge Elemen ById("b nMig"); b nBye.disabled = alse; b nMig.disabled = alse; s a usG.inne HTML = "HTTP s a us-> " + oXMLH p.s a us; //S a o della ichies a HTTP //showResul (oXMLH p. esponseTex ); showResul Send(oXMLH p. esponseTex ); //S ampa nell'apposi o <di > la esponse HTTP //Abili a i se izi disponibili a lis = documen .ge Elemen ById("lis Id"); lis .disabled = alse; }else{ ale ("E o e: " + oXMLH p.s a usTex ); } } }; oXMLH p.send(sBody); //In ia la ichies a HTTP (INVITE SIP) } unc ion sendBye(){/*Ges isce la chiusu a del dialogo a chiaman e e chiama o*/ 46 a bu on = documen .ge Elemen ById("b nBye"); //i (window.XMLH pReques ){ a oXMLH p = new XMLH pReques (); //}else{ // ale ("no xmlh p eques "); //} oXMLH p.open("ge ","bye.php?bye=" + bu on. alue, ue); oXMLH p.on eadys a echange = unc ion(){ i (oXMLH p. eadyS a e == 4){ i (oXMLH p.s a us == 200){ a s a usG = documen .ge Elemen ById("lblS a usG"); s a usG.inne HTML = "HTTP s a us-> " + oXMLH p.s a us; a esponse = oXMLH p. esponseTex ; showResul Bye( esponse); //Mos a il isul a o della chiusu a del dialogo /* a spli _a ay = esponse.spli ("--"); a s a eDial = spli _a ay[0]; a messageFlow = spli _a ay[1];*/ //showResul (s a eDial); // a di Ris = documen .ge Elemen ById(" is"); //di Ris.inne HTML = messageFlow; //showResul (oXMLH p. esponseTex ); a b nBye = documen .ge Elemen ById("b nBye"); b nBye.disabled = ue; //Disabili o i se izi a lis = documen .ge Elemen ById("lis Id"); lis .disabled = ue; }else{ ale ("E o e: " + oXMLH p.s a usTex ); } } }; oXMLH p.send(null); } unc ion sendMig(){/*Ges isce la mig azione a chiaman e e chiama o*/ a bu on = documen .ge Elemen ById("b nMig"); a selec = documen .ge Elemen ById("lis Id"); //i (window.XMLH pReques ){ a oXMLH p = new XMLH pReques (); //}else{ // ale ("no xmlh p eques "); //} oXMLH p.open("ge ","mig .php?nome=" + selec .op ions[selec .selec edIndex]. alue, ue); oXMLH p.on eadys a echange = unc ion(){ i (oXMLH p. eadyS a e == 4){ i (oXMLH p.s a us == 200){ a s a usG = documen .ge Elemen ById("lblS a usG"); s a usG.inne HTML = "HTTP s a us-> " + oXMLH p.s a us; a esponse = oXMLH p. esponseTex ; showResul Mig( esponse); //Mos a il isul a o della chiusu a del dialogo /* a spli _a ay = esponse.spli ("--"); a s a eDial = spli _a ay[0]; a messageFlow = spli _a ay[1];*/ 47 //showResul (s a eDial); // a di Ris = documen .ge Elemen ById(" is"); //di Ris.inne HTML = messageFlow; //showResul (oXMLH p. esponseTex ); a b nMig = documen .ge Elemen ById("b nMig"); b nMig.disabled = ue; //Disabili o i se izi a lis = documen .ge Elemen ById("lis Id"); lis .disabled = ue; }else{ ale ("E o e: " + oXMLH p.s a usTex ); } } }; oXMLH p.send(null); } unc ion ge Reques Body( o mDa i){ a aPa am = new A ay(); o ( a i=0; i< o mDa i.elemen s.leng h; i++){ a sPa am = encodeURIComponen ( o mDa i.elemen s[i].name); sPa am += "="; sPa am += encodeURIComponen ( o mDa i.elemen s[i]. alue); aPa am.push(sPa am); } e u n aPa am.join("&"); } unc ion showResul ( is){ a di Id = documen .ge Elemen ById("lblS a usD"); //di Id.s yle. loa = " igh "; di Id.inne HTML += is + " "; /* a spli _a ay = is.spli ("Rispos a ice u a"); di Id.inne HTML += "<p>" + spli _a ay[0] + " </p>"; di Id.inne HTML += "<p>" + spli _a ay[1] + " </p>";*/ } unc ion showResul Send( is){/*Mos a il isul a o della sendIn i e()*/ // a di Id = documen .ge Elemen ById(" isSend"); // a A = documen .ge Elemen ById("a"); a send1 = documen .ge Elemen ById(" isSend1"); a send2 = documen .ge Elemen ById(" isSend2"); a send3 = documen .ge Elemen ById(" isSend3"); a send4 = documen .ge Elemen ById(" isSend4"); a send5 = documen .ge Elemen ById(" isSend5"); a send6 = documen .ge Elemen ById(" isSend6"); a send7 = documen .ge Elemen ById(" isSend7"); a send8 = documen .ge Elemen ById(" isSend8"); a send9 = documen .ge Elemen ById(" isSend9"); a send10 = documen .ge Elemen ById(" isSend10"); a send11 = documen .ge Elemen ById(" isSend11"); //send11.s yle.display='none'; 48 a send22 = documen .ge Elemen ById(" isSend22"); //send22.s yle.display='none'; a send33 = documen .ge Elemen ById(" isSend33"); //send33.s yle.display='none'; a send44 = documen .ge Elemen ById(" isSend44"); //send44.s yle.display='none'; a send55 = documen .ge Elemen ById(" isSend55"); //send55.s yle.display='none'; a send66 = documen .ge Elemen ById(" isSend66"); a send77 = documen .ge Elemen ById(" isSend77"); a send88 = documen .ge Elemen ById(" isSend88"); a send99 = documen .ge Elemen ById(" isSend99"); a send1010 = documen .ge Elemen ById(" isSend1010"); send=1; is= is. eplace("In io ACK.","Rispos a ice u a"); is= is. eplace("In io upda e","Rispos a ice u a"); is= is. eplace("In io ihies a","Rispos a ice u a"); a spli _a ay = is.spli ("Rispos a ice u a"); o ( a i=0; i<spli _a ay.leng h; i++){ spli _a ay[i] = spli _a ay[i]. eplace(/ </g, "<"); a in = spli _a ay[i].indexO ('Via'); a heade =spli _a ay[i].subs ing(0, in); a ail=spli _a ay[i].subs ing( in); i ( indChain( ail,"F om: <sip:[email p o ec ed]") == 1){ //di Id.inne HTML += "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; i (send==1){ send1.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send11.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=2; } else i (send==2){ send2.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send22.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=3; } else i (send==3){ send3.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send33.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=4; } else i (send==4){ send4.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send44.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=5; } 49 else i (send==5){ send5.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send55.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=6; } else i (send==6){ send6.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send66.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=7; } else i (send==7){ send7.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send77.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=8; } else i (send==8){ send8.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send88.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=9; } else i (send==9){ send9.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send99.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=10; } else{ send10.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; send1010.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; send=1; } } else{ //di Id.inne HTML += ;//"<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; i (send==1){ send1.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send11.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=2; } else i (send==2){ send2.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " 50 </p e></p>"; send22.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=3; } else i (send==3){ send3.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send33.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=4; } else i (send==4){ send4.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send44.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=5; } else i (send==5){ send5.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send55.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=6; } else i (send==6){ send6.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send66.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=7; } else i (send==7){ send7.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send77.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=8; } else i (send==8){ send8.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send88.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=9; } else i (send==9){ send9.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send99.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=10; } else{ send10.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; send1010.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; send=1; } } 51 } } unc ion showResul Bye( is){/*Mos a il isul a o della sendBye()*/ // a di Id = documen .ge Elemen ById(" isBye"); a bye1 = documen .ge Elemen ById(" isBye1"); a bye2 = documen .ge Elemen ById(" isBye2"); // a bye3 = documen .ge Elemen ById(" isBye3"); // a bye4 = documen .ge Elemen ById(" isBye4"); a bye11 = documen .ge Elemen ById(" isBye11"); a bye22 = documen .ge Elemen ById(" isBye22"); // a bye33 = documen .ge Elemen ById(" isBye33"); // a bye44 = documen .ge Elemen ById(" isBye44"); a sen =1; // is= is. eplace("In io ihies aBYE","Rispos a ice u aBYE"); a spli _a ay0 = is.spli ("In io BYE"); a spli _a ay = spli _a ay0[1].spli ("Rispos a ice u a"); o ( a i=0; i<spli _a ay.leng h; i++){ spli _a ay[i] = spli _a ay[i]. eplace(/ </g, "<"); //di Id.inne HTML += "<p><p e>" + spli _a ay[i] + " </p e></p>"; a in = spli _a ay[i].indexO ('Via'); a heade =spli _a ay[i].subs ing(0, in); a ail=spli _a ay[i].subs ing( in); i ( indChain( ail,"F om: <sip:[email p o ec ed]") == 1){ i (sen ==1){ bye1.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; bye11.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; sen =2; } else i (sen ==2){ bye2.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; bye22.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; sen =3; } /*else i (sen ==3){ bye3.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; bye33.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; sen =4; } else { bye4.inne HTML = "<p><p e>" + heade . on colo ("#FF9900") + " </p e></p>"; bye44.inne HTML = "<p><p e>" + ail. on colo ("#FF9900") + " </p e></p>"; sen =1; }*/ } else{ i (sen ==1){ bye1.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; bye11.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; 52 sen =2; } else i (sen ==2){ bye2.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; bye22.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; sen =3; } /*else i (sen ==3){ bye3.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; bye33.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; sen =4; } else { bye4.inne HTML = "<p><p e>" + heade . on colo ("#000000") + " </p e></p>"; bye44.inne HTML = "<p><p e>" + ail. on colo ("#000000") + " </p e></p>"; sen =1; }*/ } } } unc ion showResul Mig( is){/*Mos a il isul a o della sendBye()*/ a di Id = documen .ge Elemen ById(" isMig"); a spli _a ay = is.spli ("Rispos a ice u a"); o ( a i=0; i<spli _a ay.leng h; i++){ spli _a ay[i] = spli _a ay[i]. eplace(/ </g, "<"); di Id.inne HTML += "<p><p e>" + spli _a ay[i] + " </p e></p>"; } } unc ion indChain(Chain,lChain){ a esul =0; o ( a i=0 ; i<Chain.leng h ; i++){ i (Chain[i] == lChain[0]){ o ( a j=0 ; j<lChain.leng h ; j++){ i (Chain[i+j] != lChain[j])b eak; else i (j==lChain.leng h-1) esul =1; } } } e u n esul ; } unc ion displayElem(id){ a x=documen .ge Elemen ById(id); i (x.s yle.display=='inline') x.s yle.display='none'; i (x.s yle.display=='none') x.s yle.display='block'; else i (x.s yle.display='block') x.s yle.display='none'; } </sc ip > 53 </head> <body id="bodyId" s yle="backg ound-colo :#494949; on - amily:a ial, hel e ica, sans-se i ;"> <di s yle="wid h:930px; ma gin:0 au o;backg ound-colo :#FFFFFF; padding:15px;"> < able cellspacing="0" cellpadding="0" wid h="930" > < > < d wid h="190" align="middle"> <img s c="images/logo.gi "> </ d> < d s yle="backg ound-colo :#18964A;" aling="le "> <img s c="images/ es a a.gi "> </ d> </ > </ able> <p><label>Use Agen : <s ong>use 1</s ong> </label><di id="lblS a usG"></di ></p> <p>Ques o use agen decide di a e mig a e un suo se izio in un'al o Use Agen , scel o secondo de e mina i c i e i.</p> <p><label>S a o dialogo:</label><di id="lblS a usD"></di ></p> < o m ac ion="in i e.php" me hod="pos " onsubmi ="sendIn i e(); e u n alse"> <p><!-- <label>Chiaman e:</label> --><inpu ype="hidden" name="calle " size="20" alue="sip:[email p o ec ed]" /></p> <p><label>Use Agen scel o come a ge della mig azione: </label><inpu ype=" ex " name="callee" size="20" alue="sip:[email p o ec ed]" /></p> <p><inpu id="b ncll" ype="submi " name="call" alue="Call" /></p> </ o m> <di id="migId"> <?php $s ing = shell_exec('sudo VBoxManage lis unning ms'); $nome=explode('"',$s ing); ?> < o m ac ion="mig .php" me hod="ge " onsubmi ="sendMig(); e u n alse"> <p><inpu id="b nMig" ype="submi " name="mig" alue="Mig azione" disabled="disabled"/> <p>Se izio che e à a o mig a e: <selec id ="lis Id" name="lis " > <?php o ($i=1; $i<coun ($nome); $i+=2){ ?> <op ion alue="<?php echo $nome[$i] ?>"> <?php echo $nome[$i] ?></op ion> <?php } ?> </selec > </p> </ o m> </di > <di id="byeId"> < o m ac ion="bye.php" me hod="ge " onsubmi ="sendBye(); e u n alse"> <inpu id="b nBye" ype="submi " name="bye" alue="Bye" disabled="disabled"/> </ o m> </di > <di id=" is"></di > <di id=" isSend1" s yle="colo :#000000" onclick="ja asc ip :displayElem('main1')"></di > <ul id="main1" class="ni el2"> <di id=" isSend11"></di > 54 p i a e $passwo d; /** * To */ p i a e $ o; /** * To ag */ p i a e $ o_ ag; /** * F om */ p i a e $ om; /** * F om Use */ p i a e $ om_use ; /** * F om ag */ p i a e $ om_ ag; /** * INVITE F om ag */ p i a e $in _ om_ ag; /** * Via ag */ p i a e $ ia; /** * INVITE Via ag */ p i a e $in _ ia; /** * Con en ype */ p i a e $con en _ ype; /** * Body */ p i a e $body; /** * Recei ed Response 61 */ p i a e $ esponse; // whole esponse body p i a e $ es_code; p i a e $ es_con ac ; p i a e $ es_cseq_me hod; p i a e $ es_cseq_numbe ; /** * Recei ed Reques */ p i a e $ eq_me hod; p i a e $ eq_cseq_me hod; p i a e $ eq_cseq_numbe ; p i a e $ eq_con ac ; /** * Au hen ica ion */ p i a e $au h; /** * Rou es */ p i a e $ ou es = a ay(); /** * Reques ias */ p i a e $ eques _ ia = a ay(); /** * Addi ional heade s */ p i a e $ex a_heade s = a ay(); /** * Ges ione callID dinamico */ p i a e $use Chiaman e; p i a e $hashChiaman e; p i a e $use Chiama o; p i a e $hashChiama o; /** * Cons uc o * * @pa am $socke _is */ public unc ion __cons uc ($socke _is ) { $ his->socke = $socke _is ; } /** 62 * Des uc o */ public unc ion __des uc () { //$ his->socke ->closeSocke (); } /** * Se s debuggin ON/OFF * * @pa am bool $s a us */ public unc ion se Debug($s a us = alse) { $ his->debug = $s a us; } /** * Adds adi ional heade * * @pa am s ing $heade */ public unc ion addHeade ($heade ) { $ his->ex a_heade s[] = $heade ; } /** * Se s F om heade * * @pa am s ing $ om */ public unc ion se F om($ om) { /*Ges ione callID dinamico*/ $ his->use Chiaman e = explode(":", $ om); $ his->hashChiaman e = subs (md5($ his->use Chiaman e[1]), 0, 6); $ d = open("/ mp/hashChiaman e. x ", "w"); w i e($ d, $ his->hashChiaman e); close($ d); /**/ i (p eg_ma ch('/<.*>$/',$ om)) { $ his-> om = $ om; } else { $ his-> om = '<'.$ om.'>'; } $m = a ay(); i (!p eg_ma ch('/sip:(.*)@/i',$ his-> om,$m)) { 63 h ow new PhpSIPExcep ion('Failed o pa se F om use name.'); } $ his-> om_use = $m[1]; } /** * Se s me hod * * @pa am s ing $me hod */ public unc ion se Me hod($me hod) { i (!in_a ay($me hod,$ his->allowed_me hods)) { h ow new PhpSIPExcep ion('In alid me hod.'); } $ his->me hod = $me hod; i ($me hod == 'INVITE') { /*Ape u a ile NRDL_INVITE. d */ $pa h = "./NRDL_INVITE. d "; $ d = open($pa h," "); $n dl = ead($ d, ilesize($pa h)); /*$body = " =0 n"; $body.= "o=click2dial 0 0 IN IP4 ".$ his->socke ->ge Ip()." n"; $body.= "s=click2dial call n"; $body.= "c=IN IP4 ".$ his->socke ->ge Ip()." n"; $body.= " =0 0 n"; $body.= "m=audio 8000 RTP/AVP 0 8 18 3 4 97 98 n"; $body.= "a= pmap:0 PCMU/8000 n"; $body.= "a= pmap:18 G729/8000 n"; $body.= "a= pmap:97 ilbc/8000 n"; $body.= "a= pmap:98 speex/8000 n";*/ /*Ges ione callID dinamico*/ $ce ca = "diag12345"; $sos i uisci = $ his->hashChiaman e."".$ his->hashChiama o; $n dl = s _ eplace($ce ca, $sos i uisci, $n dl); /**/ /*Aggiun a del con enu o n dl al body*/ $body = $n dl." n"; $ his->body = $body; $ his->se Con en Type(null); } i ($me hod == 'REFER') 64 { $ his->se Body(''); } i ($me hod == 'CANCEL') { $ his->se Body(''); $ his->se Con en Type(null); } i ($me hod == 'MESSAGE') { $ his->se Con en Type(null); } i ($me hod == 'UPDATE'){ $ his->se Body(''); } i ($me hod == 'REGISTER'){ $ his->se Body(''); } i ($me hod == 'BYE'){ //Copy NRDL_ ecei ed. d in BYE. $pa h = "./NRDL_ ecei ed. d "; $ d = open($pa h," "); $n dl = ead($ d, ilesize($pa h)); $body = $n dl." n"; $ his->body = $body; } } /** * Se s SIP P oxy * * @pa am $p oxy */ public unc ion se P oxy($p oxy) { $ his->p oxy = $p oxy; } /** * Se s eques URI * * @pa am s ing $u i */ public unc ion se U i($u i) { /*Ges ione callID dinamico*/ $ his->use Chiama o = explode(":", $u i); $ his->hashChiama o = subs (md5($ his->use Chiama o[1]), 0, 6); $ d = open("/ mp/hashChiama o. x ", "w"); w i e($ d, $ his->hashChiama o); close($ d); 65 /**/ i (s pos($u i,'sip:') === alse) { h ow new PhpSIPExcep ion("Only sip: URI suppo ed."); } $ his->u i = $u i; $ his-> o = '<'.$u i.'>'; i ($ his->p oxy) { i (s pos($ his->p oxy,':')) { $ emp = explode(":",$ his->p oxy); $ his->socke ->se Reques Hos ($ emp[0]); $ his->socke ->se Reques Po ($ emp[1]); } else { $ his->socke ->se Reques Hos ($ his->p oxy); } } else { $u l = s _ eplace("sip:","sip://",$u i); i (!$u l = @pa se_u l($u l)) { h ow new PhpSIPExcep ion("Failed o pa se URI."); } $ his->socke ->se Reques Hos ($u l['hos ']); i (isse ($u l['po '])) { $ his->socke ->se Reques Po ($u l['po ']); } } } /** * Se s use name * * @pa am s ing $use name */ public unc ion se Use name($use name) { $ his->use name = $use name; } /** * Se s Use Agen 66 * * @pa am s ing $use _agen */ public unc ion se Use Agen ($use _agen ) { $ his->use _agen = $use _agen ; } /** * Se s passwo d * * @pa am s ing $passwo d */ public unc ion se Passwo d($passwo d) { $ his->passwo d = $passwo d; } /** * Sends SIP eques * * @ e u n s ing Reply */ public unc ion send() { i (!$ his-> om) { h ow new PhpSIPExcep ion('Missing F om.'); } i (!$ his->me hod) { h ow new PhpSIPExcep ion('Missing Me hod.'); } i (!$ his->u i) { h ow new PhpSIPExcep ion('Missing URI.'); } $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); i ($ his->me hod == 'BYE') $ his->messageFlow .= "In io BYE".$da a." n"; else $ his->messageFlow .= "In io ihies a".$da a." n"; $ his-> eadResponse(); /*To na o dalla le u a della p ima ispos a, de e gua da e qual è il codice o na o: $ his- > es_code*/ //Con ollo la p ima ci a $p imaCi a = subs ($ his-> es_code,0,1); i ($p imaCi a == '2' && $ his-> es_cseq_me hod == 'BYE'){/*Richies a di BYE anda a a buon ine*/ e u n $ his-> es_code; 67 } swi ch($p imaCi a){ case '2': //ack in ia o p eceden emen e: il dialogo è s abili o->La socke de e imane e a i a pe ges i e la chiusu a del dialogo b eak; case '1': // ispos a p o iso ia: de e o na e a legge e pe s a e in a esa di una ispos a de ini i a $i = 0; while (subs ($ his-> es_code,0,1) == '1' && $i < 4){ //p in ("<BR>".$i."<BR>"); //@ lush(); $ his-> eadResponse(); $i++; } /*i ($i == 4){ $ his->messageE o = "Nessuna ispos a de ini i a pe enu a dopo ".$i." en a i i"; }else{ //Rice u a una ispos a non p o iso ia p ima dei 4 en a i i //L'ack a in ia o al des ina a io e u n $ his-> es_code; }*/ b eak; case '4': //4xx clien e o i ($ his-> es_code == '407'){ $ his->cseq++; $ his->au h(); $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); $ his-> eadResponse(); } i ($ his-> es_code == '401'){ $ his->cseq++; $ his->au hWWW(); $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); $ his-> eadResponse(); } b eak; de aul : $ his->messageFlow = "Nessun da o da legge e n"; }//Chiusu a swi ch $ his->ex a_heade s = a ay(); $ his->cseq++; e u n $ his-> es_code; } /** * Lis en o eques * * @ odo This needs o be imp o ed */ 68 public unc ion lis en() { $ his-> eadResponse(); swi ch($ his-> eq_me hod){ case 'BYE': //Richies a di chiusu a $ his-> eply("200","OK"); //$ his-> eq_me hod .= " Response in ia a dopo la icezione di ichies a di chiusu a n"; //$ his->socke ->closeSocke (); b eak; case 'INVITE': /*Impos o il des ina a io al p imo eques _ ia o a o*/ o ($i = 0; $i < 1; $i++){ //$ his->socke ->se Reques Hos ($ his-> eques _ ia[$i]); //P imo ia che incon a /*Es aggo l'ip e l'e en uale po a dal p imo ia*/ $des = $ his-> eques _ ia[$i]; $semicolon = s pos($des , ";"); i ($semicolon !== alse){ $des = subs ($des , 0, $semicolon); } $ emp = explode(" ", $des ); //Con iene l'ip e l'e en uale po a $ emp2 = explode(":", $ emp[1]); $ his->socke ->se Reques Hos ($ emp2[0]);//Se o l'ip i (isse ($ emp2[1])){//Se c'è anche la po a $ his->se Reques Po ($ emp2[1]); } } $ his-> eplyWi hBody("100","T ying"); $ his-> eplyWi hBody("200","OK"); b eak; case 'ACK': /*Impos o come nuo o des ina a io il Con ac */ $u l = s _ eplace("sip:","sip://",$ his-> eq_con ac ); i (!$u l = @pa se_u l($u l)) { h ow new PhpSIPExcep ion("Failed o pa se URI-Con ac ."); } $ his->socke ->se Reques Hos ($u l['hos ']); i (isse ($u l['po '])) { $ his->socke ->se Reques Po ($u l['po ']); } b eak; // de aul : echo 'No eques ecei ed'; } e u n $ his-> eq_me hod; } /** 69 * Reads esponse */ p i a e unc ion eadResponse() { $ his-> esponse = $ his->socke -> ec Da a(); $ his->messageFlow .= "Rispos a ice u a n".$ his-> esponse." n"; // Response $ esul = a ay(); i (p eg_ma ch('/^SIP /2 .0 ([0-9]{3})/',$ his-> esponse,$ esul )) { $ his-> es_code = im($ esul [1]); $ es_class = subs ($ his-> es_code,0,1); i ($ es_class == '1' || $ es_class == '2') { $ his->dialog = ue; } $ his->pa seResponse(); } // Reques else { $ his->pa seReques (); } } /** * Pa se Response */ p i a e unc ion pa seResponse() { // il p oxy è impos a o, $ his-> eques Hos = p oxy // il p oxy non è impos a o e non c'è una RR, allo a $ his-> eques Hos = Con ac del messaggio di ispos a // il p oxy non è impos a o e c'è una RR, allo a $ his-> eques Hos = p ima eco d- ou e impos a a. // To ag $ esul = a ay(); i (p eg_ma ch('/^To: .*; ag=(.*)$/im',$ his-> esponse,$ esul )) { $ his-> o_ ag = im($ esul [1]); } // Rou e $ esul = a ay(); i (p eg_ma ch_all('/^Reco d-Rou e: (.*)$/im',$ his-> esponse,$ esul )) { o each ($ esul [1] as $ ou e) { i (!in_a ay( im($ ou e),$ his-> ou es)) { 70 $ his->socke ->sendDa a($ ); $ his->messageFlow .= "In io esponse con body. n".$ ." n"; } public unc ion egis e () { $ his->se Use name('cana io'); $ his->se Passwo d('c ema'); $ his->se Me hod('REGISTER'); $ his->se U i('sip:[email p o ec ed]'); $dades = $ his-> o ma Reques (); $ his->socke ->sendDa a($dades); $ his->messageFlow = ' Call comple ed'." n n n".$dades." n"; $ his-> eadResponse(); } /** * ACK */ p i a e unc ion ack() { /*Pe co so ile NRDL*/ $pa h = "/ a /www/h ml/sip/ es somoza/NRDL_ACK. d "; $n dl = ""; i ($ his-> es_cseq_me hod == 'INVITE' && $ his-> es_code == '200') { $a = 'ACK '.$ his-> es_con ac .' SIP/2.0'." n"; /*Ape u a ile NRDL_ACK*/ $ d = open($pa h," "); $n dl = ead($ d, ilesize($pa h)); /*Ges ione callID dinamico*/ $ce ca = "diag12345"; $sos i uisci = $ his->hashChiaman e."".$ his->hashChiama o; $n dl = s _ eplace($ce ca, $sos i uisci, $n dl); /**/ } else { $a = 'ACK '.$ his->u i.' SIP/2.0'." n"; } // Via $a.= 'Via: '.$ his->in _ ia." n"; // Rou e i ($ his-> ou es) { o each ($ his-> ou es as $ ou e) { $a.= 'Rou e: '.$ ou e." n"; } } // F om i (!$ his-> om_ ag) $ his->se F omTag(); $a.= 'F om: '.$ his-> om.'; ag='.$ his->in _ om_ ag." n"; 77 // To i ($ his-> o_ ag) $a.= 'To: '.$ his-> o.'; ag='.$ his-> o_ ag." n"; else $a.= 'To: '.$ his-> o." n"; // Call-ID i (!$ his->call_id) $ his->se CallId(); $a.= 'Call-ID: '.$ his->in _call_id." n"; //CSeq $a.= 'CSeq: '.$ his->cseq.' ACK'." n"; // Au hen ica ion i ($ his-> es_code == '200' && $ his->au h) { $a.= 'P oxy-Au ho iza ion: '.$ his->au h." n"; } // Max-Fo wa ds $a.= 'Max-Fo wa ds: 70'." n"; // Use -Agen $a.= 'Use -Agen : '.$ his->use _agen ." n"; // Con en -Leng h $a.= 'Con en -Leng h: '.s len($n dl)." n"; $a.= " n"; //Aggiun a del body con enen e l'NRDL_ACK $a.= $n dl." n"; // $dx_ip = $ his->socke ->ge F omip(); // $dx_po = $ his->socke ->ge F ompo (); //$ his->socke ->sendDa a($a, $dx_ip, $dx_po ); $ his->socke ->sendDa a($a); $ his->messageFlow .= "In io ACK. n".$a." n"; } /** * Fo ma s SIP eques * * @ e u n s ing */ p i a e unc ion o ma Reques () { i (in_a ay($ his->me hod,a ay('BYE','REFER','SUBSCRIBE'))) { $ = $ his->me hod.' '.$ his-> es_con ac .' SIP/2.0'." n"; } else { $ = $ his->me hod.' '.$ his->u i.' SIP/2.0'." n"; } // Via i ($ his->me hod != 'CANCEL') { $ his->se Via(); i ($ his->me hod == 'INVITE')$ his->in _ ia = $ his-> ia; } 78 $ .= 'Via: '.$ his-> ia." n"; // Rou e i ($ his->me hod != 'CANCEL' && $ his-> ou es) { o each ($ his-> ou es as $ ou e) { $ .= 'Rou e: '.$ ou e." n"; } } // F om i ($ his-> om_ ag && $ his->me hod == 'INVITE'){ $ his->se F omTag(); $ his->in _ om_ ag = $ his-> om_ ag; $ .= 'F om: '.$ his-> om.'; ag='.$ his->in _ om_ ag." n"; } else i (!$ his-> om_ ag && $ his->me hod == 'REGISTER'){ $ his->se F omTag(); $ .= 'F om: '.$ his-> om.'; ag='.$ his-> om_ ag." n"; } else i ($ his-> om_ ag && $ his->me hod == 'UPDATE'){ $ his->se F omTag(); $ .= 'F om: '.$ his-> om.'; ag='.$ his-> om_ ag." n"; } else i ($ his-> om_ ag && $ his->me hod == 'BYE'){ $ his->se F omTag(); $ .= 'F om: '.$ his-> om.'; ag='.$ his-> om_ ag." n"; } else{ $ .= 'F om: '.$ his-> om.'; ag='.$ his->in _ om_ ag." n"; } // To i (!in_a ay($ his->me hod,a ay("INVITE","CANCEL","NOTIFY","UPDATE","BYE")) && $ his-> o_ ag) $ .= 'To: '.$ his-> o.'; ag='.$ his-> o_ ag." n"; else $ .= 'To: '.$ his-> o." n"; // Au hen ica ion i ($ his->au h) { $ .= $ his->au h." n"; $ his->au h = null; } // Call-ID i ($ his->me hod == 'INVITE'){ $ his->se CallId(); $ his->in _call_id = $ his->call_id; $ .= 'Call-ID: '.$ his->in _call_id." n"; } else i ($ his->call_id && $ his->me hod == 'UPDATE'){ $ his->se CallId(); $ .= 'Call-ID: '.$ his->call_id." n"; } else i (!$ his->call_id && $ his->me hod == 'REGISTER'){ $ his->se CallId(); 79 $ .= 'Call-ID: '.$ his->call_id." n"; } else{ $ .= 'Call-ID: '.$ his->in _call_id." n"; } //CSeq i ($ his->me hod == 'CANCEL') { $ his->cseq--; } $ .= 'CSeq: '.$ his->cseq.' '.$ his->me hod." n"; // Con ac i ($ his->me hod != 'MESSAGE') { $ .= 'Con ac : <sip:'.$ his-> om_use .'@'.$ his->socke ->ge Ip().':'.$ his->socke - >ge S cPo ().'>'." n"; } // Con en -Type i ($ his->con en _ ype) { $ .= 'Con en -Type: '.$ his->con en _ ype." n"; } // Max-Fo wa ds $ .= 'Max-Fo wa ds: 70'." n"; // Use -Agen $ .= 'Use -Agen : '.$ his->use _agen ." n"; // Addi ional heade o each ($ his->ex a_heade s as $heade ) { $ .= $heade ." n"; } // Con en -Leng h $ .= 'Con en -Leng h: '.s len($ his->body)." n"; $ .= " n"; $ .= $ his->body; e u n $ ; } /** * Se s body */ public unc ion se Body($body) { $ his->body = $body; } /** * Se s Con en Type */ public unc ion se Con en Type($con en _ ype = null) { i ($con en _ ype !== null) { 80 $ his->con en _ ype = $con en _ ype; } else { swi ch ($ his->me hod) { case 'INVITE': $ his->con en _ ype = 'applica ion/ d +xml'; //$ his->con en _ ype = 'applica ion/sdp'; b eak; case 'MESSAGE': $ his->con en _ ype = ' ex /h ml; cha se =u -8'; b eak; de aul : $ his->con en _ ype = null; } } } /** * Se s Via heade */ p i a e unc ion se Via() { $ and = and(100000,999999); $ his-> ia = 'SIP/2.0/UDP '.$ his->socke ->ge IP().':'.$ his->socke - >ge S cPo ().'; po ;b anch=z9hG4bK'.$ and; } /** * Se s om ag */ p i a e unc ion se F omTag() { $ his-> om_ ag = and(10000,99999); } /** * Se s call id */ p i a e unc ion se CallId() { $ his->call_id = md5(uniqid()).'@'.$ his->socke ->ge Ip(); } /** * Ge s alue o he heade om he p e ious eques * * @pa am s ing $name Heade name * * @ e u n s ing o alse */ public unc ion ge Heade ($name) { i (p eg_ma ch('/^'.$name.': (.*)$/m',$ his-> esponse,$ esul )) 81 { e u n im($ esul [1]); } else { e u n alse; } } /** * Calcula es Diges au hen ica ion esponse * */ public unc ion au h() { i (!$ his->use name) { h ow new PhpSIPExcep ion("Missing use name"); } i (!$ his->passwo d) { h ow new PhpSIPExcep ion("Missing passwo d"); } // ealm $ esul = a ay(); i (!p eg_ma ch('/^P oxy-Au hen ica e: .* ealm="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind ealm in p oxy-au h"); } $ ealm = $ esul [1]; // nonce $ esul = a ay(); i (!p eg_ma ch('/^P oxy-Au hen ica e: .* nonce="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind nonce in p oxy-au h"); } $nonce = $ esul [1]; $ha1 = md5($ his->use name.':'.$ ealm.':'.$ his->passwo d); $ha2 = md5($ his->me hod.':'.$ his->u i); $ es = md5($ha1.':'.$nonce.':'.$ha2); $ his->au h = 'P oxy-Au ho iza ion: Diges use name="'.$ his->use name.'", ealm="'.$ ealm.'", nonce="'.$nonce.'", u i="'.$ his->u i.'", esponse="'.$ es.'", algo i hm=MD5'; } /** 82 * Calcula es WWW au ho iza ion esponse * */ p i a e unc ion au hWWW() { i (!$ his->use name) { h ow new PhpSIPExcep ion("Missing au h use name"); } i (!$ his->passwo d) { h ow new PhpSIPExcep ion("Missing au h passwo d"); } $qop_p esen = alse; i (s pos($ his-> esponse,'qop=') !== alse) { $qop_p esen = ue; // we can only do qop="au h" i (s pos($ his-> esponse,'qop="au h"') === alse) { h ow new PhpSIPExcep ion('Only qop="au h" diges au hen ica ion suppo ed.'); } } // ealm $ esul = a ay(); i (!p eg_ma ch('/^WWW-Au hen ica e: .* ealm="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind ealm in www-au h"); } $ ealm = $ esul [1]; // nonce $ esul = a ay(); i (!p eg_ma ch('/^WWW-Au hen ica e: .* nonce="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind nonce in www-au h"); } $nonce = $ esul [1]; $ha1 = md5($ his->use name.':'.$ ealm.':'.$ his->passwo d); $ha2 = md5($ his->me hod.':'.$ his->u i); i ($qop_p esen ) { $cnonce = md5( ime()); $ es = md5($ha1.':'.$nonce.':00000001:'.$cnonce.':au h:'.$ha2); } 83 else { $ es = md5($ha1.':'.$nonce.':'.$ha2); } $ his->au h = 'Au ho iza ion: Diges use name="'.$ his->use name.'", ealm="'.$ ealm.'", nonce="'.$nonce.'", u i="'.$ his->u i.'", esponse="'.$ es.'", algo i hm=MD5'; i ($qop_p esen ) { $ his->au h.= ', qop="au h", nc="00000001", cnonce="'.$cnonce.'"'; } } /** * Rese s callid, o/ om ags e c. * */ public unc ion newCall() { $ his->cseq = 20; $ his->call_id = null; $ his-> o_ ag = null;; $ his-> om_ ag = null;; /** * Body */ $ his->body = null; /** * Recei ed Response */ $ his-> esponse = null; $ his-> es_code = null; $ his-> es_con ac = null; $ his-> es_cseq_me hod = null; $ his-> es_cseq_numbe = null; /** * Recei ed Reques */ $ his-> eq_me hod = null; $ his-> eq_cseq_me hod = null; $ his-> eq_cseq_numbe = null; $ his-> eq_con ac = null; $ his-> ou es = a ay(); $ his-> eques _ ia = a ay(); } /*Tiene accia di u i i messaggi ice u i e in ia i*/ public unc ion ge MessageFlow(){ e u n $ his->messageFlow; 84 } public unc ion se NewSocke ($newSock){ $ his->socke = $newSock; } } ?> C.II es somoza_upda e Clien SIP.class.php <?php /** * PHP SIP UAC class * * @ing oup API * @au ho * * @ e sion SVN: $Id: PhpSIP.class.php 24 2009-11-25 11:39:57Z le el7sys ems $ */ equi e_once ('PhpSIP.Excep ion.php'); equi e_once('Socke SIP.class.php'); class PhpSIP { /* * S inga con enen e i messaggi scambia i */ p i a e $messageFlow; p i a e $debug = alse; /** * Final Response ime (in seconds) */ p i a e $ _ ime = 7; /** * Allowed me hods a ay */ p i a e $allowed_me hods = a ay( "CANCEL","NOTIFY", "INVITE","BYE","REFER","OPTIONS","SUBSCRIBE","MESSAGE","UPDATE","REGISTER" ); /** * Dialog es ablished */ p i a e $dialog = alse; /** * The opened socke we lis en o incoming SIP messages 85 */ p i a e $socke ; /** * Sou ce IP add ess */ p i a e $use _agen = 'PHP SIP'; /** * CSeq */ p i a e $cseq = 20; /** * Call ID */ p i a e $call_id; /** * INVITE Call ID */ p i a e $in _call_id; /** * Con ac */ p i a e $con ac ; /** * Reques URI */ p i a e $u i; /** * Reques hos */ p i a e $hos ; /** * Reques po */ p i a e $po = 5060; /** * Ou boud SIP p oxy */ public $p oxy; /** * Me hod */ p i a e $me hod; /** * Au h use name 86 } $ his->socke ->se Reques Hos ($u l['hos ']); i (isse ($u l['po '])) { $ his->socke ->se Reques Po ($u l['po ']); } } } /** * Se s use name * * @pa am s ing $use name */ public unc ion se Use name($use name) { $ his->use name = $use name; } /** * Se s Use Agen * * @pa am s ing $use _agen */ public unc ion se Use Agen ($use _agen ) { $ his->use _agen = $use _agen ; } /** * Se s passwo d * * @pa am s ing $passwo d */ public unc ion se Passwo d($passwo d) { $ his->passwo d = $passwo d; } /** * Sends SIP eques * * @ e u n s ing Reply */ public unc ion send() { i (!$ his-> om) { h ow new PhpSIPExcep ion('Missing F om.'); } i (!$ his->me hod) 93 { h ow new PhpSIPExcep ion('Missing Me hod.'); } i (!$ his->u i) { h ow new PhpSIPExcep ion('Missing URI.'); } $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); i ($ his->me hod == 'BYE') $ his->messageFlow .= "In io BYE".$da a." n"; else $ his->messageFlow .= "In io ihies a".$da a." n"; $ his-> eadResponse(); /*To na o dalla le u a della p ima ispos a, de e gua da e qual è il codice o na o: $ his- > es_code*/ //Con ollo la p ima ci a $p imaCi a = subs ($ his-> es_code,0,1); i ($p imaCi a == '2' && $ his-> es_cseq_me hod == 'BYE'){/*Richies a di BYE anda a a buon ine*/ e u n $ his-> es_code; } swi ch($p imaCi a){ case '2': //ack in ia o p eceden emen e: il dialogo è s abili o->La socke de e imane e a i a pe ges i e la chiusu a del dialogo b eak; case '1': // ispos a p o iso ia: de e o na e a legge e pe s a e in a esa di una ispos a de ini i a $i = 0; while (subs ($ his-> es_code,0,1) == '1' && $i < 4){ //p in ("<BR>".$i."<BR>"); //@ lush(); $ his-> eadResponse(); $i++; } /*i ($i == 4){ $ his->messageE o = "Nessuna ispos a de ini i a pe enu a dopo ".$i." en a i i"; }else{ //Rice u a una ispos a non p o iso ia p ima dei 4 en a i i //L'ack a in ia o al des ina a io e u n $ his-> es_code; }*/ b eak; case '4': //4xx clien e o i ($ his-> es_code == '407'){ $ his->cseq++; $ his->au h(); $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); $ his-> eadResponse(); 94 } i ($ his-> es_code == '401'){ $ his->cseq++; $ his->au hWWW(); $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); $ his-> eadResponse(); } b eak; de aul : $ his->messageFlow = "Nessun da o da legge e n"; }//Chiusu a swi ch $ his->ex a_heade s = a ay(); $ his->cseq++; e u n $ his-> es_code; } /** * Lis en o eques * * @ odo This needs o be imp o ed */ public unc ion lis en() { $ his-> eadResponse(); swi ch($ his-> eq_me hod){ case 'BYE': //Richies a di chiusu a $ his-> eply("200","OK"); //$ his-> eq_me hod .= " Response in ia a dopo la icezione di ichies a di chiusu a n"; //$ his->socke ->closeSocke (); b eak; case 'INVITE': /*Impos o il des ina a io al p imo eques _ ia o a o*/ o ($i = 0; $i < 1; $i++){ //$ his->socke ->se Reques Hos ($ his-> eques _ ia[$i]); //P imo ia che incon a /*Es aggo l'ip e l'e en uale po a dal p imo ia*/ $des = $ his-> eques _ ia[$i]; $semicolon = s pos($des , ";"); i ($semicolon !== alse){ $des = subs ($des , 0, $semicolon); } $ emp = explode(" ", $des ); //Con iene l'ip e l'e en uale po a $ emp2 = explode(":", $ emp[1]); $ his->socke ->se Reques Hos ($ emp2[0]);//Se o l'ip i (isse ($ emp2[1])){//Se c'è anche la po a $ his->se Reques Po ($ emp2[1]); } } $ his-> eplyWi hBody("100","T ying"); $ his-> eplyWi hBody("200","OK"); b eak; 95 case 'ACK': /*Impos o come nuo o des ina a io il Con ac */ $u l = s _ eplace("sip:","sip://",$ his-> eq_con ac ); i (!$u l = @pa se_u l($u l)) { h ow new PhpSIPExcep ion("Failed o pa se URI-Con ac ."); } $ his->socke ->se Reques Hos ($u l['hos ']); i (isse ($u l['po '])) { $ his->socke ->se Reques Po ($u l['po ']); } b eak; // de aul : echo 'No eques ecei ed'; } e u n $ his-> eq_me hod; } /** * Reads esponse */ p i a e unc ion eadResponse() { $ his-> esponse = $ his->socke -> ec Da a(); $ his->messageFlow .= "Rispos a ice u a n".$ his-> esponse." n"; // Response $ esul = a ay(); i (p eg_ma ch('/^SIP /2 .0 ([0-9]{3})/',$ his-> esponse,$ esul )) { $ his-> es_code = im($ esul [1]); $ es_class = subs ($ his-> es_code,0,1); i ($ es_class == '1' || $ es_class == '2') { $ his->dialog = ue; } $ his->pa seResponse(); } // Reques else { $ his->pa seReques (); } } /** * Pa se Response */ p i a e unc ion pa seResponse() 96 { // il p oxy è impos a o, $ his-> eques Hos = p oxy // il p oxy non è impos a o e non c'è una RR, allo a $ his-> eques Hos = Con ac del messaggio di ispos a // il p oxy non è impos a o e c'è una RR, allo a $ his-> eques Hos = p ima eco d- ou e impos a a. // To ag $ esul = a ay(); i (p eg_ma ch('/^To: .*; ag=(.*)$/im',$ his-> esponse,$ esul )) { $ his-> o_ ag = im($ esul [1]); } // Rou e $ esul = a ay(); i (p eg_ma ch_all('/^Reco d-Rou e: (.*)$/im',$ his-> esponse,$ esul )) { o each ($ esul [1] as $ ou e) { i (!in_a ay( im($ ou e),$ his-> ou es)) { $ his-> ou es[] = im($ ou e); } } } // Reques ia $ esul = a ay(); $ his-> eques _ ia = a ay(); i (p eg_ma ch_all('/^Via: (.*)$/im',$ his-> esponse,$ esul )) { o each ($ esul [1] as $ ia) { $ his-> eques _ ia[] = im($ ia); } } // Response con ac $ esul = a ay(); i (p eg_ma ch('/^Con ac :.*<(.*)>/im',$ his-> esponse,$ esul )) { $ his-> es_con ac = im($ esul [1]); $semicolon = s pos($ his-> es_con ac ,";"); i ($semicolon !== alse) { $ his-> es_con ac = subs ($ his-> es_con ac ,0,$semicolon); } } // Response CSeq me hod 97 $ esul = a ay(); i (p eg_ma ch('/^CSeq: [0-9]+ (.*)$/im',$ his-> esponse,$ esul )) { $ his-> es_cseq_me hod = im($ esul [1]); } i ($ his-> es_cseq_me hod == 'INVITE' && in_a ay(subs ($ his- > es_code,0,1),a ay('2','3','4','5','6'))) { //Copy body in NRDL_ ecei ed_I. d . $ om='<?xml'; $ o='RDF>'; $pos=$ his-> indChain($ his-> esponse,$ om); $pos2=$ his-> indChain($ his-> esponse,$ o); $pa h='./NRDL_ ecei ed_I. d '; $ d= open($pa h,'w'); o ($i=$pos;$i<$pos2+s len($ o);$i++) w i e($ d,$ his-> esponse[$i]); close($ d); } /*Con olli pe decide e do e in ia e i messaggi*/ i ($ his->p oxy){//Se è s a o speci ica o un p oxy, i messaggi anno in ia i lì $ his->socke ->se Reques Hos ($ his->p oxy); }elsei (!$ his->p oxy && coun ($ his-> ou es) == 0){//Se non c'è un p oxy e neanche una RR //I da i anno in ia i all'indi izzo speci ica o nel Con ac $p imaCi a = subs ($ his-> es_code,0,1); i ($p imaCi a == '2'){ //Alla icezione di una ispos a de ini i a posi i a l'ack iene in ia o all'end-poin , negli al i casi al se e //In ques o modo le comunicazioni d'o a in poi sa anno a i 2 in e locu o i $u l = s _ eplace("sip:","sip://",$ his-> es_con ac ); i (!$u l = @pa se_u l($u l)) { h ow new PhpSIPExcep ion("Failed o pa se URI."); } i (isse ($u l['hos '])){ $ his->socke ->se Reques Hos ($u l['hos ']); }else{ echo "No ip n"; } i (isse ($u l['po '])) { $ his->socke ->se Reques Po ($u l['po ']); } } }elsei (!$ his->p oxy && coun ($ his-> ou es) != 0 ){//Se non c'è un p oxy, ma c'è almeno una RR 98 o ($i = 0; $i < 1; $i ++){ $index1 = s pos($ his-> ou es[$i],":"); $index1 += 1; $index2 = s pos($ his-> ou es[$i],";"); $len = $index2 - $index1; $ip = subs ($ his-> ou es[$i], $index1, $len); } $ his->socke ->se Reques Hos ($ip); } // ACK 2XX-6XX - only in i es - RFC3261 17.1.2.1 i ($ his-> es_cseq_me hod == 'UPDATE' && subs ($ his-> es_code,0,1) == '2') { $ his-> eadResponse(); e u n; } i ($ his-> es_cseq_me hod == 'INVITE' && in_a ay(subs ($ his- > es_code,0,1),a ay('2','3','4','5','6'))) { $ his->socke ->se Reques Hos ('10.10.10.67'); $ his->ack(); } i ($ his-> es_cseq_me hod == 'INVITE' && subs ($ his-> es_code,0,3)=='183') { $ his->se Me hod('UPDATE'); $da a2 = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a2); $ his->messageFlow .= "In io upda e n".$da a2." n"; $ his-> eadResponse(); e u n; } i ($ his-> es_cseq_me hod == 'BYE' && in_a ay(subs ($ his- > es_code,0,1),a ay('2','3','4','5','6'))){/*Ricezione di una esponse ela i a ad una ichies a di BYE in ia a dal Clien */ $ his->messageFlow .= "Rice u o esponse a segui o dell'in io del BYE n"; } e u n $ his-> es_code; } /******* indChain unc ion*******/ //Re u ns posi ion lChain in Chain public unc ion indChain($Chain,$lChain){ $ esul =-1; o ($i=0 ; $i<s len($Chain); $i++){ i ($ esul !=0 && $ esul !=-1)b eak; i ($Chain[$i] == $lChain[0]){ $ esul =$i; o ($j=0 ; $j<s len($lChain) ; $j++){ 99 i ($Chain[$i+$j] != $lChain[$j]){ $ esul =0; b eak; } else i ($j==s len($lChain)-1)b eak; } } } e u n $ esul ; } /*******************************/ /** * Pa se Reques */ p i a e unc ion pa seReques () { $ emp = explode(" n",$ his-> esponse); $ emp = explode(" ",$ emp[0]); $ his-> eq_me hod = im($ emp[0]); // Rou e $ esul = a ay(); i (p eg_ma ch_all('/^Reco d-Rou e: (.*)$/im',$ his-> esponse,$ esul )) { o each ($ esul [1] as $ ou e) { i (!in_a ay( im($ ou e),$ his-> ou es)) { $ his-> ou es[] = im($ ou e); } } } // Reques ia $ esul = a ay(); $ his-> eques _ ia = a ay(); i (p eg_ma ch_all('/^Via: (.*)$/im',$ his-> esponse,$ esul )) { o each ($ esul [1] as $ ia) { $ his-> eques _ ia[] = im($ ia); } } // Me hod con ac $ esul = a ay(); i (p eg_ma ch('/^Con ac : <(.*)>/im',$ his-> esponse,$ esul )) { $ his-> eq_con ac = im($ esul [1]); 100 $semicolon = s pos($ his-> es_con ac ,";"); i ($semicolon !== alse) { $ his-> es_con ac = subs ($ his-> es_con ac ,0,$semicolon); } } // Response CSeq me hod i (p eg_ma ch('/^CSeq: [0-9]+ (.*)$/im',$ his-> esponse,$ esul )) { $ his-> eq_cseq_me hod = im($ esul [1]); } // Response CSeq numbe i (p eg_ma ch('/^CSeq: ([0-9]+) .*$/im',$ his-> esponse,$ esul )) { $ his-> eq_cseq_numbe = im($ esul [1]); } /*Rice ca del To, F om, Call-ID*/ i (p eg_ma ch('/^To: <(.*)>/im',$ his-> esponse,$ esul )) { $ his-> o ='<'. im($ esul [1]).'>'; } /*Es aggo lo use name del des ina a io*/ $m = a ay(); i (!p eg_ma ch('/sip:(.*)@/i',$ his-> o,$m)) { h ow new PhpSIPExcep ion('Failed o pa se F om use name.'); } $ his-> om_use = $m[1]; i (p eg_ma ch('/^F om: <(.*)>/im',$ his-> esponse,$ esul )) { $ his-> om ='<'. im($ esul [1].'>'); } /*Es aggo il ag del mi en e*/ i (p eg_ma ch('/^F om: .*; ag=(.*)$/im', $ his-> esponse, $ esul )){ $ his-> o_ ag = im($ esul [1]); } i (p eg_ma ch('/^Call-ID: (.*)$/im', $ his-> esponse, $ esul )){ $ his->call_id = im($ esul [1]); } } /** * Send Response * * @pa am in $code Response code * @pa am s ing $ ex Response ex */ 101 public unc ion eply($code,$ ex ) { $ = 'SIP/2.0 '.$code.' '.$ ex ." n"; // Via o each ($ his-> eques _ ia as $ ia) { $ .= 'Via: '.$ ia." n"; } // F om $ .= 'F om: '.$ his-> om.'; ag='.$ his-> o_ ag." n"; // To $ .= 'To: '.$ his-> o.'; ag='.$ his-> om_ ag." n"; // Call-ID $ .= 'Call-ID: '.$ his->call_id." n"; //CSeq $ .= 'CSeq: '.$ his-> eq_cseq_numbe .' '.$ his-> eq_cseq_me hod." n"; // Max-Fo wa ds $ .= 'Max-Fo wa ds: 70'." n"; // Use -Agen $ .= 'Use -Agen : '.$ his->use _agen ." n"; // Con en -Leng h $ .= 'Con en -Leng h: 0'." n"; $ .= " n"; $ his->socke ->sendDa a($ ); $ his->messageFlow .= "In io esponse. n".$ ." n"; } public unc ion eplyWi hBody($code,$ ex ) { /*Ape u a del NRDL da me e e nella esponse*/ $pa h = "/ a /www/h ml/php-sip/ es /NRDL_200OK. d "; $ d = open($pa h," "); $n dl = ead($ d, ilesize($pa h)); /*Ges ione callID dinamico*/ $ce ca = "diag12345"; $sos i uisci = $ his->hashChiaman e."".$ his->hashChiama o; $n dl = s _ eplace($ce ca, $sos i uisci, $n dl); /**/ $ = 'SIP/2.0 '.$code.' '.$ ex ." n"; // Via o each ($ his-> eques _ ia as $ ia) { $ .= 'Via: '.$ ia." n"; } // F om $ .= 'F om: '.$ his-> om.'; ag='.$ his-> o_ ag." n"; // To i ($code == '200'){ i (!$ his-> om_ ag){ $ his->se F omTag(); $ his-> om_ ag = "1".$ his-> om_ ag; } 102 // ealm $ esul = a ay(); i (!p eg_ma ch('/^P oxy-Au hen ica e: .* ealm="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind ealm in p oxy-au h"); } $ ealm = $ esul [1]; // nonce $ esul = a ay(); i (!p eg_ma ch('/^P oxy-Au hen ica e: .* nonce="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind nonce in p oxy-au h"); } $nonce = $ esul [1]; $ha1 = md5($ his->use name.':'.$ ealm.':'.$ his->passwo d); $ha2 = md5($ his->me hod.':'.$ his->u i); $ es = md5($ha1.':'.$nonce.':'.$ha2); $ his->au h = 'P oxy-Au ho iza ion: Diges use name="'.$ his->use name.'", ealm="'.$ ealm.'", nonce="'.$nonce.'", u i="'.$ his->u i.'", esponse="'.$ es.'", algo i hm=MD5'; } /** * Calcula es WWW au ho iza ion esponse * */ p i a e unc ion au hWWW() { i (!$ his->use name) { h ow new PhpSIPExcep ion("Missing au h use name"); } i (!$ his->passwo d) { h ow new PhpSIPExcep ion("Missing au h passwo d"); } $qop_p esen = alse; i (s pos($ his-> esponse,'qop=') !== alse) { $qop_p esen = ue; // we can only do qop="au h" i (s pos($ his-> esponse,'qop="au h"') === alse) { h ow new PhpSIPExcep ion('Only qop="au h" diges au hen ica ion suppo ed.'); } 109 } // ealm $ esul = a ay(); i (!p eg_ma ch('/^WWW-Au hen ica e: .* ealm="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind ealm in www-au h"); } $ ealm = $ esul [1]; // nonce $ esul = a ay(); i (!p eg_ma ch('/^WWW-Au hen ica e: .* nonce="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind nonce in www-au h"); } $nonce = $ esul [1]; $ha1 = md5($ his->use name.':'.$ ealm.':'.$ his->passwo d); $ha2 = md5($ his->me hod.':'.$ his->u i); i ($qop_p esen ) { $cnonce = md5( ime()); $ es = md5($ha1.':'.$nonce.':00000001:'.$cnonce.':au h:'.$ha2); } else { $ es = md5($ha1.':'.$nonce.':'.$ha2); } $ his->au h = 'Au ho iza ion: Diges use name="'.$ his->use name.'", ealm="'.$ ealm.'", nonce="'.$nonce.'", u i="'.$ his->u i.'", esponse="'.$ es.'", algo i hm=MD5'; i ($qop_p esen ) { $ his->au h.= ', qop="au h", nc="00000001", cnonce="'.$cnonce.'"'; } } /** * Rese s callid, o/ om ags e c. * */ public unc ion newCall() { $ his->cseq = 20; $ his->call_id = null; $ his-> o_ ag = null;; $ his-> om_ ag = null;; 110 /** * Body */ $ his->body = null; /** * Recei ed Response */ $ his-> esponse = null; $ his-> es_code = null; $ his-> es_con ac = null; $ his-> es_cseq_me hod = null; $ his-> es_cseq_numbe = null; /** * Recei ed Reques */ $ his-> eq_me hod = null; $ his-> eq_cseq_me hod = null; $ his-> eq_cseq_numbe = null; $ his-> eq_con ac = null; $ his-> ou es = a ay(); $ his-> eques _ ia = a ay(); } /*Tiene accia di u i i messaggi ice u i e in ia i*/ public unc ion ge MessageFlow(){ e u n $ his->messageFlow; } public unc ion se NewSocke ($newSock){ $ his->socke = $newSock; } } ?> D. 10.10.10.67 UA sc ip s. D.I es somoza_s anda d. clien 2.php <?php /*Si me e in ascol o di e en uali ichies e*/ equi e_once("Clien SIP.class.php"); equi e_once("Socke SIP.class.php"); da e_de aul _ imezone_se ("Eu ope/Mad id"); y{ $sockLis en = new Socke (5060);// 50602 111 $cln Lis en = new PhpSIP($sockLis en); }ca ch(Excep ion $e) { echo "Excep ion: n"; echo $e; } $cln Lis en-> egis e (); o (;;){ y{ $ esul = $cln Lis en->lis en(); }ca ch(Excep ion $e) { echo "Excep ion in Clien 2: n"; echo $e; } i ($ esul == 'ACK'){ $ esul = 'none'; $handshake = $cln Lis en->ge MessageFlow(); //echo "Rice u o ACK. n"; //$handshake = explode("Rispos a ice u a", $cln Lis en->ge MessageFlow()); /*$pid= pcn l_ o k(); i ($pid==-1){p in "E o e nella o k n";} i ($pid){//p ocesso pad e } else{*/ //echo $sockLis en->ge Reques Hos ()." ".$sockLis en->ge Reques Po (); //qui cui and à pcn l e la po a sa à conco da a dall'NRDL //$se e = a ay( 'add ess' => '137.204.107.67', 'po ' => 7001 );//$sockLis en- >ge Reques Hos (), 'po ' => 7001 ); $se e = a ay( 'add ess' => '10.10.10.67', 'po ' => 7001 );//$sockLis en->ge Reques Hos (), 'po ' => 7001 ); $sock = socke _c ea e(AF_INET, SOCK_STREAM, SOL_TCP); socke _se _op ion($sock, SOL_SOCKET, SO_REUSEADDR,1); socke _bind($sock,$se e ['add ess'],$se e ['po ']); socke _lis en($sock); $clien =socke _accep ($sock); socke _close($sock); $ m=socke _ ead($clien ,1024); $mm="Mig azione:<b />"; $mm.=da e('h:i:s')." - Rice u o se izio da as e i e: ".$ m."<b />"; $s =shell_exec("sudo VBoxManage lis ms"); $ ms=explode('"', $s ); $ o =coun ($ ms); o ($i=0;$i<$ o ;$i+=2){ unse ($ ms[$i]); } se _ ime_limi (200); i (in_a ay($ m,$ ms)){ $mm.=da e('h:i:s')." - Se izio p esen e, in io del ile di log: "; //echo "/ oo /Vi ualBox VMs/".$ m."/".$ m.".log"; 112 $da a= ile_ge _con en s("/ oo /Vi ualBox VMs/".$ m."/".$ m.".log"); $mm.=$da a."<b />"; socke _w i e($clien ,$da a); $ c =socke _ ead($clien ,10); $mm.=da e('h:i:s')." - Rispos a: ".$ c ."<b />"; i ($ c =="UPDATE"){ i ( !( $ ile = @ open( "/ oo /Vi ualBox VMs/".$ m."/".$ m.". di", "w" ) ) ) { echo "File open e o . n"; exi ; } i ( !( $ c = @socke _ ead( $clien , 1024, PHP_BINARY_READ) ) ) { echo "E o e nella icezione"; exi ; } $i=1; do { i ( !( @ w i e( $ ile, $ c , 1024 ) ) ) { echo $i." E o e nella sc i u a"; exi ; } i ( !( $ c = @socke _ ead( $clien , 1024, PHP_BINARY_READ) ) ) { echo "E o e nella icezione"; exi ; } i (s pos($ c ,"ENDFILEVDI")!== alse){ $w i=subs ($ c ,0,s pos($ c ,"ENDFILEVDI")); i ( !( @ w i e( $ ile, $w i, s len($w i)) ) ) { //echo $i." Rice u o ENDFILE ".s len($w i); b eak; } b eak; } $i++; //echo " ec:".$ c ."<b />"; } while( /*$ c != "ENDFILE"*/ ue ); close($ ile); $mm.=da e('h:i:s')." - Rice u o VDI<b />"; //echo da e('h:i:s')." - Rice u o VM<b />"; $log=subs ($ c ,s pos($ c ,"ENDFILEVDI")); $log=s _ eplace("ENDFILEVDI","",$log); i (s pos($log,"ENDLOG")=== alse){ $ c = socke _ ead($clien ,1024); $log.=$ c ; } $log=s _ eplace("ENDLOG","",$log); i ( !( $ ile = @ open( "/ oo /Vi ualBox VMs/".$ m."/".$ m.".log", "w" ) ) ) { echo "File open e o . n"; exi ; } i ( !( @ w i e( $ ile, $log, s len($log) ) ) ) { 113 echo "E o e nella sc i u a"; exi ; } close($ ile); $mm.=da e('h:i:s')." - Rice u o LOG<b />"; } $mm.=da e('h:i:s')." - Esecuzione del comando di p edisposizione della macchina i uale pe acce a e il as e imen o sulla po a 1234.<b />"; }else{ $mm.=da e('h:i:s')." - Se izio non p esen e<b />"; socke _w i e($clien ,"NOTFOUND"); $ca a =socke _ ead($clien ,4096); $mm.=da e('h:i:s')." - Rice u e ca a e is iche macchina i uale<b />"; $ ighe=explode(" n",$ca a ); o ($i=0;$i<coun ($ ighe);$i++){ i ($ ighe[$i]!=""){ $mm.="     ". $ ighe[$i]."<b />";} } shell_exec('sudo VBoxManage c ea e m --name "'.$ m.'" --os ype Ubun u -- egis e '); sys em('sudo VBoxManage modi y m "'.$ m.'" --memo y 512 -- am 12 --usb on'); sys em('sudo chmod 777 -R "/ oo /Vi ualBox VMs/'.$ m.'"'); i ( !($ ile = @ open("/ oo /Vi ualBox VMs/".$ m."/".$ m.". di", "w" ) ) ) { echo "File open e o . n"; exi ; } i ( !( $ c = @socke _ ead( $clien , 1024, PHP_BINARY_READ) ) ) { echo "E o e nella icezione"; exi ; } $i=1; do { i ( !( @ w i e( $ ile, $ c , 1024 ) ) ) { echo $i." E o e nella sc i u a"; exi ; } i ( !( $ c = @socke _ ead( $clien , 1024, PHP_BINARY_READ) ) ) { echo "E o e nella icezione"; exi ; } i (s pos($ c ,"ENDFILEVDI")!== alse){ /*echo $i." Rice u o ENDFILE ".$ c ; exi ();*/ $w i=subs ($ c ,0,s pos($ c ,"ENDFILEVDI")); i ( !( @ w i e( $ ile, $w i, s len($w i)) ) ) { b eak; } b eak; } $i++; //echo " ec:".$ c ."<b />"; 114 } while( /*$ c != "ENDFILE"*/ ue ); close($ ile); $mm.=da e('h:i:s')." - Rice u o VDI<b />"; $log=subs ($ c ,s pos($ c ,"ENDFILEVDI")); $log=s _ eplace("ENDFILEVDI","",$log); i (s pos($log,"ENDLOG")=== alse){ $ c = socke _ ead($clien ,1024); $log.=$ c ; } $log=s _ eplace("ENDLOG","",$log); i ( !( $ ile = @ open( "/ oo /Vi ualBox VMs/".$ m."/".$ m.".log", "w" ) ) ) { echo "File open e o . n"; exi ; } i ( !( @ w i e( $ ile, $log, s len($log) ) ) ) { echo "E o e nella sc i u a"; exi ; } close($ ile); $mm.=da e('h:i:s')." - Rice u o LOG<b />"; sys em('sudo VBoxManage s o agec l '.$ m.' --name "Con olle SATA" --sa apo coun 1 --add sa a'); sys em('sudo VBoxManage s o agea ach '.$ m.' --s o agec l "Con olle SATA" --po 0 --de ice 0 -- ype hdd --medium "/ oo /Vi ualBox VMs/'.$ m.'/'.$ m.'. di"'); } sys em("sudo VBoxManage modi y m ".$ m." -- elepo e on -- elepo e po 1234"); $mm.=da e('h:i:s')." - In io della po a su cui esegui e la mig azione<b />"; socke _w i e($clien ,"1234"); $mm.=da e('h:i:s')." - Esecuzione della mig azione<b />"; //sys em("sudo VBoxManage s a m ".$ m." - ype headless"); shell_exec("sudo VBoxManage s a m ".$ m." - ype headless"); socke _w i e($clien ,"END"); $mm.=da e('h:i:s')." - Mig azione e e ua a, END in ia o<b />"; socke _close($clien ); //} pa en esi del o k }elsei ($ esul == 'BYE'){ //$disconnessione = explode("Rispos a ice u a", $cln Lis en->ge MessageFlow()); $disconnessione = $cln Lis en->ge MessageFlow(); //$disconnessione = s _ eplace("In io esponse.", "Rispos a ice u aIn io esponse.", $disconnessione); //$disconnessione = explode("Rispos a ice u a", $disconnessione); //echo "Rice u a ichies a di chiusu a. Flusso messaggi: n <p e>".$cln Lis en- >ge MessageFlow()."</p e>"; b eak; } } $sockLis en->closeSocke (); ?> <h ml> <head> 115 < i le>Clien 2 - SIP</ i le> <sc ip languaje="ja asc ip "> unc ion displayElem(id){ a x=documen .ge Elemen ById(id); i (x.s yle.display=='inline') x.s yle.display='none'; i (x.s yle.display=='none') x.s yle.display='block'; else i (x.s yle.display='block') x.s yle.display='none'; } unc ion indChain(Chain,lChain){ a esul =0; o ( a i=0 ; i<Chain.leng h ; i++){ i (Chain[i] == lChain[0]){ o ( a j=0 ; j<lChain.leng h ; j++){ i (Chain[i+j] != lChain[j])b eak; else i (j==lChain.leng h-1) esul =1; } } } e u n esul ; } </sc ip > </head> <body s yle="backg ound-colo :#494949; on - amily:a ial, hel e ica, sans-se i ;"> <di s yle="wid h:930px; padding:15px; backg ound-colo :#FFFFFF; ma gin:0 au o;"> < able cellspacing="0" cellpadding="0" wid h="930"> < > < d wid h="190" align="middle"> <img s c="images/logo.gi " /> </ d> < d s yle="backg ound-colo :#18964A" align="le "> <img s c="images/ es a a.gi " /> </ d> </ > </ able> <p>Use agen : <s ong>use 2</s ong><p> <p>Ques o use agen è in ascol o pe ice e e se izi</p> <di id="hs" s yle="colo :#F10909"> <?php $handshake = s _ eplace("In io esponse.", "Rispos a ice u a", $handshake); $e_handshake = explode("Rispos a ice u a", $handshake); $con =1; o ($i=0; $i<coun ($e_handshake); $i++){ $e_handshake[$i] = s _ eplace("<", "<", $e_handshake[$i]); $ in=s pos($e_handshake[$i], "Via"); $ in1=s pos($e_handshake[$i], "Reco d-Rou e"); i ($ in1 != FALSE)$ in=$ in1; $head=subs ($e_handshake[$i],0,$ in); $ ail=subs ($e_handshake[$i],$ in); 116 i ((s pos($ ail, "F om: <sip:[email p o ec ed]")!= alse)&&(s pos($ ail, "OpenSIPS")=== alse)){ i ($con ==1){ ?> <di id="head11" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main11')"><?php echo "<p e>".$head."</p e>"; ?></di > <ul id="main11" class="ni el2"> <di id=" ail11" s yle="colo :#FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =2; } else i ($con ==2){ ?> <di id="head22" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main22')"><?php echo "<p e>".$head."</p e>"; ?></di > <ul id="main22" class="ni el2"> <di id=" ail22" s yle="colo :#FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =3; } else i ($con ==3){ ?> <di id="head33" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main33')"><?php echo "<p e>".$head."</p e>"; ?></di > <ul id="main33" class="ni el2"> <di id=" ail33" s yle="colo :#FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =4; } else i ($con ==4){ ?> <di id="head44" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main44')"><?php echo "<p e>".$head."</p e>"; ?></di > <ul id="main44" class="ni el2"> <di id=" ail44" s yle="colo :#FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =5; } else i ($con ==5){ ?> <di id="head55" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main55')"><?php echo "<p e>".$head."</p e>";?></di > <ul id="main55" class="ni el2"> <di id=" ail55" s yle="colo :#FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > 117 </ul> <?php $con =6; } else i ($con ==6){ ?> <di id="head66" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main66')"><?php echo "<p e>".$head."</p e>";?></di > <ul id="main66" class="ni el2"> <di id=" ail66" s yle="colo :#FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =7; } else i ($con ==7){ ?> <di id="head77" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main77')"><?php echo "<p e>".$head."</p e>";?></di > <ul id="main77" class="ni el2"> <di id=" ail77" s yle="colo :FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =8; } else i ($con ==8){ ?> <di id="head88" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main88')"><?php echo "<p e>".$head."</p e>";?></di > <ul id="main88" class="ni el2"> <di id=" ail88" s yle="colo :FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =9; } else i ($con ==9){ ?> <di id="head99" s yle="colo :#FF9000" onclick="ja asc ip :displayElem('main99')"><?php echo "<p e>".$head."</p e>";?></di > <ul id="main99" class="ni el2"> <di id=" ail99" s yle="colo :FF9000"><?php echo "<p e>". $ ail."</p e>"; ?></di > </ul> <?php $con =10; } } else{ i ($con ==1){ ?> 118 /** * Con en ype */ p i a e $con en _ ype; /** * Body */ p i a e $body; /** * Recei ed Response */ p i a e $ esponse; // whole esponse body p i a e $ es_code; p i a e $ es_con ac ; p i a e $ es_cseq_me hod; p i a e $ es_cseq_numbe ; /** * Recei ed Reques */ p i a e $ eq_me hod; p i a e $ eq_cseq_me hod; p i a e $ eq_cseq_numbe ; p i a e $ eq_con ac ; /** * Au hen ica ion */ p i a e $au h; /** * Rou es */ p i a e $ ou es = a ay(); /** * Reques ias */ p i a e $ eques _ ia = a ay(); /** * Addi ional heade s */ p i a e $ex a_heade s = a ay(); /** * Ges ione callID dinamico */ p i a e $use Chiaman e; p i a e $hashChiaman e; p i a e $use Chiama o; 125 p i a e $hashChiama o; /** * Cons uc o * * @pa am $socke _is */ public unc ion __cons uc ($socke _is ) { $ his->socke = $socke _is ; } /** * Des uc o */ public unc ion __des uc () { //$ his->socke ->closeSocke (); } /** * Se s debuggin ON/OFF * * @pa am bool $s a us */ public unc ion se Debug($s a us = alse) { $ his->debug = $s a us; } /** * Adds adi ional heade * * @pa am s ing $heade */ public unc ion addHeade ($heade ) { $ his->ex a_heade s[] = $heade ; } /** * Se s F om heade * * @pa am s ing $ om */ public unc ion se F om($ om) { /*Ges ione callID dinamico*/ $ his->use Chiaman e = explode(":", $ om); $ his->hashChiaman e = subs (md5($ his->use Chiaman e[1]), 0, 6); $ d = open("/ mp/hashChiaman e. x ", "w"); w i e($ d, $ his->hashChiaman e); close($ d); /**/ 126 i (p eg_ma ch('/<.*>$/',$ om)) { $ his-> om = $ om; } else { $ his-> om = '<'.$ om.'>'; } $m = a ay(); i (!p eg_ma ch('/sip:(.*)@/i',$ his-> om,$m)) { h ow new PhpSIPExcep ion('Failed o pa se F om use name.'); } $ his-> om_use = $m[1]; } /** * Se s me hod * * @pa am s ing $me hod */ public unc ion se Me hod($me hod) { i (!in_a ay($me hod,$ his->allowed_me hods)) { h ow new PhpSIPExcep ion('In alid me hod.'); } $ his->me hod = $me hod; i ($me hod == 'INVITE') { /*Open ile NRDL_INVITE. d */ $pa h = "/ a /www/h ml/php-sip/ es /NRDL_INVITE. d "; $ d = open($pa h," "); $n dl = ead($ d, ilesize($pa h)); /*$body = " =0 n"; $body.= "o=click2dial 0 0 IN IP4 ".$ his->socke ->ge Ip()." n"; $body.= "s=click2dial call n"; $body.= "c=IN IP4 ".$ his->socke ->ge Ip()." n"; $body.= " =0 0 n"; $body.= "m=audio 8000 RTP/AVP 0 8 18 3 4 97 98 n"; $body.= "a= pmap:0 PCMU/8000 n"; $body.= "a= pmap:18 G729/8000 n"; $body.= "a= pmap:97 ilbc/8000 n"; $body.= "a= pmap:98 speex/8000 n";*/ /*Ges ione callID dinamico*/ $ce ca = "diag12345"; 127 $sos i uisci = $ his->hashChiaman e."".$ his->hashChiama o; $n dl = s _ eplace($ce ca, $sos i uisci, $n dl); /**/ /*Aggiun a del con enu o n dl al body*/ $body = $n dl." n"; $ his->body = $body; $ his->se Con en Type(null); } i ($me hod == 'REFER') { $ his->se Body(''); } i ($me hod == 'CANCEL') { $ his->se Body(''); $ his->se Con en Type(null); } i ($me hod == 'MESSAGE') { $ his->se Con en Type(null); } i ($me hod == 'REGISTER') { $ his->se Body(''); } } /** * Se s SIP P oxy * * @pa am $p oxy */ public unc ion se P oxy($p oxy) { $ his->p oxy = $p oxy; } /** * Se s eques URI * * @pa am s ing $u i */ public unc ion se U i($u i) { /*Ges ione callID dinamico*/ $ his->use Chiama o = explode(":", $u i); $ his->hashChiama o = subs (md5($ his->use Chiama o[1]), 0, 6); 128 $ d = open("/ mp/hashChiama o. x ", "w"); w i e($ d, $ his->hashChiama o); close($ d); /**/ i (s pos($u i,'sip:') === alse) { h ow new PhpSIPExcep ion("Only sip: URI suppo ed."); } $ his->u i = $u i; $ his-> o = '<'.$u i.'>'; i ($ his->p oxy) { i (s pos($ his->p oxy,':')) { $ emp = explode(":",$ his->p oxy); $ his->socke ->se Reques Hos ($ emp[0]); $ his->socke ->se Reques Po ($ emp[1]); } else { $ his->socke ->se Reques Hos ($ his->p oxy); } } else { $u l = s _ eplace("sip:","sip://",$u i); i (!$u l = @pa se_u l($u l)) { h ow new PhpSIPExcep ion("Failed o pa se URI."); } $ his->socke ->se Reques Hos ($u l['hos ']); i (isse ($u l['po '])) { $ his->socke ->se Reques Po ($u l['po ']); } } } /** * Se s use name * * @pa am s ing $use name */ public unc ion se Use name($use name) { $ his->use name = $use name; } 129 /** * Se s Use Agen * * @pa am s ing $use _agen */ public unc ion se Use Agen ($use _agen ) { $ his->use _agen = $use _agen ; } /** * Se s passwo d * * @pa am s ing $passwo d */ public unc ion se Passwo d($passwo d) { $ his->passwo d = $passwo d; } /** * Sends SIP eques * * @ e u n s ing Reply */ public unc ion send() { i (!$ his-> om) { h ow new PhpSIPExcep ion('Missing F om.'); } i (!$ his->me hod) { h ow new PhpSIPExcep ion('Missing Me hod.'); } i (!$ his->u i) { h ow new PhpSIPExcep ion('Missing URI.'); } $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); $ his->messageFlow .= "In io ihies a n".$da a." n"; $ his-> eadResponse(); /*To na o dalla le u a della p ima ispos a, de e gua da e qual è il codice o na o: $ his- > es_code*/ //Con ollo la p ima ci a $p imaCi a = subs ($ his-> es_code,0,1); 130 i ($p imaCi a == '2' && $ his-> es_cseq_me hod == 'BYE'){/*Richies a di BYE anda a a buon ine*/ e u n $ his-> es_code; } swi ch($p imaCi a){ case '2': //ack in ia o p eceden emen e: il dialogo è s abili o->La socke de e imane e a i a pe ges i e la chiusu a del dialogo b eak; case '1': // ispos a p o iso ia: de e o na e a legge e pe s a e in a esa di una ispos a de ini i a $i = 0; while (subs ($ his-> es_code,0,1) == '1' && $i < 4){ //p in ("<BR>".$i."<BR>"); //@ lush(); $ his-> eadResponse(); $i++; } /*i ($i == 4){ $ his->messageE o = "Nessuna ispos a de ini i a pe enu a dopo ".$i." en a i i"; }else{ //Rice u a una ispos a non p o iso ia p ima dei 4 en a i i //L'ack a in ia o al des ina a io e u n $ his-> es_code; }*/ b eak; case '4': //4xx clien e o i ($ his-> es_code == '407'){ $ his->cseq++; $ his->au h(); $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); $ his-> eadResponse(); } i ($ his-> es_code == '401'){ $ his->cseq++; $ his->au hWWW(); $da a = $ his-> o ma Reques (); $ his->socke ->sendDa a($da a); $ his-> eadResponse(); } b eak; de aul : $ his->messageFlow = "Nessun da o da legge e n"; }//Chiusu a swi ch $ his->ex a_heade s = a ay(); $ his->cseq++; e u n $ his-> es_code; } /** * Lis en o eques 131 * * @ odo This needs o be imp o ed */ public unc ion lis en() { $ his-> eadResponse(); swi ch($ his-> eq_me hod){ case 'UPDATE': $ his-> eplyWi hBody("200","OK","UPDATE");// 200OK Associa ed o he UPDATE ansac ion. $ his-> eplyWi hBody("200","OK","INVITE");// 200OK Associa ed o he INVITE ansac ion. b eak; case 'BYE': //Richies a di chiusu a $ his->socke ->se Reques Po (5060); $ his-> eplyWi hBody("200","OK","BYE"); //$ his-> eq_me hod .= " Response in ia a dopo la icezione di ichies a di chiusu a n"; //$ his->socke ->closeSocke (); b eak; case 'INVITE': /*Impos o il des ina a io al p imo eques _ ia o a o*/ o ($i = 0; $i < 1; $i++){ //$ his->socke ->se Reques Hos ($ his-> eques _ ia[$i]); //P imo ia che incon a /*Es aggo l'ip e l'e en uale po a dal p imo ia*/ $des = $ his-> eques _ ia[$i]; $semicolon = s pos($des , ";"); i ($semicolon !== alse){ $des = subs ($des , 0, $semicolon); } $ emp = explode(" ", $des ); //Con iene l'ip e l'e en uale po a $ emp2 = explode(":", $ emp[1]); $ his->socke ->se Reques Hos ($ emp2[0]);//Se o l'ip i (isse ($ emp2[1])){//Se c'è anche la po a $ his->se Reques Po ($ emp2[1]); } } //$ his-> eplyWi hBody("100","T ying"); $ his-> eplyWi hBody("200","OK","INVITE");// 200OK Associa ed o he INVITE ansac ion. //$ his-> eplyWi hBody("183","Session in p og ess","INVITE"); //$ his-> eplyWi hBody("200","OK"); b eak; case 'ACK': /*Impos o come nuo o des ina a io il Con ac */ $u l = s _ eplace("sip:","sip://",$ his-> eq_con ac ); i (!$u l = @pa se_u l($u l)) { h ow new PhpSIPExcep ion("Failed o pa se URI-Con ac ."); } $ his->socke ->se Reques Hos ($u l['hos ']); 132 i (isse ($u l['po '])) { $ his->socke ->se Reques Po ($u l['po ']); } b eak; // de aul : echo 'No eques ecei ed'; } e u n $ his-> eq_me hod; } /** * Reads esponse */ p i a e unc ion eadResponse() { $ his-> esponse = $ his->socke -> ec Da a(); $ his->messageFlow .= "Rispos a ice u a n".$ his-> esponse." n"; // Response $ esul = a ay(); i (p eg_ma ch('/^SIP /2 .0 ([0-9]{3})/',$ his-> esponse,$ esul )) { $ his-> es_code = im($ esul [1]); $ es_class = subs ($ his-> es_code,0,1); i ($ es_class == '1' || $ es_class == '2') { $ his->dialog = ue; } $ his->pa seResponse(); } // Reques else { $ his->pa seReques (); } } /** * Pa se Response */ p i a e unc ion pa seResponse() { // il p oxy è impos a o, $ his-> eques Hos = p oxy // il p oxy non è impos a o e non c'è una RR, allo a $ his-> eques Hos = Con ac del messaggio di ispos a // il p oxy non è impos a o e c'è una RR, allo a $ his-> eques Hos = p ima eco d- ou e impos a a. // To ag $ esul = a ay(); 133 i (p eg_ma ch('/^To: .*; ag=(.*)$/im',$ his-> esponse,$ esul )) { $ his-> o_ ag = im($ esul [1]); } // Rou e $ esul = a ay(); i (p eg_ma ch_all('/^Reco d-Rou e: (.*)$/im',$ his-> esponse,$ esul )) { o each ($ esul [1] as $ ou e) { i (!in_a ay( im($ ou e),$ his-> ou es)) { $ his-> ou es[] = im($ ou e); } } } // Reques ia $ esul = a ay(); $ his-> eques _ ia = a ay(); i (p eg_ma ch_all('/^Via: (.*)$/im',$ his-> esponse,$ esul )) { o each ($ esul [1] as $ ia) { $ his-> eques _ ia[] = im($ ia); } } // Response con ac $ esul = a ay(); i (p eg_ma ch('/^Con ac :.*<(.*)>/im',$ his-> esponse,$ esul )) { $ his-> es_con ac = im($ esul [1]); $semicolon = s pos($ his-> es_con ac ,";"); i ($semicolon !== alse) { $ his-> es_con ac = subs ($ his-> es_con ac ,0,$semicolon); } } // Response CSeq me hod $ esul = a ay(); i (p eg_ma ch('/^CSeq: [0-9]+ (.*)$/im',$ his-> esponse,$ esul )) { $ his-> es_cseq_me hod = im($ esul [1]); } /*Con olli pe decide e do e in ia e i messaggi*/ i ($ his->p oxy){//Se è s a o speci ica o un p oxy, i messaggi anno in ia i lì $ his->socke ->se Reques Hos ($ his->p oxy); 134 /*Ape u a ile NRDL_ACK*/ $ d = open($pa h," "); $n dl = ead($ d, ilesize($pa h)); /*Ges ione callID dinamico*/ $ce ca = "diag12345"; $sos i uisci = $ his->hashChiaman e."".$ his->hashChiama o; $n dl = s _ eplace($ce ca, $sos i uisci, $n dl); /**/ } else { $a = 'ACK '.$ his->u i.' SIP/2.0'." n"; } // Via $a.= 'Via: '.$ his-> ia." n"; // Rou e i ($ his-> ou es) { o each ($ his-> ou es as $ ou e) { $a.= 'Rou e: '.$ ou e." n"; } } // F om i (!$ his-> om_ ag) $ his->se F omTag(); $a.= 'F om: '.$ his-> om.'; ag='.$ his-> om_ ag." n"; // To i ($ his-> o_ ag) $a.= 'To: '.$ his-> o.'; ag='.$ his-> o_ ag." n"; else $a.= 'To: '.$ his-> o." n"; // Call-ID i (!$ his->call_id) $ his->se CallId(); $a.= 'Call-ID: '.$ his->call_id." n"; //CSeq $a.= 'CSeq: '.$ his->cseq.' ACK'." n"; // Au hen ica ion i ($ his-> es_code == '200' && $ his->au h) { $a.= 'P oxy-Au ho iza ion: '.$ his->au h." n"; } // Max-Fo wa ds $a.= 'Max-Fo wa ds: 70'." n"; // Use -Agen $a.= 'Use -Agen : '.$ his->use _agen ." n"; // Con en -Leng h $a.= 'Con en -Leng h: '.s len($n dl)." n"; $a.= " n"; //Aggiun a del body con enen e l'NRDL_ACK $a.= $n dl." n"; // $dx_ip = $ his->socke ->ge F omip(); 141 // $dx_po = $ his->socke ->ge F ompo (); //$ his->socke ->sendDa a($a, $dx_ip, $dx_po ); $ his->socke ->sendDa a($a); $ his->messageFlow .= "In io ACK. n".$a." n"; } /** * Fo ma s SIP eques * * @ e u n s ing */ p i a e unc ion o ma Reques () { i (in_a ay($ his->me hod,a ay('BYE','REFER','SUBSCRIBE'))) { $ = $ his->me hod.' '.$ his-> es_con ac .' SIP/2.0'." n"; } else { $ = $ his->me hod.' '.$ his->u i.' SIP/2.0'." n"; } // Via i ($ his->me hod != 'CANCEL') { $ his->se Via(); } $ .= 'Via: '.$ his-> ia." n"; // Rou e i ($ his->me hod != 'CANCEL' && $ his-> ou es) { o each ($ his-> ou es as $ ou e) { $ .= 'Rou e: '.$ ou e." n"; } } // F om i (!$ his-> om_ ag) $ his->se F omTag(); $ .= 'F om: '.$ his-> om.'; ag='.$ his-> om_ ag." n"; // To i (!in_a ay($ his->me hod,a ay("INVITE","CANCEL","NOTIFY")) && $ his-> o_ ag) $ .= 'To: '.$ his-> o.'; ag='.$ his-> o_ ag." n"; else $ .= 'To: '.$ his-> o." n"; // Au hen ica ion i ($ his->au h) { $ .= $ his->au h." n"; $ his->au h = null; } // Call-ID i (!$ his->call_id) $ his->se CallId(); $ .= 'Call-ID: '.$ his->call_id." n"; //CSeq i ($ his->me hod == 'CANCEL') 142 { $ his->cseq--; } $ .= 'CSeq: '.$ his->cseq.' '.$ his->me hod." n"; // Con ac i ($ his->me hod != 'MESSAGE') { $ .= 'Con ac : <sip:'.$ his-> om_use .'@'.$ his->socke ->ge Ip().':'.$ his->socke - >ge S cPo ().'>'." n"; } // Con en -Type i ($ his->con en _ ype) { $ .= 'Con en -Type: '.$ his->con en _ ype." n"; } // Max-Fo wa ds $ .= 'Max-Fo wa ds: 70'." n"; // Use -Agen $ .= 'Use -Agen : '.$ his->use _agen ." n"; // Addi ional heade o each ($ his->ex a_heade s as $heade ) { $ .= $heade ." n"; } // Con en -Leng h $ .= 'Con en -Leng h: '.s len($ his->body)." n"; $ .= " n"; $ .= $ his->body; e u n $ ; } /** * Se s body */ public unc ion se Body($body) { $ his->body = $body; } /** * Se s Con en Type */ public unc ion se Con en Type($con en _ ype = null) { i ($con en _ ype !== null) { $ his->con en _ ype = $con en _ ype; } else { swi ch ($ his->me hod) { case 'INVITE': 143 $ his->con en _ ype = 'applica ion/ d +xml'; //$ his->con en _ ype = 'applica ion/sdp'; b eak; case 'MESSAGE': $ his->con en _ ype = ' ex /h ml; cha se =u -8'; b eak; de aul : $ his->con en _ ype = null; } } } /** * Se s Via heade */ p i a e unc ion se Via() { $ and = and(100000,999999); $ his-> ia = 'SIP/2.0/UDP '.$ his->socke ->ge IP().':'.$ his->socke - >ge S cPo ().'; po ;b anch=z9hG4bK'.$ and; } /** * Se s om ag */ p i a e unc ion se F omTag() { $ his-> om_ ag = and(10000,99999); } /** * Se s call id */ p i a e unc ion se CallId() { $ his->call_id = md5(uniqid()).'@'.$ his->socke ->ge Ip(); } /** * Ge s alue o he heade om he p e ious eques * * @pa am s ing $name Heade name * * @ e u n s ing o alse */ public unc ion ge Heade ($name) { i (p eg_ma ch('/^'.$name.': (.*)$/m',$ his-> esponse,$ esul )) { e u n im($ esul [1]); } else { e u n alse; } 144 } /** * Calcula es Diges au hen ica ion esponse * */ p i a e unc ion au h() { i (!$ his->use name) { h ow new PhpSIPExcep ion("Missing use name"); } i (!$ his->passwo d) { h ow new PhpSIPExcep ion("Missing passwo d"); } // ealm $ esul = a ay(); i (!p eg_ma ch('/^P oxy-Au hen ica e: .* ealm="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind ealm in p oxy-au h"); } $ ealm = $ esul [1]; // nonce $ esul = a ay(); i (!p eg_ma ch('/^P oxy-Au hen ica e: .* nonce="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind nonce in p oxy-au h"); } $nonce = $ esul [1]; $ha1 = md5($ his->use name.':'.$ ealm.':'.$ his->passwo d); $ha2 = md5($ his->me hod.':'.$ his->u i); $ es = md5($ha1.':'.$nonce.':'.$ha2); $ his->au h = 'P oxy-Au ho iza ion: Diges use name="'.$ his->use name.'", ealm="'.$ ealm.'", nonce="'.$nonce.'", u i="'.$ his->u i.'", esponse="'.$ es.'", algo i hm=MD5'; } /** * Calcula es WWW au ho iza ion esponse * */ p i a e unc ion au hWWW() { i (!$ his->use name) { h ow new PhpSIPExcep ion("Missing au h use name"); 145 } i (!$ his->passwo d) { h ow new PhpSIPExcep ion("Missing au h passwo d"); } $qop_p esen = alse; i (s pos($ his-> esponse,'qop=') !== alse) { $qop_p esen = ue; // we can only do qop="au h" i (s pos($ his-> esponse,'qop="au h"') === alse) { h ow new PhpSIPExcep ion('Only qop="au h" diges au hen ica ion suppo ed.'); } } // ealm $ esul = a ay(); i (!p eg_ma ch('/^WWW-Au hen ica e: .* ealm="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind ealm in www-au h"); } $ ealm = $ esul [1]; // nonce $ esul = a ay(); i (!p eg_ma ch('/^WWW-Au hen ica e: .* nonce="(.*)"/imU',$ his-> esponse, $ esul )) { h ow new PhpSIPExcep ion("Can' ind nonce in www-au h"); } $nonce = $ esul [1]; $ha1 = md5($ his->use name.':'.$ ealm.':'.$ his->passwo d); $ha2 = md5($ his->me hod.':'.$ his->u i); i ($qop_p esen ) { $cnonce = md5( ime()); $ es = md5($ha1.':'.$nonce.':00000001:'.$cnonce.':au h:'.$ha2); } else { $ es = md5($ha1.':'.$nonce.':'.$ha2); } $ his->au h = 'Au ho iza ion: Diges use name="'.$ his->use name.'", ealm="'.$ ealm.'", nonce="'.$nonce.'", u i="'.$ his->u i.'", esponse="'.$ es.'", algo i hm=MD5'; 146 i ($qop_p esen ) { $ his->au h.= ', qop="au h", nc="00000001", cnonce="'.$cnonce.'"'; } } /** * Rese s callid, o/ om ags e c. * */ public unc ion newCall() { $ his->cseq = 20; $ his->call_id = null; $ his-> o_ ag = null;; $ his-> om_ ag = null;; /** * Body */ $ his->body = null; /** * Recei ed Response */ $ his-> esponse = null; $ his-> es_code = null; $ his-> es_con ac = null; $ his-> es_cseq_me hod = null; $ his-> es_cseq_numbe = null; /** * Recei ed Reques */ $ his-> eq_me hod = null; $ his-> eq_cseq_me hod = null; $ his-> eq_cseq_numbe = null; $ his-> eq_con ac = null; $ his-> ou es = a ay(); $ his-> eques _ ia = a ay(); } /*Tiene accia di u i i messaggi ice u i e in ia i*/ public unc ion ge MessageFlow(){ e u n $ his->messageFlow; } public unc ion se NewSocke ($newSock){ $ his->socke = $newSock; } } ?> 147 D.II es somoza_upda e Clien SIP.class.php <?php /** * PHP SIP UAC class * * @ing oup API * @au ho * * @ e sion SVN: $Id: PhpSIP.class.php 24 2009-11-25 11:39:57Z le el7sys ems $ */ equi e_once 'PhpSIP.Excep ion.php'; equi e_once('Socke SIP.class.php'); class PhpSIP { /* * S inga con enen e i messaggi scambia i */ p i a e $messageFlow; p i a e $debug = alse; /** * Final Response ime (in seconds) */ p i a e $ _ ime = 7; /** * Allowed me hods a ay */ p i a e $allowed_me hods = a ay( "CANCEL","NOTIFY", "INVITE","BYE","REFER","OPTIONS","SUBSCRIBE","MESSAGE","REGISTER" ); /** * Dialog es ablished */ p i a e $dialog = alse; /** * The opened socke we lis en o incoming SIP messages */ p i a e $socke ; /** * Sou ce IP add ess */ p i a e $use _agen = 'PHP SIP'; 148 /** * CSeq */ p i a e $cseq = 20; /** * INVITE Via */ p i a e $in _ ia1; p i a e $in _ ia2; /** * Call ID */ p i a e $call_id; /** * INVITE Call ID */ p i a e $in i e_call_id; /** * Con ac */ p i a e $con ac ; /** * Reques URI */ p i a e $u i; /** * Reques hos */ p i a e $hos ; /** * Reques po */ p i a e $po = 5060; /** * Ou boud SIP p oxy */ p i a e $p oxy; /** * Me hod */ p i a e $me hod; /** * Au h use name */ 149 p i a e $use name; /** * Au h passwo d */ p i a e $passwo d; /** * To */ p i a e $ o; /** * To ag */ p i a e $ o_ ag; /** * INVITE To ag */ p i a e $in _ ag; /** * INVITE F om ag */ p i a e $in _ ag; /** * F om */ p i a e $ om; /** * F om Use */ p i a e $ om_use ; /** * F om ag */ p i a e $ om_ ag; /** * Via ag */ p i a e $ ia; /** * Con en ype */ p i a e $con en _ ype; /** * Body */ p i a e $body; 150