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

      最后更新: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);

      }

      }

      下线

      如何使用

      # 注意事项

      # 参考资料链接

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类