当前位置: 首页 > 面试题库 >

从Android向PC发送LAN​​唤醒数据包

太叔鸿博
2023-03-14
问题内容

我的Android应用程序使用HTTP向用户自己的PC发送数据/从用户自己的PC检索数据,并且与少数beta测试人员一起正常工作。我现在需要考虑PC处于休眠状态的情况。

我之前从未做过此事,但我在Google上搜索以找到有关WOL“魔术包”的信息以及一些用C语言编写的简单源(在客户端使用CAsyncSocket)。通过用户家庭网络上的wi-
fi连接执行此操作可能相对简单,但理想情况下,我希望此操作可通过移动Internet进行(假设用户可以将其家庭路由器配置为接受/转发数据包)。

我猜我需要使用一些通用的Java网络代码,而且我一直在研究java.net

目前,我无法决定应该使用java.net.Socket还是java.net.DatagramSocket。所以问题是,我是否采用这种正确的方法?我应该使用两种套接字类型中的哪一种(或者两者都足够)?非常感谢。


问题答案:

这是我过去使用的一些C#代码。转换成Java并使用DatagramPacket发送应该相对容易

namespace WakeOnLan
{
    class Program
    {
        static void Main(string[] args)
        {

            byte[] mac = new byte[] { mac address goes here i.e 0x00, and so on };
            WakeUp(mac);
        }

        private static void WakeUp(byte[] mac)
        {
            //
            // WOL packet is sent over UDP 255.255.255.0:40000.
            //
            Console.WriteLine("Waking Up.......");
            UdpClient client = new UdpClient();
            client.Connect(IPAddress.Broadcast, 40000);

            //
            // WOL packet contains a 6-bytes trailer and 16 times a 6-bytes sequence containing the MAC address.
            //
            byte[] packet = new byte[17 * 6];

            //
            // Trailer of 6 times 0xFF.
            //
            for (int i = 0; i < 6; i++)
                packet[i] = 0xFF;

            //
            // Body of magic packet contains 16 times the MAC address.
            //
            for (int i = 1; i <= 16; i++)
                for (int j = 0; j < 6; j++)
                    packet[i * 6 + j] = mac[j];

            //
            // Submit WOL packet.
            //
            client.Send(packet, packet.Length);
            Console.WriteLine("Machine Woke Up....");
        }
    }
}

希望这可以帮助



 类似资料:
  • 我正在尝试从Android向我的php服务器提交数据。然而,所有的答案似乎都使用了不推荐使用的ApacheHTTP库。我不想用它,当我试着用的时候,它不起作用。 现在它似乎什么也没做。它似乎连接到web服务器,但服务器不写入任何数据。如果我只是用浏览器访问url,它会写入一个文件。 php代码是 然后在Android studio中,我会在按下按钮后放入所有代码

  • 我需要将下面的类中的数据传递到我的Flitter应用程序,其中的数据仅在来电事件发生时可用。我需要将此数据(mobileNumber)传递给颤振(如果可能,即使颤振应用程序终止,我也需要传递数据) 广播接收器。Java语言 }根据以上代码,我需要将incomingNumber传递给Flatter。如果可能-即使应用程序已关闭,也要共享数据。 MainActivity.java 目前,即使应用程序被

  • 函数名称:唤醒屏幕 函数功能:唤醒设备 CPU、屏幕等,可以用来点亮屏幕 函数方法 device.wake() 函数用例 bool = device.isWake() if bool then toast("屏幕亮屏",2) mSleep(3000) else toast("屏幕黑屏",2) mSleep(3000) --唤醒屏幕 device.wa

  • 下面我们来看看睡眠和醒来的基本模型。假设有两个系统调用作为睡眠和唤醒。呼叫睡眠的过程将被阻止,而调用的过程将被唤醒。 有一个叫做生产者消费者问题的流行例子,它是模拟睡眠和唤醒机制的最流行的问题。 睡眠和觉醒的概念非常简单。如果关键部分不是空的,那么该过程将进入休眠状态。它将被临界区内正在执行的其他进程唤醒,以便进程可以进入临界区。 在生产者消费者问题中,让我们说有两个过程,一个过程写某事,而另一个

  • 休眠与唤醒 [HW,ACPI] acpi_sleep={s3_bios,s3_mode,s3_beep,s4_nohwsig,old_ordering,nonvs,sci_force_enable} ACPI休眠选项。 (1)s3_bios和s3_mode与显卡有关。计算机从S3状态(挂起到内存)恢复时,硬件需要被正确的初始化。这对大多数硬件都不是问题,但因为显 卡是由BIOS初始化的,内核无法获

  • Future 一次polled 就能完成的,并不常见。而多数情况下,Future 需要确保一旦准备好前进,就再次进行轮询(poll) 。而这是通过Waker类型,辅助完成的。 每次 Future poll 时,都会将其作为“任务(task)”的一部分。任务是已提交给 executor 的顶级 Future 。 Waker提供一个wake()方法,它可以用来告诉 executor,应该唤醒的相关任务