Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread活动
瑞萨_RA6M4
瑞萨_Renesas
基于RT-Thread+RA6M4的远程开机助手
发布于 2022-06-17 00:39:39 浏览:1314
订阅该版
[tocm] 我平时使用语雀记录,要看最新的请访问这个[《基于RT-Thread+RA6M4的远程开机助手》](https://www.yuque.com/docs/share/136b2ca7-8fea-42cb-8004-e7716450a23d?# "《基于RT-Thread+RA6M4的远程开机助手》") #基于RT-Thread+RA6M4的远程开机助手概要 ## 应用背景 有时候重要的资料或者软件只有在家里的电脑里有,或者自己的办公电脑性能太弱,存储太小C盘都红了以及运行较大的软件很卡的时候就需要远程访问电脑。必须多压榨压榨电脑才能对得起自己当初花的钱。![image1.png](https://oss-club.rt-thread.org/uploads/20220617/80dd088c4f7c1c9a076cb31e4fff74a7.png "image1.png") 但是家里电脑也不能一直开着费电,尤其是在外租的房子有时候还是商业用电,用起来就更肉疼了,这时候就需要一个能控制家里电脑远程开机的小工具来辅助开机。 要达到远程访问自家电脑需要解决两个问题**如何通知电脑开机**和**如何构建远程连接的网络通道**。本远程开机助手只解决如何通知电脑开机,对于如何构建远程连接的网络通道只作提示(分为两种情况,一种是有公网IP:很简单,开启路由器的DDNS,在路由器处做一个端口转发,把系统自带的电脑远程桌面开启,开放用到的端口。另一种是没有公网IP:用自建或者第三方提供的内网映射,我个人推荐用[zerotier](https://www.zerotier.com/),免费速度快,[使用教程](https://zhuanlan.zhihu.com/p/444720139))。 ## 实现功能 功能就是在外面可以方便的开启家里的电脑,如果网络通畅,再通过远程桌面访问就像把家里电脑直接搬过来了一样,再配合上USB Network Gate共享USB设备(试用版可以共享两个设备),串口,DAP调试器以及大部分USB设备等都可以远程连接到你家里的电脑(具体速度受限于你的网速和延迟,我用过zerotier搭建虚拟局域网搭配USB Network Gate共享USB设备,共享DAP下载器程序的时候特别慢,只适合紧急的时候临时使用,简单的来个调试啥的应该是没问题的) ## 系统框架 ### 硬件框架 ![22222.jpg](https://oss-club.rt-thread.org/uploads/20220617/8ad8c359483bd17fdfac9660f08d73ea.jpg.webp "22222.jpg") ### 软件框架 ![33.jpg](https://oss-club.rt-thread.org/uploads/20220617/a33108a0835dd8fbdc8b362ab2ad4788.jpg "33.jpg") ## RT-Thread使用情况 基于官方示例工程开发。 ## 软件模块说明 用的都是现成的软件包,主要是tencent-cloud-iot-package和RW007-package。 ## 作品完整图片 ![微信图片_20220617002336.jpg](https://oss-club.rt-thread.org/uploads/20220617/86a9d5e80700473ba579c03d00cd93c2.jpg.webp "微信图片_20220617002336.jpg") ## 视频演示 [基于RT-Thread+RA6M4的远程开机助手 .mp4](https://club.rt-thread.org/file_download/1df565791923a046) ## 代码地址 [https://gitee.com/yuanzihao/RA6M4](https://gitee.com/yuanzihao/RA6M4) # 制作过程 ## 用RT-Thread Studio创建实例工程 用这个实例工程的原因是这里面RW007已经对接好了,编译完烧录直接用可以,节省时间。![5555.png](https://oss-club.rt-thread.org/uploads/20220617/b0ff7ba5b22e0e9972116d1e2ecf49de.png "5555.png") 创建成功后,编译烧录,接入串口控制台,确保RW007的SN和VER可以正常读取,WIFI可以正常连接。 我这次用腾讯云的物联网开发平台(可以直接连接微信小程序使用),所以先把[ali-iotkit](https://github.com/RT-Thread-packages/ali-iotkit)这个包先去掉然后添加[tencent-cloud-iot-package-for-rtthread](https://github.com/tencentyun/tencent-cloud-iot-package-for-rtthread)软件包。![666.png](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`。 ```c #include
#include
/* 使用BSD socket,需要包含sockets.h头文件 */ #include
#include
#include
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接入腾讯云物联网开发平台](https://blog.csdn.net/wenjs0620/article/details/113756014),按照这个教程创建你自己的微信小程序界面。可以先创建一个灯,在[tencent-cloud-iot](https://github.com/tencentyun/tencent-cloud-iot-package-for-rtthread)软件包配置界面中配置好设备三元组,然后启动实例程序确保可以正常连接云平台。我这里只是简单建了一个电脑状态和一个电脑开关。![777.png](https://oss-club.rt-thread.org/uploads/20220617/2e3dbbc1f7247abc38f8731186b852dc.png.webp "777.png") ## 处理信息并唤醒电脑 以下代码是从[tencent-cloud-iot](https://github.com/tencentyun/tencent-cloud-iot-package-for-rtthread)软件包的demo中修改而来。 WOL唤醒解决了,但是通过发送网络命令让电脑强制关机可能需要做一个小程序在电脑端一直运行,本次先不做,电脑网络唤醒后只能通过远程连接关机。 如何获取电脑状态呢,本项目的解决方案是,在路由器里面把自己的电脑MAC和地址绑定,到期后局域网IP也不会变,然后开发板不停的用ping指令访问电脑的局域网IP,如果能ping通就说明电脑已经开机了,如果不能则电脑已关机。 首先在wol_data_config.c,定义自己用到的数据。 ```c /*-----------------data config start -------------------*/ #include "qcloud_iot_export.h" #include "qcloud_iot_import.h" #include "lite-utils.h" #define TOTAL_PROPERTY_COUNT 2 static 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指令是否成功执行。 ```c ////////上方省略 // 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 property sg_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](https://github.com/tencentyun/tencent-cloud-iot-package-for-rtthread)软件包配置界面中配置好设备三元组。 4. 修改`board.h`处39行至42行的宏定义,分别替换为自己的WIFI名称,WIFI密码,电脑的局域网IP地址和MAC地址。 5. 配置好自己的微信连连小程序。 6. 上电连上串口查看调试信息。 ------------ # 注意事项 1. 本文实现的电脑唤醒如果电脑非正常关机(比如按Power键来强制关机)还是无法WOL唤醒的,只有正常关机后,网卡仍会处于活动状态可以接收网络数据。所以你可以加个舵机直接去按开关,或者加个光耦连入机箱控制线。因本硬件方案价格较贵并不适合实际作为产品使用,所以这里就先不实现了。 2. 按照文档来说唤醒端口应该是9,但我实际测试其实别的端口也可以。 ------------ # 参考资料链接 9. [【开发板评测】Renesas RA6M4开发板之RW007](https://club.rt-thread.org/ask/article/9a68932caeb29e91.html) 10. [开发板原理图](https://oss-club.rt-thread.org/uploads/20220314/460d66bee9aa09a6036f302890ebc737.pdf) 11. [一种基于WOL协议跨Internet远程唤醒的解决方案](https://blog.csdn.net/taifei/article/details/97916516) 12. [5个远程开机的方案(无线唤醒电脑保姆教程)](https://blog.51cto.com/u_9843231/5080380) 13. [Windows系统用网卡实现开机唤醒](https://blog.csdn.net/qq_34090937/article/details/124796145) 14. [网络唤醒全攻略(Wake On LAN)](https://zhuanlan.zhihu.com/p/29100706/) 15. [【N32G457】基于RT-Thread和N32G457的智能家居demo](https://club.rt-thread.org/ask/article/bd591775515d1c0b.html) 16. [RT-Thread&BearPi 开发笔记 -- 小熊派基于RT-Thread接入腾讯云物联网开发平台](https://blog.csdn.net/wenjs0620/article/details/113756014)
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
原子号
这家伙很懒,什么也没写!
文章
3
回答
1
被采纳
0
关注TA
发私信
相关文章
1
(苏州站)RT-Thread物联网开发者沙龙【已结束】
2
(成都站)RT-Thread物联网开发者沙龙
3
(深圳站)RT-Thread物联网开发者沙龙
4
(西安站)RT-Thread物联网开发者沙龙
5
成都站2018 RT-Thread开发者沙龙回顾及PPT下载
6
2018 RT-Thread物联网开发者沙龙(北京站)
7
2018 RT-Thread物联网开发者沙龙(南京站)
8
第十三届研电赛RT-Thread企业专项奖发布通知
9
RT-Thread应用作品征集大赛开始啦!
10
你的投票将决定RT-Thread官网应该优先准备的文档是哪些
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
7
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部