关于程序员:基于RTThreadRA6M4的远程开机助手

47次阅读

共计 5706 个字符,预计需要花费 15 分钟才能阅读完成。

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

利用背景

有时候重要的材料或者软件只有在家里的电脑里有,或者本人的办公电脑性能太弱,存储太小 C 盘都红了以及运行较大的软件很卡的时候就须要近程拜访电脑。必须多压迫压迫电脑能力对得起本人当初花的钱。
然而家里电脑也不能始终开着费电,尤其是在外租的房子有时候还是商业用电,用起来就更肉疼了,这时候就须要一个能管制家里电脑近程开机的小工具来辅助开机。
要达到近程拜访自家电脑须要解决两个问题 如何告诉电脑开机 如何构建近程连贯的网络通道。本近程开机助手只解决如何告诉电脑开机,对于如何构建近程连贯的网络通道只作提醒(分为两种状况,一种是有公网 IP:很简略,开启路由器的 DDNS,在路由器处做一个端口转发,把零碎自带的电脑远程桌面开启,凋谢用到的端口。另一种是没有公网 IP:用自建或者第三方提供的内网映射,我集体举荐用 zerotier,收费速度快,应用教程)。

实现性能

性能就是在里面能够不便的开启家里的电脑,如果网络通顺,再通过远程桌面拜访就像把家里电脑间接搬过去了一样,再配合上 USB Network Gate 共享 USB 设施(试用版能够共享两个设施),串口,DAP 调试器以及大部分 USB 设施等都能够近程连贯到你家里的电脑(具体速度受限于你的网速和提早,我用过 zerotier 搭建虚构局域网搭配 USB Network Gate 共享 USB 设施,共享 DAP 下载器程序的时候特地慢,只适宜紧急的时候长期应用,简略的来个调试啥的应该是没问题的)

零碎框架

硬件框架

软件框架

RT-Thread 应用状况

基于官网示例工程开发。

软件模块阐明

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

作品残缺图片

视频演示

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

代码地址

https://gitee.com/yuanzihao/RA6M4

制作过程

用 RT-Thread Studio 创立实例工程

用这个实例工程的起因是这外面 RW007 曾经对接好了,编译完烧录间接用能够,节省时间。
创立胜利后,编译烧录,接入串口控制台,确保 RW007 的 SN 和 VER 能够失常读取,WIFI 能够失常连贯。
我这次用腾讯云的物联网开发平台(能够间接连贯微信小程序应用),所以先把 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 <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 软件包配置界面中配置好设施三元组,而后启动实例程序确保能够失常连贯云平台。我这里只是简略建了一个电脑状态和一个电脑开关。

解决信息并唤醒电脑

以下代码是从 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 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 指令是否胜利执行。

//////// 上方省略

// 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 软件包配置界面中配置好设施三元组。
  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 接入腾讯云物联网开发平台

正文完
 0