Wake-on-LAN приложение для Android

74
02 ноября 2021, 02:20

Пытаюсь реализовать Wake On LAN в своем приложении. Вот код:

 public void onClickWakeUp(View view)  {
    {
        String ip = ed1.getText().toString();
        String mac = ed2.getText().toString();
        wakeUp(ip,mac);
    }
}
public static void wakeUp(String ip,String mac) {
    String ipStr = ip;
    String macStr = mac;
    try {
        byte[] macBytes = getMacBytes(macStr);
        byte[] bytes = new byte[6 + 16 * macBytes.length];
        for (int i = 0; i < 6; i++) {
            bytes[i] = (byte) 0xff;
        }
        for (int i = 6; i < bytes.length; i += macBytes.length) {
            System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
        }
        final InetAddress address = InetAddress.getByName(ipStr);
        final DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 9);
        final DatagramSocket socket = new DatagramSocket();
        socket.send(packet);
        socket.close();
        Log.i(MAINLOG,"Wake-on-LAN packet sent.");
    }
    catch (Exception e) {
        Log.e(MAINLOG,"Failed to send Wake-on-LAN packet:" + e);
    }
}
private static byte[] getMacBytes(String macStr) throws IllegalArgumentException {
    byte[] bytes = new byte[6];
    String[] hex = macStr.split("(\\:|\\-)");
    if (hex.length != 6) {
        throw new IllegalArgumentException("Invalid MAC address.");
    }
    try {
        for (int i = 0; i < 6; i++) {
            bytes[i] = (byte) Integer.parseInt(hex[i], 16);
        }
    }
    catch (NumberFormatException e) {
        throw new IllegalArgumentException("Invalid hex digit in MAC address.");
    }
    return bytes;
}

Брал данную библиотеку,слегка отредактировав её:ссылка

Нужные байты отправляются,но компьютер не включается. Со стороны компьютера и роутера точно все настроено(порт,ip,mac верные,другие приложения с маркета WOL работают).

В manifest-файле указал:

<uses-permission android:name="android.permission.INTERNET"/>

Через снифер видно,что нужные данные отправляются по нужному ip:

А это другое приложение с маркета,которое включает компьютер:

И еще указал в onCreate:

if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
           StrictMode.setThreadPolicy(policy);
       }

Так как без этой строчки в логе такая ошибка:

Failed to send Wake-on-LAN packet:android.os.NetworkOnMainThreadException

Что может быть не так?

Answer 1

Проблема была в IP. Нужно слать "магические пакеты" на широковещательный адрес. Самое странное то,что при компилировании этой же библиотеки с помощью JDK 8,компьютер включается с указанием его зарезервированного IP(типа 192.168.0.105),но под Android такое не работает.

Определить широковещательный адрес легко. Если адрес сети будет равен 192.168.0.0 и маска подсети будет равна 255.255.255.0,то широковещательный адрес получается: 192.168.0.255 (192.168.1.0 = 192.168.1.255 и так далее).

Далее уже в обработчике щелчка передаем аргументы:

wakeUp(new String[]{"192.168.0.255","00:1D:72:3D:45:CB"});

И компьютер включается

READ ALSO
Возникает ошибка java.lang.NoClassDefFoundError: Failed resolution of: [Ljava/awt/geom/Line2D$Float;

Возникает ошибка java.lang.NoClassDefFoundError: Failed resolution of: [Ljava/awt/geom/Line2D$Float;

Работаю над андроид игрушкой и вылазит ошибка

129
Java Orika Mapper

Java Orika Mapper

ЗдраствуйтеУ меня есть PostEntity, PostDto и есть OrikaMapper

166
Java: вывести слова из текста в алфавитном порядке

Java: вывести слова из текста в алфавитном порядке

Есть массив со словами, как вывести слова в массиве по алфавиту и посчитать сколько одинаковых слов, например:

213
Ошибка инициализации MySQL 8.0

Ошибка инициализации MySQL 8.0

Помогите, пожалуйста, запустить mySql 80 Файл my

187