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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix