准备:移植好pppd软件工具(可见下面的参考文章)、ppp拨号脚本、能上网的SIM卡、使能复位好EC20模块、串口初始化、读写的接口(因为CPU的USB接口给占用了,因此这里使用串口与模块通信)

识别、适应运营商原理:每个运营商的SIM卡会有相应规则的IMSI号码。通过AT指令(AT+CIMI)和EC20模块通信,读取SIM卡的IMSI号,然后判断CIMI号是哪个运营商的SIM卡,最后根据运营商的拨号码传递给拨号脚本进行拨号。

判断运营商的接口:根据获取到的IMSI判断运营商

static int get_IMSI(char *IMSI)
{char s2[128]="AT+CIMI\r\n";char s1[1024]={0};tcflush(ec20_fd,TCIOFLUSH);UART0_Send(ec20_fd, s2,strlen(s2));usleep(500000);int count=UART0_Recv(ec20_fd,5,0,s1,1024);int i=0;#if 0printf("count=%d\n",count);while(count-->0){printf("%c",s1[i++]);}printf("\n");#endifchar *p=s1;while(*p++){// printf("%c ",*p);if(*p>='0'&&*p<='9'){memcpy(IMSI,p,15);break;}}//printf("IMSI:%s\n",IMSI);if(IMSI[0]=='4'&&IMSI[1]=='6'&&IMSI[2]=='0'){if(IMSI[3]=='0' && IMSI[4]=='0' || IMSI[3]=='0' && IMSI[4]=='2' || IMSI[3]=='0' && IMSI[4]=='7'||IMSI[3]=='2'&&IMSI[4]=='0'){printf("中国移动\n");return 0;}if(IMSI[3]=='0' && IMSI[4]=='1' || IMSI[3]=='0' && IMSI[4]=='6' || IMSI[3]=='0' && IMSI[4]=='9' ){printf("中国联通\n");return 1;}if(IMSI[3]=='0' && IMSI[4]=='3' || IMSI[3]=='0' && IMSI[4]=='5' || IMSI[3]=='1' && IMSI[4]=='1' ){printf("中国电信\n");return 2;}printf("code[%c] [%c]\n",IMSI[3],IMSI[3]);return 3;}sleep(1);return 0;
}

PPP拨号接口:根据获取到的运营商向PPP拨号脚本传递对应运营商的拨号号码进行拨号,并且执行pppd拨号程序

拨号号码:
移动:ATD991#或981#
联通:ATD*99#
电信:#777(ATD#777)

#define SHELL_PPPD_PATH "/etc/ppp/peers/pppd.sh"
#define USER "user"
#define PASSWORAD "password"
#define EC20  "/dev/ttyPS1"
static int  ppp_ec20()
{char IMSI[128]={0};char buf[1024]={0};int ret=get_IMSI(IMSI);if(ret==0)//ret=execlp("pppd","pppd","call","provider",NULL);{sprintf(buf,"%s  %s %d cmnet %s %s ATD*99***1# &",SHELL_PPPD_PATH,EC20,921600,USER,PASSWORAD);}if(ret==1){sprintf(buf,"%s  %s %d 3gnet %s %s ATD*99# &",SHELL_PPPD_PATH,EC20,921600,USER,PASSWORAD);}if(ret==2){sprintf(buf,"%s  %s %d ctnet %s %s ATD#777 &",SHELL_PPPD_PATH,EC20,921600,USER,PASSWORAD);}change_baud(921600);//AT指令修改模块波特率。因为使用的是串口通信,所以默认的115200速率上网较慢,这里直接修改到最大波特率sleep(1);ret=system(buf);
}

手敲的拨号脚本pppd:可传递4个参数进来

#!/bin/shecho "devname baud apn user password"
#默认的参数设置
DEVNAME=/dev/ttyPS1
BAUD=115200
APN=ctnet
USER=user
PASSWORD=password
NUM=ATD#777
if [ $# -ge 1 ]; thenDEVNAME=$1echo "devname  $DEVNAME"
fiif [ $# -ge 2 ]; thenBAUD=$2echo "BAUD  $BAUD"
fiif [ $# -ge 3 ]; thenAPN=$3echo "apn  $APN"
fiif [ $# -ge 4 ]; thenUSER=$4echo "user  $USER"
fiif [ $# -ge 5 ]; thenPASSWORD=$5echo "password  $PASSWORD"
fiif [ $# -ge 6 ]; thenNUM=$6echo "NUM  $NUM"
fiCONNECT="'chat -s -v ABORT \"BUSY\" ABORT \"NO CARRIER\" ABORT \"NO DIALTONE\" ABORT \"ERROR\" ABORT \"NO ANSWER\" \"\" AT OK ATE0 OK ATI OK AT+CSUB OK AT+CSQ OK AT+CPIN? OK AT+COPS? OK  AT+CGREG? OK AT+CGDCONT=1,\\\"IP\\\",\\\"$APN\\\",,0,0 OK $NUM CONNECT'"
DISCONNECT="'chat -s -v ABORT ERROR ABORT OK ABORT DELAYED ABORT  \"NO CARRIER\" ABORT \"NO DIALTONE\" SAY \"\nSending break to the modem\n\" \"\" +++ \"\" +++ \"\" +++ SAY \"\nGood bay\n\"'"
pppd $DEVNAME $BAUD user "$USER" password "$PASSWORD" connect "'$CONNECT'" disconnect "'$DISCONNECT'" nodetach lock \
modem \
persist \
crtscts \
usepeerdns \
noauth \
noipdefault \
novj \
novjccomp \
noccp \
defaultroute \
ipcp-accept-local \
ipcp-accept-remote

编写、执行测试程序调试:

1.先查看SIM卡信号(AT+CSQ指令),良好

2.查看运营商,正确

3.拨号测试,正确识别运营商和成功拨号;输入ifconfig命令后可以看到已经生成ppp0网卡,添加ppp0默认路由后ping外网测试成功。


注意点:
1.不同运营商有不同的apn和拨号号码,要正确选择,否则拨号不成功
2.拨号前用AT指令检查能否接受到基站信号
3.用户名(user)和密码(password)可有可无,不重要。
4.ping测试识别不了域名的时候在/etc/resolv.conf上加上nameserver8.8.8.8/114.114.114.114

参考:
https://blog.csdn.net/zhaoxd200808501/article/details/72637695
https://blog.csdn.net/blog_xu/article/details/99676812
http://t.zoukankan.com/zhuangquan-p-12191214.html

【嵌入式linux】使用4G模块EC20自适应运营商和ppp拨号上网相关推荐

  1. 移植移远4G模块EC20过程记录2-QMI+PPP拨号上网

    目录 1.背景 2.移植QMI_WWAN驱动 2.1 准备源码 2.2 修改源码 2.3 make 2.4 安装 2.5 编译cdc_wdm 2.6 再次安装 2.7 验证QMI驱动 3.ppp拨号 ...

  2. Linux下4G模块高新兴物联中兴ME3630拨号上网

    Linux下4G模块高新兴物联ME3630拨号上网 实验硬件平台: 实验模块: 一.添加模组的PID/VIP到Linux内核中 代码文件:drivers/usb/serial/option.c 找到o ...

  3. 【imx6ul】SIM7600CE 4G模块在imx6ul linux4.15上拨号上网

    1.增加USB Serial内核驱动 CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y diff --gi ...

  4. 嵌入式Linux,4G模组使用,命令,EC20、EC25...

    嵌入式Linux开发中,移远4G模组通过ppp拨号上网,命令操作过程如下. chat:调制解调器的自动对话脚本,Chat程序定义了一个计算机和调制解调器之间对话交流,其主要目的是用来在本地PPPD和远 ...

  5. 实现4G模块EC20在树莓派系统下的PPP拨号上网

    目录 PPP协议 PPP通信建立 PPP认证方式 ppp协议栈 pppd数据传输 Pppd 控制协议数据流程 Linux中的PPP实现 安装PPP 方法一:源码安装 方法二: 直接安装 PPP拨号上网 ...

  6. 4G模块 EC20 R2.0 USB Serial/GobiNet/QMI WWAN 驱动移植过程

    4G模块 EC20 R2.0 USB Serial/GobiNet/QMI WWAN 驱动移植过程 一.开发环境 二.确定 EC20 R2.0 的基本信息 三.USB Serial 驱动移植 opti ...

  7. linux怎么使用4g模块的网络,在ARM-linux上实现4G模块PPP拨号上网(示例代码)

    在ARM平台上实现4G模块的PPP拨号上网,参考网上的资料和自己的理解,从一无所知到开发完成花了一周多.最后看到ARM板ping通www.baidu.com时甚是高兴,现将此过程整理如下.当然,除此之 ...

  8. gsm基于linux程序,基于嵌入式Linux下GSM模块的短信收发系统设计

    摘要:移动通信中的短消息业务以其方便.可靠和价廉得到了广泛应用,本文在嵌入式Linux系统中,通过西门子MC35模块,实现了短信收发系统,该系统采用PDU短信模式,能支持中文短信.程序设计采用异步事件 ...

  9. linux 串口4g ppp,在ARM-linux上实现4G模块PPP拨号上网

    原标题:在ARM-linux上实现4G模块PPP拨号上网 在ARM平台上实现 的 ,参考网上的资料和自己的理解,从一无所知到开发完成花了一周多.最后看到ARM板ping通www.baidu.com时甚 ...

最新文章

  1. NSBundle介绍
  2. top99 slam
  3. 210326阶段三人脸识别
  4. 2008年夜饭时随手拍的两张照片
  5. Java-进阶:Java-File--IO—2
  6. centos7源码安装ntp_如何安装和配置 Chrony 作为 NTP 客户端?
  7. CentOS设置网卡成DHCP动态获取IP
  8. android cursor 空,java – Android:即使数据库不为空,Cursor也总是返回null
  9. html5中颜色范围,HTML5输入范围:将runnable-track的颜色更改为当前值
  10. sklearn学习笔记(一):数据预处理
  11. 关于穿越机FPV视频果冻效应的讨论
  12. matlab 按照字符串运行,matlab中将字符串视为语句运行的方法——eval()函数
  13. 【JPress】jpress-core架构
  14. WPF之路——绘制几何图形
  15. 手机、浏览器的分辨率、状态栏参数
  16. 关于2021年最热门的5种编程语言
  17. 百度网盘网页版倍速播放
  18. 小王的摆烂日记之6月工作总结
  19. dlib人脸对齐(python)
  20. 【技巧收集】MATLAB乱码问题的解决

热门文章

  1. JavaWeb:HTML
  2. 思科三层交换机不同vlan互通_cisco(三层交换和动态路由,不同vlan间的通信,静态路由实现全网互通)...
  3. SMP并行编程为什么这么难-从Linux自旋锁到图灵机
  4. 微信 米聊 导游 服务器 李白,【文化】千古“第一导游”,我只服李白!
  5. vue webapp之music(六)利用axios与后端接口代理请求歌单推荐数据
  6. Teamwork(The second day of the team)
  7. [模板上新]病毒防疫主题公众号图文模板免费使用,武汉加油!
  8. 怎么批量转换图片格式?
  9. CCF论文列表(2022拟定)大更新!MICCAI空降B类!PRCV空降C类!ICLR继续陪跑...
  10. 爬取笔趣阁小说网站上的所有小说(二)