Get suffix string for BlackBerry connection on 4.6

2019-01-27 08:50发布

问题:

I'm trying to develop an application which uses HttpRequest for requesting a web page. The problem is that I still can't find the right way to get the suffix in the connection string for OS 4.6.1.

Thanks.

回答1:

Also, if you're in a time crunch, and don't have time to read the resources I listed in my other answer, and just want some quick code, I remember there was an implementation in BlackBerry's original Facebook SDK that looked close to what I wrote myself (sorry, I can't post that code I wrote, because it's my client's). But, the Facebook SDK implementation appears to be free to publish. I can't find a link to it anymore, but I'll paste it below for your enjoyment:

/**
 * 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.
 * 
 */
package com.blackberry.util.network;

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

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

import com.blackberry.util.log.Logger;

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 static String getProfile() {
      StringBuffer sb = new StringBuffer();
      sb.append("http://www.blackberry.net/go/mobile/profiles/uaprof/");
      sb.append(DeviceInfo.getDeviceName());
      sb.append("/");
      sb.append(DeviceInfo.getSoftwareVersion().substring(0, 3)); //RDF file format is 4.5.0.rdf (does not include build version)
      sb.append(".rdf");

      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) {

      if ((pURL.length() > 5) && pURL.startsWith("cod://")) {
         return new LocalHttpConnection(pURL);
      }

      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]);
      }

      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());
         } finally {
            break;
         }
      case TRANSPORT_WIFI:
         try {
            con = getWifiConnection(pURL);
         } catch (IOException e) {
            log.debug(e.getMessage());
         } finally {
            break;
         }
      case TRANSPORT_BES:
         try {
            con = getBesConnection(pURL);
         } catch (IOException e) {
            log.debug(e.getMessage());
         } finally {
            break;
         }
      case TRANSPORT_BIS:
         try {
            con = getBisConnection(pURL);
         } catch (IOException e) {
            log.debug(e.getMessage());
         } finally {
            break;
         }
      case TRANSPORT_DIRECT_TCP:
         try {
            con = getTcpConnection(pURL);
         } catch (IOException e) {
         } finally {
            break;
         }
      case TRANSPORT_WAP2:
         try {
            con = getWap2Connection(pURL);
         } catch (IOException e) {
            log.debug(e.getMessage());
         } finally {
            break;
         }
      }

      log.debug("con = " + con);

      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);
      }
      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;
   }

}


回答2:

The links I believe I used to create my connection strings, pre OS 5.0, were these two:

http://supportforums.blackberry.com/t5/Java-Development/Different-ways-to-make-an-HTTP-or-socket-connection/ta-p/445879

http://docs.blackberry.com/en/developers/deliverables/34480/Network_transport_options_1293321_11.jsp

BlackBerry of course supports several different transports (Wifi, WAP, BIS, etc.). You probably want to decide which transport you would like to use, and create your connection string depending on which transports are available at any one time, and on your priority.

Here's some more sample code to download from blackberry.com that helps build connection string suffixes. See the attachment links near the bottom for the actual downloads.