मैं एक ऐप्लिकेशन है जो कुछ प्रसारण संदेश भेजता है और अन्य 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);
}
नोट कुछ है कि राउटर डिफ़ॉल्ट रूप से मल्टीकास्ट DNS अक्षम करते हैं। – yorkw
ओह ... मुझे जिक्र करना होगा कि मैं वाईफाई एडमोक – Lara
में हूं, आप इस पोस्ट को देखना चाहेंगे: http://stackoverflow.com/a/16208617/1028256 यह कहता है कि कुछ वाईफाई ड्राइवर प्रसारण रिसीवर को अक्षम कर सकते हैं, लेकिन उस स्थिति में यह नींद मोड से फिर से शुरू होने के बाद होता है। – Mixaz