2011-03-08 17 views
12

मैं एक ऐसा एप्लीकेशन बना रहा हूं जो मोबाइल और वाई-फाई डिवाइस के बीच डेटा स्थानांतरित कर सके ... मोबाइल को AP सक्षम (कोड के माध्यम से) मिला है और दूसरा डिवाइस इससे जुड़ता है विशिष्ट नेटवर्क ... नेटवर्क (एपी) से जुड़े उपकरणों के विवरण देखने के लिए मैं कोड के माध्यम से कैसे पता लगा सकता हूं? ** क्या इसके लिए कोई समाधान है?एंड्रॉइड एप्लिकेशन वाई-फाई डिवाइस - एपी कनेक्टिविटी

मैंने वाईफ़ाई हॉट स्पॉटHTC Desire में एक एप्लिकेशन देखा है जो नेटवर्क से जुड़े उपकरणों के आईपी पते दिखाने की कार्यक्षमता करता है। यह कैसे हासिल किया जा सकता है?

Review: Sprint Mobile Hotspot on HTC EVO 4G देखें।

यह एक ऐसा एप्लिकेशन दिखाता है जो वास्तव में कनेक्ट किए गए उपयोगकर्ताओं को प्रदर्शित कर सकता है। हम प्रोग्रामेटिक तरीके से कैसे कर सकते हैं? क्या इसके लिए कोई एपीआई है?

एक पहुँच बिंदु बनाने के लिए:

private void createWifiAccessPoint() { 
    if (wifiManager.isWifiEnabled()) 
    { 
     wifiManager.setWifiEnabled(false); 
    } 
    Method[] wmMethods = wifiManager.getClass().getDeclaredMethods(); //Get all declared methods in WifiManager class 
    boolean methodFound = false; 

    for (Method method: wmMethods){ 
     if (method.getName().equals("setWifiApEnabled")){ 
      methodFound = true; 
      WifiConfiguration netConfig = new WifiConfiguration(); 
      netConfig.SSID = "\""+ssid+"\""; 
      netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
      //netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
      //netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
      //netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
      //netConfig.preSharedKey = password; 
      //netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
      //netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
      //netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
      //netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 

      try { 
       boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig,true); 
       //statusView.setText("Creating a Wi-Fi Network \""+netConfig.SSID+"\""); 
       for (Method isWifiApEnabledmethod: wmMethods) 
       { 
        if (isWifiApEnabledmethod.getName().equals("isWifiApEnabled")){ 
         while (!(Boolean)isWifiApEnabledmethod.invoke(wifiManager)){ 
         }; 
         for (Method method1: wmMethods){ 
          if(method1.getName().equals("getWifiApState")){ 
           int apstate; 
           apstate = (Integer)method1.invoke(wifiManager); 
           //      netConfig = (WifiConfiguration)method1.invoke(wifi); 
           //statusView.append("\nSSID:"+netConfig.SSID+"\nPassword:"+netConfig.preSharedKey+"\n"); 
          } 
         } 
        } 
       } 

       if(apstatus) 
       { 
        System.out.println("SUCCESSdddd"); 
        //statusView.append("\nAccess Point Created!"); 
        //finish(); 
        //Intent searchSensorsIntent = new Intent(this,SearchSensors.class); 
        //startActivity(searchSensorsIntent); 
       } 
       else 
       { 
        System.out.println("FAILED"); 

        //statusView.append("\nAccess Point Creation failed!"); 
       } 
      } 
      catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } 
      catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    if (!methodFound){ 
     //statusView.setText("Your phone's API does not contain setWifiApEnabled method to configure an access point"); 
    } 
} 
+0

Thats सही नहीं, वाई-फाई हॉटस्पॉट पर एचटीसी डिजायर आप प्रदर्शित नहीं करता है जो उपकरणों की इच्छा से ही वाईफ़ाई नेटवर्क से जुड़े हुए हैं, लेकिन यह खोलता है एक स्वयं का वाईफाई-हॉटस्पॉट (और इसलिए एक वाईफाई-नेटवर्क) और स्वयं पहुंच बिंदु के रूप में कार्य करता है। यही कारण है कि यह कनेक्टेड डिवाइस प्रदर्शित कर सकता है, क्योंकि यह इसका अपना नेटवर्क है। – theomega

+0

ठीक है .... मैं प्रोग्रामिंग रूप से वाईफाई-एक्सेस पॉइंट स्थापित करने में सक्षम हूं ... अब इस नेटवर्क से जुड़े डिवाइसों का पता लगाने में सक्षम होगा? –

+0

आप एक्सेस-प्वाइंट को कहां निबंधित करते हैं? एक गैर एंड्रॉइड डिवाइस पर? तो ठीक। एंड्रॉइड पर सामान्य ऐप में डेटा प्राप्त करने के लिए रूट-एक्सेस के बिना यह काफी मुश्किल हो जाएगा। – theomega

उत्तर

5

आप डिवाइस को पिंग सकता है अगर आप अपने मेजबान के नाम या उसके IP पते पता है।

Runtime runtime = Runtime.getRuntime(); 
    Process proc = runtime.exec("ping -c 1 " + hostname); 
    proc.waitFor(); 

आप एक प्रतिक्रिया से ऊपर की तरह एक पिंग का उपयोग कर या TCP या UDP का उपयोग कर कनेक्ट करने का प्रयास करने के लिए नेटवर्क पर हर आईपी पते की कोशिश कर रहा एक आईपी पता स्कैन कर सकता है,।

यदि आप मैक पता जानते हैं, तो आप ARP तालिका का उपयोग कर सकते हैं।

यदि आपके पास डिवाइस पर कुछ सॉफ्टवेयर चल रहा है, तो आप प्रत्येक डिवाइस पर यूडीपी पैकेट भेज सकते हैं और उन्हें अपने एंड्रॉइड डिवाइस पर सुन सकते हैं। इसे कैसे करें Sending and receiving UDP broadcast packets in Android देखें।

+0

नेटवर्क से जुड़े उपकरणों की जांच करने के लिए कोई अन्य मूल्य नहीं है? ताकि मैं पुन: प्रयास कर सकूं और आवश्यक एक ढूंढ सकूं ... –

+1

ऊपर मेरा संपादन देखें। – theomega

+0

मेरी आवश्यकता में, मेरे पास एक वाईफाई नियंत्रक है जो डिवाइस से कनेक्ट होगा (उदाहरण के लिए एक मोबाइल जिसमें मेरा ऐप इंस्टॉल है, मेरे पास एपी सक्षम है और दूसरे डिवाइस से मैंने इस नेटवर्क से कनेक्ट किया है) ... अब मैं डिवाइस (ऐप इंस्टॉल) में कैसे पता लगा सकता हूं, नेटवर्क से जुड़े डिवाइस .. यूडीपी पैकेट भेजने के लिए मुझे अन्य डिवाइस पर एक और ऐप इंस्टॉल करने की आवश्यकता होगी .. वैसे भी..मैं यूडीपी पैकेट्स कैसे सुनूं? –

7

आप सभी ARP प्रविष्टियों को पढ़ने के लिए /proc/net/arp फ़ाइल पढ़ सकते हैं। ब्लॉग पोस्ट Android: Howto find the hardware MAC address of a remote host में उदाहरण देखें। एआरपी तालिका में, आईपी पते के आधार पर आपके वाई-फाई नेटवर्क से जुड़े सभी होस्टों की खोज करें।

यहां उदाहरण कोड है, जो एपी से जुड़े होस्टों की संख्या की गणना करता है। यह कोड मानता है कि एक एआरपी प्रविष्टि नेटवर्क से जुड़े फोन के लिए है और शेष एपी से जुड़े मेजबानों से हैं।

private int countNumMac() 
{ 
    int macCount = 0; 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader("/proc/net/arp")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      String[] splitted = line.split(" +"); 
      if (splitted != null && splitted.length >= 4) { 
       // Basic sanity check 
       String mac = splitted[3]; 
       if (mac.matches("..:..:..:..:..:..")) { 
        macCount++; 
       } 
      } 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     try { 
      br.close(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    if (macCount == 0) 
     return 0; 
    else 
     return macCount-1; //One MAC address entry will be for the host. 
} 
+0

हे ... कमाल :) यह काम किया ... बहुत कुछ ... –

+1

आप कैसे जानते थे कि आपको इस फ़ाइल तक पहुंचना था ??/proc/net/arp ... इसके लिए कोई स्रोत ?? –

+1

/proc एक मानक लिनक्स फ़ाइल सिस्टम है जो कर्नेल के बारे में बहुत सारी जानकारी देता है। आप http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html पर/proc/net के बारे में विवरण पा सकते हैं।/Proc की Google खोज आपको जानकारी पर एक टन देगी। – Paul

2

आप उपयोग कर सकते हैं accesspoint:

WifiApControl apControl = WifiApControl.getInstance(context); 

// These are cached and may no longer be connected, see 
// WifiApControl.getReachableClients(int, ReachableClientListener) 
List<WifiApControl.Client> clients = apControl.getClients() 
संबंधित मुद्दे