Linux主板4G通讯断线重连的自动管理

 2019-5-5     作者:黄志超     [nemail]    
[lablebox]

  在工控主板使用的现场环境中,可能会有一部分不能够提供以太网的情形,所以3G和4G网络以其便捷的使用方式,得到越来越广泛的应用。但是在使用无线通讯的时候,为了保证通讯的稳定性,断线重连机制是必须在程序中实现的。


  为了让客户能够更加便捷的进行开发,英创公司在Linux主板上实现了自动拨号和断线重连的管理功能,并以库文件的形式放在主板文件系统中提供给客户。通过拨号管理库提供的API函数,客户就能够方便的实现自动拨号以及断线重连的功能,下面就详细介绍针对英创Linux主板的拨号管理库及导出的API函数。


  英创公司提供的拨号管理库文件名为libautodial.so,在编译应用程序的时候,需要链接这个库文件,如果客户使用光盘资料中提供的eclipse工具进行开发,在编译之前需要对工程进行设置,设置方法为选择对应的工程,通过右键菜单进入properties,点击右侧C/C++ Build子栏目,选择其中Settings这一项,在C++ Linker子项中添加库文件和路径,如下图:


Linux主板4G通讯断线重连的自动管理.png

工程设置


  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函数代表,可更换为其他处理代码。例程测试效果如下:


Linux主板4G通讯断线重连的自动管理.png

建立连接


  可以看到系统通过程序加载驱动后,生成了相应的虚拟串口,然后启用了拨号管理功能,start_connect()函数读出模块为ME909s,根据模块型号调用了对应的拨号脚本,连接成功后,检测线程打印出connected,说明连接已经成功。为了测试效果我们通过终端关闭拨号连接,模拟断线的情况,来测试是否能够实现自动重连:


Linux主板4G通讯断线重连的自动管理.png

断开模块


  从打印信息可以看到,在我们通过终端关闭拨号连接后,检测程序打印的信息提示disconnect,说明此时拨号连接已经断开。pppconnt_check()函数检测到连接断开但是硬件正常,于是返回-1,根据测试代码,就会打印disconnect信息。接下来我们查看拨号管理线程是否会自动重连,打印信息如下:


Linux主板4G通讯断线重连的自动管理.png

重连过程


  根据打印信息可以看出,在断开连接以后,10s左右的时间便重新连接上了,重新连接的过程是在拨号管理线程内部进行的,当检测程序提示了connected,就说明重连成功。


  成功连接后,会生成ppp0网口,可以使用ifconfig命令查看,如果要使用ppp0网络,采用linux标准的网络编程就可以了,即创建套接字绑定ppp0,然后进行需要的设置和操作,关于这部分的说明,可以参考我们提供的编程应用手册以及例程step3_tcpserver、step4_tcpclient。


  如果客户对拨号管理的功能感兴趣,可以和英创工程师联系,索取相关例程代码。

[lablebox]