2013-06-25 10 views
11

मैं एक ऐप्लिकेशन है जो कुछ प्रसारण संदेश भेजता है और अन्य Android उपकरणों से कुछ जवाब प्राप्त करता है विकसित करने के लिए कोशिश कर रहा हूँ पर यह प्राप्त नहीं। मुझे अन्य उपकरणों से यूडीपी संदेशों को प्राप्त करने में कुछ परेशानी हो रही है। मुझे लगता है कि इस कोड जिंजरब्रेड पर काम किया उल्लेख करना चाहिए लेकिन JellyBean पर इसे अब और काम नहीं कर रहा है और मैं क्या समस्या हो सकती है पता नहीं है।भेजें प्रसारण यूडीपी लेकिन अन्य Android उपकरणों

यहाँ मैं कहाँ प्रसारण संदेश भेजने के लिए (मैं जानता हूँ कि अन्य उपकरणों पोर्ट 5000 पर सुनने) है:

private void sendUDPMessage(String msg) { 

    try { 
     DatagramSocket clientSocket = new DatagramSocket(); 

     clientSocket.setBroadcast(true); 
     InetAddress address = InetAddress.getByName(Utils.getBroadcastAddress()); 

     byte[] sendData; 

     sendData = msg.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, 
       sendData.length, address, 5000); 
     clientSocket.send(sendPacket); 

     clientSocket.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

और यहाँ वह जगह है जहाँ मैं इसे प्राप्त करते हैं:

private void start_UDP() 
{ 
    try { 
      serverSocketUDP = new DatagramSocket(5000); 
     } 
    catch (Exception e) { 

     Log.i(LOGTAG, "Exception opening DatagramSocket UDP"); 
    } 

    final byte[] receiveData = new byte[1024]; 


    while(runningUDP) { 
     Log.d(LOGTAG, "Waiting for Broadcast request in ServerUDP."); 

     final DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 

     serverSocketUDP.receive(receivePacket); 


       byte[] sendData = new byte[1024]; 
       InetAddress address = receivePacket.getAddress(); 
       int port = receivePacket.getPort(); 
       if(!receivePacket.getAddress().getHostAddress().equals(Utils.getLocalIpAddress())) 
       { 
        String req = new String(receivePacket.getData(), 0, receivePacket.getLength()); 


        Log.d(LOGTAG, "Received UDP message : "+req+" from: "+receivePacket.getAddress().getHostAddress()); 
       } 
         }// while ends 
     }//method ends 

मैं उल्लेख करना चाहिए कि ये 2 कार्य 2 अलग-अलग धागे में अलग हैं, इसलिए मैं एक साथ भेज और प्राप्त कर सकता हूं।

मैं भी निम्नलिखित ताले प्राप्त:

powerManager =(PowerManager)context.getSystemService(Context.POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK ,LOGTAG); // PARTIAL_WAKE_LOCK Only keeps CPU on 
    wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
    wifiLock = wifiManager.createWifiLock(3, LOGTAG); 
    multicastLock = wifiManager.createMulticastLock(LOGTAG); 

    wakeLock.acquire(); 
    multicastLock.acquire(); 
    wifiLock.acquire(); 

और मैनिफ़ेस्ट फ़ाइल पर अनुमतियों:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.WRITE_SETTINGS"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 

मैं परीक्षण किया है अगर संदेशों wireshark और tcpdump का उपयोग कर भेजा जाता है और वे भेजे जाते हैं। इसके अलावा, क्या और भी अधिक अजीब है, मैं प्रसारण संदेश है कि मैं भेजने, प्राप्त किया जाता है (लेकिन मैं उन्हें त्यागने क्योंकि मैं न अपने आप से भेजे गए संदेशों की प्रक्रिया पूरी की) लेकिन मैं प्रसारण संदेशों अन्य उपकरणों से भेजा (जो होना चाहिए प्राप्त न एक ही प्रारूप, केवल स्रोत पता अलग होगा और संदेश शामिल होगा, किसी भी तरह से प्रसारण संदेश को प्रभावित नहीं करना चाहिए)।

कृपया क्योंकि मैं वास्तव में कुछ और मैं कोशिश कर सकते से बाहर भाग मुझे पता है अगर आप किसी भी विचार है करते हैं। किसी भी सहायता की सराहना की जाएगी। धन्यवाद!

संपादित करें: मैं कुछ परीक्षण किया है और यहां तक ​​कि अगर जब मैं फोन ifconfig wlan0 में से प्रत्येक पर चलाने के लिए और यह कहते हैं की तरह

ifconfig wlan0 
    wlan0: ip 169.254.17.28 mask 255.255.0.0 flags [up broadcast multicast] 

कुछ जिसका अर्थ है कि इंटरफेस सक्रिय है और आईपी सेट किया गया है और प्रसारण संदेश और बहुस्त्र्पीय msgs प्राप्त कर सकते हैं लेकिन जब मैं

    InetAddress in=InetAddress.getByName("169.254.17.28"); 
      if (in.isReachable(1000)) 
       Log.i(LOGTAG, "host is reachable"); 
      else 
       Log.i(LOGTAG, "host is not reachable"); 

का उपयोग यह लॉग मेजबान में पता चलता पहुंच योग्य नहीं है।

यह वह जगह है जहाँ मैं वाई-फाई

private void startWifiAdhoc() { 

    WifiManager wifiManager =  (WifiManager)SharingFileService.context.getSystemService(Context.WIFI_SERVICE); 
    String command=""; 
    if (condWifiAdhoc == false) { 

     condWifiAdhoc=true; 
     wifiInterface = Utils.getWifiInterface(); 


     wifiManager.setWifiEnabled(true); 
     localIP = Utils.getLinkLocalAddress(); 
    } 
    else 
    { 
     wifiManager.setWifiEnabled(true); 
     localIP = Utils.getLinkLocalAddress(); 
    } 
     // Set wifi ad-hoc 
     command = context.getFilesDir().getPath() 
       + "/iwconfig " + wifiInterface + " mode ad-hoc essid " 
       + "mcp" + " channel " + "1" + " commit\n"; 

     Log.i(LOGTAG, command); 
     Utils.rootExec(command); 


     Log.i(LOGTAG, "Ip address used :" + localIP); 
     command = context.getFilesDir().getPath() 
       + "/ifconfig " + wifiInterface + " " + localIP 
       + " netmask 255.255.0.0 up\n"; 



     Log.i(LOGTAG, command); 
     Utils.rootExec(command); 

} 
+0

नोट कुछ है कि राउटर डिफ़ॉल्ट रूप से मल्टीकास्ट DNS अक्षम करते हैं। – yorkw

+0

ओह ... मुझे जिक्र करना होगा कि मैं वाईफाई एडमोक – Lara

+0

में हूं, आप इस पोस्ट को देखना चाहेंगे: http://stackoverflow.com/a/16208617/1028256 यह कहता है कि कुछ वाईफाई ड्राइवर प्रसारण रिसीवर को अक्षम कर सकते हैं, लेकिन उस स्थिति में यह नींद मोड से फिर से शुरू होने के बाद होता है। – Mixaz

उत्तर

1

मैं जब एक ऐसी ही समस्या को हल करने की कोशिश कर अपनी पोस्ट में आए चालू करें। क्या आपको अपनी सामग्री मिल रही है?

मेरे मामले में, मैं एक नेक्सस 7 और नेक्सस वन (पहली Jelly Bean 4.3 के साथ जनरल) (जिंजरब्रेड 2.3.6) प्राप्त करने के लिए यूडीपी के माध्यम से एक दूसरे से बात कोशिश कर रहा था। प्रारंभ में मेरे एप्लिकेशन, दोनों उपकरणों पर चल रहा है, सफलतापूर्वक लिंक होगा, लेकिन केवल एक तरह से संचार के साथ फोन से गोली करने के लिए। मैनिफेस्ट में इंटरनेट पर केवल एक ही अनुमति थी: इंटरनेट। एक बार जब मैंने ACCESS_NETWORK_STATE को मैनिफेस्ट में अनुमति दी थी तो टैबलेट से फोन पर संचार काम करना शुरू कर दिया।

तो, किसी कारण से, नेक्सस 7 दोनों भेजने और प्राप्त करने यूडीपी पैकेट के लिए सिर्फ इंटरनेट अनुमति के साथ खुश है (ठीक है, इसके बारे में मेरी विशेष कार्यान्वयन, कम से कम)।नेक्सस वन केवल इंटरनेट अनुमति के साथ भेजेगा लेकिन तब तक प्राप्त नहीं होगा जब तक ACCESS_NETWORK_STATE अनुमति भी दी जाती है।

आपका कोड मेरा जैसा दिखता है (हालांकि मैं आपके "UTILS" कॉल को नहीं पहचानता हूं)। मेरे मामले में, हालांकि, परीक्षण के प्रयोजनों के लिए, मैंने प्रसारण पता हार्ड कोड किया है (1 9 2.168.एन.255)। जब आप किसी विज्ञापन नेटवर्क पर हों तो मैं एक एक्सेस पॉइंट पर हूं। शायद इसका कुछ प्रभाव भी है।

12

मुझे मिल गया यह एक विधि यहाँ वर्णित का उपयोग कर प्रसारण पते की गणना करने के द्वारा काम कर रहे: https://code.google.com/p/boxeeremote/wiki/AndroidUDP

यहाँ मेरी रिसीवर है:

try { 
    //Keep a socket open to listen to all the UDP trafic that is destined for this port 
    socket = new DatagramSocket(Constants.PORT, InetAddress.getByName("0.0.0.0")); 
    socket.setBroadcast(true); 

    while (true) { 
    Log.i(TAG,"Ready to receive broadcast packets!"); 

    //Receive a packet 
    byte[] recvBuf = new byte[15000]; 
    DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); 
    socket.receive(packet); 

    //Packet received 
    Log.i(TAG, "Packet received from: " + packet.getAddress().getHostAddress()); 
    String data = new String(packet.getData()).trim(); 
    Log.i(TAG, "Packet received; data: " + data); 

    // Send the packet data back to the UI thread 
    Intent localIntent = new Intent(Constants.BROADCAST_ACTION) 
      // Puts the data into the Intent 
      .putExtra(Constants.EXTENDED_DATA_STATUS, data); 
    // Broadcasts the Intent to receivers in this app. 
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent); 
    } 
} catch (IOException ex) { 
    Log.i(TAG, "Oops" + ex.getMessage()); 
} 

और यहाँ मेरी इस है:

public void sendBroadcast(String messageStr) { 
    // Hack Prevent crash (sending should be done using an async task) 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

    try { 
     //Open a random port to send the package 
     DatagramSocket socket = new DatagramSocket(); 
     socket.setBroadcast(true); 
     byte[] sendData = messageStr.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, getBroadcastAddress(), Constants.PORT); 
     socket.send(sendPacket); 
     System.out.println(getClass().getName() + "Broadcast packet sent to: " + getBroadcastAddress().getHostAddress()); 
    } catch (IOException e) { 
     Log.e(TAG, "IOException: " + e.getMessage()); 
    } 
    } 

    InetAddress getBroadcastAddress() throws IOException { 
    WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcp = wifi.getDhcpInfo(); 
    // handle null somehow 

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
    byte[] quads = new byte[4]; 
    for (int k = 0; k < 4; k++) 
     quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); 
    return InetAddress.getByAddress(quads); 
    } 
+0

क्या यह कोड तभी काम करता है जब डिवाइस एक ही स्थानीय नेटवर्क पर हों? – zer0uno

+0

हां, यह सही है – caspii

+0

एंड्रॉइड 5.1.1 और एंड्रॉइड 7.1.2 पर सत्यापित –

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