Linux下如何将GSM模块AT+CIFSR获取的IP设为默认地址?
问题描述
我正在用Python编写GSM模块扩展程序,目前已通过AT+CIFSR命令获取到IP地址,请问在Linux系统中如何将该IP设置为默认地址?当前我的网络检测代码如下:
def check_network(): for i in range(1, 3): if send_at("AT+CGREG?", "0,1") == 1: print('SIM868 is online\r\n') break else: print('SIM868 is offline, please wait...\r\n') utime.sleep(5) continue send_at("AT+CPIN?", "OK") send_at("AT+CSQ", "OK") send_at("AT+COPS?", "OK") send_at("AT+CGATT?", "OK") send_at("AT+CGDCONT?", "OK") send_at("AT+CSTT?", "OK") send_at("AT+CSTT=\""+APN+"\"", "OK") send_at("AT+CIICR", "OK") send_at("AT+CIFSR", "OK")
注:
AT+CIFSR命令用于获取IP地址。
解决方案
在Linux系统中,GSM模块拨号后通常会生成ppp0类的网络接口,你需要针对该接口配置默认路由,以下是具体操作步骤:
1. 确认GSM模块对应的网络接口
先执行命令查看当前系统的网络接口,找到GSM拨号生成的接口:
ip link show
拨号成功后会出现类似ppp0的标识,这就是需要操作的目标接口。
2. 临时配置默认路由(重启后失效)
假设GSM接口为ppp0,执行以下命令替换默认路由:
# 可选:删除原有默认路由 sudo ip route del default # 将GSM接口设为默认路由 sudo ip route add default dev ppp0
3. 永久配置默认路由(重启后生效)
不同Linux发行版配置方式略有差异:
- Debian/Ubuntu(传统ifupdown):编辑
/etc/network/interfaces,添加以下内容:auto ppp0 iface ppp0 inet dhcp post-up ip route add default dev ppp0 - Ubuntu(Netplan):创建/编辑
/etc/netplan/01-gsm.yaml:
执行network: version: 2 ethernets: ppp0: dhcp4: true routes: - to: 0.0.0.0/0 dev: ppp0sudo netplan apply使配置生效。
4. 在Python代码中集成路由配置
修改现有代码,在获取到IP后通过subprocess调用系统命令完成配置:
import subprocess import utime def check_network(): gsm_ip = None for i in range(1, 3): if send_at("AT+CGREG?", "0,1") == 1: print('SIM868 is online\r\n') break else: print('SIM868 is offline, please wait...\r\n') utime.sleep(5) continue send_at("AT+CPIN?", "OK") send_at("AT+CSQ", "OK") send_at("AT+COPS?", "OK") send_at("AT+CGATT?", "OK") send_at("AT+CGDCONT?", "OK") send_at("AT+CSTT?", "OK") send_at(f"AT+CSTT=\"{APN}\"", "OK") send_at("AT+CIICR", "OK") # 提取AT+CIFSR返回的IP地址 response = send_at("AT+CIFSR", "OK") if response: gsm_ip = response.strip() print(f"获取到GSM IP: {gsm_ip}") # 配置默认路由 try: subprocess.run(["sudo", "ip", "route", "del", "default"], check=False) subprocess.run(["sudo", "ip", "route", "add", "default", "dev", "ppp0"], check=True) print("默认路由已切换为GSM接口") except subprocess.CalledProcessError as e: print(f"路由配置失败: {e}") return gsm_ip
注意:执行
sudo命令需要确保当前用户有免密sudo权限,可通过编辑/etc/sudoers添加规则:你的用户名 ALL=(ALL) NOPASSWD: /usr/sbin/ip
内容的提问来源于stack exchange,提问作者Papp Tamás
相关产品推荐
相关产品推荐

