[英]Wake-on-Lan app only works for recently shutdown devices
我在 Kotlin 中編寫了一個小應用程序,它通過我的本地網絡向智能電視發送一個魔術包。 我使用了這種方法(代碼),用 Kotlin 重寫(加上我硬編碼了 IP 和 MAC 用於測試目的)。
當電視關閉時,我可以很容易地用我的應用程序重新啟動它。 一段時間后,這不再起作用了。
import java.net.DatagramPacket
import java.net.DatagramSocket
import java.net.InetAddress
fun main() {
magicPacket("A8:23-FE:A0:5C:DB", "192.168.xx.xxx", 7)
}
/**
* Android:
* Network interaction starting in new Thread!
*/
fun magicPacket(mac: String, ip: String, PORT: Int = 7) {
// throws IllegalThreadStateException without declaration
//val t = thread {
val packet = buildPacket(mac)
val datagramSocket = DatagramSocket()
try {
datagramSocket.send(
DatagramPacket(
packet,
packet.size,
InetAddress.getByName(ip),
PORT
)
)
datagramSocket.close()
} catch (e: Exception) {
e.printStackTrace()
}
//}
}
private fun buildPacket(mac: String): ByteArray {
// prepare packet (6 bytes header) (16 * 6 bytes MAC)
val temp = ByteArray(6 + 6 * 16)
val macBytes = ByteArray(6)
for (i in 0..5) {
temp[i] = 0xFF.toByte()
macBytes[i] = mac.split(":", "-")[i].toInt(16).toByte()
}
for (i in 6 until temp.size step macBytes.size) System.arraycopy(
macBytes,
0,
temp,
i,
macBytes.size
)
return temp
}
發送wakeonlan 數據包時,需要確保目標設備可以接收數據包。
目前,您正在將數據包發送到設備的 IPv4 地址。
當您的計算機必須向 IPv4 地址發送數據包時,它需要知道其 MAC 地址。 所以它會詢問網絡“誰擁有 IPv4 192.168.2.32?告訴我你的 MAC 地址”。 由於您的電視已關閉,因此它沒有響應。
永遠不會發送真正的 LAN 喚醒數據包,因為它不知道目標 MAC 地址。
那么真正的問題就變成了,為什么它在關閉后直接工作,原因是你的操作系統保存了一個IPv4+mac地址表列表,所以它可以快速發送數據包。 您可以在 Windows 上使用命令arp -av
查看此列表
請注意當您的程序成功喚醒電視時它如何顯示“動態”,但當它未能喚醒電視時顯示“無效”。
一種解決方案是將數據包發送到廣播 IPv4 地址,每個設備都會收到該地址。 此 IPv4 地址通常以.255
結尾,具有典型的消費者 IPv4 范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.