在工控主板使用的现场环境中,可能会有一部分不能够提供以太网的情形,所以3G和4G网络以其便捷的使用方式,得到越来越广泛的应用。但是在使用无线通讯的时候,为了保证通讯的稳定性,断线重连机制是必须在程序中实现的。
为了让客户能够更加便捷的进行开发,英创公司在Linux主板上实现了自动拨号和断线重连的管理功能,并以库文件的形式放在主板文件系统中提供给客户。通过拨号管理库提供的API函数,客户就能够方便的实现自动拨号以及断线重连的功能,下面就详细介绍针对英创Linux主板的拨号管理库及导出的API函数。
英创公司提供的拨号管理库文件名为libautodial.so,在编译应用程序的时候,需要链接这个库文件,如果客户使用光盘资料中提供的eclipse工具进行开发,在编译之前需要对工程进行设置,设置方法为选择对应的工程,通过右键菜单进入properties,点击右侧C/C++ Build子栏目,选择其中Settings这一项,在C++ Linker子项中添加库文件和路径,如下图:
工程设置
Windows开发环境和Ubuntu开发环境下面的eclipse设置方法相同。对运行环境的英创主板,其根文件系统/lib路径下已经做好了相应设置,客户不需要再做任何操作,直接运行编译好的程序即可。
拨号管理库文件libautodial.so一共提供了三个API函数,分别实现连接,查询和断开的功能,函数接口定义如下:
/** * 启用拨号管理线程 * * 函数会创建一个线程用来进行拨号管理 * 实现自动拨号,以及断线重连 * * 返回值说明: * 0 表示成功开启拨号管理线程。 * -1 表示在当前环境无法运行。 * */ int pppconnt_start(); /** * 查询连接状态 * * 返回值说明: * 0 表示运行连接正常。 * -1 表示连接断开。 * -2表示信号太差或者没有读取到SIM卡导致连接失败。 * -3表示连接模块无响应,建议检查硬件连接和驱动是否加载成功。 * */ int pppconnt_check(); /** * 关闭连接 * * 关闭拨号管理功能,并关闭已建立的连接。 * */ void pppconnect_stop();
pppconnt_start()函数会创建一个线程来对整个拨号的流程实现自动管理,管理线程一开始便会自动判断接入的模块型号,根据模块型号调用对应的拨号脚本,然后进行拨号和断线重连。所以对于客户来说,只需要调用一次pppconnt_start()函数,就会创建出一个实现拨号管理的线程,不需要再执行其他任何操作。
pppconnt_check()函数提供了查询功能,如果在使用过程中客户想获取连接状态,可以通过调用该函数的返回值来判断,0为正常连接,-1为连接断开,-2为信号弱或者无信号,可能是由于没有接天线或者没有读取到SIM卡造成的,-3为模块无响应,可能是由于没有识别到外部模块或者没有加载驱动造成的。如果一直无法连接成功,客户可以根据查询的返回值判断原因,还可以增加硬件复位和重新上电等操作来保证模块的正常工作。
pppconnt_stop()函数,这个函数会关闭拨号管理线程,以及已经建立好的连接。在客户需要关闭拨号连接或是对模块进行复位等操作时,建议先调用pppconnt_stop()函数释放相关资源。
客户在主板上电后,需要先加载4G模块对应的驱动,因为需要驱动加载成功后,才能通过虚拟串口使用程序与模块之间进行交互,加载驱动可以放在程序或者脚本中进行,驱动加载的方法可以参考文章:《英创Linux主板基于3G和4G的无线通讯方案》中的说明。驱动加载成功后,系统会生成对应的虚拟串口,这时就可以调用拨号管理库中提供的pppconnt_start()函数进行拨号连接了。根据上面的介绍和对API函数的描述,我们使用以下代码进行简单的测试:
int i1; //先调用一次pppconnt_stop,关闭连接 pppconnt_stop(); //通过代码加载驱动,测试使用华为ME909s,VID=0x12d1,PID=15c1 system("insmod /lib/modules/4.1.15/usbserial.ko vendor=0x12d1 product=0x15c1"); //开启拨号管理 i1 = pppconnt_start( ); printf("i1 = %d\n", i1); while(1) { i1 = pppconnt_check(); if(!i1) { printf("connected!\n"); //main processing //... sleep(5); } else { //返回值为-,说明连接断开 if(i1 == -1) printf("disconnect!\n"); //返回值为-2,说明检测不到信号,可能是没有检测到SIM卡,这里执行退出 else if(i1 == -2) { printf("singal is weak, please check SIM card!\n"); break; } //返回值为-3,说明模块无响应,这里执行退出 else if(i1 == -3) { printf("there is no response, please check hardware!\n"); break; } } sleep(1); } //退出循环,调用pppconnt_stop,释放相关资源 pppconnt_stop(); return 0;
例程中对于查询到的状态,我们只是做了简单的打印,方便观看效果,在遇到没有读取到SIM卡和模块无响应的情况下就退出,在实际使用中可以加入硬件复位和重新上电等操作。应用处理由sleep函数代表,可更换为其他处理代码。例程测试效果如下:
建立连接
可以看到系统通过程序加载驱动后,生成了相应的虚拟串口,然后启用了拨号管理功能,start_connect()函数读出模块为ME909s,根据模块型号调用了对应的拨号脚本,连接成功后,检测线程打印出connected,说明连接已经成功。为了测试效果我们通过终端关闭拨号连接,模拟断线的情况,来测试是否能够实现自动重连:
断开模块
从打印信息可以看到,在我们通过终端关闭拨号连接后,检测程序打印的信息提示disconnect,说明此时拨号连接已经断开。pppconnt_check()函数检测到连接断开但是硬件正常,于是返回-1,根据测试代码,就会打印disconnect信息。接下来我们查看拨号管理线程是否会自动重连,打印信息如下:
重连过程
根据打印信息可以看出,在断开连接以后,10s左右的时间便重新连接上了,重新连接的过程是在拨号管理线程内部进行的,当检测程序提示了connected,就说明重连成功。
成功连接后,会生成ppp0网口,可以使用ifconfig命令查看,如果要使用ppp0网络,采用linux标准的网络编程就可以了,即创建套接字绑定ppp0,然后进行需要的设置和操作,关于这部分的说明,可以参考我们提供的编程应用手册以及例程step3_tcpserver、step4_tcpclient。
如果客户对拨号管理的功能感兴趣,可以和英创工程师联系,索取相关例程代码。
成都英创信息技术有限公司 028-8618 0660