本文由RT-Thread论坛用户@原子号参加瑞萨电子 MCU RT-Thread开发设计大赛发布的原创文章:https://club.rt-thread.org/ask/article/e086a4b93cd3b143.html

应用背景

有时候重要的资料或者软件只有在家里的电脑里有,或者自己的办公电脑性能太弱,存储太小C盘都红了以及运行较大的软件很卡的时候就需要远程访问电脑。必须多压榨压榨电脑才能对得起自己当初花的钱。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pc29nRF-1655427669668)(https://oss-club.rt-thread.org/uploads/20220617/80dd088c4f7c1c9a076cb31e4fff74a7.png “image1.png”)]
但是家里电脑也不能一直开着费电,尤其是在外租的房子有时候还是商业用电,用起来就更肉疼了,这时候就需要一个能控制家里电脑远程开机的小工具来辅助开机。
要达到远程访问自家电脑需要解决两个问题如何通知电脑开机如何构建远程连接的网络通道。本远程开机助手只解决如何通知电脑开机,对于如何构建远程连接的网络通道只作提示(分为两种情况,一种是有公网IP:很简单,开启路由器的DDNS,在路由器处做一个端口转发,把系统自带的电脑远程桌面开启,开放用到的端口。另一种是没有公网IP:用自建或者第三方提供的内网映射,我个人推荐用zerotier,免费速度快,使用教程)。

实现功能

功能就是在外面可以方便的开启家里的电脑,如果网络通畅,再通过远程桌面访问就像把家里电脑直接搬过来了一样,再配合上USB Network Gate共享USB设备(试用版可以共享两个设备),串口,DAP调试器以及大部分USB设备等都可以远程连接到你家里的电脑(具体速度受限于你的网速和延迟,我用过zerotier搭建虚拟局域网搭配USB Network Gate共享USB设备,共享DAP下载器程序的时候特别慢,只适合紧急的时候临时使用,简单的来个调试啥的应该是没问题的)

系统框架

硬件框架

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pts95OqV-1655427669669)(https://oss-club.rt-thread.org/uploads/20220617/8ad8c359483bd17fdfac9660f08d73ea.jpg.webp “22222.jpg”)]

软件框架

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBjrioPk-1655427669669)(https://oss-club.rt-thread.org/uploads/20220617/a33108a0835dd8fbdc8b362ab2ad4788.jpg “33.jpg”)]

RT-Thread使用情况

基于官方示例工程开发。

软件模块说明

用的都是现成的软件包,主要是tencent-cloud-iot-package和RW007-package。

作品完整图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sw7FM3r4-1655427669670)(https://oss-club.rt-thread.org/uploads/20220617/86a9d5e80700473ba579c03d00cd93c2.jpg.webp “微信图片_20220617002336.jpg”)]

视频演示

基于RT-Thread+RA6M4的远程开机助手 .mp4

代码地址

https://gitee.com/yuanzihao/RA6M4

制作过程

用RT-Thread Studio创建实例工程

用这个实例工程的原因是这里面RW007已经对接好了,编译完烧录直接用可以,节省时间。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4JohkcVh-1655427669670)(https://oss-club.rt-thread.org/uploads/20220617/b0ff7ba5b22e0e9972116d1e2ecf49de.png “5555.png”)]
创建成功后,编译烧录,接入串口控制台,确保RW007的SN和VER可以正常读取,WIFI可以正常连接。
我这次用腾讯云的物联网开发平台(可以直接连接微信小程序使用),所以先把ali-iotkit这个包先去掉然后添加tencent-cloud-iot-package-for-rtthread软件包。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T46scKZp-1655427669671)(https://oss-club.rt-thread.org/uploads/20220617/999ec9f59f17ffc52b06a540fd4be876.png “666.png”)]
保存配置后,确保能够正常编译。

局域网内测试WOL唤醒

添加如下代码,将自己已经配置好WOL的电脑关机,用另一台电脑连接开发板串口控制台,输入命令测试查看是否可以正常唤醒。在第六行换入你电脑自己的mac地址(要用有线网卡的MAC地址,除非你电脑关机还能连WIFI),第56行中的IP地址实际取决于你的路由器是怎么分配的,如果你电脑开机后IP显示是192.168.0.100,那你这里就填192.168.0.255,如果你电脑开机后IP显示是192.168.31.100,那么你这里就填192.168.31.255

#include <rtthread.h>
#include <sys/socket.h> /* 使用BSD socket,需要包含sockets.h头文件 */
#include <netdb.h>
#include <string.h>
#include <finsh.h>
char mac1[6] = {0xD8,0xBB,0xC1,0x00,0x00,0x00};
char send_data[6+6*16]; /* 发送用到的数据 */
void wake_on_LAN(const char *url, uint32_t count)
{int sock, port;struct hostent *host;struct sockaddr_in server_addr;/* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */host = (struct hostent *) gethostbyname(url);port = 9;/* 创建一个socket,类型是SOCK_DGRAM,UDP类型 */if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){rt_kprintf("Socket error\n");return;}for(int i = 0; i<6;i++){send_data[i]= 0xFF;}for (int i = 0; i < 16; i++){for (int j = 0; j < 6; j++){send_data[6 + 6 * i + j] = mac1[j];}}/* 初始化预连接的服务端地址 */server_addr.sin_family = AF_INET;server_addr.sin_port = htons(port);server_addr.sin_addr = *((struct in_addr *)host->h_addr);rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));int flag=1;setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag));  //给socketfd开放广播权限/* 总计发送count次数据 */while (count){/* 发送数据到服务远端 */sendto(sock, send_data, strlen(send_data), 0,(struct sockaddr *)&server_addr, sizeof(struct sockaddr));/* 线程休眠一段时间 */rt_thread_delay(50);/* 计数值减一 */count --;}/* 关闭这个socket */closesocket(sock);
}void CMD_wakeOnLAN(void)
{rt_kprintf("Wake on LAN!\n");wake_on_LAN("192.168.0.255",10);
}MSH_CMD_EXPORT(CMD_wakeOnLAN , wake up your computer up);

创建腾讯连连的微信小程序

这里直接参考链接8.RT-Thread&BearPi 开发笔记 – 小熊派基于RT-Thread接入腾讯云物联网开发平台,按照这个教程创建你自己的微信小程序界面。可以先创建一个灯,在tencent-cloud-iot软件包配置界面中配置好设备三元组,然后启动实例程序确保可以正常连接云平台。我这里只是简单建了一个电脑状态和一个电脑开关。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q8EPZNz9-1655427669672)(https://oss-club.rt-thread.org/uploads/20220617/2e3dbbc1f7247abc38f8731186b852dc.png.webp “777.png”)]

处理信息并唤醒电脑

以下代码是从tencent-cloud-iot软件包的demo中修改而来。
WOL唤醒解决了,但是通过发送网络命令让电脑强制关机可能需要做一个小程序在电脑端一直运行,本次先不做,电脑网络唤醒后只能通过远程连接关机。
如何获取电脑状态呢,本项目的解决方案是,在路由器里面把自己的电脑MAC和地址绑定,到期后局域网IP也不会变,然后开发板不停的用ping指令访问电脑的局域网IP,如果能ping通就说明电脑已经开机了,如果不能则电脑已关机。
首先在wol_data_config.c,定义自己用到的数据。

/*-----------------data config start  -------------------*/
#include "qcloud_iot_export.h"
#include "qcloud_iot_import.h"
#include "lite-utils.h"#define TOTAL_PROPERTY_COUNT 2static sDataPoint    sg_DataTemplate[TOTAL_PROPERTY_COUNT];typedef struct _ProductDataDefine {TYPE_DEF_TEMPLATE_BOOL m_computer_status;TYPE_DEF_TEMPLATE_BOOL m_computer_switch;
} ProductDataDefine;static   ProductDataDefine     sg_ProductData;static void _init_data_template(void)
{sg_ProductData.m_computer_status = 0;sg_DataTemplate[0].data_property.data = &sg_ProductData.m_computer_status;sg_DataTemplate[0].data_property.key  = "computer_status";sg_DataTemplate[0].data_property.type = TYPE_TEMPLATE_BOOL;sg_ProductData.m_computer_switch = 0;sg_DataTemplate[1].data_property.data = &sg_ProductData.m_computer_switch;sg_DataTemplate[1].data_property.key  = "computer_switch";sg_DataTemplate[1].data_property.type = TYPE_TEMPLATE_BOOL;
};

然后在wol_sample.c里面如下函数中做处理,netdev_cmd_ping_private魔改用来判断ping指令是否成功执行。

上方省略// when control msg received, data_template's properties has been parsed in pData
// you should add your logic how to use pData
void deal_down_stream_user_logic(void *client, ProductDataDefine   * pData)
{Log_d("someting about your own product logic wait to be done");if(pData ->m_computer_switch ==1){Log_e("computer start up!\r\n");CMD_wakeOnLAN();}else{Log_e("computer cannot be turned off!\tr\n");}
#ifdef EVENT_POST_ENABLED//IOT_Event_setFlag(client, FLAG_EVENT0);  //set the events flag when the evnts your defined occured, see events_config.c
#endif}/*set property state, changed or no change*/
static void  set_propery_state(void *pProperyData, eDataState state)
{int i;for (i = 0; i < TOTAL_PROPERTY_COUNT; i++) {if (sg_DataTemplate[i].data_property.data == pProperyData) {sg_DataTemplate[i].state = state;break;}}
}/*get local property data, like sensor data*/
static void _refresh_local_property(void)
{int i;//add your local property refresh logic//refresh local propertysg_ProductData.m_computer_status = netdev_cmd_ping_private(SELF_COMPUTER_IP_ADDRESS, RT_NULL, 1, 0);if(sg_ProductData.m_computer_status == 1){sg_ProductData.m_computer_switch = 1;}for (i = 0; i < TOTAL_PROPERTY_COUNT; i++) {set_propery_state(sg_DataTemplate[i].data_property.data, eCHANGED);}
}下方省略

如何使用

  1. 确保能够正常用RT-Thread Studio打开并编译工程。

  2. 确保RW007已经正确连接。

  3. 在tencent-cloud-iot软件包配置界面中配置好设备三元组。

  4. 修改board.h处39行至42行的宏定义,分别替换为自己的WIFI名称,WIFI密码,电脑的局域网IP地址和MAC地址。

  5. 配置好自己的微信连连小程序。

  6. 上电连上串口查看调试信息。


注意事项

  1. 本文实现的电脑唤醒如果电脑非正常关机(比如按Power键来强制关机)还是无法WOL唤醒的,只有正常关机后,网卡仍会处于活动状态可以接收网络数据。所以你可以加个舵机直接去按开关,或者加个光耦连入机箱控制线。因本硬件方案价格较贵并不适合实际作为产品使用,所以这里就先不实现了。
  2. 按照文档来说唤醒端口应该是9,但我实际测试其实别的端口也可以。

参考资料链接

  1. 【开发板评测】Renesas RA6M4开发板之RW007

  2. 开发板原理图

  3. 一种基于WOL协议跨Internet远程唤醒的解决方案

  4. 5个远程开机的方案(无线唤醒电脑保姆教程)

  5. Windows系统用网卡实现开机唤醒

  6. 网络唤醒全攻略(Wake On LAN)

  7. 【N32G457】基于RT-Thread和N32G457的智能家居demo

  8. RT-Thread&BearPi 开发笔记 – 小熊派基于RT-Thread接入腾讯云物联网开发平台

基于RT-Thread+RA6M4的远程开机助手相关推荐

  1. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  2. 【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机

    外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机(详细) 之前文章向大家介绍了 外网环境下基于FRP.VNC技术远程访问计算机,实现内网穿透 以及利用 WOL远程唤醒功能 基于FRP.VNC技 ...

  3. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  4. 基于Citrix的云桌面远程连接Mac机

    基于Citrix的云桌面远程连接Mac机,是通过VNC的方式.Mac机做为Server端,云桌面做为客户端使用VNCViewer进行连接. 一.Mac端开启屏幕共享和远程登录. 首先要打开Mac电脑, ...

  5. win10查看pcie设备_壹拓网科技解密WIN10系统使用向日葵开机棒远程开机需要设置几个地方...

    向日葵开机棒,是一款非常好用的远程智能远程开机硬件,它一头接网线,另外一头和被开电脑接在同一个路由器下,不需要和被开电脑或者设备直接连接,当然,被开电脑需要有线联网,暂时不支持使用无线方式联网的电脑. ...

  6. 截屏 远程协助 android,ARDC Android 远程桌面助手 录屏 演示 MD

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? ARDC Android 远程桌面助手 录屏 演示 MD ARDC:Android Remote Displayer a ...

  7. Android Studio 连接阿里云数据库【制作基于数据库的多人远程聊天APP】

    Android Studio 连接阿里云数据库的简单方法[制作基于数据库的多人远程聊天APP] 首先购买好一个阿里云数据库RDS[我买了一年用了49元] 1.进入官网–>打开右上角的控制台 2. ...

  8. 【转】实现远程开机(电脑)的各种方法总结

    https://post.smzdm.com/p/664774/ 实现远程开机(电脑)的各种方法总结 一.为什么要远程开机 因为工作需要,总是需要打开某台不在身边的电脑,相信很多值友也遇到过相同的问题 ...

  9. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

最新文章

  1. linux-----shell高级编程----grep应用
  2. forfiles命令批量删除N天前文件
  3. 14.3 线程实现方法2
  4. 多线程利器-队列(queue)
  5. Windows 平台编译 WebRTC
  6. Google 开源技术protobuf 简介与样例
  7. java.util.PropertyPermission“ “org.graalvm.nativeimage.imagecode“ “read“
  8. Nginx解决服务器宕机问题
  9. SQL server中如何使用return,break和continue
  10. wpf 让图标显示在系统托盘
  11. Spring AOP 之 通知、连接点、切点、切面
  12. 电子邮件服务器怎样匿名转发功能,技巧:你为什么不能匿名发送电子邮件
  13. 若x,y均定义为int型,z定义为double型,以下不合法的scanf函数调用语句是: A)scanf(“ %d%lx,%le“,x,y,z); B)scanf(“%2d * %d%lf“,
  14. Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——目录
  15. 根据用户名字刷账户(取用户名的字母)
  16. 小话设计模式(番外二)委托模式
  17. 大数据核心技术是什么
  18. 对象不支持“attachEvent”属性或方法
  19. Python合并多个sheet工作表为一个工作表
  20. 如何用化学软件绘制制高分子链

热门文章

  1. R语言数据科学:变量选择(一)逐步回归法
  2. laraverl框架房源管理
  3. LeetCode 三维形体的表面积
  4. 微机原理 - 期末考试复习考点
  5. 研华工控台式计算机选型,工控机选型
  6. SpringBoot + Vue 头像上传案例
  7. Linux 音频路ucm和pulseaudio
  8. oracle中 合并列值 将一列的多个值合并成一行
  9. 计算机垃圾回收站桌面上找不到,桌面上的回收站不见了怎么办?桌面上的回收站不见了解决方法...
  10. 卷积神经网络之目标检测总结