2013-06-24 4 views
1

я пытаюсь сделать Wake On Lan приложения в Java (для Android), так что я искал, и нашел этот код:Android Wake On Lan в Java

import java.io.*; 
import java.net.*; 

public class WakeOnLan { 

public static final int PORT = 9;  

public static void main(String[] args) { 

    if (args.length != 2) { 
     System.out.println("Usage: java WakeOnLan <broadcast-ip> <mac-address>"); 
     System.out.println("Example: java WakeOnLan 192.168.0.255 00:0D:61:08:22:4A"); 
     System.out.println("Example: java WakeOnLan 192.168.0.255 00-0D-61-08-22-4A"); 
     System.exit(1); 
    } 

    String ipStr = args[0]; 
    String macStr = args[1]; 

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

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

     System.out.println("Wake-on-LAN packet sent."); 
    } 
    catch (Exception e) { 
     System.out.println("Failed to send Wake-on-LAN packet: + e"); 
     System.exit(1); 
    } 

} 

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; 
} 


} 

Я попробовал его на моем компьютере, он работал, но он не работает на Android :(Я пытался изменить его, но до сих пор ничего :(Вот не мой код для Android:.

import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 

import com.macura.wakemypc.MainActivity; 

import com.macura.wakemypc.R; 
import com.macura.wakemypc.MainActivity; 

import com.macura.wakemypc.MainActivity; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.EditText; 

public class MainActivity extends Activity { 
public static final int PORT = 9;  





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

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
public void buttonClick(View view) { 
    EditText iptext = (EditText)findViewById(R.id.editText1); 
    EditText mactext = (EditText)findViewById(R.id.editText2); 
    String mac = mactext.toString(); 
    String broadcastIP = iptext.toString(); 
    MainActivity.wakeup(broadcastIP, mac); 
} 
private static byte[] getMacBytes(String mac) throws IllegalArgumentException { 
    // TODO Auto-generated method stub 
    byte[] bytes = new byte[6]; 
    if (mac.length() != 12) 
    { 
     throw new IllegalArgumentException("Invalid MAC address..."); 
    } 
    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); 
     } 
    } 
    catch (NumberFormatException e) { 
     throw new IllegalArgumentException("Invalid hex digit..."); 
    } 
    return bytes; 
} 

public static void wakeup(String broadcastIP, String mac) { 
    if (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); 
      } 

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



     } 
     catch (Exception e) { 
    } 

} 
} 

Everytime I введите IP и макинтош адресовать это не делает ничего Итак, вы можете мне помочь, пожалуйста? :) Да, и извините за мой английский: D

+0

Есть ли у вашего устройства Android настоящий порт Ethernet? Или вы пытаетесь использовать Wake on LAN через WLAN? –

+0

Я использую свой телефон Android, подключенный к Wi-Fi – StfgMccx

ответ

1

Я не уверен в остальной части кода, но вы должны использовать String mac = mactext.getText().toString(); вместо String mac = mactext.toString();, потому что без этого изменения вы конвертируете в строку весь текст EditText, а не только его значение. P.S. я знаю его через 10 месяцев после вопроса, все еще для тех, кто придет сюда, ищет код Wroid для Android, он должен быть полезен

0

Я знаю, что немного поздно, но я также долго пытался получить этот Java-код андроид. Решением является использование широковещательной передачи ip. Это все. Cheers j

+0

Не могли бы вы добавить более подробную информацию о решении, которое вы предоставляете? – abarisone

+0

Просто используйте широковещательный IP-адрес маршрутизатора вместо IP-сети компьютеров. Трансляция: http://en.wikipedia.org/wiki/Broadcast_address Инструмент расчета: http://www.petenetlive.com/KB/Article/0000215.htm – JuloOr