Tôi đang cố phát triển một ứng dụng gửi một số tin nhắn quảng bá và nhận một số câu trả lời từ các thiết bị Android khác. Tôi gặp sự cố khi nhận tin nhắn UDP từ các thiết bị khác. Tôi nên đề cập rằng mã này làm việc trên Gingerbread nhưng trên Jellybean nó không hoạt động nữa và tôi không biết điều gì có thể là vấn đề.Gửi Broadcast UDP nhưng không nhận được trên các thiết bị Android khác
Đây là nơi tôi gửi tin nhắn quảng bá (Tôi biết các thiết bị khác lắng nghe trên cổng 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();
}
}
Và đây là nơi mà tôi nhận được nó:
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
tôi nên đề cập rằng 2 chức năng này tách biệt trong 2 luồng khác nhau để tôi có thể gửi và nhận đồng thời.
Tôi cũng có được khóa sau:
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();
Và các điều khoản trên các tập tin Manifest:
<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"/>
Tôi đã thử nghiệm nếu các thông điệp được gửi bằng Wireshark và tcpdump và chúng được gửi. Hơn nữa, những gì thậm chí còn lạ hơn, tôi nhận được tin nhắn phát mà tôi gửi (nhưng tôi loại bỏ chúng vì tôi không cần xử lý các tin nhắn được gửi từ bản thân mình) nhưng tôi không nhận được tin nhắn được gửi từ các thiết bị khác (cần có cùng một định dạng, chỉ có địa chỉ nguồn sẽ khác và thông báo chứa, dù cách nào cũng không ảnh hưởng đến thông báo phát sóng).
Vui lòng cho tôi biết nếu bạn có bất kỳ ý tưởng nào vì tôi thực sự đã hết mọi thứ khác mà tôi có thể thử. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn!
EDIT: Tôi đã thực hiện một số xét nghiệm và thậm chí nếu khi tôi chạy trên mỗi wlan0 điện thoại ifconfig và nó nói cái gì đó như
ifconfig wlan0
wlan0: ip 169.254.17.28 mask 255.255.0.0 flags [up broadcast multicast]
có nghĩa là giao diện đang hoạt động và địa chỉ IP được thiết lập và có thể nhận tin nhắn quảng bá và thông điệp đa hướng nhưng khi tôi sử dụng
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");
Nó hiển thị trong máy chủ nhật ký không thể truy cập được.
Đây là nơi tôi bật Wi-fi
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);
}
Lưu ý rằng một số các bộ định tuyến vô hiệu hóa DNS multicast theo mặc định. – yorkw
oh ... Tôi phải đề cập đến rằng tôi đang ở trong một wifi adhoc – Lara
Bạn có thể muốn xem bài đăng này: http://stackoverflow.com/a/16208617/1028256 Nó nói rằng một số trình điều khiển wifi có thể vô hiệu hóa máy thu phát sóng, nhưng trong trường hợp đó nó xảy ra sau khi tiếp tục từ chế độ ngủ. – Mixaz