环境:raspbian-stretch(2018-06-27)
树莓派:3代B型
SIM868模块具有GPRS数据传输功能(2G网络),但是模块是通过AT指令控制的,在树莓派上用AT指令控制会非常不方便,如果可以像wifi一样操作就很方便了。通过ppp拨号上网就可以实现这个功能。
这样就可以实现树莓派通过socket或者http协议直接与服务器访问。
1、安装ppp
sudo apt-get install ppp
2、进入/etc/ppp/peers目录,复制一份provider文件并命名为gprs
sudo su
sudo cd /etc/ppp/peers
cp provider gprs
3、打开并编辑gprs脚本,编写gprs脚本为PPP连接指定了连接使用的设备、使用的控制字符传输速率、指定了硬件加速、溢出控制等。
vim /etc/ppp/peers/gprs
内容修改如下:
注:加上参数-v 告诉 chat命令将其所有的输出/入拷贝到系统记录里(通常是 #/var/log/messages),chat脚本的位置可以位于/etc/目录下,也可以位于/var下,这个可以根据需要灵活设置
4、打开并编辑gprs的chat脚本
从上图中可以看到gprs的chat脚本放置在/etc/chatscripts/文件夹下的gprs文件
cd /etc/chatscripts
cp gprs gprs_copy
vim gprs
配置文件修改如下:
通过查看AT命令手册,CGDCONT是有很多参数的
三大运营商拨号设置表:
5、测试ppp拨号上网
注意:需要将eth0、wlan0即网口给禁用掉,这样ping命令才会通过ppp0端口寻找路由连接外网,但是eth0、wlan0网口禁用掉之后就不能联网了,所以下面分两种情况进行操作!
(1)、树莓派与显示器通过hdmi线直连,可按照如下进行操作
需要将eth0、wlan0即网口给禁用掉
sudo ifconfig eth0 down
sudo ifconfig wlan0 down
启动ppp拨号
pppd call gprs &
拨号成功如图所示:
ping 一下度娘看下是否可以上网,如ping通就是可以上网了。
(2)、树莓派与电脑通过 ssh 或者 远程桌面 方式连接,可按照如下进行操作
新建一个linux shell脚本,命名为:bat.sh,内容如下:
PS:使用shell脚本的目的就是为了在禁用 eth0、wlan0 网口后,让树莓派自动启动ppp拨号,并启动完成之后将 eth0、wlan0 网口开启,方便继续远程连接!!!
#!/bin/bash echo -e "start!"
#将eth0、wlan0网口给禁用掉
sudo ifconfig eth0 down
sudo ifconfig waln0 down
#启动ppp拨号
pppd call gprs &
#将eth0、wlan0网口开启
sudo ifconfig eth0 up
sudo ifconfig waln0 up echo -e "end!"
打开Terminal终端,cd 到 bat.sh 目录下
#开启root模式
su #执行bat.sh脚本
chmod 755 bat.sh
./bat.sh
拨号成功如图所示:
指定ppp0网口ping百度,可以看到ping通了,也就说树莓派可以使用ppp拨号上网了。
PS:指定ppp0网口ping百度操作可参考指定网卡进行ping操作。
6、 对于第5步操作的思考
我们注意到,如果是单独执行 pppd call gprs & 也是会产生ppp0网口 并且运营商也会分配公网ip,但是我们指定源ip去ping,却无法ping通百度,经过摸索,发现无法通过sim868上网和linux 的路由配置有关
执行完 pppd call gprs & 之后,ifconfig 查看网口配置情况
sudo pppd call gprs &
ifconfig
可以看到,虽然无法ping通百度,但是有公网ip 10.25.98.151,查看当前路由配置
route -n
发现对于ppp0网口来说,只有一条路由记录为:
192.168.254.254 0.0.0.0 255.255.255.255 VH 0 0 0 ppp0
注:这是条主机路由,目的ip地址为192.168.254.254,所以当然无法ping通百度。
我们增加一条路由规则,
sudo route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0
可以看到多出一条目的ip地址为0.0.0.0,网关为默认网关 0.0.0.0,子网掩码为 0.0.0.0 的默认路由规则为:
0.0.0.0 0.0.0.0 0.0.0.0 V 0 0 0 ppp0
可以看到通过ppp0网口可以ping通百度了,也就是说可以通过sim868上网了。
7、 对于第5步操作的进一步思考
我们注意到5步中,有个操作为先将eth0、wlan0即网口给禁用掉,再启动ppp拨号,最后再up开启eth0、wlan0网口
先将eth0、wlan0即网口给禁用掉之前,路由配置如下:
启动ppp拨号
sudo ./bat.sh
查看路由配置如下:
发现多处一条ppp0网口的默认路由!!!
指定源ip为10.9.169.76也可ping通百度!!
8、 结语
经过第6、7步的思考,我们知道了如果单纯的执行 pppd call gprs & 启动ppp拨号的话,虽然能获得ip,但是缺少对于ppp0网口的路由配置,才导致无法通过sim868模块拨号上网。这时就需要我们增加一条如下的默认路由即可:
sudo route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0
参考资料: http://www.waveshare.net/study/article-790-1.html
https://blog.csdn.net/allen19881119/article/details/72457541