Проблема с реализацией Wake on Lan в приложении Android - PullRequest
0 голосов
/ 08 мая 2020

Это моя первая попытка создать приложение, в котором одной из функций является Wake On Lan. Я искал форумы и inte rnet и нашел следующий код. Однако пакеты не отправляются на компьютеры в моей локальной сети (я установил сниффер на ноутбук, и приложение WOL, которое я установил, работает), а в журнале отображается исключение.

Кроме того, я хотел бы последний введенный IP-адрес, который будет сохранен в поле editText и появится при повторном открытии приложения. Как мне это сделать?

Буду очень благодарен за любую помощь в этом вопросе. Спасибо.

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class MainActivity extends Activity {
public static final int PORT = 9;
String broadcastIpAddress = ("255.255.255.0");
EditText ipEditText;
WebView webView;
Button btnOpenLink;
String mUrl = "";
SharedPreferences mPrefs;

public void shutButton(View view) {

    InputMethodManager inputManager = (InputMethodManager)
            getSystemService(this.INPUT_METHOD_SERVICE);

    inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

    webView = findViewById(R.id.webView);
    ipEditText = findViewById(R.id.ipEditText);
    btnOpenLink = findViewById(R.id.shutButton);

            webView.setWebViewClient(new WebViewClient() {

                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
            });

            String page = ipEditText.getText().toString();
            if (!TextUtils.isEmpty(page)) {
                mUrl = "http://" + page + "/sleep_station";
                webView.loadUrl(mUrl);
            } else {
                Toast.makeText(MainActivity.this, "Please enter IP Address or Hostname", Toast.LENGTH_LONG).show();
            }
        }
    ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
public void buttonClick(View view) {

    EditText mactext = findViewById(R.id.macEditText);
    String broadcastIP = String.valueOf(broadcastIpAddress);
    String mac = mactext.getText().toString();
    Log.d("Read mac= ", mac);
    Log.d("Read ip=", broadcastIP);
    MainActivity.wakeup(broadcastIP, mac);
}

private static byte[] getMacBytes(String mac) throws IllegalArgumentException {
    Log.d("GetMacBytes", "method started");

    byte[] bytes = new byte[6];
    try {
        String hex;
        for (int i = 0; i < 6; i++) {
            hex = mac.substring(i*2, i*2+2);
            bytes[i] = (byte) Integer.parseInt(hex, 16);
            Log.d("GetMacbytes", "done");
            Log.d("Get Bytes", new String(bytes));
        }
    }
    catch (NumberFormatException e) {
        Log.e("GetMacBytes","error");
    }
    return bytes;
}

public static void wakeup(String broadcastIP, String mac) {
    Log.d("wakeup", "method started");
    if (mac == null) {
        Log.d("Mac error on wakeup", "mac = null");
        return;
    }

    try {
        byte[] macBytes = getMacBytes(mac);

        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);
            Log.d("wakeup (bytes)", new String(bytes));

        Log.d("wakeup", "calculating completed, sending...");

        InetAddress address = InetAddress.getByName(broadcastIP);
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 9);
        DatagramSocket socket = new DatagramSocket();
        socket.send(packet);
        socket.close();

        }   Log.d("magic-packet", "Magic Packet sent");

    }
    catch (Exception e) {

        Log.e("magic-packet", "error");

    }

}

}

Журнал:

2020-05-08 16:56:49.681 12909-12909/com.example.sleep_wake D/Read mac=: 001B44113AB7
2020-05-08 16:56:49.683 12909-12909/com.example.sleep_wake D/Read ip=: 255.255.255.0
2020-05-08 16:56:49.684 12909-12909/com.example.sleep_wake D/wakeup: method started
2020-05-08 16:56:49.684 12909-12909/com.example.sleep_wake D/GetMacBytes: method started
2020-05-08 16:56:49.684 12909-12909/com.example.sleep_wake D/GetMacbytes: done
2020-05-08 16:56:49.685 12909-12909/com.example.sleep_wake D/Get Bytes: �����������
2020-05-08 16:56:49.685 12909-12909/com.example.sleep_wake D/GetMacbytes: done
2020-05-08 16:56:49.685 12909-12909/com.example.sleep_wake D/Get Bytes: �F��������
2020-05-08 16:56:49.685 12909-12909/com.example.sleep_wake D/GetMacbytes: done
2020-05-08 16:56:49.685 12909-12909/com.example.sleep_wake D/Get Bytes: �F�������
2020-05-08 16:56:49.686 12909-12909/com.example.sleep_wake D/GetMacbytes: done
2020-05-08 16:56:49.686 12909-12909/com.example.sleep_wake D/Get Bytes: �F������
2020-05-08 16:56:49.687 12909-12909/com.example.sleep_wake E/GetMacBytes: done
2020-05-08 16:56:49.691 12909-12909/com.example.sleep_wake D/wakeup (bytes): �������F������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
2020-05-08 16:56:49.691 12909-12909/com.example.sleep_wake D/wakeup: calculating completed, sending...
2020-05-08 16:56:49.692 12909-12909/com.example.sleep_wake E/magic-packet: error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...