简介:使用串口拨号,先发4G命令,再发送拨号命令

一,试验

1,本来是为了让树莓派ubuntu开机的时候自动运行4g模块的上网拨号,所以开始尝试写脚本,但是有2个难点

sudo minicom -D /dev/ttyUSB2
AT+CNMP=38
sudo insmod simcom_wwan.ko
ifconfig -a
sudo ifconfig wwp1s0u1u1i5 up
sudo minicom -D /dev/ttyUSB2
AT$QCRMCALL=1,1
sudo udhcpc -i wwp1s0u1u1i5

2,难点1是这个拨号需要使用串口发送AT命令才行。难点2是怎么读取4G模块的网卡名字。

3,串口的解决办法是使用python,编写一个serial的操作,进行串口通信。但是目前遇到的问题是,必须执行2次脚本才能成功。

python有两种方法执行shell命令

#第一种方法,能执行命令,但是获取不到输出信息
import os
val = os.system('ls -al')
print val     #这里val输出会是0,应该表示的是没有错误


#第二种方法,能保存下来执行命令后的输出内容
val =os.popen()
val.read()
#或者
val.readlines()



4,读取网卡内容,可以使用psutil工具,可以pip安装

pip install psutil

psutil.net_if_addrs()

下面的代码可以读到我的4G模块网卡名字,但是只有在ifconfig 网卡名 up后才能读取到

import psutil as pu 

netname=psutil.net_if_addrs()

for netn in netname.keys():
    if netn=='lo':
        continue
    elif netn=='wlan0':
        continue
    elif netn=='eth0':
        continue
    else:
        print(netn)
        break

二,下面测试成功,前提是在root下运行。

这个脚本之前有问题,每次都是发送第二次才成功,应该是读取返回换行再ok有关,所以我没有使用serial库,直接使用shell命令的echo—–>串口设备了。下面脚本可以正常运行成功

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import serial
import time
import os,sys

ser = serial.Serial('/dev/ttyUSB2',115200)
ser.flushInput()
ser.flushOutput()
if ser.is_open!=True:
    ser.open()

def send_at(command,back,timeout):
    rec_buff = ''
    ser.write((command+'\r\n').encode())
    time.sleep(timeout)
    if ser.inWaiting():
        time.sleep(0.01)
        rec_buff = ser.read(ser.inWaiting())
    if rec_buff != '':
        if back not in rec_buff.decode():
            print(command + ' ERROR')
            print(command + ' back:\t' + rec_buff.decode())
            return 0
        else:
            str_4g=rec_buff.decode()
            print(rec_buff.decode())
            # if len(str_4g)>50:
            #     print(float(str_4g[25:27])+float(str_4g[27:36])/60)
            #     print(float(str_4g[39:42])+float(str_4g[42:51])/60)
            return 1
    else:
        print('CMD is not ready')
        return 0
def send_4g_cmd():
    # AT$QCRMCALL=1,1
    send_at('AT+CNMP=38','OK',1)
    print('against1')
    time.sleep(1)
    send_at('AT+CNMP=38','OK',1)
    #send_at('AT$QCRMCALL=1,1','OK',1)
    time.sleep(1)

def send_call():
    # AT$QCRMCALL=1,1
    send_at('AT$QCRMCALL=1,1','OK',1)
    print('against2')
    time.sleep(1)
    send_at('AT$QCRMCALL=1,1','OK',1)
    #send_at('AT$QCRMCALL=1,1','OK',1)
    time.sleep(1)

def send_AT():
    # AT$QCRMCALL=1,1
    send_at('AT','OK',1)
    print('against3')
    send_at('AT','OK',1)
    #send_at('AT$QCRMCALL=1,1','OK',1)
    time.sleep(0.5)


# 执行程序
try:
    #-------------------------------------------------------------------------------------
    os.system("echo 'AT+CNMP=38' > /dev/ttyS0")
    time.sleep(1)
    os.system("echo 'AT+CNMP=38' > /dev/ttyS0")
    time.sleep(1)
    #拨号上网的程序
    #1
    #send_4g_cmd()
    print("*1* send 4G cmd\n")
    #2
    if os.system('sudo insmod /home/ubuntu/Downloads/SIM7600_NDIS/simcom_wwan.ko') != 0:
        #sys.exit(0)
        pass
    print("*2* setup wwan.ko\n")
    time.sleep(1)
    #3
    if os.system('sudo ifconfig wwp1s0u1u1i5 up') != 0:
        pass
        #sys.exit(0)
    print("*3* ifconfig wwp1s0u1u1i5 up\n")
    time.sleep(1)
    #4
    os.system("echo 'AT$QCRMCALL=1,1' > /dev/ttyS0")
    time.sleep(1)
    os.system("echo 'AT$QCRMCALL=1,1' > /dev/ttyS0")
    time.sleep(1)
    #send_call()
    print("*4* send call\n")
    #5
    if os.system('sudo udhcpc -i wwp1s0u1u1i5') != 0:
        #sys.exit(0)
        pass
    print("*5* do udhcpc\n")
    time.sleep(1)
    #6
    # if os.system('sudo ifconfig wlan0 down') != 0:
    #     sys.exit(0)
    print("*6* close wlan0\n")
    #-------------------------------------------------------------------------------------

    #-------------------------------------------------------------------------------------
    #连接虚拟专用网络
    #7
    if os.system('openvpn3 session-start --config /etc/openvpn3/clb1.ovpn') != 0:
        sys.exit(0)
    print("*7* connect vpn\n")
except:
    if ser != None:
        ser.close()
if ser != None:
        ser.close()

三,开机自动运行设置

说明:ubuntu18.04不支持init.d运行,但是保留了rc.local所以我们用这个方法。(官方建议用啥呢?没找到说明,官方说这2个方法都不建议用,没办法,先用着吧)

1,创建服务文件

vi /etc/systemd/system/你服务的名字.service

2,内容如下

可以修改为自己文件位置和名字,但是记得chmod 755



[Unit]
Description=Start up script
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

3,创建Create file /etc/rc.local with

#!/bin/bash

touch /root/OK

exit 0

4,

sudo systemctl daemon-reload

5,

sudo systemctl enable 你服务的名字.service