STM32+rt-thread判斷是否聯網

一、根據NETDEV_FLAG_INTERNET_UP位判斷

static bool is_conncected(void)
{struct netdev *dev = RT_NULL;dev = netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev == RT_NULL){printf("wait netdev internet up...");return false;}else{printf("local ip is:%d.%d.%d.%d", ((( dev->ip_addr.addr) >> 0) & 0xFF), ((( dev->ip_addr.addr) >> 8) & 0xFF),((( dev->ip_addr.addr) >> 16) & 0xFF), ((( dev->ip_addr.addr) >> 24) & 0xFF));return true;}}

二、如果開啟dhcp根據是否獲取到ip判斷

bool is_connected()
{struct netdev *dev = RT_NULL;struct netif *netif = netif_list; // 獲取第一個網絡接口if (netif && netif_is_up(netif)) { // 檢查接口是否已初始化并啟動struct dhcp *dhcp = netif_dhcp_data(netif); // 獲取 DHCP 數據結構if (dhcp && dhcp->state == 10) { // 檢查 DHCP 是否綁定到 IP 地址log_i("network is connected and ip address is obtained!");return true;} else {log_w("network is up but no ip address!");return false;}} else {log_w("network interface is not up!");return false;}
}

三、通過ping命令檢測

以下是一個基于RT-Thread和LwIP的Ping網絡連接檢測代碼示例,用于檢查設備是否成功連接互聯網:

代碼實現

#include <rtthread.h>
#include <lwip/netdb.h>
#include <lwip/sockets.h>
#include <lwip/icmp.h>
#include <lwip/inet.h>
#include <lwip/ip.h>#define PING_DATA_SIZE       32
#define PING_DELAY           RT_TICK_PER_SECONDstatic struct rt_semaphore ping_sem;
static rt_uint32_t ping_time;static void ping_timeout(void *arg)
{rt_sem_release(&ping_sem);
}static void ping_recv(int s, struct sockaddr_in *addr)
{char buf[64];int fromlen = sizeof(*addr);int len;while ((len = lwip_recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)addr, (socklen_t *)&fromlen)) > 0){struct ip_hdr *iphdr = (struct ip_hdr *)buf;struct icmp_echo_hdr *iecho = (struct icmp_echo_hdr *)(buf + (IPH_HL(iphdr) * 4));if (iecho->id == PING_ID && iecho->seqno == htons(ping_time)){rt_sem_release(&ping_sem);break;}}
}static int ping(int s, const char *host)
{int timeout = PING_DELAY;struct sockaddr_in addr;struct hostent *hptr;struct rt_timer ping_timer;addr.sin_family = AF_INET;addr.sin_port = 0;if ((hptr = lwip_gethostbyname(host)) == NULL){return -RT_ERROR;}addr.sin_addr.s_addr = *(rt_uint32_t *)hptr->h_addr_list[0];rt_timer_init(&ping_timer, "ping_timeout", ping_timeout, RT_NULL, timeout, RT_TIMER_FLAG_ONE_SHOT);rt_timer_start(&ping_timer);rt_sem_init(&ping_sem, "ping_sem", 0, RT_IPC_FLAG_FIFO);for (ping_time = 0; ping_time < PING_DATA_SIZE; ping_time++){struct icmp_echo_hdr *iecho;char buf[PING_DATA_SIZE + sizeof(struct icmp_echo_hdr)];iecho = (struct icmp_echo_hdr *)buf;ICMPH_TYPE_SET(iecho, ICMP_ECHO);ICMPH_CODE_SET(iecho, 0);iecho->chksum = 0;iecho->id = PING_ID;iecho->seqno = htons(ping_time);rt_memset(&buf[sizeof(struct icmp_echo_hdr)], 0x00, PING_DATA_SIZE);iecho->chksum = inet_chksum(iecho, sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE);if (lwip_sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&addr, sizeof(addr)) <= 0){rt_timer_stop(&ping_timer);rt_sem_detach(&ping_sem);return -RT_ERROR;}if (rt_sem_take(&ping_sem, timeout) == RT_EOK){rt_timer_stop(&ping_timer);rt_sem_detach(&ping_sem);return RT_EOK;}}rt_timer_stop(&ping_timer);rt_sem_detach(&ping_sem);return -RT_ERROR;
}int ping_network(void)
{int s;int ret;s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP);if (s < 0){rt_kprintf("create socket failed\n");return -1;}ret = ping(s, "8.8.8.8");  // Ping Google DNS服務器lwip_close(s);if (ret == RT_EOK){rt_kprintf("ping 8.8.8.8 success!\n");return 0;}else{rt_kprintf("ping 8.8.8.8 failed!\n");return -1;}
}MSH_CMD_EXPORT(ping_network, Ping test network connection);

代碼說明

  1. 代碼創建了一個ICMP RAW socket用于發送和接收Ping包
  2. 使用Google的DNS服務器8.8.8.8作為Ping目標
  3. 實現了Ping的超時處理和響應接收
  4. 通過信號量同步Ping的發送和接收過程
  5. 結果會通過串口輸出顯示Ping是否成功

使用說明

  1. 在RT-Thread的env工具中確保已開啟LwIP組件
  2. 將代碼添加到項目中并編譯
  3. 在FinSH命令行中執行ping_network命令
  4. 成功連接互聯網時會顯示"ping 8.8.8.8 success!"

注意事項

  1. 需要網絡接口已正確初始化并能訪問互聯網
  2. 某些網絡環境可能屏蔽ICMP包,這種情況下即使網絡連通Ping也會失敗
  3. 可以根據需要修改Ping的目標地址

常見問題處理

若ping命令不可用,需檢查:

  • 網絡協議棧(LwIP)是否正確初始化
  • 網絡接口(如ETH或WIFI)是否正常連接
  • DNS配置是否正確(對于域名ping測試)

網絡連接成功后,ping測試可作為基礎的網絡狀態檢測手段,配合其他網絡工具如ifconfig、netstat等全面診斷網絡問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909050.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于React Native開發HarmonyOS 5.0醫療類應用

隨著HarmonyOS 5.0的發布和React Native技術的成熟&#xff0c;開發者現在可以利用React Native框架為HarmonyOS平臺構建高性能的跨平臺醫療應用。 一、技術選型與優勢 1.React Native HarmonyOS的組合優勢 &#xff08;1&#xff09;跨平臺能力??&#xff1a;React Nati…

姜偉生《統計至簡》

姜偉生《統計至簡》 系列叢書之一 這套書圖真漂亮&#xff0c;字間距也大&#xff0c;特別合適直接作為課件。但是理論上弱&#xff0c;有的地方算法也get不點上。適合初學者&#xff0c;因為能看圖說話&#xff1b;又不適合初學者&#xff0c;因為沒有解析、沒有分析。 這學…

滾動—橫向滾動時,如何直接滾動到對應的內容板塊

使用scrollIntoView方法方法解讀 scrollIntoView 是 HTML 元素&#xff08;HTMLElement&#xff09;的一個方法。當調用該方法時&#xff0c;它會嘗試將調用它的元素滾動到瀏覽器的可視區域內。這個方法特別適用于處理頁面上的滾動行為&#xff0c;比如讓用戶能夠快速定位到頁面…

HTML5 定位網頁元素

1. 定位&#xff08;position&#xff09; position&#xff1a;static&#xff08;標準&#xff09; position&#xff1a;relative&#xff08;相對定位&#xff09; 偏移量的方向 相對定位的規律 浮動元素設置相對定位 position&#xff1a;absolute&#xff08;絕對…

分類數據集 - 植物分類數據集下載

數據集介紹&#xff1a;植物分類數據集&#xff0c;真實場景高質量圖片數據&#xff1b;適用實際項目應用&#xff1a;自然場景植物分類項目&#xff0c;以及作為通用分類數據集場景數據的補充&#xff1b;數據集類別&#xff1a;標注說明&#xff1a;采用文件夾來區分不同的目…

?React Hooks 的閉包陷阱問題

這是主包在面試中遇到的一道題目&#xff0c;面試官的問題是&#xff1a;"這個頁面初次展示出來時Count和step的值是什么&#xff0c;我點擊按鈕count和step的值有什么變化&#xff1f;“ 這個題目主包回答的不好&#xff0c;所以想做一個總結。 題目 import React, { …

新基建浪潮下:中國新能源汽車充電樁智慧化建設與管理實踐

在新基建戰略的強力推動下&#xff0c;中國新能源汽車充電樁建設正迎來智慧化升級的重要機遇期。作為連接能源革命與交通革命的關鍵節點&#xff0c;充電基礎設施的智能化轉型不僅關乎新能源汽車產業的可持續發展&#xff0c;更是構建新型電力系統的重要支撐。當前&#xff0c;…

如何在多任務環境中設定清晰的項目優先級?

在多任務環境中設定清晰的項目優先級需要明確項目戰略價值、緊急性、資源利用效率、風險管理。其中&#xff0c;明確項目戰略價值尤為重要&#xff0c;它決定了項目對組織整體戰略目標實現的貢獻程度。例如&#xff0c;戰略價值高的項目&#xff0c;即使不緊急&#xff0c;也應…

【Django】性能優化-普通版

性能優化&#xff1a; 思路 通常無論是什么編程語言或者是什么框架&#xff0c;瓶頸通常都是數據庫相關的操作&#xff1b; 大部分的查詢慢的問題接口都是頻繁查庫、全盤掃描、多層for循環嵌套、高頻查redis、序列化時多級外鍵&#xff1b; 多用O(1)查找復雜度的數據 合理使…

數據治理域——離線數據開發

摘要 文本主要介紹了離線數據開發相關內容,包括業務與流程、阿里MaxCompute系統設計以及阿里調度系統設計。離線數據開發是大數據開發核心組成部分,用于處理批量數據,支持企業多種需求,其流程涵蓋需求調研、數據源接入等環節。阿里MaxCompute系統架構與特點被闡述,調度系…

python-docx 庫教程

Python-docx 庫介紹 官網文檔 python-docx 是一個用于創建和修改 Microsoft Word (.docx) 文件的 Python 庫。它允許你通過編程方式生成格式化的文檔&#xff0c;添加文本、段落、表格、圖片等元素&#xff0c;而無需依賴 Microsoft Word 應用程序。 主要功能 創建新的 Word…

Ansible小試牛刀

注意事項 除了安裝的zabbix相關組件 使用此腳本安裝的所有軟件版本均為系統默認版本 安裝軟件 zabbix相關組件&#xff0c;包括server&#xff0c;agent等 MySQL Redis NGINX openjdk maven nodejs keepalived iptables ipvsadm 使用劇本 --- - hosts: allname…

MCP使用

什么是MCP Model Context Protocol (MCP) 是由 Anthropic 公司于 2024 年 11 月推出的一種開放協議標準&#xff0c;目的在于標準化LLM 與外部數據源、工具及服務之間的交互方式。MCP 被廣泛類比為“AI 領域的 USB-C 接口” MCP與Function Calling的區別 MCP 的核心概念 1.…

邊緣計算一:現代前端架構演進圖譜 —— 從 SPA 到邊緣渲染

過去十年&#xff0c;前端項目架構經歷了從簡單 HTML 文件到復雜框架的飛躍&#xff0c;但很多開發者忽略了**“渲染位置”與“資源交付方式”**對體驗與性能的根本性影響。 從最初的瀏覽器渲染&#xff0c;到現在“在離用戶最近的地方動態返回 HTML”&#xff0c;架構正在悄悄…

linux學習記錄(六)三個常用命令介紹

1.vim命令 Vim是由Vi發展過來的文本編譯器&#xff0c;其代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富&#xff0c;在程序員中被廣泛使用。 1.1 語法 vim filename 1.2 vi/vim的使用 vi/vim 共分為三種模式&#xff0c;命令模式&#xff08;Command Mode&#xff09;、…

用Python獲取京東關鍵字接口的用戶指南

在電商數據分析和市場研究中&#xff0c;獲取京東平臺的關鍵字搜索結果數據具有重要意義。本文將詳細介紹如何使用Python調用京東開放平臺的API接口&#xff0c;獲取關鍵字相關的商品數據&#xff0c;并進行解析和處理。 一、準備工作 &#xff08;一&#xff09;注冊京東開發…

觀測云,全球領先的監控觀測平臺亮相亞馬遜云科技中國峰會!

觀測云每年都不會缺席亞馬遜云科技峰會 忙完一整季的產品發布&#xff0c;我們終于將目光投向這場全球頂尖的云技術盛會——2025亞馬遜云科技中國峰會。如果你也在這個領域&#xff0c;應該已經感覺到了&#xff1a;這不只是一場大會&#xff0c;而是一個信號。AI、可觀測性、…

消息隊列處理模式:流式與批處理的藝術

&#x1f30a; 消息隊列處理模式&#xff1a;流式與批處理的藝術 &#x1f4cc; 深入解析現代分布式系統中的數據處理范式 一、流式處理&#xff1a;實時數據的"活水" 在大數據時代&#xff0c;流式處理已成為實時分析的核心技術。它將數據視為無限的流&#xff0c;…

一起學習swin-transformer(一)

Transform學習鏈接 從零開始設計Transformer模型&#xff08;1/2&#xff09;——剝離RNN&#xff0c;保留Attention-CSDN博客 Transformer-PyTorch實戰項目——文本分類_transformer文本分類 pytorch-CSDN博客 從零開始設計Transformer模型&#xff08;2/2&#xff09;——…

PyQt常用控件的使用:QFileDialog、QMessageBox、QTreeWidget、QRadioButton等

文章目錄 一、控件常用函數介紹二、QFileDialog&#xff08;文件類操作&#xff09;三、QMessageBox(對話框)四、QTreeWidget&#xff08;樹結構類操作&#xff09;4.1 樹結構的初始化4.2 遞歸讀取完整樹結構4.3 兩QTreeWidget滑輪同步滑動4.4 信號槽綁定 五、QCombox改寫下拉多…