软硬件

  • 树莓派
  • ec20
  • wvdial
  • gammu
  • SIM卡

EC20模块

概述

EC20-CE是移远通信最近推出的LTE Cat 4无线通信模块,采用LTE 3GPP Release 11 技术,支持最大下行速率 150 Mbps和最大上行速率50 Mbps;同时在封装上兼容移远通信多网络制式LTE EC21系列、EC25系列和EG25-G 模块,实现了3G网络与4G网络之间的无缝切换。

EC20-CE采用镭雕工艺,镭雕工艺具有外观更漂亮、金属质感强、散热更好、信息不容易被抹除、更能适应自动化需求等优点。

EC20-CE内置多星座高精度定位GNSS(GPS/GLONASS/BDS/Galileo/QZSS)接收机;在简化产品设计的同时,还大大提升了定位速度及精度。

EC20-CE内置丰富的网络协议,集成多个工业标准接口,并支持多种驱动和软件功能(适用于Windows 7/8/8.1/10/11、Linux、Android等操作系统下的USB驱动等),极大地拓展了EC20-CE在M2M领域的应用范围,如CPE、路由器、数据卡、平板电脑、车载、智能安全以及工业级PDA等。

产品特性

image-20240409092210305

更多详情可到官网查看

产品手册 Quectel_Product_Brochure_CN_V7.8)

查看设备是否挂载成功

使用命令

1
sudo ls /dev |grep ttyUSB

挂载成功会有如图输出

image-20240409092926200

要是没有看到设备则检查设备是否稳定插入、更换USB口或者重启设备之后再重新使用命令查看

拨号上网

wvdial

  1. 安装

    wvdial是一个方便使用的PPP拨号模块,它能调用调制调节器,并通过PPP上网,无需像手动拨号一样配置繁琐的文件

    1
    2
    3
    sudo apt update 

    sudo apt install wvdial
  2. 配置

    修改配置文件

    1
    sudo vim /etc/wvdial.conf

    image-20240408175302335

    可以继续使用 [Dialer Defaults]也可以重新根据自己需要添加,我这里为了没有多余手机卡,也为了方便输入命令,就直接使用

    电信/移动SIM卡使用以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [Dialer Defaults]
    Init1 = ATZ
    Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
    Modem Type = Analog Modem
    Modem = /dev/ttyUSB3
    Baud = 115200
    New PPPD = yes
    ISDN = 0
    Phone = *99#
    Username = card
    Password = card

    联通卡使用以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Dialer Defaults]
    Init1 = ATZ
    Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
    Init3 = at+cgdcont=1,"ip","uninet"
    Modem Type = Analog Modem
    Modem = /dev/ttyUSB3
    Baud = 115200
    New PPPD = yes
    ISDN = 0
    Phone = *99#
    Password = card
    Username = card

    配置来源于 Quectel EC20 在 Linux 上的使用

    在配置文件中大部分都不需要自己调整,只有ModemBaud需要根据自己设备情况进行调整

    • Modem:根据情况选择合适的设备我的这个ttyUSB2和ttyUSB3都能正常使用
    • Baud:根据情况选择合适的波特率,对于ec20来说9600-115200都可以
  3. 启动wvdial

    1
    sudo wvdial

    image-20240409095147469

    查看网络设备

    1
    ifconfig

    image-20240409095403975

    可以看到多了ppp0和wwan0两个设备

    正常情况还无法访问网络,因为默认路由在其他网络设备中,需要重新配置路由

配置路由

查看路由

1
sudo route

配置路由的方式有很多种,我这里的方法比较简单粗暴,需要具体配置的可自己查找方法

1
sudo route add default dev ppp0

该命令会在路由表中添加一条新的默认路由

image-20240409100146004

在每次重启后都会刷新路由,可以将命令加到/etc/rc.local中,每次开机都执行添加方法

1
sudo vim /etc/rc.local

exit 0前添加

1
su - root -c `route add default dev ppp0`

通过systemctl来管理wvdial

开机自启wvdial的方法有很多种,并不一定要使用systemctl

最简单的就是和添加路由一样,在/etc/rc.local中添加启动命令

1
2
3
4
sudo vim /etc/rc.local

# 添加
wvdial &
  1. 编写控制wvdial启动和检测wvdial运行脚本

    新建sh脚本文件,可以放到你想存放的地方

    我这里在root用户下/root/shell

    1
    2
    3
    4
    sudo mkdir /root/shell && cd shell

    # 名字可以任起
    sudo vim onwvdial.sh

    wvdial控制脚本内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #!/bin/bash
    DEVICE_NAME="/dev/ttyUSB3" # 和wvdial配置设备一致
    LOG_FILE="/var/log/wvdial_on.log" # 日志文件存储位置
    PROCESS_NAME=(wvdial pppd) # 需检查占用软件
    # 定义函数检查进程是否占用设备
    check_device_usage() {
    local process_name=$1
    local device=$2
    local pids=$(pgrep -f "$process_name")

    if [ -z "$pids" ]; then
    return
    fi

    for pid in $pids; do
    echo "pid:$pid"
    local device_count=$(lsof -p "$pid" 2>/dev/null | grep -e "$device" | wc -l)
    if [ "$device_count" -gt 0 ]; then
    echo "占用设备:$device"
    kill $pid
    fi
    done
    return
    }

    function check_wvdial() {
    if pgrep -x "wvdial" >/dev/null; then
    return 0 # wvdial 进程在运行
    else
    return 1 # wvdial 进程未运行
    fi
    }

    for process in $PROCESS_NAME; do
    echo "进程名: $process"
    check_device_usage $process $DEVICE_NAME
    done

    wvdial >> "$LOG_FILE" 2>&1 &
    route add default dev ppp0

    while true;do
    if ! check_wvdial;then
    echo "$(date +"%Y-%m-%d %H:%M:%S") - wvdial 进程未运行,正在重新启动..." >> "$LOG_FILE"
    wvdial >> "$LOG_FILE" 2>&1 &
    fi
    sleep 120
    done

    该脚本包含功能:

    • 停止wvdial启动前所需设备的占用
    • 启动wvdial
    • 添加ppp0默认路由
    • 每120秒检测wvdial是否运行
    • 记录启动、错误日志

    设置可执行权限

    1
    sudo chmod u+x /root/shell/onwvdial.sh
  2. 编写systemctl控制文件

    1
    sudo vim /etc/systemd/system/wvdial_on.service

    配置文件内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=Safe Start Wvadil
    After=dev-ttyUSB3.device
    Requires=dev-ttyUSB3.device

    [Service]
    User=root
    Group=root
    ExecStart=/root/shell/onwvdial.sh # 路径根据自己配置修改

    [Install]
    WantedBy=multi-user.target

  3. 启动服务

    1
    2
    3
    4
    5
    systemctl daemon-reload

    systemctl start wvdial_on.service

    systemctl enable wvdial_on.service

    设置自启动后就不需要在/etc/rc.local中添加修改路由和启动wvdial命令了

配置防火墙

如果在ec20模块连接4G网络后还需要使用wifi则需要配置防火墙,不需要则不用配置

1
2
3
4
5
6
7
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo iptables -A FORWARD -i ppp0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o ppp0 -j ACCEPT


将防火墙规则写入文件
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

顺序执行命令即可

收发短信

  1. 安装软件gammu

    1
    sudo apt install gammu gammu-smsd
  2. 配置gammu

    使用命令

    1
    sudo gammu-config

    配置可参考我的

    image-20240409105606687

    或者直接修改/root/.gammurc,效果是一样的
    如果没有/root/.gammurc文件就使用命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [gammu]

    port = /dev/ttyUSB2
    model =
    connection = at19200
    synchronizetime = yes
    logfile =
    logformat = nothing
    use_locking = no
    gammuloc =

    修改 /etc/gammu-smsdrc

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [gammu]
    # Please configure this!
    port = /dev/ttyUSB2
    connection = at19200
    # Debugging
    #logformat = textall
    # SMSD configuration, see gammu-smsdrc(5)
    [smsd]
    service = files
    logfile = syslog
    RunOnReceive = /root/msmtp/sh/send-smsd.sh # 发送邮件脚本
    # Increase for debugging information
    debug = yes
    #debuglevel = 0

    # Paths where messages are stored
    inboxpath = /var/spool/gammu/inbox/
    outboxpath = /var/spool/gammu/outbox/
    sentsmspath = /var/spool/gammu/sent/
    errorsmspath = /var/spool/gammu/error/
  3. 编辑收到短信后自动发送邮件脚本

    树莓派配置邮件这里不再赘述,可以自行搜索,或者参考我之前的一篇博客

    编辑脚本

    1
    vim /root/msmtp/sh/send-smsd.sh

    文件路径根据自己需要修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    for i in `seq $SMS_MESSAGES` ; do
    if [ $i -eq 1 ]; then
    phone="$SMS_1_NUMBER"
    fi
    tmp="$(eval echo '$'SMS_${i}_TEXT)"
    message="$text$tmp"
    done
    echo "$message" |mutt -s "树莓派短信转发" xxx@163.com
  4. 重启gammu

    1
    systemctl restart gammu-smsd.service
  5. 短信测试

    向目标号码发送短信后邮箱能收到短信

    通过终端向其他号码发送短信

    1
    gammu-smsd-inject TEXT 目标号码 -text '短信内容' -unicode

    如果收到短信说明配置成功

短信发送失败踩坑

  1. 查看端口占用

    1
    sudo lsof /dev/ttyUSB2

    如果有其他进程和gammu-sms占用设备,可以使用kill命令结束非必须进程

  2. 设备波特率和wvdial重复

    检查wvdial配置和gammu配置,如果wvdial已经使用了ttyUSB3和波特率115200则gammu配置中就不要再使用相同设备和波特率,可以使用ttyUSB2和波特率at19200

  3. ModemManager占用设备

    查看设备后发现有进程ModemMnana在使用设备,可以停用ModemManager

    需要考虑实际使用情况来判断,在确认ModemManager确实不是必要软件后再进行操作

    1
    2
    3
    sudo systemctl disable ModemManager.service

    sudo systemctl stop ModemManager.service