当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-26 11:44:12 Python

本文为RT-Thread论坛用户@原子数参加瑞萨电子MCURT-Thread开发设计大赛发表的原创文章:https://club.rt-thread.org/ask/article/e086a4b93cd3b143.html应用背景有时重要的信息或软件只能在家里的电脑上使用,或者我办公室的电脑性能太弱,存储空间太小,C盘是红色的,大型软件的运行速度很慢有时您需要远程访问您的计算机。你要多挤,挤电脑才对得起你当初花的钱。但是家里的电脑又不能一直开着,尤其是租的房子有时候做商业用途,用起来就更蛋疼了。这时候就需要一个可以控制家里电脑远程启动的小工具来辅助启动了。要实现对自己电脑的远程访问,需要解决两个问题:如何通知电脑开机,如何搭建远程连接的网络通道。本远程开机助手只解决如何通知电脑开机,只给出如何搭建远程连接网络通道的提示(分两种情况,一种是带公网IP:很简单,打开路由器的DDNS,并做一个端口转发,打开系统自带电脑的远程桌面,打开使用的端口另一种是没有公网IP:使用自建或者第三方内网映射,个人推荐zerotier,免费,速度快,使用教程)。功能的实现是在外面方便的打开家里的电脑。如果网络畅通,通过远程桌面访问就像直接搬家电脑一样,然后配合USBNetworkGate共享USB设备(试用版可以共享两个设备),串口,DAP调试器和大部分USB设备都可以远程连接到家里的电脑(具体速度受限于你的网速和延迟,我用zerotier搭建了一个虚拟局域网和USBNetworkGate共享USB设备,共享DAP下载器程序的时候很慢。只适合临时应急用,简单调试应该没问题。)系统框架硬件框架软件框架RT-Thread的使用是基于官方示例工程开发的。软件模块说明使用现成的软件包,主要有tencent-cloud-iot-package和RW007-package。作品完整图片及视频演示基于RT-Thread+RA6M4。远程开机助手.mp4代码地址https://gitee.com/yuanzihao/RA6M4制作过程使用RT-ThreadStudio创建示例工程。之所以使用这个示例工程,是因为里面有RW007已经对接好了,直接编译烧录就可以使用,节省时间。创建成功后编译烧录,连接串口控制台,保证RW007的SN和VER可以正常读取,WIFI可以正常连接。我这次使用的是腾讯云的IoT开发平台(可以直接连接微信小程序),所以先去掉ali-iotkit包,然后添加tencent-cloud-iot-package-for-rtthread包。保存配置后,确保可以正常编译。在局域网中测试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#include/*要使用BSDsocket,需要包含sockets.h头文件*/#include#include#include<完成。h>charmac1[6]={0xD8,0xBB,0xC1,0x00,0x00,0x00};charsend_data[6+6*16];/*用于发送的数据*/voidwake_on_LAN(constchar*url,uint32_tcount){intsock,port;结构主机*主机;结构sockaddr_in服务器地址;/*通过函数入口参数url获取主机地址(如果是域名则做域名解析)*/host=(structhostent*)gethostbyname(url);端口=9;/*创建一个socket,类型为SOCK_DGRAM,UDP类型*/if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){rt_kprintf("Socketerror\n");返回;}for(inti=0;i<6;i++){send_data[i]=0xFF;}for(inti=0;i<16;i++){for(intj=0;j<6;j++){send_data[6+6*i+j]=mac1[j];}}/*初始化预连服务器地址*/server_addr.sin_family=AF_INET;server_addr.sin_port=htons(端口);server_addr.sin_addr=*((structin_addr*)host->h_addr);rt_memset(&(server_addr.sin_zero),0,sizeof(server_addr.sin_zero));int标志=1;setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&flag,sizeof(flag));//为socketfd开启广播权限/*总共发送计数数据*/while(count){/*向服务器端发送数据*/sendto(sock,send_data,strlen(send_data),0,(structsockaddr*)&server_addr,sizeof(structsockaddr));/*线程休眠一段时间*/rt_thread_delay(50);/*计数值减一*/count--;}/*关闭这个套接字*/closesocket(sock);}voidCMD_wakeOnLAN(void){rt_kprintf("WakeonLAN!\n");wake_on_LAN("192.168.0.255",10);}MSH_CMD_EXPORT(CMD_wakeOnLAN,唤醒你的电脑);创建腾讯连连的微信小程序。这里有直接参考链接8.RT-Thread&BearPi开发笔记--BearPi基于RT-Thread接入腾讯云物联网开发平台。按照本教程创建您自己的微信小程序界面可以先创建一个灯,在tencent-cloud-iot软件包配置界面配置设备三元组,然后启动实例程序,保证云平台可以正常连接。我这里只是简单的建了个电脑状态和电脑开关。处理信息并唤醒电脑以下代码修改自tencent-cloud-iot包的demo。WOL唤醒已经解决,但是发送网络命令强制电脑关机可能需要电脑端一直运行一个小程序。这次我不会这样做。电脑从网络唤醒后,只能通过远程连接关机。如何获取计算机的状态?本项目的解决方案是在路由器中绑定你电脑的MAC地址,过期后局域网IP不会变,然后开发板一直使用ping命令访问电脑的局域网IP,如果能ping通,说明电脑开机了,如果不能ping通,说明电脑关机了。首先,在wol_data_config.c中,定义您使用的数据。/*----------------数据配置开始----------------*/#include"qcloud_iot_export.h"#include"qcloud_iot_import.h"#include"lite-utils.h"#defineTOTAL_PROPERTY_COUNT2staticsDataPointsg_DataTemplate[TOTAL_PROPERTY_COUNT];typedefstruct_ProductDataDefine{TYPE_DEF_TEMPLATE_BOOLm_computer_status;TYPE_DEF_TEMPLATE_BOOLm_computer_switch;}ProductDataDefine;staticProductDataDefinesg_ProductData;staticvoid_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命令是否执行成功////////东方省略//当收到控制消息时,data_template的属性已在pData中解析//你应该添加你的逻辑如何使用pDatavoiddeal_down_stream_user_logic(void*client,ProductDataDefine*pData){Log_d("someting关于自己的产品逻辑有待完成");if(pData->m_computer_switch==1){Log_e("计算机启动!\r\n");CMD_wakeOnLAN();}else{Log_e("电脑无法关机!\tr\n");}#ifdefEVENT_POST_ENABLED//IOT_Event_setFlag(client,FLAG_EVENT0);//当您定义的事件发生时设置事件标志,请参阅events_config.c#endif}/*设置属性状态,已更改或未更改*/staticvoidset_propery_state(void*pProperyData,eDataStatestate){inti;对于(i=0;i