软硬件

  • 树莓派
  • 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)

查看设备是否挂载成功

使用命令

sudo ls /dev |grep ttyUSB

挂载成功会有如图输出

image-20240409092926200

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

拨号上网

wvdial

  1. 安装

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

    sudo apt update 
    
    sudo apt install wvdial
  2. 配置

    修改配置文件

    sudo vim /etc/wvdial.conf

    image-20240408175302335

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

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

    [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

    联通卡使用以下配置

    [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

    sudo wvdial

    image-20240409095147469

    查看网络设备

    ifconfig

    image-20240409095403975

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

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

配置路由

查看路由

sudo route

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

sudo route add default dev ppp0

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

image-20240409100146004

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

sudo vim /etc/rc.local

exit 0前添加

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

通过systemctl来管理wvdial

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

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

sudo vim /etc/rc.local

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

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

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

    sudo mkdir /root/shell && cd shell
    
    # 名字可以任起
    sudo vim onwvdial.sh

    wvdial控制脚本内容

    #!/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是否运行
    • 记录启动、错误日志

    设置可执行权限

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

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

    配置文件内容如下:

    [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. 启动服务

    systemctl daemon-reload
    
    systemctl start wvdial_on.service
    
    systemctl enable wvdial_on.service

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

配置防火墙

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

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

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

    使用命令

    sudo gammu-config

    配置可参考我的

    image-20240409105606687

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

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

    修改 /etc/gammu-smsdrc

    [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. 编辑收到短信后自动发送邮件脚本

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

    编辑脚本

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

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

    #!/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

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

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

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

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

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

短信发送失败踩坑

  1. 查看端口占用

    sudo lsof /dev/ttyUSB2

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

  2. 设备波特率和wvdial重复

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

  3. ModemManager占用设备

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

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

    sudo systemctl disable ModemManager.service
    
    sudo systemctl stop ModemManager.service
最后修改:2024 年 07 月 25 日
如果觉得我的文章对你有用,请随意赞赏