Это моя первая попытка создать приложение, в котором одной из функций является 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