Android板上檢測4G模塊


Android版本:4.4.4
Linux內核版本:3.0.6

 

  近來工作上有個需求:在網絡不可用的時候,重啟4G模塊。這個功能可以理解為斷網自動重連

  開機過程中,4G模塊轉出為ttyUSB0~ttyUSB5等虛擬串口,串口數不定。可通過 cat  /proc/kmsg 命令,查看內核打印信息

root@rk3188:/ # cat /proc/kmsg 
...
...
...
...
<6>[ 8.882529] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB0 <6>[ 8.882904] option 2-1.4:1.1: GSM modem (1-port) converter detected <6>[ 8.883192] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB1 <6>[ 8.883577] option 2-1.4:1.2: GSM modem (1-port) converter detected <6>[ 8.883845] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB2 <6>[ 8.884276] option 2-1.4:1.3: GSM modem (1-port) converter detected <6>[ 8.885092] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB3 <6>[ 8.885784] option 2-1.4:1.4: GSM modem (1-port) converter detected <6>[ 8.887226] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB4 <4>[ 9.821694] ==> rtl8188e_iol_efuse_patch <6>[ 10.181269] ADDRCONF(NETDEV_UP): wlan0: link is not ready

  虛擬串口的數目不定,但可以確定,4G模塊初始化必會轉出ttyUSB0串口。只需檢查ttyUSB0的存在,就可以判斷4G模塊是否初始化。

filter = new IntentFilter();
filter.addAction(Intent.ACTION_BOOT_COMPLETED);//監聽開機廣播

mContext.registerReceiver(
    new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          File serial_4g = new File("/dev/ttyUSB0");//判斷4G模塊是否存在
          if( serial_4g.exists() ){//若初始化了,則開啟檢測網絡的線程
              mRestartHandler.postDelayed(mRunnable, 3000);
          }   
        }    
    },   
        filter
        );  

  在檢測不到網絡的情況下,重啟4G模塊。需要注意的是,gpio 在 /sys/class/ 目錄下。/sys/ 不太確定,但可以確定,/sys/class/ 下的文件是驅動代碼導出來的。所以,對gpio的復位置位,不能簡單地用java里的文件操作函數來實現,需要用到JNI。JNI,Java Native Interface,是聯系上層java代碼和底層C/C++代碼的接口。

private Runnable  mRunnable = new Runnable() {
    @Override
    public void run() {
        loge("XYP_DEBUG ====================I will check network====================");
        NetworkInfo mNetworkInfo = getActiveNetworkInfo();
        if(mNetworkInfo != null && mNetworkInfo.isAvailable())
        {
          loge("XYP_DEBUG ======== net is available ========type = " + mNetworkInfo.getType() + " ==== typeName = " + mNetworkInfo.getTypeName() + " ====");
          BrokenNetRestartCount = 0;
        }
        else
        {//網絡不可用,對4G模塊的reset復位后置位

          try{
              Gpio.SetGpioOutputLow("gpio_3g_reset");//調用了JNI方法
              Thread.currentThread();
              Thread.sleep(500);//休眠一段時間,保證復位完成
              Gpio.SetGpioOutputHigh("gpio_3g_reset");
          }catch(InterruptedException e){
              Log.e( "InterruptedException",e.getMessage() );
          }
        }
        //網絡可能不穩定,每隔60S檢查一下網絡
        mRestartHandler.postDelayed(mRunnable, 1000 * 60);
    }
};

  我用板子測的,確保它必定沒連上網,以此檢測4G模塊是否重啟。

  還是用 cat  /proc/kmsg 命令查看內核打印信息,也可以用dmesg命令,但 cat  /proc/kmsg 才能實時打印。4G模塊隔一段時間重啟,cmd窗口也就隔段時間會輸出ttyUSB0等虛擬串口的信息。這說明4G模塊重啟的功能已實現。

root@rk3188:/ # cat /proc/kmsg 
...
...
...
...
<6>[   13.999017] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB0 <6>[   13.999340] option 2-1.4:1.1: GSM modem (1-port) converter detected
<6>[   13.999616] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB1
<6>[   13.999951] option 2-1.4:1.2: GSM modem (1-port) converter detected
<6>[   14.000188] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB2
<6>[   14.000474] option 2-1.4:1.3: GSM modem (1-port) converter detected
<6>[   14.000694] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB3
<6>[   14.001012] option 2-1.4:1.4: GSM modem (1-port) converter detected
<6>[   14.001268] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB4
<6>[   17.206536] DWC_OTG: ********vbus detect*********************************************
<6>[   17.408847] DWC_OTG: ********soft connect!!!*****************************************
<6>[   17.414856] DWC_OTG: USB SUSPEND
<6>[   17.521191] DWC_OTG: USB RESET
<6>[   17.561161] android_work: sent uevent USB_STATE=CONNECTED
<6>[   17.564801] DWC_OTG: USB RESET
<6>[   17.647356] android_usb gadget: high speed config #1: android
<6>[   17.647405] DWC_OTG: do_gadget_setup warning: pcd->lock locked without unlock
<6>[   17.647509] android_work: sent uevent USB_STATE=CONFIGURED
<6>[   23.544892] warning: `zygote' uses 32-bit capabilities (legacy support in use)
<6>[   30.373765] EXT4-fs (mmcblk0p10): re-mounted. Opts: (null)
<6>[   31.550755] healthd: battery l=50 v=0 t=0.0 h=2 st=3 chg=a
<4>[   44.744474] wifi_driver_write: wifi driver already rmmod
<4>[   44.762519] enter func vmac_open...
<4>[   44.866590] power on phy
<6>[   45.917707] vmac_mii_bus: probed
<6>[   45.917895] rk29 vmac rk29 vmac.0: PHY driver [Generic PHY] (mii_bus:phy_addr=0:00, irq=-1)
<6>[   45.919116] ADDRCONF(NETDEV_UP): eth0: link is not ready
<6>[   46.093472] acc_open
<6>[   46.093499] acc_release
<6>[   47.916994] PHY: 0:00 - Link is Down
<7>[   48.018648] SELinux: initialized (dev mmcblk0p11, type vfat), uses genfs_contexts
<4>[   48.070390] avc:  denied  { set } for property=sys.vold.hasAsec scontext=u:r:vold:s0 tcontext=u:object_r:system_prop:s0 tclass=property_service
<3>[   48.070460] init: sys_prop: permission denied uid:0  name:sys.vold.hasAsec
<3>[   48.070960] init: no such service 'fuse_internal_sd'
<5>[   50.078679] type=1400 audit(50.060:4): avc:  denied  { getattr } for  pid=885 comm="zygote" path="socket:[5713]" dev=sockfs ino=5713 scontext=u:r:untrust
ed_app:s0 tcontext=u:r:zygote:s0 tclass=unix_stream_socket
<5>[   50.078858] type=1400 audit(50.060:5): avc:  denied  { getopt } for  pid=885 comm="zygote" path="/dev/socket/zygote" scontext=u:r:untrusted_app:s0 tconte
xt=u:r:zygote:s0 tclass=unix_stream_socket
<3>[   51.133715] init: sys_prop: permission denied uid:1003  name:service.bootanim.exit
<6>[   52.473320] alarm_set_rtc: no RTC, time will be lost on reboot
<6>[   55.328510] usb 2-1.4: USB disconnect, device number 5
<6>[   55.328967] option1 ttyUSB0: GSM modem (1-port) converter now disconnected from ttyUSB0
<6>[   55.329094] option 2-1.4:1.0: device disconnected
<3>[   55.329312] option: option_instat_callback : error -2
<6>[   55.329602] option1 ttyUSB1: GSM modem (1-port) converter now disconnected from ttyUSB1
<6>[   55.329724] option 2-1.4:1.1: device disconnected
<3>[   55.345337] option: option_instat_callback : error -71
<3>[   55.345827] option: option_instat_callback : error -71
<3>[   55.346327] option: option_instat_callback : error -71
<6>[   55.436820] option1 ttyUSB2: GSM modem (1-port) converter now disconnected from ttyUSB2
<6>[   55.436909] option 2-1.4:1.2: device disconnected
<6>[   55.437268] option1 ttyUSB3: GSM modem (1-port) converter now disconnected from ttyUSB3
<6>[   55.437363] option 2-1.4:1.3: device disconnected
<6>[   55.437660] option1 ttyUSB4: GSM modem (1-port) converter now disconnected from ttyUSB4
<6>[   55.437740] option 2-1.4:1.4: device disconnected
<6>[   63.496831] usb 2-1.4: new high speed USB device number 6 using usb20_host
<6>[   63.612508] usb 2-1.4: New USB device found, idVendor=1c9e, idProduct=9b3c
<6>[   63.612537] usb 2-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
<6>[   63.612572] usb 2-1.4: Product: USB Modem
<6>[   63.612590] usb 2-1.4: Manufacturer: LONGSUNG
<6>[   63.658409] option 2-1.4:1.0: GSM modem (1-port) converter detected
<6>[   63.659242] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB0 <6>[   63.660367] option 2-1.4:1.1: GSM modem (1-port) converter detected
<6>[   63.661184] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB1
<6>[   63.662499] option 2-1.4:1.2: GSM modem (1-port) converter detected
<6>[   63.663283] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB2
<6>[   63.664638] option 2-1.4:1.3: GSM modem (1-port) converter detected
<6>[   63.665446] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB3
<6>[   63.667054] option 2-1.4:1.4: GSM modem (1-port) converter detected
<6>[   63.669260] usb 2-1.4: GSM modem (1-port) converter now attached to ttyUSB4
<6>[   69.245090] healthd: battery l=50 v=0 t=0.0 h=2 st=3 chg=a

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM