ãã®ãã€ã€ã©ãŒã¯ååŸæ¥å¡ã®ã³ã³ãã¥ãŒã¿ãŒã«ã€ã³ã¹ããŒã«ãããé»è©±ãåããå¿ èŠã«å¿ããŠé»è©±ããããŸããã èšå®ãå€æŽããã«ã¯ããã¹ãŠã®ãã·ã³ã移åããŠããã¹ãŠãæåã§è¡ãå¿ èŠããããŸããã åæã«ãåŸæ¥å¡ããªã¢ãŒãã§äœæ¥ããŠããå Žåããã®æ¹æ³ãé»è©±ã§çžè«ããå¿ èŠããããŸããã ãããŠããã°ãã°ããã¯éåžžã«å°é£ã§ããã
ããããäž»ãªåé¡ã¯ãWebã·ã¹ãã ããã³ããŒã¿ããŒã¹ãšã®çµ±åã®æ¬ åŠã§ããã çä¿¡é話çšã«é¡§å®¢ã«ãŒããéããååŸæ¥å¡ã®é話統èšãä¿åããã管çWebã€ã³ã¿ãŒãã§ã€ã¹ããèªåã®ã¢ã¯ãã£ããã£ãç£èŠãããšãã£ãäžèŠåçŽãªã¿ã¹ã¯ã¯ã察å¿ããçµ±åæ©èœãåããŠããŠãããã¹ã¯ããããœãããã©ã³ã§ã¯ãã¹ãŠéåžžã«å°é£ã§ããã©ãŠã¶ãããšãã°ãã©ã°ã€ã³ã䜿çšããŸãã
ãã¹ãŠã®å éšäœæ¥ãšåŒã³åºãã1ã€ã®ã·ã¹ãã ãšããŒã¿ããŒã¹ã«ãŸãšãããšããã¢ã€ãã¢ããããŸããã é話èšé²æ©èœãåããå èµãã€ã€ã©ãŒã®æ©èœã䜿çšããŠãCRMãé·ãéå¹ãæ¿ããŸããã
é»è©±ããããããã«ãç§ã¯ããã€ãã®æè¡ã調ã¹ãããŸãå€ãã¯ãªããšããçµè«ã«éããŸããã ããã€ãã®ãªãŒãã³ãœãŒã¹ãšåçšã®å®è£ ãããã³å éšã®ã»ãã¥ãªãã£ããªã·ãŒã®ããã«é©åã§ã¯ãªãã£ãããã€ãã®SAASãµãŒãã¹ããããŸãã-ç¬èªã®ãµãŒããŒãä»ããŠåŒã³åºããåŠçããããã§ãã
æåã¯sipml5ã䜿çšããããšããŸãã ïŒ
ããã¥ã¡ã³ãã¯ãããã¯ãŒã¯ããæççã«åéããå¿ èŠããããŸããã ãã®çµæããã©ãŠã¶åŽã«SIPã¹ã¿ãã¯ãåããå€ããå°ãªãã皌åäžã®é»è©±ãæã«å ¥ããŸããã
ã€ã³ã¹ããŒã«ããã¹ããããã³èšå®ã¯çŽ2é±éç¶ããŸããããã®çµæãåé¿ã§ããªãã£ãå°ããªãã°ãããã€ãèŠã€ãããŸãããããšãã°ããããã®1ã€ã¯SSLãä»ããŠWebsocketèšå®ã«é¢é£ä»ããããŠããŸããã ãããŠãChromeãã©ãŠã¶ããŒãžã§ã³35ã®ãªãªãŒã¹åŸããŠã§ãé»è©±ã¯ãŸã£ããæ©èœããªããªããŸããã
ããã«ãç§ã¯ãªãã¬ãŒã¿ãŒã«SIPã¢ã«ãŠã³ããé瀺ããããããŸããã§ããããã©ãŠã¶ãŒåŽã®SIPã¹ã¿ãã¯ã¯ãWebsocketãä»ãããããã®å ¬é䜿çšãšéä¿¡ãæ瀺ããŠããŸãã WebsocketãSSLãä»ããŠåäœããå Žåã§ããæœåšçãªæ»æè ã¯jsã³ãŒããç Žæ£ããSIPãã¹ã¯ãŒããåŒãåºãå¯èœæ§ããããŸãã WebãµãŒããŒã«SIPãã€ãžã§ã¹ãèªèšŒãå§ä»»ãããªãã·ã§ã³ããããŸãããããã®å®è£ ã«å°éããããšã¯ã§ããŸããã§ããã
ããã¯ããã©ãŠã¶åŽã®SIPãªã¯ãšã¹ãããããã°ã³ã³ãœãŒã«ã§ã©ã®ããã«èŠãããã§ãã
JavascriptããSIPã¹ã¿ãã¯ãžã®ãã«ã¢ã¯ã»ã¹ã¯ãäžè¬çã«æªããããŸããã ããã«ã¯å©ç¹ããããŸããããšãã°ãJS SIPã·ã°ããªã³ã°ã®äœããã®çµ±åãã°ã®ä¿®æ£ãè©Šã¿ãããšãã§ããŸãã ãã ãã泚æç¹ã1ã€ãããŸãã çŸåšãSIPãã³ããŒã®90ïŒ ä»¥äžããJS SIPãå®è¡ãã2014幎1æã®ã»ãã·ã§ã³éå§ãããã³ã«ïŒSIPïŒRFC 7118ã®ãã©ã³ã¹ããŒããšããŠã®WebSocketãããã³ã«ã®ä»æ§ããµããŒãããŠããŸãããã€ãŸããwebrtc2sipã¢ãžã¥ãŒã«ã¯ã¹ããŒããã«SIPãšããŠåäœããå¿ èŠããããŸããããã·ãšå®éã«ãµãŒããŒåŽã®SIPã¹ã¿ãã¯ãµããŒããè€è£œããŸãã ãã®ã¬ã€ã¢ãŠãã¯ããããªãäœæ¥ãšãµããŒãã®ããã«éåžžã«å°é£ã«æããã®ã§ãSIPã¹ã¿ãã¯ããã©ãŠã¶ãŒåŽã«æ®ãããã¹ãã§ãããµãŒããŒããŒãã䜿çšããŠããã®ãããªã¿ã¹ã¯çšã®ããã·ã³ãã«ã§ããããããAPIãèŠã€ããããšã«ããŸããã
ãã®çµæã圌ã¯Web Call Serverã®ãã¹ããéå§ããŸããã ããã¯SAASã§ã¯ãªãããµãŒããŒãä»ããŠåŒã³åºããåŠçã§ããããã«ããŸãããã®å Žåã¯å¿ èŠã§ããïŒ
é¢æ°ã¯sipml5ãšã»ãŒåãã§ãSIPãåŒã³åºãWebRTCãåãã§ããéãåæ§ã§ãã Flashã®ãµããŒãããããŸããããã¹ãŠã®ãªãã¬ãŒã¿ãŒã¯äž»ã«ChromeãšFirefoxãã©ãŠã¶ãŒã䜿çšããIEã䜿çšãããŠãŒã¶ãŒã¯ãããæ£ããããã©ãŠã¶ãŒã«åãæ¿ããå¿ èŠããã£ããããå¿ èŠãããŸããã§ããã
è² è·ã¯ãWebããŒãžã«åæç»ããã³é©åã§ãããªãŒãã³ãœãŒã¹ã®JSãœãããã©ã³ã«äžããããŸãã
sipml5ãšã®äž»ãªéãã¯ãSIP over Websocketã§ã¯ãªããAPIãä»ãããµãŒããŒãšã®å¯Ÿè©±ã§ãã ã€ãŸã ãã©ãŠã¶åŽã«SIPã¹ã¿ãã¯ã¯ãããŸããã ãµãŒããŒåŽã«ã®ã¿ãããŸãã ããã«ãããéçºè ã«ãšã£ãŠããã³ããšã³ãã¿ã¹ã¯ãå°ãç°¡åã«ãªããŸããã ãã©ãŠã¶åŽã®SIPã¹ã¿ãã¯ã¯æ··ä¹±ãæããJavascript APIãšCSSã䜿çšããå Žåãããã³ããšã³ãã«éäžããããšãå¯èœã«ãªããŸããã
ã ãããç§ã¯ããããã¹ãŠå®è£ ããæ¹æ³ã
1. Amazon EC2ã§ãã®ãµãŒããŒã䜿çšããŸãã ã
ã¡ã¢ãªãšãã£ã¹ã¯å®¹éã¯ããŸãå¿ èŠãããŸããã ãã°ãé€ããŸãã ãããŠããã®ãããªã¿ã¹ã¯ã§ã®CPUã®èšç®èœåã¯éèŠã«ãªãå¯èœæ§ããããããæã匱ãã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããŸããã§ããã
2. Webã€ã³ã¿ãŒãã§ã€ã¹çšã«Apacheãèµ·åããWCSãµãŒããŒãã€ã³ã¹ããŒã«ããŠèµ·åããŸããã
3. chromeããŒãžã«æšæºã®Webé»è©±ã衚瀺ããããã®ã³ãŒãã¯githubã«ãããŸãã
é»è©±ã®ã€ã³ã¿ãŒãã§ã€ã¹ãããŸãæ°ã«å ¥ããªãã£ãã®ã§ãããã«ãã¶ã€ã³ãå€æŽããããšã«ããŸãããå³åŽã®ãããã°ã³ã³ãœãŒã«ã¯éåžžã«äŸ¿å©ã§ããã æ®å¿µãªãããåŸã§éåžžã®ãŠãŒã¶ãŒãæããããªãããã«åé€ããå¿ èŠããããŸããã
4.é»è©±æ©èœã«ã€ããŠãã¹ãæžã¿ã®Webé»è©±ã ããã«ã¯ä»¥åã®SIPã¢ã«ãŠã³ãã䜿çšããŸããã ãã¹ãŠãæ£åžžã«æ©èœããŸãã ãããŠã圌ã¯æºåž¯é»è©±ããããŠSIPé»è©±ã«é»è©±ããããé話ã®ä¿æãšè»¢éããããŠãã©ãã¯ãžã£ãã¯ãš...
åæ§ã«ãæºåž¯é»è©±ã§ã®äœæ¥ã
5. web-CRMã«web-phoneã³ãŒããé©åããããã®ãã¶ã€ã³ãåæç»ãããšããã次ã®ããã«ãªããŸããã
ç§ãã¡ã¯ãé©å¿ã«ã€ããŠãã詳现ã«æ€èšããå¿ èŠããããŸãã ãã¶ã€ã³ã®åæç»ã¯ããã«éå®ãããŸããã§ããã
æåã®é倧ãªã¿ã¹ã¯ã¯ãSIPãµãŒããŒã§ã®Webé»è©±ã®èªåç»é²ã§ããã ããããªããšããªãã¬ãŒã¿ãŒã¯CRMã·ã¹ãã ã®ãã°ã€ã³ãšãã¹ã¯ãŒããå ¥åããåŸãSIPãã°ã€ã³ãšãã¹ã¯ãŒããååºŠå ¥åããå¿ èŠããããŸãã çµ±åã®æ¹æ³ã«ã€ããŠçåãçããŸããã
APIã«ã¯ããã®ããã®ç¹å¥ãªloginByTokené¢æ°ãããããšãããããŸããã
function loginByToken(token) { trace("Phone - loginByToken "+ token); connectingViewBeClosed = false; var result = flashphoner.loginByToken(flashphonerLoader.urlServer, token, document.URL); closeLoginView(); openConnectingView("Connecting...", 0); }
ãã®æ©èœãã©ã®ããã«æ©èœããããç解ããããã«ãäžçæžåœåªåããªããã°ãªããŸããã§ããã
ããã¥ã¡ã³ããšäŸã䜿çšããŠãããããã¹ãŠæ¬¡ã®ããã«æ©èœããããšãããããŸããã
1ïŒCRMåŽã§ããŒã¯ã³ãäœæããå ŽåãAESæå·åã¢ã«ãŽãªãºã ã䜿çšãããŸããããã¯ããŠãŒã¶ãŒã®SIPãŠãŒã¶ãŒåãšãã¹ã¯ãŒããããã³ãã®ä»ã®å¿ èŠãªæ å ±ãå«ãæååãæå·åããŸãã
æå·åããŒã¯ãCRMãå±éãããŠãããµãŒããŒãšWCSãµãŒããŒã®ã¿ãç¥ã£ãŠããŸãã ããã«ãããŒã¯ã³ã®æå¹æéã¯ç¹å¥ãªå±æ§ã®æå¹æéã«ãã£ãŠèšå®ããããããããŒã¯ã³ãåå©çšããããšã¯ã§ããŸããã
ããŒã¯ã³ã®æå·åã¯ãAES CTRã¢ãŒãã§çºçããŸãã 以äžã«opensslã®äŸã瀺ããŸãããã®äŸã§ã¯ãæå·åãããããŒã¯ã³ãSIPãã¹ã¯ãŒãéä¿¡ã§çæãããŸãã
echo -ne '<root status="ok" description="test" registerRequired="true" login="user5" authenticationName="user5" password="password" outboundProxy="proxy.my" domain="proxy.my" port="5060" visibleName="AAA" api_key="App1" expires="1394839040761100000"/>' | openssl enc -aes-128-ctr -nosalt -K 8263D535FFFFFFFF7B0F60 -iv 00000000000000000000000000000000 | xxd -p
ãã®çµæãç§ã¯æ¬¡ã®ãããªãã®ãåŸãŸããïŒ
CRM:cf4693eedaafda1390b261dcf29d45bd3556d64b1f69cd84db8c3ac8721e7e139b80be75e39da18154e897596e9317084faee0d24d6a6197b62a93a2647b263059167b2664179a5866738260c77372e04fe22104ebe1c7530e9215f50d111fd24384755d28d06673e866159c0b6b83289c045619e8481f9c2a6b56b182f393a7dea06b38b7856436895402a5b40f0525a17822ae0f3204b606e4f0169d1ca9176e8e1b696683d12c7db8208946c204e94f3c8ff285f2bcef4ca9b12187cf541ce37d508d3663ef65f944b01db9aea5c0f10002a376d051cbf1b19bc34f76b6d2a4e1ad1450ae412b51b3af1d3860167f5416b3d2c9eeff94d60b82279e8685beb543893e8a09dee640d7366e478d0d1ee7368e0b63b511
ã¢ããªã±ãŒã·ã§ã³ã®ååã¯å·ŠåŽããCRMããå³åŽãå ã»ã©äœæããããŒã¯ã³ã§ãã
ãã®ããŒã¯ã³ã次ã®åœ¢åŒã§web-phoneã®flashphoner.xmlæ§æã«æ¿å ¥ããŸãã
<token>CRM:cf4693eed...</token>
ãã®å ŽåãããŒãžããªããŒããããçŽåŸã«èªåããŒã¯ã³ç»é²æé ãéå§ãããŸãã
2ããã³3ïŒloginByTokenããã³åŸ©å·åã
ãµãŒããŒåŽã§ã¯ãAESã®æå·åããŒãæ§æã«ç»é²ãããŸãã
CRM=8263D535FFFFFFFF7B0F60
ãããã£ãŠãããŒã¯ã³ãæ¥é èŸãCRMïŒãã§å°çãããšã察å¿ããããŒã䜿çšããŠããã埩å·åããŸãã
埩å·åã®çµæãWCSãµãŒããŒã¯ä»¥åã«æå·åãããæååãåä¿¡ããŸãã
<root status="ok" description="test" registerRequired="true" login="user5" authenticationName="user5" password="password" outboundProxy="proxy.my" domain="proxy.my" port="5060" visibleName="AAA" api_key="App1" expires="1394839040761100000"/>
ãã®XMLæååãããSIPç»é²ã«å¿ èŠãªãã¹ãŠã®ããŒã¿ãååŸããŸãã
3ïŒãµãŒããŒã¯ããŒã¿ã埩å·åãããšããã«ãSIP REGISTERèŠæ±ãSIPã«éä¿¡ããåã®æé ã§åŸ©å·åããSIPãã°ã€ã³ãšãã¹ã¯ãŒãã䜿çšããŠéåžžã®ãã€ãžã§ã¹ãèªèšŒã401ã«è¿ããŸãã
REGISTER sip:sipnet.ru;lr SIP/2.0 Call-ID: 345ec5157b1a66de3a3a275bdba36197@192.168.1.90 CSeq: 2 REGISTER From: <sip:crm1@sipnet.ru>;tag=73a499a8 To: <sip:crm1@sipnet.ru> Via: SIP/2.0/UDP 192.168.1.90:30000;branch=z9hG4bK2622ce723c34760d6a3f43dd631329e1 Max-Forwards: 70 User-Agent: WebRTC Allow: UPDATE,MESSAGE,BYE,ACK,REFER,INVITE,NOTIFY,INFO,OPTIONS,CANCEL Contact: <sip:crm1@192.168.1.90:30000>;expires=3600 Expires: 3600 Authorization: Digest username="crm1",realm="etc.tario.ru",nonce="4A0674BEDF81E0B3F65D",uri="sip:sipnet.ru;lr",response="0762b862c544007f4fb7c43277312a3d",algorithm=MD5,opaque="opaq",qop=auth,cnonce="1234567890",nc=00000001 Content-Length: 0
ãã®å ŽåãCRMãšWebã³ãŒã«ãµãŒããŒã®ã¿ãSIPãã°ã€ã³ãšãã¹ã¯ãŒããç¥ã£ãŠããŸãã ãã®ããŒã¿ã¯ãéãã圢ã§ãã©ãŠã¶ã«å±ããŸããã
ãããã£ãŠãç§ã¯ã2ã€ã®ç°ãªãã¢ã«ãŠã³ãïŒCRMçšãšSIPçšïŒãä¿åããã«ããªãã¬ãŒã¿ãŒã®ããŒãžã«é»è©±ãåã蟌ãããšãã§ããŸãããããã¯éåžžã«äžäŸ¿ã ããã§ãã ããã§ãããŒãžã®ããŒãçŽåŸã«loginByTokenãåŒã³åºãããé»è©±ã¯æºåå®äºç¶æ ã«ãªããŸãã
ãã©ãŠã¶åŒã³åºããå®è£ ããçµæïŒ
1.åŒã³åºãããµã€ãããè¡ããããµã€ãã§åä¿¡ããããã¹ãŠã®ã¢ã¯ã·ã§ã³ãã·ã¹ãã ã«èšé²ãããŸãã
2.èšé²ãããäŒè©±ãèãããšãå¯èœã«ãªãã顧客ãšã®å¯Ÿç«ãåŸæ¥å¡éã®æèŠã®äžäžèŽã解決ããã®ã«åœ¹ç«ã¡ãŸãã ããã¯ãåæ£ãªãã£ã¹ã«ãšã£ãŠéèŠã§ãã
3.çä¿¡æ°ã¯çŽ20ïŒ å¢å ããŸããã ã¯ã©ã€ã¢ã³ããé»è©±ãããããšãã«ããªãã¬ãŒã¿ãŒãåžžã«é»è©±ãããããšã¯éããªãããšãæããã«ãªããŸããã
çŸæç¹ã§ã¯ããã¹ãŠãæå³ãããšããã«æ©èœããŠãããšèšããŸãã SIPããŒããŠã§ã¢ã«æ²¡é ããããšãªããåé¡ã®ç¶æ³ã解決ã§ããŸããã
æ¬ ç¹ã®äžã§ãWindowsã§ã€ã³ã¹ããŒã«ã§ããªãããšã«æ³šæããããšãã§ããŸãã ãšããã§ãLinuxã®ã€ã³ã¹ããŒã«ãšçµ±åã§ã¯ãããããåãå¿ èŠããããŸããããäžçŽãŠãŒã¶ãŒ/éçºè ã ããããããã¹ã¿ãŒããããã§ãã
WebRTCãªãŒãã£ãªã³ãŒã«ã¯ãFlash Playerãªã©ã®è¿œå ã®ãã©ãŠã¶ãã©ã°ã€ã³ãªãã§å®å®ããŠåäœããŸãã ãããã£ãŠãèšç»ãããçµ±åãå®è£ ã§ããããã2é±éã®äœæ¥ã¯ç¡é§ã«ãªããªãã£ããšèšããŸãã