`
xusaomaiss
  • 浏览: 615580 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

一个网络apn的自动检测框架

阅读更多

先说一下思路,程序启动的时候先启动一个检测apn的类CheckApnForm,CheckApnForm可以做出动画或者简单的字样提示例如“检测网 络中请稍等。。。”,同时启动两个线程job,一个通过设置代理去连接服务器,一个直连服务器,将CheckApnForm的引用传给两个线程,当线程检 测成功或者失败,都要返回结果给CheckApnForm,然后通过最终的状态判断手机的网络设置时cmwap还是cmnet,然后程序中再需要连接网络 的地方就都要根据当前网络状态,选择是否设置代理。以下是代码:

(备注:可能高手看来不算什么,但是这个框架我在工作中一直都用到,而且非常好用,觉得原创,首次发布到dev.chinamobile.com,如果转 载希望可以表明出处和作者,如果工作中用到了就无所谓了,随便用)
public interface CheckAPN {
    public final int ERROR=0;
    public final int CMWAP=1;
    public final int CMNET=2;
    public final int CMWAP_ERROR=3;
    public final int CMNET_ERROR=4;
    public final int CMWAP_SUCCESS=5;
    public final int CMNET_SUCCESS=6;
    public void getAPN(int apn);
}

public class CheckApnForm implements CheckAPN{
    private MIDlet midlet;
    private Form f = null;
    private Form nextForm = null;   
    public static int status=ERROR;
    private int threadCount=0;
    private String content="";
    private Label label;
    private boolean hasChecked=false;
   
    public CheckApnForm(MIDlet midlet){
        this.midlet=midlet;               
        f = new Form();
        f.setTitle("检测网络状态");
        f.setLayout(new BorderLayout());               
        label=new Label("正在检测网络类型......");
        f.addComponent(BorderLayout.CENTER,label);
        f.show();
        f.repaint();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        Thread t1=new CheckNetTread("t1",this,CMWAP);
        Thread t2=new CheckNetTread("t2",this,CMNET);
        t1.start();
        t2.start();
    }

    public synchronized void getAPN(int apn) {
        threadCount++;
        if(apn>=5&&status<5){
            status=apn;
        }           
        if(!hasChecked){
            //System.out.println(status);
            if(status>=5){               
                hasChecked=true;               
                //Dialog.show("网络检测", ""+status, "确定", null);
                System.gc();
                LoginForm mainForm=new LoginForm(midlet);
                nextForm=mainForm.getForm();
                nextForm.show();               
                f.repaint();
                return;               
            }else{
                if(threadCount>=2){
                    label.setText("请退出,查看系统的网络连接配置");
                    content+="检测网络连接都失败!\r\n请检查系统网络连接配置\r\n";
                    Dialog.show("网络检测", content, "确定", null);
                    f.addCommand(new Command("退出",1));
                    f.addCommandListener(new ActionListener(){
                        public void actionPerformed(ActionEvent event) {
                            if(event.getCommand().getId()==1)
                                midlet.notifyDestroyed();
                        }
                    });
                }
            }
        }
        f.repaint();
    }

    public void msg(String msg) {
        label.setText(msg);
    }
}

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.http;

import com.gui.CheckAPN;
import java.io.DataInputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

/**
*
* @author Administrator
*/
public class CheckNetTread extends Thread{
    private int apn;
    private CheckAPN apnForm;
    public CheckNetTread(String name,CheckAPN apnForm,int apn){
        super(name);
        this.apnForm=apnForm;
        this.apn=apn;
    }

    public void run(){
        HttpConnection conn = null;
        try {
            //System.out.println(this.getName()+" begin open url");
            if(apn==CheckAPN.CMWAP){
                conn = (HttpConnection) Connector.open("http://10.0.0.172/",Connector.READ_WRITE,true);
                conn.setRequestProperty("x-online-host", "wap.baidu.com");
            }else if(apn==CheckAPN.CMNET){
                conn = (HttpConnection) Connector.open("http://www.baidu.com/",Connector.READ_WRITE,true);
            }
            DataInputStream dis=conn.openDataInputStream();            
            //System.out.println(this.getName()+" open url over");
        } catch (IOException ex) {
            //System.out.println(this.getName()+" IOException,return");
            if(apn==CheckAPN.CMWAP)
                apnForm.getAPN(CheckAPN.CMWAP_ERROR);
            else if(apn==CheckAPN.CMNET)
                apnForm.getAPN(CheckAPN.CMNET_ERROR);
            return;
        }        
        if(apn==CheckAPN.CMWAP)
            apnForm.getAPN(CheckAPN.CMWAP_SUCCESS);
        else if(apn==CheckAPN.CMNET)
            apnForm.getAPN(CheckAPN.CMNET_SUCCESS);        
    }
}

分享到:
评论

相关推荐

    Laravel开发-laravel-apn-push

    1. **Apple Push Notification Service (APN)**: 这是苹果提供的一个后台服务,允许应用开发者将通知发送到已安装其应用的苹果设备上,即使应用没有运行也能收到通知。APN分为生产环境和开发环境,需要分别获取不同...

    AT_Test_stm32at_AT指令框架_stm32at_at_AT指令框架

    AT指令框架是嵌入式系统,尤其是微控制器(如STM32)与通信模块交互的一种标准方式。在STM32AT项目中,这种框架被设计用于简化STM32微控制器与各种通信模块(如GSM/GPRS、Wi-Fi或蓝牙模块)之间的通信。通过AT指令,...

    装置测试程序涉及拨号调用及配置文件使用

    为了完成这些测试,DKTest很可能是一个综合性的测试工具或框架。它可能提供了一套接口和功能,帮助测试工程师模拟拨号过程,检查网络连接,验证数据传输,并管理配置文件。DKTest可能还包含了自动化测试脚本,以提高...

    GPRS.rar_GPRS C_GPRS CSharp_GPRS SERVER CSharp_GPRS evc

    - **网络连接管理**:客户端需要能够自动检测网络状态,重新连接或恢复连接在丢失后。 - **错误处理和重试机制**:考虑到无线通信的不稳定性,客户端需要有良好的错误处理机制和重试策略。 以上就是关于GPRS通信...

    windowsmobile系统gprs联网开发

    在Windows Mobile系统中进行GPRS联网开发是一项关键的技术任务,特别是在物联网、远程监控...通过`ConnectManager`类的实现,我们可以构建一个完整的GPRS联网框架,以满足移动设备在2G/2.5G网络环境下的数据通信需求。

    4G上网模块ME3760的Linux驱动

    3. **设置网络接口**:一旦驱动加载成功,Linux会创建一个新的网络接口,如`wwan0`。使用`ifconfig`或`ip link`命令查看和配置网络接口。 4. **激活网络连接**:使用`nmcli`或`wvdial`等工具,根据运营商的APN设置...

    Laravel开发-laravel-push-notification

    例如,可以创建一个模型事件监听器,当数据发生变化时自动发送通知。门面提供了简单的API,如`send()`方法,用于指定设备标识、通知标题和正文。 4. **处理设备令牌**: 在用户首次打开应用或重新安装应用时,应用会...

    longsung_cm.rar

    2. 设备识别:模块插入后,Linux会将其识别为一个USB设备。通过`lsusb`命令可以查看到设备信息,确认模块已被正确识别。 3. PPP配置:使用`pppd`工具创建PPP连接。配置文件中需要设定网络参数,如APN(接入点名称)...

    GPRS开发包源代码

    在"**www.pudn.com.txt**"和"**GPRS开发包**"这两个文件中,"www.pudn.com.txt"可能是一个链接或说明文档,指向更多关于GPRS开发的资源。而"**GPRS开发包**"很可能是包含源代码、头文件、示例程序和其他辅助文件的...

    PushNotifications::dragon:一个macOS,Linux,Windows应用程序,用于在iOS和Android上测试推送通知

    "PushNotifications::dragon:一个macOS,Linux,Windows应用程序,用于在iOS和Android上测试推送通知" 这个标题表明我们讨论的是一个名为"PushNotifications"的应用程序,它是一个跨平台的工具,支持macOS、Linux...

    3C Toolbox Pro 1.9.9.7.6C.apk

    又名“Android Tuner Pro” 最全面的工具箱,可以节省电池,调整,调整,备份,保护和监控运行任何ROM,任何内核(从Android ...* 2需要root和Xposed框架 警告:对移动设备进行生根和刷根可能会影响其性能或导致故障。

    android 3g数据上网卡原理说明

    PPPD(Point-to-Point Protocol Daemon)是一个实现PPP协议的守护进程,用于在客户端与网络服务器之间建立点对点连接。在Android系统中,一旦通过串口成功连接Modem,用户就可以通过PPPD建立PPP会话,从而实现互联网...

    调试成功文件java短信猫调试成功文件.

    【标题】:“调试成功文件java短信猫调试成功文件”揭示了一个关键的信息,即这个压缩包包含的是一些关于Java编程语言在调试短信猫设备过程中的成功案例或解决方案。短信猫通常指的是通过SIM卡接口实现短信收发功能...

Global site tag (gtag.js) - Google Analytics