fache 0.1.351

发车工具箱
Documentation

    use serde::{Deserialize, Serialize};
    use std::io;
    use std::net::UdpSocket;
    #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct MagicPacket {
        pub mac: String,
        pub ip: Option<String>,
        pub port: Option<i32>,
        pub title: Option<String>,
        pub r#type: Option<String>,
    }
    #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct MagicPacketSend {
        is_send: bool,
        magic_packet: MagicPacket,
    }

    impl MagicPacket {
        fn create_magic_packet(mac: &str) -> io::Result<Vec<u8>> {
            let mut packet = Vec::new();
            // Magic Packet的头部是6个0xFF
            packet.extend([0xFF; 6]);
            // 将MAC地址重复16次
            let mac_bytes = mac
                .split(':')
                .map(|byte| u8::from_str_radix(byte, 16))
                .collect::<Result<Vec<u8>, _>>()
                .unwrap();
            for _ in 0..16 {
                packet.extend(&mac_bytes);
            }
            Ok(packet)
        }

        pub async fn send(&self) -> MagicPacketSend {
            // 创建UDP套接字并绑定到发送电脑的IP地址
            // 使用 "0.0.0.0" 允许操作系统选择合适的接口
            let socket = UdpSocket::bind("0.0.0.0:0").unwrap();
            // 设置套接字选项以允许广播
            socket.set_broadcast(true).unwrap();
            // 局域网广播地址
            // 使用端口9,这是WOL的默认端口
            // 通常为 192.168.111.255:9
            // 通常为 192.168.111.33:9
            let broadcast_address = format!(
                "{}:{}",
                self.ip.clone().unwrap_or("255.255.255.255".to_string()),
                self.port.unwrap_or(9)
            );
            // 构造Magic Packet
            // 被唤醒主机的MAC地址
            let magic_packet = Self::create_magic_packet(&self.mac).unwrap();
            // 发送Magic Packet到广播地址和端口9
            socket.send_to(&magic_packet, broadcast_address).unwrap();
            MagicPacketSend {
                is_send: true,
                magic_packet: self.clone(),
            }
        }
    }