簡體   English   中英

局域網喚醒應用程序僅適用於最近關閉的設備

[英]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
    }

我在代碼中嘗試了什么

  • 我更改了端口號(從隨機(11111、55555、快速谷歌搜索建議的端口 0、7、9 開始)都失敗了
  • 發送不是一個而是 10 到 100 個數據包
  • 我也在我的 PC 上將應用程序作為 Intellij 的 java (kotlin) 項目運行,結果相同

我發現了什么

  1. WOL 並不適用於所有設備
  2. 電源狀態可能很重要
  3. Wake On Lan無論如何都能喚醒設備,所以我認為問題在於應用程序,而不是任何設置
  4. 所有網絡 IP 和 MAC 均為 static

發送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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM