blackberry平台联网策略与实现

BlackBerry的联网(HTTP/SOCKET)方式分为五种:

第一种: BES(Blackberry enterprise Server)

该方式是通过假设企业级Blackberry服务器,来负责客户端与服务器交互,通过使用BES的MDS service来进行网络连接,负责数据的请求与加密等服务。

所以blackberry规范中约定如果使用BES服务,那么url必须要被重写,例如

http://www.myserver.com  原生的地址要重写为 http://www.myserver.com;deviceside=false


第二种:BIS(Blackberry internet Service)

该服务是Blackberry自己的互联网服务,并开放给第三方合作伙伴。比如说中国移动与加拿大的RIM联合合作推出了电子邮件的推送服务,都是由BIS来承载的。

同样,如果您的企业要使用该服务的前提是必须要与RIM公司进行合作,在这里我们称为“入盟”。

使用BIS服务的网络url也需要被重写:

http://www.myservice.com;deviceside=false;connectionUID="本地uid";ConnectionType=mds-public

本地uid需要从servicebook读取,之后会讲解servicebook的原理和解析方式。


第三种:WAP2

如果要连接WAP2.0网关,你需要在连接时指定service record ,以及UID,后面会有代码解读。

网络连接的url被重写为 www.myservice.com;deviceside=true;ConnectionUID="UID"

第四种:WIFI

直接在url后面加入参数 interface=wifi

第五种:DIRECT TCP

需要在url后面跟参数 device=true


好了,说完了这五种连接方式,再说下servicebook,网上不少人叫它傻逼(SB),呵呵,原名“服务预订”,我没有很深刻的理解这个概念,总之我觉得就是联网选择的服务参数表,你选择什么样的网络服务,就需要在servicebook中选择合适的参数,比如说UID。

读取servicebook代码:


/**
	 * 读servicebook
	 */
	public void readServiceBook() {
		ServiceBook sb = ServiceBook.getSB();
		ServiceRecord[] records = sb.getRecords();

		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();
				// BIS
				if (cid.indexOf("ippp") != -1 && uid.indexOf("gpmds") != -1) {
					bisUid = myRecord.getUid();
				}
				// WIFI
				if (cid.indexOf("wptcp") != -1 && uid.indexOf("wifi") != -1) {
					wifiUid = myRecord.getUid();
				}
				// Wap2.0
				if (cid.indexOf("wptcp") != -1 && uid.indexOf("wifi") == -1
						&& uid.indexOf("mms") == -1) {
					wap2Uid = myRecord.getUid();
				}
			}
		}
	}

接下来,讲一下,我在实际项目中的一个需求案例,这里的要求,终端联网策略有两种,一种是自动选择网络连接,一种是手动选择,自动选择就不多说了,就是遇到可用网络就优先尝试连接,直到连接成功位置,手动选择分为四种,BIS WIFI WAP2 DRIECT/TCP,用户可以手动选择4中网络方式进行连接。

那么发一下我的代码,供大家参考:

/**
 * FileName: AccessPoint.java
 * All rights Reserved, Designed By 21winmess
 * Copyright: Copyright(C) 2011-2012 
 * Company 21winmess DaLian LTD.
 * @author: Gordon Bi
 * @version V2.0
 * Createdate: 2012-8-3 下午4:33:09
 *
 * Modification History:
 * Date Author Version Discription
 * -----------------------------------------------------------------------------------
 * 2012-8-3 Qute for BlackBerry
 * Why & What is modified: <修改原因描述>
 */
package org.blz.net;

import org.blz.rms.RmsFacade;
import org.blz.rms.RmsSeed;

import net.rim.device.api.servicebook.ServiceBook;
import net.rim.device.api.servicebook.ServiceRecord;
import net.rim.device.api.system.CoverageInfo;
import net.rim.device.api.system.WLANInfo;

/**
 * @ClassName: AccessPoint
 * @Description:接入点能力
 * @author: GordonBi
 * @date: 2012-8-3 下午4:33:09
 * 
 */
public class APN {

	public static int WIFI = 1;

	public static int BIS = 2;

	public static int WAP = 3;

	public static int DIRECT_TCP = 4;

	public static int AUTO_SELECT = 5;

	public static int currentAPN = -1;// 当前接入点方式

	public static boolean isManualSelectAPN = false;// 是否手动选择APN 默认

	public String bisUid = null;

	public String wifiUid = null;

	public String wap2Uid = null;

	public String currentSocketUrl = "";

	/**
	 * 根据当前APN,重写socket url地址
	 * @param url
	 * @return
	 */
	public String rewriteSocketUrl(String url) {
		switch (currentAPN) {
		case 1:
			currentSocketUrl = getWIFIURL(url);
			break;
		case 2:
			currentSocketUrl = getBISURL(url, bisUid);
			break;
		case 3:
			currentSocketUrl = getWAP2URL(url, wap2Uid);
			break;
		case 4:
			currentSocketUrl = getDirectTCP(url);
			break;
		}
		return currentSocketUrl;
	}

	/**
	 * 手动选择APN联网方式
	 * 
	 * @param conncetionMethod
	 * @return
	 */
	public void manualSelectAPN(int conncetionMethod) {
		switch (conncetionMethod) {
		case 1:
			currentAPN = WIFI;
			break;
		case 2:
			currentAPN = BIS;
			break;
		case 3:
			currentAPN = WAP;
			break;
		case 4:
			currentAPN = DIRECT_TCP;
			break;
		}
		RmsFacade.setBoolean(RmsSeed.IS_MANUAL_SELECT_APN, true);
		RmsFacade.setInt(RmsSeed.APN_SETTING, currentAPN);// 设置当前接入点
		isManualSelectAPN = true;
	}

	/**
	 * 自动检测APN,选择最优联网方式
	 * 
	 * @return
	 */
	public void autoSelectAPN() {
		if (CoverageInfo.isCoverageSufficient(CoverageInfo.COVERAGE_DIRECT)) {
			currentAPN = DIRECT_TCP;
		}
		if (CoverageInfo.isCoverageSufficient(CoverageInfo.COVERAGE_BIS_B)) {
			currentAPN = BIS;
		}
		if (CoverageInfo.isCoverageSufficient(CoverageInfo.COVERAGE_DIRECT)) {
			if (wap2Uid != null && !"".equals(wap2Uid)) {
				currentAPN = WAP;
			}
		}
		if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) {
			currentAPN = WIFI;
		}

		RmsFacade.setInt(RmsSeed.APN_SETTING, currentAPN);// 设置当前接入点
		RmsFacade.setBoolean(RmsSeed.IS_MANUAL_SELECT_APN, false);
		isManualSelectAPN = false;

	}

	/**
	 * 读servicebook
	 */
	public void readServiceBook() {
		ServiceBook sb = ServiceBook.getSB();
		ServiceRecord[] records = sb.getRecords();

		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();
				// BIS
				if (cid.indexOf("ippp") != -1 && uid.indexOf("gpmds") != -1) {
					bisUid = myRecord.getUid();
				}
				// WIFI
				if (cid.indexOf("wptcp") != -1 && uid.indexOf("wifi") != -1) {
					wifiUid = myRecord.getUid();
				}
				// Wap2.0
				if (cid.indexOf("wptcp") != -1 && uid.indexOf("wifi") == -1
						&& uid.indexOf("mms") == -1) {
					wap2Uid = myRecord.getUid();
				}
			}
		}
	}

	// ================build url by different connection
	// method=================//
	public static String getWIFIURL(String url) {
		if (url != null && !"".equals(url)) {
			return url + ";interface=wifi";
		} else {
			return "";
		}
	}

	public static String getBISURL(String url, final String bisUid) {
		if (url != null && !"".equals(url) && bisUid != null
				&& !"".equals(bisUid)) {
			return url + ";deviceside=false;connectionUID=" + bisUid
					+ ";ConnectionType=mds-public";
		} else {
			return "";
		}
	}

	public static String getWAP2URL(String url, final String wap2Uid) {
		if (url != null && !"".equals(url) && wap2Uid != null
				&& !"".equals(wap2Uid)) {
			return url + ";deviceside=true" + ";ConnectionUID=" + wap2Uid;
		} else {
			return "";
		}
	}

	public static String getDirectTCP(String url) {
		if (url != null && !"".equals(url)) {
			return url + ";deviceside=true";
		} else {
			return "";
		}
	}

	// ===============================================================//

	// ======================单例模式===========================//
	private static APN mSingleInstance = null;
	private static Object mSyncObject = new Object();

	public static APN getSingleInstance() {
		synchronized (mSyncObject) {
			if (mSingleInstance == null)
				mSingleInstance = new APN();
		}
		return mSingleInstance;
	}

	private APN() {
		readServiceBook();
		// autoSelectAPN();
	}
	
	public static String getAPNAlice(int apnIndex){
		String apnAlice = "";
		switch (apnIndex) {
		case 1:
			apnAlice = "WIFI";
			break;
		case 2:
			apnAlice = "BIS-B";
			break;
		case 3:
			apnAlice = "WAP";
			break;
		case 4:
			apnAlice = "DRTCP";
			break;
		}
		return apnAlice;
	}
}








你可能感兴趣的:(String,null,url,BlackBerry,平台,WAP)