Linux C实现在线检测

通过ping某个服务器,检测设备是否internet是连通的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>

#define dbg(fmt, args...) printf("\033[1m[ %s ] %03d: "fmt"\033[0m\n\r", __FUNCTION__, __LINE__, ##args)

static unsigned int check_interval = 1;

#define INTERVAL_MAX    (1024)
#define INTERVAL_MIN    (2)

#define MAX(a, b)     ((a) > (b) ? (a) : (b))
#define MIN(a, b)     ((a) < (b) ? (a) : (b))

#define LED_RED "/sys/class/leds/red:system/trigger"
#define LED_GREEN "/sys/class/leds/green:system/trigger"
#define LED_BLUE "/sys/class/leds/blue:system/trigger"

#define GPIO_RED "/sys/class/leds/red:system/brightness"
#define GPIO_GREEN "/sys/class/leds/green:system/brightness"
#define GPIO_BLUE "/sys/class/leds/blue:system/brightness"

#define ROOT_SVR "A.root-servers.net"

static void set_led(int online)
{
    static int last_state = 2;
    char cmd[128] = {0};

    int cur_state = online ? 1 : 0;
    if (last_state == cur_state) {
        return;
    }

    if (online) {
        /*set green/white*/
        last_state = 1;
        if (0 == access(LED_RED, F_OK) &&
            0 == access(LED_GREEN, F_OK) &&
            0 == access(LED_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo default-on > %s", LED_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_BLUE);
            system(cmd);
        } else if (0 == access(GPIO_RED, F_OK) &&
            0 == access(GPIO_GREEN, F_OK) &&
            0 == access(GPIO_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 1 > %s", GPIO_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_BLUE);
            system(cmd);
        }
    } else {
        last_state = 0;
        /*set red*/
        if (0 == access(LED_RED, F_OK) &&
            0 == access(LED_GREEN, F_OK) &&
            0 == access(LED_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo default-on > %s", LED_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo none > %s", LED_BLUE);
            system(cmd);
        } else if (0 == access(GPIO_RED, F_OK) &&
            0 == access(GPIO_GREEN, F_OK) &&
            0 == access(GPIO_BLUE, F_OK)) {
            snprintf(cmd, sizeof(cmd), "echo 1 > %s", GPIO_RED);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_GREEN);
            system(cmd);
            snprintf(cmd, sizeof(cmd), "echo 0 > %s", GPIO_BLUE);
            system(cmd);
        }
    }

    return;
}

static int led_check(void)
{
    int ret = 1;
    char cmd[128] = {0};
    snprintf(cmd, sizeof(cmd), "ping %s -c 1 -w 1 -4", ROOT_SVR);
    ret = system(cmd);
    set_led(0 == ret);

    return ret;
}

int main(int argc, char const *argv[])
{
    while (1) {
        check_interval = MAX(INTERVAL_MIN, check_interval);
        check_interval = MIN(INTERVAL_MAX, check_interval);

        /*do the mission at once*/
        if (led_check() != 0) {
            /*to check quickly if fail*/
            check_interval = INTERVAL_MIN;
        }

        sleep(check_interval);
        dbg("sleep %us", check_interval);
        check_interval = check_interval << 1;
    }

	return 0;
}

posted @   付时凡  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示