You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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: ppp0
    
    执行sudo 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:56:22