Пытаюсь реализовать 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
Что может быть не так?
Проблема была в 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"});
И компьютер включается
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Работаю над андроид игрушкой и вылазит ошибка
Есть массив со словами, как вывести слова в массиве по алфавиту и посчитать сколько одинаковых слов, например: