<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • Linux主板4G通訊斷線重連的自動管理

     2019-5-5     作者:黃志超         
    文章標簽:C/C++Eclipse4G

      在工控主板使用的現(xiàn)場環(huán)境中,可能會有一部分不能夠提供以太網(wǎng)的情形,所以3G和4G網(wǎng)絡以其便捷的使用方式,得到越來越廣泛的應用。但是在使用無線通訊的時候,為了保證通訊的穩(wěn)定性,斷線重連機制是必須在程序中實現(xiàn)的。


      為了讓客戶能夠更加便捷的進行開發(fā),英創(chuàng)公司在Linux主板上實現(xiàn)了自動撥號和斷線重連的管理功能,并以庫文件的形式放在主板文件系統(tǒng)中提供給客戶。通過撥號管理庫提供的API函數(shù),客戶就能夠方便的實現(xiàn)自動撥號以及斷線重連的功能,下面就詳細介紹針對英創(chuàng)Linux主板的撥號管理庫及導出的API函數(shù)。


      英創(chuàng)公司提供的撥號管理庫文件名為libautodial.so,在編譯應用程序的時候,需要鏈接這個庫文件,如果客戶使用光盤資料中提供的eclipse工具進行開發(fā),在編譯之前需要對工程進行設置,設置方法為選擇對應的工程,通過右鍵菜單進入properties,點擊右側(cè)C/C++ Build子欄目,選擇其中Settings這一項,在C++ Linker子項中添加庫文件和路徑,如下圖:


    Linux主板4G通訊斷線重連的自動管理.png

    工程設置


      Windows開發(fā)環(huán)境和Ubuntu開發(fā)環(huán)境下面的eclipse設置方法相同。對運行環(huán)境的英創(chuàng)主板,其根文件系統(tǒng)/lib路徑下已經(jīng)做好了相應設置,客戶不需要再做任何操作,直接運行編譯好的程序即可。


      撥號管理庫文件libautodial.so一共提供了三個API函數(shù),分別實現(xiàn)連接,查詢和斷開的功能,函數(shù)接口定義如下:


    /**
     *    啟用撥號管理線程
    *
    *    函數(shù)會創(chuàng)建一個線程用來進行撥號管理
    *    實現(xiàn)自動撥號,以及斷線重連
    *
     *    返回值說明:
     *     0 表示成功開啟撥號管理線程。
     *    -1 表示在當前環(huán)境無法運行。
     *
     */
    int pppconnt_start();
     
    /**
     *    查詢連接狀態(tài)
     *
     *    返回值說明:
     *    0 表示運行連接正常。
     *    -1 表示連接斷開。
    *      -2表示信號太差或者沒有讀取到SIM卡導致連接失敗。
     *    -3表示連接模塊無響應,建議檢查硬件連接和驅(qū)動是否加載成功。
    *
     */
    int pppconnt_check();
     
    /**
     *    關閉連接
     *
     *    關閉撥號管理功能,并關閉已建立的連接。
     *
     */
    void pppconnect_stop();


      pppconnt_start()函數(shù)會創(chuàng)建一個線程來對整個撥號的流程實現(xiàn)自動管理,管理線程一開始便會自動判斷接入的模塊型號,根據(jù)模塊型號調(diào)用對應的撥號腳本,然后進行撥號和斷線重連。所以對于客戶來說,只需要調(diào)用一次pppconnt_start()函數(shù),就會創(chuàng)建出一個實現(xiàn)撥號管理的線程,不需要再執(zhí)行其他任何操作。


      pppconnt_check()函數(shù)提供了查詢功能,如果在使用過程中客戶想獲取連接狀態(tài),可以通過調(diào)用該函數(shù)的返回值來判斷,0為正常連接,-1為連接斷開,-2為信號弱或者無信號,可能是由于沒有接天線或者沒有讀取到SIM卡造成的,-3為模塊無響應,可能是由于沒有識別到外部模塊或者沒有加載驅(qū)動造成的。如果一直無法連接成功,客戶可以根據(jù)查詢的返回值判斷原因,還可以增加硬件復位和重新上電等操作來保證模塊的正常工作。


      pppconnt_stop()函數(shù),這個函數(shù)會關閉撥號管理線程,以及已經(jīng)建立好的連接。在客戶需要關閉撥號連接或是對模塊進行復位等操作時,建議先調(diào)用pppconnt_stop()函數(shù)釋放相關資源。


      客戶在主板上電后,需要先加載4G模塊對應的驅(qū)動,因為需要驅(qū)動加載成功后,才能通過虛擬串口使用程序與模塊之間進行交互,加載驅(qū)動可以放在程序或者腳本中進行,驅(qū)動加載的方法可以參考文章:《英創(chuàng)Linux主板基于3G和4G的無線通訊方案》中的說明。驅(qū)動加載成功后,系統(tǒng)會生成對應的虛擬串口,這時就可以調(diào)用撥號管理庫中提供的pppconnt_start()函數(shù)進行撥號連接了。根據(jù)上面的介紹和對API函數(shù)的描述,我們使用以下代碼進行簡單的測試:


     int   i1;
     
           //先調(diào)用一次pppconnt_stop,關閉連接
           pppconnt_stop();
     
           //通過代碼加載驅(qū)動,測試使用華為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卡,這里執(zhí)行退出
                         else if(i1 == -2) {
                                printf("singal is weak, please check SIM card!\n");
                                break;
                         }
                         //返回值為-3,說明模塊無響應,這里執(zhí)行退出
                         else if(i1 == -3) {
                                printf("there is no response, please check hardware!\n");
                                break;
                         }
                  }
     
                  sleep(1);
           }
     
           //退出循環(huán),調(diào)用pppconnt_stop,釋放相關資源
           pppconnt_stop();
           return 0;


      例程中對于查詢到的狀態(tài),我們只是做了簡單的打印,方便觀看效果,在遇到?jīng)]有讀取到SIM卡和模塊無響應的情況下就退出,在實際使用中可以加入硬件復位和重新上電等操作。應用處理由sleep函數(shù)代表,可更換為其他處理代碼。例程測試效果如下:


    Linux主板4G通訊斷線重連的自動管理.png

    建立連接


      可以看到系統(tǒng)通過程序加載驅(qū)動后,生成了相應的虛擬串口,然后啟用了撥號管理功能,start_connect()函數(shù)讀出模塊為ME909s,根據(jù)模塊型號調(diào)用了對應的撥號腳本,連接成功后,檢測線程打印出connected,說明連接已經(jīng)成功。為了測試效果我們通過終端關閉撥號連接,模擬斷線的情況,來測試是否能夠?qū)崿F(xiàn)自動重連:


    Linux主板4G通訊斷線重連的自動管理.png

    斷開模塊


      從打印信息可以看到,在我們通過終端關閉撥號連接后,檢測程序打印的信息提示disconnect,說明此時撥號連接已經(jīng)斷開。pppconnt_check()函數(shù)檢測到連接斷開但是硬件正常,于是返回-1,根據(jù)測試代碼,就會打印disconnect信息。接下來我們查看撥號管理線程是否會自動重連,打印信息如下:


    Linux主板4G通訊斷線重連的自動管理.png

    重連過程


      根據(jù)打印信息可以看出,在斷開連接以后,10s左右的時間便重新連接上了,重新連接的過程是在撥號管理線程內(nèi)部進行的,當檢測程序提示了connected,就說明重連成功。


      成功連接后,會生成ppp0網(wǎng)口,可以使用ifconfig命令查看,如果要使用ppp0網(wǎng)絡,采用linux標準的網(wǎng)絡編程就可以了,即創(chuàng)建套接字綁定ppp0,然后進行需要的設置和操作,關于這部分的說明,可以參考我們提供的編程應用手冊以及例程step3_tcpserver、step4_tcpclient。


      如果客戶對撥號管理的功能感興趣,可以和英創(chuàng)工程師聯(lián)系,索取相關例程代碼。

    文章標簽:C/C++Eclipse4G
    国产精品国产三级国产AⅤ| 精品免费人成视频app| 精品国产高清自在线一区二区三区| 国产99视频精品免视看9| 精品极品三级久久久久| 老汉精品免费AV在线播放| 亚洲精品99久久久久中文字幕| 69SEX久久精品国产麻豆| 久久精品人人爽人人爽快| 日本免费精品一区二区三区| 国产精品69白浆在线观看免费| 亚洲国产精品一区二区成人片国内| 午夜精品久久久久蜜桃| 人人妻人人澡人人爽人人精品浪潮| 久久精品九九热无码免贵| 久久国产精品无码网站| 国内精品福利在线视频| 91午夜精品亚洲一区二区三区| 日本一区精品久久久久影院| 亚洲精品一级无码鲁丝片| 精品久久久无码中字| 九九精品久久久久久噜噜| 久久国产精品无码一区二区三区| 中国精品18videosex性中国| 亚洲国产主播精品极品网红| 精品久久久久亚洲| 精品视频一区二区三区四区| 97久久精品国产成人影院| 国产精品拍天天在线| 日本无码小泬粉嫩精品图| 国产精品亚洲高清一区二区 | 亚洲麻豆精品果冻传媒| 亚洲精品二区国产综合野狼| 精品久久久久久无码免费| 久青草中文字幕精品视频| 国产精品天干天干| 在线观看91精品国产不卡免费| 日韩精品成人无码专区免费 | 四虎精品影库4HUTV四虎| 精品国产系列在线观看| 国产精品国产三级国产AV麻豆|