嵌入式开发之Linux开发板访问外网

📅 2026/7/2 8:46:59
嵌入式开发之Linux开发板访问外网
最近在做嵌入式人脸识别的项目时用到了百度云的人脸识别api需要开发板根据key和获得的tokend去上传图像信息做对比。但是在切换网络或者重启开发板、虚拟机后经常出现图像识别失败的情况。多次实践后写了以下debug文档供大家检查bug开发板网络拓扑# FSMP1A 网络问题排查与修复记录## 故障现象Qt 程序人脸识别出错。判断是图片问题还是http token请求格式问题还是网络问题。打印信息是调用百度 API 时报错http_post error: Host aip.baidubce.com not foundcode: QNetworkReply::HostNotFoundErrorurl: https://aip.baidubce.com/oauth/2.0/token?...检查网络拓扑开发板192.168.9.210↕虚拟机192.168.9.120 192.168.78.2↕宿主机 → 外网## 排查流程### Step 1 — 确认网络连通性在 FSMP1A 开发板上bash# 查看网络接口状态ip addr show# 测试外网 (IP 直连)ping -c 3 8.8.8.8# 测试 DNS 解析ping -c 3 aip.baidubce.com# 查看路由表route -n# 查看 DNS 配置cat /etc/resolv.conf### Step 2 — 判断问题层级| 告警 | 症状 | 原因 ||------|------|------|| HostNotFoundError | ping 域名报 bad address | DNS 无法解析 || 100% packet loss | ping 8.8.8.8 不通 | 无外网路由/网关 || Link is Down 周期性出现 | dmesg 中规律断连 | PHY 驱动/硬件问题 |检查开发板路由配置ip routedefault via 192.168.9.1 dev end0192.168.9.0/24 dev end0 scope link src 192.168.9.210问题开发板把不存在的 192.168.9.1 当网关检查虚拟机 IP 转发状态cat /proc/sys/net/ipv4/ip_forward0禁止路由转发### Step 3 — 检查内核日志bashdmesg | grep -iE dwmac|stm32|eth|end0|phylink|phy | tail -50FSMP1A 出现 PHY Link Flappingstm32-dwmac 5800a000.ethernet end0: Link is Down ← 约每 130 秒stm32-dwmac 5800a000.ethernet end0: Link is Up - 100Mbps/Full## 解决方案### 修复 1配置 NAT 转发VM 侧在宿主机 VM (192.168.9.120) 上执行# 开启 IP 转发sudo sysctl -w net.ipv4.ip_forward1# 配置 NAT将 ens37 (连 FSMP1A) 的流量转发到 ens33 (连外网)sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE让开发板流量“伪装成虚拟机”访问外网sudo iptables -A FORWARD -i ens33 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPTsudo iptables -A FORWARD -i eth1 -o ens33 -j ACCEPT 允许内外网数据双向通过虚拟机持久化 iptables 规则重启不丢失bashsudo apt install iptables-persistentsudo netfilter-persistent save### 修复 2配置网关和 DNSFSMP1A 侧# 添加默认网关指向 VM 的 ens37route add default gw 192.168.9.120ip route replace default via 192.168.9.120# 配置 DNSecho nameserver 8.8.8.8 /etc/resolv.confecho nameserver 114.114.114.114 /etc/resolv.conf**持久化方法**写入启动脚本bash# 方法 A写入 /etc/network/interfaces如有# 方法 B写入 /etc/init.d/rcS 或 /etc/rc.local# 方法 C在应用程序启动前执行 route add 和 DNS 写入### 修复 3代码层网络容错http.cpp在 http_post() 中加入重试机制对抗短暂的 Link Downcppbool Http::http_post(...){const int MAX_RETRIES 3; // 最多重试 3 次const int RETRY_DELAY_MS 2000; // 间隔 2 秒for (int attempt 0; attempt MAX_RETRIES; attempt) {// ... 发送请求 ...if (ok) return true;// 失败时等待后重试if (attempt MAX_RETRIES - 1) {QTimer::singleShot(RETRY_DELAY_MS, loop, QEventLoop::quit);loop.exec();}}return false;}**重试策略**3 次 × 2 秒 覆盖 6 秒时间窗Link Down 持续约 4 秒 → 能够扛过。# FSMP1A 上route -n # 确认 default gw 存在ping -c 2 8.8.8.8 # 确认外网通ping -c 2 aip.baidubce.com # 确认 DNS 解析正常# 运行程序确认不再报 HostNotFoundErrorcd /root/face ./LOCKERS