WKJay 3 vuotta sitten
sitoutus
dea2f2b023
4 muutettua tiedostoa jossa 132 lisäystä ja 0 poistoa
  1. 12 0
      SConscript
  2. 24 0
      readme.md
  3. 89 0
      wol.c
  4. 7 0
      wol.h

+ 12 - 0
SConscript

@@ -0,0 +1,12 @@
+from building import *
+
+cwd     = GetCurrentDir()
+CPPPATH = [
+    cwd
+]
+src     = Glob('*.c')
+
+
+group = DefineGroup('wol', src, depend = ['PKG_USING_WOL'], CPPPATH = CPPPATH)
+
+Return('group')

+ 24 - 0
readme.md

@@ -0,0 +1,24 @@
+# WOL - 网络唤醒
+
+## 简介
+
+WOL 全称是 Wake-On-LAN,是一种电源管理功能;如果存在网络活动,则允许设备将操作系统从待机或休眠模式中唤醒。目前许多主板厂商支持IBM提出的网络唤醒标准。该标准允许网络管理员远程打开PC机电源,以便进行文件升级、资源跟踪和设备清点等工作。
+
+本软件包会将你的设备变成一个开机棒,只要与目标机器在一个局域网内,即可实现目标设备关机的情况下将其唤醒,配合物联网相关技术可以实现设备的远程启动。
+
+## 注意事项
+
+- 该功能需要被开机的设备支持WOL。
+- 关机时必须是通电的。
+- 非正常关机可能会唤醒失败,所以里如果断电导致关机的话可能需要手工开启机器。
+- 被唤醒的电脑必须连接网络,或者路由器,并且保证与开机设备处在同一局域网。
+
+## 使用方法
+
+加入该软件包并且编译下载后可以使用命令行进行测试,输入下面指令中的任意一条,注意参数为目标设备的网卡MAC地址
+```
+wol_wakeup 00:01:02:03:04:05 或者
+wol_wakeup 00-01-02-03-04-05 或者
+wol_wakeup "00 01 02 03 04 05"
+
+```

+ 89 - 0
wol.c

@@ -0,0 +1,89 @@
+/***************************************************************
+ * @file           wol.c
+ * @brief
+ * @author         WKJay
+ * @Version
+ * @Date           2022-11-16
+ ***************************************************************/
+#include <rtthread.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include "wol.h"
+
+#define MAGIC_OFFSET 6
+#define SOCK_PORT    7
+
+static int do_wol(uint8_t *mac) {
+    int sock = -1;
+    int index = 0;
+    int optval = 1;
+    struct sockaddr_in server_addr;
+    uint8_t magic_data[102];
+
+    rt_memset(magic_data, 0xff, sizeof(magic_data));
+
+    for (index = 0; index < 16; index++) {
+        rt_memcpy(&magic_data[MAGIC_OFFSET + index * 6], mac, 6);
+    }
+
+    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+        rt_kprintf("create socket error\r\n");
+        return -1;
+    }
+
+    setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval));
+
+    rt_memset(&server_addr, 0, sizeof(struct sockaddr_in));
+    server_addr.sin_family = AF_INET;
+    server_addr.sin_port = htons(SOCK_PORT);
+    server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
+
+    if (sendto(sock, magic_data, sizeof(magic_data), 0, (struct sockaddr *)&server_addr,
+               sizeof(struct sockaddr)) != sizeof(magic_data)) {
+        rt_kprintf("send wol data failed.\r\n");
+        return -1;
+    }
+
+    rt_thread_mdelay(1000);
+
+    closesocket(sock);
+
+    return 0;
+}
+
+int wol(uint8_t *mac) { return do_wol(mac); }
+
+int wol_str(char *mac_str) {
+    int ret = -1;
+    uint8_t mac[6] = {0};
+    ret = sscanf(mac_str, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &mac[0], &mac[1], &mac[2], &mac[3],
+                 &mac[4], &mac[5]);
+    if (ret == 6) goto next;
+    ret = sscanf(mac_str, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3],
+                 &mac[4], &mac[5]);
+    if (ret == 6) goto next;
+    ret = sscanf(mac_str, "%hhx %hhx %hhx %hhx %hhx %hhx", &mac[0], &mac[1], &mac[2], &mac[3],
+                 &mac[4], &mac[5]);
+    if (ret == 6) goto next;
+
+    rt_kprintf("invalid mac: %s\r\n", mac);
+    return -1;
+next:
+    return do_wol(mac);
+}
+
+static void wol_wakeup(int argc, char *argv[]) {
+    if (argc != 2) {
+        rt_kprintf("invalid arguments,please input:\r\n");
+        rt_kprintf("wol_wakeup 00:01:02:03:04:05 or\r\n");
+        rt_kprintf("wol_wakeup 00-01-02-03-04-05 or\r\n");
+        rt_kprintf("wol_wakeup \"00 01 02 03 04 05\"\r\n");
+        return;
+    }
+    if (wol_str(argv[1]) < 0) {
+        rt_kprintf("wake %s failed.", argv[1]);
+        return;
+    }
+    return;
+}
+MSH_CMD_EXPORT(wol_wakeup, Wake on Lan)

+ 7 - 0
wol.h

@@ -0,0 +1,7 @@
+#ifndef __WOL_H
+#define __WOL_H
+
+#include <stdint.h>
+
+
+#endif /* __WOL_H */