“Tunnel Failed” exception in BlackBerry Curve 8520

▼魔方 西西 提交于 2019-11-26 09:49:53

问题


Phone model:bb curve 8520

Phone version:4.6.1.314

Carrier :airtel india

APN :airtelgprs.com

No username and password

I am using the following code:

  String url=\"http://<address>:<port>/path;deviceside=true\";
  HttpConnection conn =(HttpConnection)Connector.open(url,Connector.READ_WRITE,true);
  int response=conn.getResponseode();
   if(responsecode==HttpConnection.HTTP_OK)
   {
          //...code for handling the response...
   }

This code is throwing a \"tunnel failed \" exception. I am unable to understand the reason behind it. The APN is properly defined in the phone according to the network carrier. I am able to access internet through the browser also.

Please reply me if you know the reason for the tunnel failure or critical tunnel failure.

One more thing, the code is working fine when I append interface=wifi in the place of deviceside=true (this requires WIFI to be on and connected ).

[EDIT]

I checked the log in the BlackBerry Curve 8520 mobile and it looks like this:

 E net.rim.tcp-TNLf 0 
 a net.rim.tunnel-pdp2 1 
 a net.rim.hrtRT-EPRj 0x2100000001
 a net.rim.tunnel - STnc-00000000
 a net.rim.tunnel- Open - airtelgprs.com
 a net.rim.tcp-open 

Can any one guess whats wrong after seeing the log?


回答1:


common problem and also answered many times

DeviceInfo.isSimulator() then extension is ";deviceside=true"

and

BisConnection then extension is ";deviceside=false;ConnectionType=mds-public"

and

BesConnection then extension is ";deviceside=false"

and

WifiConnection then extension is ";interface=wifi"

in this way specific extensions or available so this is not a good way to using extensions we have to classes 1)HttpConnectionFactory 2)HttpConnectionFactoryException

just import those classes into our project. HttpConnectionFactory class have to chose extension according to order by preference 1)class one is define different connection types

  /**
 * Copyright (c) E.Y. Baskoro, Research In Motion Limited.
 * 
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without 
 * restriction, including without limitation the rights to use, 
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the 
 * Software is furnished to do so, subject to the following 
 * conditions:
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
 * OTHER DEALINGS IN THE SOFTWARE.
 * 
 * This License shall be included in all copies or substantial 
 * portions of the Software.
 * 
 * The name(s) of the above copyright holders shall not be used 
 * in advertising or otherwise to promote the sale, use or other 
 * dealings in this Software without prior written authorization.
 * 
 */


import java.io.IOException;
import java.io.OutputStream;
import java.util.Vector;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

import net.rim.device.api.io.http.HttpHeaders;
import net.rim.device.api.io.http.HttpProtocolConstants;
import net.rim.device.api.servicebook.ServiceBook;
import net.rim.device.api.servicebook.ServiceRecord;
import net.rim.device.api.system.Branding;
import net.rim.device.api.system.CoverageInfo;
import net.rim.device.api.system.DeviceInfo;
import net.rim.device.api.system.WLANInfo;



public class HttpConnectionFactory {

    public static final int TRANSPORT_WIFI = 1;
    public static final int TRANSPORT_BES = 2;
    public static final int TRANSPORT_BIS = 4;
    public static final int TRANSPORT_DIRECT_TCP = 8;
    public static final int TRANSPORT_WAP2 = 16;
    public static final int TRANSPORT_SIM = 32;

    public static final int TRANSPORTS_ANY = TRANSPORT_WIFI | TRANSPORT_BES | TRANSPORT_BIS | TRANSPORT_DIRECT_TCP | TRANSPORT_WAP2 | TRANSPORT_SIM;
    public static final int TRANSPORTS_AVOID_CARRIER = TRANSPORT_WIFI | TRANSPORT_BES | TRANSPORT_BIS | TRANSPORT_SIM;
    public static final int TRANSPORTS_CARRIER_ONLY = TRANSPORT_DIRECT_TCP | TRANSPORT_WAP2 | TRANSPORT_SIM;

    public static final int DEFAULT_TRANSPORT_ORDER[] = { TRANSPORT_SIM, TRANSPORT_WIFI, TRANSPORT_BIS, TRANSPORT_BES, TRANSPORT_WAP2, TRANSPORT_DIRECT_TCP };

    private static final int TRANSPORT_COUNT = DEFAULT_TRANSPORT_ORDER.length;

    // private static ServiceRecord srMDS[], srBIS[], srWAP2[], srWiFi[];
    private static ServiceRecord srWAP2[];
    private static boolean serviceRecordsLoaded = false;

    private int transports[];
    private int lastTransport = -1;

//  protected Logger log = Logger.getLogger(getClass());

    public HttpConnectionFactory() {
        this(0);
    }

    public HttpConnectionFactory(int allowedTransports) {
        this(transportMaskToArray(allowedTransports));
    }

    public HttpConnectionFactory(int transportPriority[]) {
        if (!serviceRecordsLoaded) {
            loadServiceBooks(false);
        }
        transports = transportPriority;
    }

    public static String getUserAgent() {
        StringBuffer sb = new StringBuffer();
        sb.append("BlackBerry");
        sb.append(DeviceInfo.getDeviceName());
        sb.append("/");
        sb.append(DeviceInfo.getSoftwareVersion());
        sb.append(" Profile/");
        sb.append(System.getProperty("microedition.profiles"));
        sb.append(" Configuration/");
        sb.append(System.getProperty("microedition.configuration"));
        sb.append(" VendorID/");
        sb.append(Branding.getVendorId());

        return sb.toString();
    }



    public HttpConnection getHttpConnection(String pURL) {
        return getHttpConnection(pURL, null, null);
    }

    public HttpConnection getHttpConnection(String pURL, HttpHeaders headers) {
        return getHttpConnection(pURL, headers, null);
    }

    public HttpConnection getHttpConnection(String pURL, byte[] data) {
        return getHttpConnection(pURL, null, data);
    }

    public HttpConnection getHttpConnection(String pURL, HttpHeaders headers, byte[] data) {

        int curIndex = 0;
        HttpConnection con = null;

        while ((con = tryHttpConnection(pURL, curIndex, headers, data)) == null) {
            try {
                curIndex = nextTransport(curIndex);
            } catch (HttpConnectionFactoryException e) {
                e.printStackTrace();
                break;
            } finally {
            }
        }

        if (con != null) {
            setLastTransport(transports[curIndex]);
        }
//      try {
//          System.out.println(con.getResponseCode());
//      } catch (IOException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }
        return con;
    }

    private int nextTransport(int curIndex) throws HttpConnectionFactoryException {
        if ((curIndex >= 0) && (curIndex < transports.length - 1)) {
            return curIndex + 1;
        } else {
            throw new HttpConnectionFactoryException("No more transport available.");
        }
    }

    private HttpConnection tryHttpConnection(String pURL, int tIndex, HttpHeaders headers, byte[] data) {

        HttpConnection con = null;
        OutputStream os = null;

//      log.debug("Trying " + getTransportName(transports[tIndex]) + "... ");
        switch (transports[tIndex])
        {
        case TRANSPORT_SIM:
            try {
                con = getSimConnection(pURL, false);                            
            } catch (IOException e) {
//              log.debug(e.getMessage());
//              break;
            } finally {
                break;
            }
        case TRANSPORT_WIFI:
            try {
                System.out.println(transports[tIndex]);
                con = getWifiConnection(pURL);
            } catch (IOException e) {
//              log.debug(e.getMessage());
//              break;
            } finally {
                break;
            }
        case TRANSPORT_BES:
            try {
                con = getBesConnection(pURL);
            } catch (IOException e) {
//              log.debug(e.getMessage());
//              break;
            } finally {
                break;
            }
        case TRANSPORT_BIS:
            try {
                con = getBisConnection(pURL);
            } catch (IOException e) {
//              log.debug(e.getMessage());
//              break;
            } finally {
                break;
            }
        case TRANSPORT_DIRECT_TCP:
            try {
                con = getTcpConnection(pURL);
            } catch (IOException e) {
//              break;
            } finally {
                break;
            }
        case TRANSPORT_WAP2:
            try {
                con = getWap2Connection(pURL);
            } catch (IOException e) {
//              log.debug(e.getMessage());
//              break;
            } finally {
                break;
            }
        }
        if (con != null) {
            try {
//              log.debug("url = " + con.getURL());
                //add headers to connection
                if (headers != null) {
                    int size = headers.size();

                    for (int i = 0; i < size;) {
                        String header = headers.getPropertyKey(i);
                        String value = headers.getPropertyValue(i++);

                        if (value != null) {
                            con.setRequestProperty(header, value);

                        }
                    }
                }
                // post data
                if (data != null) {
                    con.setRequestMethod(HttpConnection.POST);
                    con.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_TYPE, HttpProtocolConstants.CONTENT_TYPE_APPLICATION_X_WWW_FORM_URLENCODED);
                    con.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(data.length));

                    os = con.openOutputStream();
                    os.write(data);
                } else {
                    con.setRequestMethod(HttpConnection.GET);
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return con;
    }

    public int getLastTransport() {
        return lastTransport;
    }

    public String getLastTransportName() {
        return getTransportName(getLastTransport());
    }

    private void setLastTransport(int pLastTransport) {
        lastTransport = pLastTransport;
    }

    private HttpConnection getSimConnection(String pURL, boolean mdsSimulatorRunning) throws IOException {
        if (DeviceInfo.isSimulator()) {
            if (mdsSimulatorRunning) {
                return getConnection(pURL, ";deviceside=false", null);

            } else {
                return getConnection(pURL, ";deviceside=true", null);
            }
        }
        return null;
    }

    private HttpConnection getBisConnection(String pURL) throws IOException {
        if (CoverageInfo.isCoverageSufficient(4 /* CoverageInfo.COVERAGE_BIS_B */)) {
            return getConnection(pURL, ";deviceside=false;ConnectionType=mds-public", null);
        }
        return null;
    }

    private HttpConnection getBesConnection(String pURL) throws IOException {
        if (CoverageInfo.isCoverageSufficient(2 /* CoverageInfo.COVERAGE_MDS */)) {
            return getConnection(pURL, ";deviceside=false", null);
        }
        return null;
    }

    private HttpConnection getWifiConnection(String pURL) throws IOException {
        if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) {

            return getConnection(pURL, ";interface=wifi", null);

        }
        return null;
    }

    private HttpConnection getWap2Connection(String pURL) throws IOException {
        if (CoverageInfo.isCoverageSufficient(1 /* CoverageInfo.COVERAGE_DIRECT */) && (srWAP2 != null) && (srWAP2.length != 0)) {
            return getConnection(pURL, ";deviceside=true;ConnectionUID=", srWAP2[0].getUid());
        }
        return null;
    }

    private HttpConnection getTcpConnection(String pURL) throws IOException {
        if (CoverageInfo.isCoverageSufficient(1 /* CoverageInfo.COVERAGE_DIRECT */)) {
            return getConnection(pURL, ";deviceside=true", null);
        }
        return null;
    }

    private HttpConnection getConnection(String pURL, String transportExtras1, String transportExtras2) throws IOException {
        StringBuffer fullUrl = new StringBuffer();
        fullUrl.append(pURL);
        if (transportExtras1 != null) {
            fullUrl.append(transportExtras1);
//          LoadingScreen.tag=transportExtras1;
        }
        if (transportExtras2 != null) {
            fullUrl.append(transportExtras2);
        }
        return (HttpConnection) Connector.open(fullUrl.toString());
    }

    public static void reloadServiceBooks() {
        loadServiceBooks(true);
    }

    private static synchronized void loadServiceBooks(boolean reload) {
        if (serviceRecordsLoaded && !reload) {
            return;
        }
        ServiceBook sb = ServiceBook.getSB();
        ServiceRecord[] records = sb.getRecords();
        Vector mdsVec = new Vector();
        Vector bisVec = new Vector();
        Vector wap2Vec = new Vector();
        Vector wifiVec = new Vector();

        if (!serviceRecordsLoaded) {
            for (int i = 0; i < records.length; i++) {
                ServiceRecord myRecord = records[i];
                String cid, uid;

                if (myRecord.isValid() && !myRecord.isDisabled()) {
                    cid = myRecord.getCid().toLowerCase();
                    uid = myRecord.getUid().toLowerCase();
                    if ((cid.indexOf("wptcp") != -1) && (uid.indexOf("wap2") != -1) && (uid.indexOf("wifi") == -1) && (uid.indexOf("mms") == -1)) {
                        wap2Vec.addElement(myRecord);
                    }
                }
            }

            srWAP2 = new ServiceRecord[wap2Vec.size()];
            wap2Vec.copyInto(srWAP2);
            wap2Vec.removeAllElements();
            wap2Vec = null;

            serviceRecordsLoaded = true;
        }
    }

    public static int[] transportMaskToArray(int mask) {
        if (mask == 0) {
            mask = TRANSPORTS_ANY;
        }
        int numTransports = 0;
        for (int i = 0; i < TRANSPORT_COUNT; i++) {
            if ((DEFAULT_TRANSPORT_ORDER[i] & mask) != 0) {
                numTransports++;
            }
        }
        int transports[] = new int[numTransports];
        int index = 0;
        for (int i = 0; i < TRANSPORT_COUNT; i++) {
            if ((DEFAULT_TRANSPORT_ORDER[i] & mask) != 0) {
                transports[index++] = DEFAULT_TRANSPORT_ORDER[i];
            }
        }
        return transports;
    }

    private static String getTransportName(int transport) {
        String tName;
        switch (transport) {
        case TRANSPORT_WIFI:
            tName = "WIFI";
            break;
        case TRANSPORT_BES:
            tName = "BES";
            break;
        case TRANSPORT_BIS:
            tName = "BIS";
            break;
        case TRANSPORT_DIRECT_TCP:
            tName = "TCP";
            break;
        case TRANSPORT_WAP2:
            tName = "WAP2";
            break;
        case TRANSPORT_SIM:
            tName = "SIM";
            break;
        default:
            tName = "UNKNOWN";
            break;
        }
        return tName;
    }

}

second class is

/**
 * Copyright (c) E.Y. Baskoro, Research In Motion Limited.
 * 
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without 
 * restriction, including without limitation the rights to use, 
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the 
 * Software is furnished to do so, subject to the following 
 * conditions:
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
 * OTHER DEALINGS IN THE SOFTWARE.
 * 
 * This License shall be included in all copies or substantial 
 * portions of the Software.
 * 
 * The name(s) of the above copyright holders shall not be used 
 * in advertising or otherwise to promote the sale, use or other 
 * dealings in this Software without prior written authorization.
 * 
 */


public class HttpConnectionFactoryException extends Exception {

    public HttpConnectionFactoryException(String string) {
        super(string);
    }

    public HttpConnectionFactoryException() {
        super();
    }

}

you just use following code to checking your url extension String url="YOur actual url"

HttpConnectionFactory factory = new HttpConnectionFactory(0);
        Httpconnection httpConnection = factory.getHttpConnection(url);
            if(httpConnection.getResponseCode()==HttpConnection.HTTP_OK){
//some of the connection in available
}else{
//no connection available
}


来源:https://stackoverflow.com/questions/8502915/tunnel-failed-exception-in-blackberry-curve-8520

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!