Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
159 views
in Technique[技术] by (71.8m points)

"Tunnel Failed" exception in BlackBerry Curve 8520

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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 /* Coverage

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...