Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Lan唤醒应用程序仅适用于最近关闭的设备_Java_Android_Kotlin_Networking_Wake On Lan - Fatal编程技术网

Java Lan唤醒应用程序仅适用于最近关闭的设备

Java Lan唤醒应用程序仅适用于最近关闭的设备,java,android,kotlin,networking,wake-on-lan,Java,Android,Kotlin,Networking,Wake On Lan,我用Kotlin编写了一个小应用程序,通过本地网络向智能电视发送一个神奇的数据包。我使用了(),用Kotlin重写(加上为了测试目的我硬编码了IP和MAC) 当电视关机时,我可以用我的应用程序轻松地重新启动它。过了一段时间,这就不起作用了 代码 我在代码中尝试了什么 我更改了端口号(从random(111115555,快速谷歌搜索建议的端口0、7、9)开始,但都失败了 发送不是一个而是10到100个数据包 我也在我的PC上运行了Intellij的java(kotlin)项目,结果相同 我发现

我用Kotlin编写了一个小应用程序,通过本地网络向智能电视发送一个神奇的数据包。我使用了(),用Kotlin重写(加上为了测试目的我硬编码了IP和MAC)

当电视关机时,我可以用我的应用程序轻松地重新启动它。过了一段时间,这就不起作用了

代码 我在代码中尝试了什么
  • 我更改了端口号(从random(111115555,快速谷歌搜索建议的端口0、7、9)开始,但都失败了
  • 发送不是一个而是10到100个数据包
  • 我也在我的PC上运行了Intellij的java(kotlin)项目,结果相同
我发现了什么
  • WOL并非在所有设备上都能工作
  • 电源状态可能很重要
  • 无论如何都能唤醒设备,所以我认为问题在于应用程序,而不是任何设置
  • 所有网络IP和MAC都是静态的

  • 发送wakeonlan数据包时,您需要确保目标设备可以接收数据包

    此时,您正在将数据包发送到设备的IPv4地址

    当您的计算机必须向IPv4地址发送数据包时,它需要知道其MAC地址。因此它会询问网络“谁拥有IPv4 192.168.2.32?告诉我您的MAC地址”。由于您的电视已关闭,因此它不会响应

    真正的lan唤醒数据包永远不会被发送,因为它不知道目标mac地址

    真正的问题是,为什么它在关机后直接工作,原因是你的操作系统保留了一个IPv4+mac地址表的列表,因此它可以快速发送数据包。你可以在Windows上用命令
    arp-av
    查看这个列表

    请注意,当您的程序成功唤醒电视时,它是如何显示“动态”的,而当无法唤醒电视时,它是如何显示“无效”的


    一种解决方案是将数据包发送到每个设备接收的广播IPv4地址。该IPv4地址通常以
    .255
    结尾,具有典型的消费者IPv4范围。

    您是将数据包发送到广播IP还是计算机的IP?您需要将其发送到广播IP(或计算机加入的任何多播组)由于ARP en邻居表最终删除了该计算机的条目,我正在发送电视的IP…所以你说我需要将其发送到xxx.xxx.xx.255?
    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
        }