最后更新:2022-06-17 21:05
应用背景
有时候重要的信息或软件只能在你的家庭电脑上,或者你自己的办公室电脑太弱,小C盘是红色,运行较大的软件太昂贵,无法远程访问。

但家庭电脑不能总是用电运行,尤其在租用房屋中,有时是商业的,当你使用它时更痛苦,然后你需要一个可以远程控制家庭电脑的小工具来帮助你运行它。
要获得远程访问到自己的计算机,你需要解决两个问题:如何通知计算机打开和如何构造一个远程连接的网络通道。这个远程启动助理只解决如何通知计算机启动的问题,如何建立远程连接网络通道只是一个建议(在两个情况下,一个是公开的IP:很简单,打开路由器DDNS,在路由器上进行端口转移,打开系统自备的计算机远程桌面,开放用到的端口。另一个是没有公共网络IP:由自建或第三方提供的内部网络映射,我个人建议使用零级,免费速度快,使用教程)。
实现功能
功能是方便地在室外打开家庭电脑,如果网络通畅,远程桌面访问就像把家里的电脑直接转移到这儿。此外,您可以在USB网络门上共享USB设备(试用版本可以共享两个设备),串口,DAP调试器和大多数USB设备可以远程连接到您的家庭电脑(特定速度仅限于您的网络速度和延迟,我使用零级来创建一个虚拟LAN,使用USB网络门共享USB设备,分享DAP下载程序时特别慢,只适用于紧急情况下的临时使用,试一下就没关系。
系统框架
硬件框架

软件框架

RT线程使用
基于官方的例子的开发。
软件模块说明
使用软件包是Tencent-cloud-iot-package和RW007-package。
作品完整图片

视频演示
基于RT - Thread + RA 6 M 4.mp4的远程启动助理
代码地址
https://jinshenggk.com
制作过程
使用RT-Thread Studio创建一个实例项目
使用这个例子项目的原因是,RW007已经连接,直接编译燃烧器,并节省时间。

成功创建后, 编译烧结, 连接到串行控制面板, 确保RW007的 SN 和 VER 正确读取, WIFI 正确连接.
这次我使用Tencent Cloud的Internet of Things(Internet of Things)开发平台(可以直接连接到WeChat小程序),所以先删除Ali-iotkit包并添加Tencent-cloud-iot-package-for-rtthread软件包。

在保存配置后, 确保它能够正确编译.
在本地网络中测试WOL觉醒
添加如下代码,设置自己的WOL电脑关闭,与另一台计算机连接开发板串行控制面板,输入测试是否可以正常醒来的命令.在第六行中,切换到您的电脑自己的MAC地址(以使用带有网络卡的MAC地址,除非你的电脑开关能连接到 WIFI,否则在56行的IP地址实际上取决于你的路由器如何分配,如果您的电脑启动后显示IP,然后你填到这儿,如果您的电脑启动后显示IP,那么你在这儿填好。
#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 = (struct hostent *) gethostbyname(url);
port = 9;
/*创建插座,类型为SOCK_DGRAM,UDP类型*/
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
rt_kprintf("Socket errorn");
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开放广播权限
计数器发送计数时间数据*/
while (count)
{
/*向远程服务发送数据*/
sendto(sock, send_data, strlen(send_data), 0,
(struct sockaddr *)&server_addr, sizeof(struct sockaddr));
/*线断了一段时间
rt_thread_delay(50);
/*计数值为1 */
count --;
}
/*关闭这个插座
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);
为Tencent创建WeChat应用程序
这里直接参考链接8.RT-Thread&BearPi 开发笔记 -- 小熊派基于RT-Thread接入腾讯云物联网开发平台,按照这个教程创建你自己的微信小程序界面。可以先创建一个灯,在十元云网软件包配置界面中,配置设备的三个组件,然后运行实例程序,确保云平台正确连接。我只是建立一个计算机状态和一个计算机交换机。

处理信息并唤醒电脑
下面的代码是从10cent-cloud-iot软件包 demo中修改的。
WOL醒来是解决的,但是通过发送网络命令迫使计算机关闭,可能需要在计算机末端运行一个小程序,这次不是,而且计算机网络醒来只能通过远程连接开关进行。
如何获取计算机状态,这个项目的解决方案是,将计算机的MAC和路由器内部的地址绑定,LAN的IP不会在期限过后改变,然后,板继续使用 ping 命令访问计算机的 LAN IP,如果你能拨打它, 它就会告诉你电脑是开的.否则, 电脑将关闭.
首先在wol_data_config.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!rn");
CMD_wakeOnLAN();
}else
{
Log_e("computer cannot be turned off!trn");
}
#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);
}
}
下线
如何使用
# 注意事项
# 参考资料链接
本文由 在线网速测试 整理编辑,转载请注明出处。