Отправлять Broadcast UDP, но не получать его на других устройствах AndroidAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Отправлять Broadcast UDP, но не получать его на других устройствах Android

Сообщение Anonymous »

Я пытаюсь разработать приложение, которое отправляет широковещательные сообщения и получает ответы от других устройств Android. У меня возникли проблемы с получением сообщений UDP от других устройств. Должен отметить, что этот код работал на Gingerbread, но на JellyBean он больше не работает, и я не знаю, в чем может быть проблема.

Здесь я отправляю широковещательное сообщение. (Я знаю, что другие устройства прослушивают порт 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


Я должен отметить, что эти две функции разделены на два разных потока, поэтому я могу отправлять и получать одновременно.

Также я приобретаю следующие замки:

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();


И разрешения для файла манифеста:










Я проверил, отправляются ли сообщения с помощью Wireshark и tcpdump, и они отправляются. Более того, что еще более странно, я получаю широковещательные сообщения, которые отправляю (но отбрасываю их, поскольку мне не нужно обрабатывать отправленные от себя сообщения), но не получаю широковещательные сообщения, отправленные с других устройств (которые должны иметь том же формате, только адрес источника будет другим, а содержащееся сообщение в любом случае не должно влиять на широковещательное сообщение).

Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи, потому что У меня действительно закончилось все, что я мог попробовать. Любая помощь будет оценена по достоинству. Спасибо!

РЕДАКТИРОВАТЬ:
Я провел несколько тестов, и даже если при запуске на каждом из телефонов ifconfig wlan0 он говорит что-то вроде

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


это означает, что интерфейс активен, IP установлен и может принимать широковещательные и многоадресные сообщения, но когда я использую

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");


В журналах показано, что хост недоступен.

Здесь я включаю 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);

}


Подробнее здесь: https://stackoverflow.com/questions/173 ... id-devices
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Отправлять Broadcast UDP, но не получать его на других устройствах Android
    Anonymous » » в форуме Android
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Отправлять Broadcast UDP, но не получать его на других устройствах Android
    Anonymous » » в форуме Android
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • UDP Broadcast в C# работает только на той машине, на которой он запущен.
    Anonymous » » в форуме C#
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Получить пакет Datagram Datagram Broadcast UDP
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • UDP-клиент не печатает полученные сообщения с udp-сервера
    Anonymous » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»