2010-03-18 16 views
36

के साथ समस्या हो रही है, मैं एक Droid/Android 2.0.1 के साथ काम कर रहा हूं और एक समस्या का सामना कर रहा हूं, जाहिर है कि बहुत से लोगों के पास है: मैं एक शुद्ध-जावा ज़ीरोकॉन्फ़ लाइब्रेरी का उपयोग करके सेवाओं को खोजने में असमर्थ हूं, मुझे पता है, jmDNS । (एप्पल के Bonjour, जबकि यह लिनक्स और विंडोज जावा पर काम करता है, मेरा मानना ​​है कि कठिन बंदरगाह मूल कोड पर निर्भरता की वजह से Android में होगा।)मैं एंड्रॉइड पर zeroconf (बोनजोर) सेवाओं को कैसे खोज सकता हूं? मुझे jmDNS

मैं सेवाओं बना सकते हैं, लेकिन उन्हें खोज नहीं। मैं यह समझने की कोशिश कर रहा हूं कि क्या हो रहा है।

यहां एक जारी समस्या रिपोर्ट है; मल्टीकास्ट और आईपीवी 6 से संबंधित है, लेकिन यह भी jmDNS के उपयोगकर्ताओं को फेंक रहा है, http://code.google.com/p/android/issues/detail?id=2323

कोई विचार क्यों इस व्यक्ति को सफलता हो रही है? बग रिपोर्ट में टिप्पणी 22 देखें। (मैं SO के लिए नया हूं, इसलिए एक से अधिक यूआरएल पोस्ट नहीं कर सकते हैं।)

मैंने उनके कोड का परीक्षण किया है, लेकिन बिना किसी किस्मत के।

क्या किसी ने jmDNS या किसी अन्य लाइब्रेरी का उपयोग करके एंड्रॉइड पर सफलतापूर्वक ज़ीरोकॉन्फ़ सेवा खोज पूरी की है?

क्या यह संभव है कि मेरी खोज समस्या आईपीवी 6 मल्टीकास्ट समस्या से संबंधित है?

+0

उस बग रिपोर्ट में कोई टिप्पणी 22 नहीं है। यह केवल 14 पर जाता है। – CommonsWare

+0

ऐसा लगता है कि समस्या ट्रैकर लिंक होना चाहिए: http://code.google.com/p/android/issues/detail?id=2917 –

+0

क्षमा करें, सही: http://code.google। कॉम/पी/एंड्रॉइड/मुद्दों/विवरण? आईडी = 2 9 17 # सी 22 –

उत्तर

12

मैं भी नया हूं अन्यथा मैं smountcastle के उत्तर पर एक टिप्पणी छोड़ देता जो अधिकतर सही है। मैं अभी एंड्रॉइड 2.1 चलाने वाले Droid पर एक ही समस्या से निपट रहा हूं। मैंने पाया कि मुझे मल्टीकास्टॉक को संदर्भ-गणना के लिए सेट करने की आवश्यकता है अन्यथा यह स्वचालित रूप से रिलीज़ होने लगती है।

AndroidManifest.xml: 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 

// Networking code: 
WifiManager wifi = getSystemService(Context.WIFI_SERVICE); 
MulticastLock lock = wifi.createMulticastLock("fliing_lock"); 
lock.setReferenceCounted(true); 
lock.acquire(); 

बस lock.release() कॉल करने के लिए जब आप इसे पूरा कर चुके हैं सुनिश्चित करें। यह केवल एंड्रॉइड 2.0+ के लिए आवश्यक हो सकता है, वर्तमान में Droid मेरा एकमात्र टेस्ट डिवाइस है, इसलिए मैं निश्चित रूप से नहीं कह सकता।

+0

तो सामान्य टिप्पणियां करने में सक्षम होने के करीब ... मैं जेएमडीएनएस का उपयोग कर रहा हूं, मुझे मोटोरोला Droid चलाने पर सफलता मिली है मल्टीकास्टॉक दृष्टिकोण का उपयोग कर 2.1-अपडेट 1। हाल ही में एंड्रॉइड के एक ही संस्करण को चलाने वाला एचटीसी इनक्रेडिबल मिला है, और सेवा खोज सटीक कोड का उपयोग करके काम नहीं करती है। मैं उस पर अपने बालों को खींच रहा हूं, शुभकामनाएं ... – Churlbong

+0

क्या आप कुछ कोड जोड़ सकते हैं आप सब कुछ कैसे बुला रहे हैं .. मैंने CHANGE_WIFI_MULTICASR_STATE अनुमति जोड़कर कोशिश की है .. लेकिन मुझे अभी भी कोई परिणाम नहीं मिल रहा है। – mudit

+0

धन्यवाद, चुर्लबोंग - जिज्ञासा से बाहर, क्या आप जेएमडीएनएस का उपयोग कर रहे हैं या सिर्फ क्लाइंट कार्यान्वयन को लिख रहे हैं? (या एक और पुस्तकालय का उपयोग कर)? मैं इसे आज़मा दूंगा, क्योंकि मेरा लॉक कोड काफी समान नहीं है और मुझे यकीन नहीं है कि मुझे पता था कि नेटवर्क अनुमति से स्वतंत्र अनुमति भी थी। ;) –

3

क्या आपने मल्टीकास्ट लॉक को स्पष्ट रूप से अधिग्रहित किया है ताकि आप मल्टीकास्ट पैकेट प्राप्त कर सकें?

 
AndroidManifest.xml: 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 

// Networking code: 
WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
MulticastLock lock = wifi.createMulticastLock("mylock"); 
lock.acquire(); 

कि एंड्रॉयड अंक के अनुसार यह 2.0.1 तरह लग रहा है ठीक नहीं है थ्रेड। शायद आपको बाद में रिलीज में बदलाव करना चाहिए?

3

आप यह पहले से ही नहीं देखा है, तो मैं GitHub पर इस परियोजना के बाहर की जाँच के सुझाव देते हैं (अस्वीकरण - मैं लेखक नहीं कर रहा हूँ): https://github.com/twitwi/AndroidDnssdDemo

यह एक नमूना परियोजना है कि काफी शो कैसे सब कुछ प्राप्त करने के लिए है अभी भी अच्छा चल रहा है। इसमें कस्टम jmdns.jar भी शामिल है जो कुछ मुद्दों को हल करता है जो मुझे आउट-ऑफ-द-बॉक्स jmdns.jar के साथ डुप्लिकेट क्लास फ़ाइल रखते हैं।

8

मैं करने में कामयाब रहे Android के लिए पार संकलन Bonjour और यह ठीक वैसे ही एप्पल का इरादा रखता है यह प्रिंटर की तरह एम्बेडेड उपकरणों पर चलने के लिए तैयार रहें। Here बिल्ड स्क्रिप्ट है।

Here एक छोटी सुविधा रैपर है जो आपको उम्मीद के अनुसार काम करने के लिए है।

हम Bonjour वितरण से client_shim परत का उपयोग कर रहे सामान्य dns_sd.h एपीआई के माध्यम से एम्बेडेड mDNS कार्यान्वयन की असीमित एक्सेस रैप करने के लिए। आप idiom का उपयोग फाइलहैंडल्स के साथ नहीं करते हैं और शिम परत के साथ चयन करते हैं।

क्लाइंट_शिम परत बिल्कुल ऐप्पल द्वारा समर्थित नहीं है - वास्तव में मुझे चर नामों में टाइपो मिलते हैं, लेकिन यह फिर भी काम कर रहा है। सही शीर्षलेख फ़ाइलों को शामिल करने के लिए आपको this patch लागू करने की आवश्यकता होगी, टाइपो को ठीक करें और एंड्रॉइड एपीआई के माध्यम से लॉगिंग प्राप्त करें।

एक और बात: आप जरूरत प्राप्त करने और अपने जावा कोड के भीतर से बहुस्त्र्पीय लॉक धारण करने के लिए, अन्यथा आप किसी और नहीं मिलेगा। उदाहरण here देखें।

इसके अलावा, मैं एंड्रॉइड एपीआई लेवल 8 पर काम कर रहा हूं और हम Bonjour for Android की प्रीबिल्ट लाइब्रेरी बनाए रख रहे हैं, हालांकि मुझे यकीन नहीं है कि यह लाइसेंस के अनुसार ठीक है या नहीं।

संपादित:

संस्करण prebuilts में 330.10 है, client_shim साथ नए लोगों के रूप में स्थिर पुस्तकालयों खिड़कियों पर MSVC2010 साथ संकलित करने के लिए असफल हो, तो हम इस एक रखा।

शुभकामनाएं!

+0

कुछ लिंक मर चुके हैं, लेकिन मैं प्रीबिल्ट उदाहरण ढूंढने में कामयाब रहा। क्या इन कक्षाओं (प्रकाशक, सब्सक्राइबर, नोड, डिस्कवरी) का इस्तेमाल ऐप्पल डिवाइस के साथ संवाद करने के लिए किया जा सकता है जो बोनजोर के कार्यान्वयन का उपयोग करता है या क्या ऐप्पल डिवाइस को भी उमंडो चलाना होगा? –

+0

हमारे पास अभी भी प्रीबिल्ट हैं, लेकिन वे एक [tarball] (http://umundo.tk.informatik.tu-darmstadt.de/prebuilt/0.4.3/) में स्थानांतरित हो गए हैं जो कॉन्फ़िगरेशन-टाइम पर डाउनलोड किया गया है। प्रत्येक मंच के लिए लेकिन डार्विन के लिए, एक libmdnsembedded अंदर है। uMundo पब/उप के लिए ज़ीरोएमक्यू + एमडीएनएस है - यदि आप केवल सेवाओं को ढूंढना चाहते हैं, तो libmdnsembedded और dns_sd.h का उपयोग क्लाइंट_शिम कार्यान्वयन में किए गए चयन के बिना करें। – sradomski

+0

मैं अपने एंड्रॉइड डिवाइस के माध्यम से सिर्फ सेवाएं ढूंढना चाहता हूं। क्या dns_sd.h के संयोजन के साथ एंड्रॉइड डिवाइस पर 'libmDNSEmbedded.a' फ़ाइल का उपयोग करने के लिए कोई उदाहरण हैं? क्या सरल सेवा खोज के लिए जावा रैपर है? –

6

एंड्रॉइड 4.1 अनुप्रयोगों के लिए देशी बोनजोर समर्थन (एमडीएनएस रेस्पॉन्डर के माध्यम से इसे लागू करने जैसा दिखता है) जोड़ता है। उच्च स्तरीय एपीआई को Network Service Discovery कहा जाता है लेकिन नीचे बोनजोर प्रतीत होता है। android.net.wifi.p2p.WifiP2pManager के माध्यम से खुला निचला स्तर वाला एपीआई भी प्रतीत होता है।

हालांकि यह सिस्टम-व्यापी DNS लुकअप के लिए उपयोग नहीं किया जाता है (उदाहरण के लिए मैं केवल क्रोम के माध्यम से http://machine.local पर ब्राउज़ नहीं कर सकता) ऐसा लगता है कि यह मूल एंड्रॉइड ऐप्स के लिए ज़ीरोकॉन्फ़/बोनजोर लुकअप करने का तरीका होगा आगे जा रहा है।

+5

दुर्भाग्यवश, मूल एपीआई TXT रिकॉर्ड तक पहुंच की अनुमति नहीं देता है, जो गंभीर रूप से सीमित है - https://code.google.com/p/android/issues/detail?id=136099 –