2013-10-21 6 views
11

के माध्यम से तत्काल संदेश कैसे भेजें मेरे पास मेरे मोबाइल नेटवर्क प्रदाता द्वारा बनाई गई एक विंडोज़ डेस्कटॉप एप्लिकेशन है, जो एसआईपी के साथ सभी प्रकार की चीजें करता है: कॉल, संदेश भेजें, आदि। इस ऐप को सफलतापूर्वक MESSAGE कैसे भेजता है स्क्रीनशॉट (पिछले 4 लाइनों): Wiresharkएसआईपी

MESSAGE अनुरोध, डेस्कटॉप एप्लिकेशन से, (पीछे से 4 लाइन) के रूप में भेजा जाता है:

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

test 

और उस के लिए सफल प्रतिक्रिया है:

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

तो मैं PHP से समान भेजने के लिए (और एन-रूपों) अनुरोध के लिए प्रयास है, लेकिन मैं हमेशा SIP/2.0 407 Proxy Authentication Required के बजाय SIP/2.0 403 Forbidden प्राप्त करते हैं:

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

अजीब हिस्सा है, अगर मैं REGISTER अनुरोध भेजने के यह काम करता है कि, और मैं सफलतापूर्वक SIP/2.0 401 Unauthorized शीर्षलेख WWW-Authenticate के साथ प्राप्त करता हूं। मैं प्राधिकरण का पुनर्मूल्यांकन करता हूं, और इसे पुनः भेजता हूं। तब मुझे SIP/2.0 200 OK प्राप्त होता है। MESSAGE के साथ यह कैसे काम करना चाहिए।

क्या गलत हो सकता है? मुझसे क्या छूट गया? क्या MESSAGE अनुरोध से पहले किसी अन्य अनुरोध की आवश्यकता है (मैंने पहले ही REGISTER पहले से कोशिश की है)?
मैंने RFC 3428 को ऊपर और नीचे पढ़ा है, सभी उदाहरणों को संभवतः प्रयास किया है, लेकिन सफलता के बिना।

+0

मैं कोई 'एसआईपी' विशेषज्ञ नहीं हूं और ऐसा लगता है कि आप जानते हैं कि आप क्या कर रहे हैं। मैं बस इतना कह सकता हूं कि अगर आपको लगता है कि आप किसी अन्य लॉक के बिना अन्य सॉफ़्टवेयर (जो काम करता है) की तरह कर रहे हैं, तो मैं कहूंगा कि आप उन चीज़ों के लिए जा सकते हैं जो आप अलग-अलग कर सकते हैं। शायद चरित्रों का मिलान मिस्चैच एक अच्छी शुरुआत हो सकता है, जैसे '\ n' बनाम \ n \ r'। – Mehran

+0

@Mehran: मुझे नहीं लगता कि विभिन्न प्रकार की "नई लाइनें" कोई फर्क नहीं पड़ेगी, क्योंकि 'रजिस्ट्रार' विधि काम कर रही है। यदि मैं, उदाहरण के लिए, अनुरोध से 'सीएसईक्यू' हेडर को हटा दें, एसआईपी सर्वर 'एसआईपी/2.0 400 गुम सीएसईक हेडर' लौटाता है ... यह मुझे बताता है कि संचार ठीक है। मुझे लगता है कि 'संदेश' विधि सही भेजी गई है, यह कुछ और होना चाहिए; ( –

उत्तर

5

यदि आपको 403 प्रतिक्रिया प्राप्त हुई है, तो आपको एक कारण शीर्षलेख दिखाई देगा। शुरुआत में Q.850 स्ट्रिंग इंगित करती है कि यह आईटीयू-टी पुनर्मूल्यांकन द्वारा परिभाषित एक कारण कोड होगा।

विशेष रूप से, प्रदान की कारण कोड 55 आईएसडीएन और साहित्यिक साधन से संबंधित है "इनकमिंग कॉल बंद प्रयोक्ता समूह के भीतर वर्जित" (आप RFC 3398 में यह जांच कर सकते हैं) और, आम तौर पर, इसका मतलब है कि, सदस्यों के एक समूह के भीतर, कॉल स्वागत है वर्जित।

दूसरी ओर, 55 कारण अनुरोध के भीतर एक समस्या को भी इंगित करता है, विशेष रूप से उपयोगकर्ता (प्रेषक या रिसीवर) के संबंध में।आरेख के बाद एसआईपी उपयोगकर्ताओं के बीच एक सामान्य संदेश विनिमय पता चलता है:

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

वास्तव में, सख्त हो गया है, रजिस्टर उपयोगकर्ता एक की जरूरत नहीं है से लेकिन सबसे सिस्टम (आईएमएस) की तरह एक प्रमाणीकरण तंत्र के रूप में यह उपयोग करता है। फिर, रजिस्टर अनुरोध में, विशेष हेडर हैं:

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

ध्यान रखें कि, एक रजिस्टर करने के लिए 200 ठीक जवाब, एक Expires: शीर्ष लेख या Contact: हैडर इंगित करता है कि स्वीकार किए जाते हैं समाप्ति समय के अंदर एक expires पैरामीटर शामिल है आ सकता है। उदाहरण के लिए:

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

इस स्थिति में, आपको इस समाप्ति समय (उदाहरण में 60 सेकंड) से पहले पुनः पंजीकरण करना चाहिए।

ध्यान रखें कि आप मोबाइल फोन पर एक एसएमएस भेजने की कोशिश कर रहे हैं, रिसेप्शन पॉइंट सीधे आपके नेटवर्क प्रदाता के MGCF द्वारा प्रबंधित किया जाता है, इसलिए यह प्रेषक का पंजीकरण या संदेश अनुरोध छोड़ देता है।

अपने मूल संदेश प्रस्ताव के बारे में, अनुरोध URI (संदेश के पहली पंक्ति), होना चाहिए:

MESSAGE sip:[email protected] SIP/2.0 

क्योंकि यह संदेश स्वागत इकाई को दर्शाता है।

उम्मीद है कि इससे मदद मिलती है।

+0

@ ग्लैविक आप Q.850 कोड और एसआईपी [आरएफसी 33 9 8] में संबंध के बारे में कुछ जानकारी प्राप्त कर सकते हैं (https: // www.ietf.org/rfc/rfc3398.txt)। संदेश अनुरोध के बारे में यूआरआई, आपको अपने उपयोगकर्ता (न तो my_phone_num या उपयोगकर्ता नाम) के बारे में जानकारी प्रदान नहीं करनी चाहिए, लेकिन _destination_ के बारे में, यह 'TO' मान है। अधिकांश प्रॉक्सी सर्वर केवल यह जांचते हैं संदेश अग्रेषण के लिए यूआरआई का अनुरोध करें और, असल में, यह आपकी समस्या से मेल खाता है, आप अपने आप को एक संदेश भेजने की कोशिश कर रहे हैं। – jcm

+0

@ Glavić यदि आप एक एसएमएस भेजने की कोशिश कर रहे हैं, तो आपने टेली यूआरआई प्रारूप की कोशिश की है: tel: + sip के बजाय: TO @ DOMAIN? – jcm

+0

@ ग्लैविक कारण कोड 55, प्रारंभ में, इस उपयोगकर्ता पर प्रदान किए गए समूह (प्रबंधन इकाई) में किसी प्रकार का प्रतिबंध है, लेकिन यह अनुरोध <--> उपयोगकर्ता असंगतता का भी अनुरोध कर सकता है। आपके पिछले संदेशों से मुझे लगता है कि आप संदेश भेजने से पहले कॉलर और कैली उपयोगकर्ताओं को पहले ही पंजीकृत कर चुके हैं, क्या मैं गलत हूं? – jcm

2

जैसा कि मैंने आपको टिप्पणियों में बताया है, मैं कोई एसआईपी विशेषज्ञ नहीं हूं लेकिन मेरा एक दोस्त है। मैंने उससे आपके मामले के बारे में पूछा है और यही वह है जो उसने मुझे बताया:

एसआईपी प्रोटोकॉल एक संवाद प्रोटोकॉल है जिसका अर्थ है कि प्रत्येक संचार एक अद्वितीय संवाद आईडी (HTTP में सत्र आईडी की तरह कुछ) के साथ एक संवाद है। एसआईपी और HTTP के बीच का अंतर यह है कि अलग-अलग टीपीसी/आईपी कनेक्शन (HTTP अनुरोध) के बीच सत्र आईडी का उपयोग किया जाता है जबकि संवाद आईडी का उपयोग उसी टीपीसी/आईपी कनेक्शन के भीतर किया जाता है लेकिन विभिन्न संदेशों के बीच होता है।

ऐसा लगता है कि आप यहां क्या करने की कोशिश कर रहे हैं कुछ हद तक HTTP में सत्र अपहरण की तरह है। हालांकि HTTP में एक सत्र आईडी को हाइजैक करना संभव है और इसे किसी अन्य क्लाइंट से भेजा गया है, वही एसआईपी के लिए नहीं है। मेरे मित्र एसआईपी सर्वर के अनुसार एक आंतरिक मेमोरी है जिसमें कौन सी संवाद आईडी संबंधित है, और आप अपने संवाद आईडी को जानकर किसी और के संवाद में अपने संदेशों को पर्ची नहीं कर सकते हैं।

आपका प्रश्न यह नहीं कहता कि वास्तव में आप ऐसा करने की कोशिश कर रहे हैं, लेकिन यदि ऐसा है, तो मुझे कहना होगा कि आप नहीं कर सकते हैं। तथ्य यह है कि आप REGISTER कमांड भेज सकते हैं यह दिखाता है कि एसआईपी सर्वर से आपका संचार किया जाता है। आपको बस अपनी खुद की वार्ता शुरू करने और वहां से लेने की ज़रूरत है।

+0

यदि आप PHP में एक एसआईपी स्टैक को लागू करने का प्रयास कर रहे हैं तो आप उपलब्ध पुस्तकालयों का उपयोग क्यों नहीं कर रहे हैं? यहां एक है: https://code.google.com/p/php-sip /। मुझे यकीन है कि आप इंटरनेट पर ऐसी कई परियोजनाएं पा सकते हैं। – Mehran

+0

दुर्भाग्य से नहीं। लेकिन अगर आपने पहले से ही किसी भी सफलता के साथ एसआईपी सर्वर से संचार करने वाली कई पुस्तकालयों का परीक्षण किया है, तो मुझे कहना होगा कि आपको चाहिए यह सुनिश्चित करने के लिए कि आपका सर्वर अजीब अभिनय नहीं कर रहा है। मेरा मतलब है कि वहां मौजूद सभी पुस्तकालय खराब नहीं हो सकते हैं! – Mehran

संबंधित मुद्दे