BlackBerry模拟器可以连接到Web服务,但真正的设备不能

时间:2012-01-13 10:40:38

标签: web-services blackberry ksoap2 blackberry-eclipse-plugin

我正在开发连接到Web服务的BlackBerry应用程序。

当我在模拟器上开发时,我使用BlackBerry MDS进行模拟器,一切都很顺利。我的应用程序(在模拟器上运行)可以完美地连接我的Web服务。请注意,模拟器和Web服务位于不同的PC上。

现在,我的项目已经完成。我尝试将我的应用程序部署到真实设备(BB 8520)。当我在设备上使用该应用程序时,我发现它无法连接到Web服务。我在互联网上做了一项研究,我确信它必须归功于MDS问题。看来我必须在我的Web服务所在的计算机上使用MDS做一些事情,但我仍然找不到明显的答案。

任何人都请帮帮我......

PS。我的Web服务在IIS上发布,在Visual Studio 2010中开发.BlackBerry应用程序在Eclipse中开发,通过ksoap2连接到Web服务。关闭Web服务所在的计算机上的防火墙。使用的连接是WIFI。

4 个答案:

答案 0 :(得分:3)

如果您的设备使用wifi concat ";interface=wifi" String to URL。

答案 1 :(得分:2)

您必须使用HTTPConnetion将所有连接参数添加到您的网址中。创建一个Custom类来检查连接参数..使用下面的Custom Class

public class HttpConnectionImpl 
extends impl.javame.com.twitterapime.io.HttpConnectionImpl {

private static String appendConnectionParameters;

private static String connectionParameters;


private static ServiceRecord getWAP2ServiceRecord() {
    String cid;
    String uid;
    ServiceBook sb = ServiceBook.getSB();
    ServiceRecord[] records = sb.getRecords();
    //
    for (int i = records.length -1; i >= 0; i--) {
        cid = records[i].getCid().toLowerCase();
        uid = records[i].getUid().toLowerCase();
        //
        if (cid.indexOf("wptcp") != -1 
                && uid.indexOf("wifi") == -1 
                && uid.indexOf("mms") == -1) {
            return records[i];
        }
    }
    //
    return null;
}


public static String getConnectionParams() {
    String connParams = "";
    //
    if (connectionParameters != null) {
        connParams = connectionParameters;
    } else {
        if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) {
            connParams = ";interface=wifi"; //Connected to a WiFi access point.
        } else {
            int coverageStatus = CoverageInfo.getCoverageStatus();
            //
            if ((coverageStatus & CoverageInfo.COVERAGE_BIS_B) == CoverageInfo.COVERAGE_BIS_B) {
                connParams = ";deviceside=false;ConnectionType=mds-public";
            } else if ((coverageStatus & CoverageInfo.COVERAGE_DIRECT) == CoverageInfo.COVERAGE_DIRECT) {
                // Have network coverage and a WAP 2.0 service book record
                ServiceRecord record = getWAP2ServiceRecord();
                //
                if (record != null) {
                    connParams = ";deviceside=true;ConnectionUID=" + record.getUid();
                } else {
                    connParams = ";deviceside=true";
                }
            } else if ((coverageStatus & CoverageInfo.COVERAGE_MDS) == CoverageInfo.COVERAGE_MDS) {
                // Have an MDS service book and network coverage
                connParams = ";deviceside=false";
            }
        }
        //
        if (appendConnectionParameters != null) {
            connParams += appendConnectionParameters;
        }
    }
    //
    return connParams;
}


public static void setAppendConnectionParameters(String params) {
    if (params != null && !params.startsWith(";")) {
        params = ";" + params;
    }
    //
    appendConnectionParameters = params;
}


public static void setConnectionParameters(String params) {
    if (params != null && !params.startsWith(";")) {
        params = ";" + params;
    }
    //
    connectionParameters = params;
}


public void open(String url) throws IOException {
    super.open(url + getConnectionParams());
}
}

在整合上面的课程之后,你必须制作一个名为impl.javame.com.twitterapime.io的包,然后添加到下面的课程。

`package impl.javame.com.twitterapime.io; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.microedition.io.Connector; import com.twitterapime.io.HttpConnection;

public class HttpConnectionImpl实现HttpConnection {     private javax.microedition.io.HttpConnection httpConn;

public void open(String url) throws IOException {
    httpConn =
        (javax.microedition.io.HttpConnection)
            Connector.open(url, Connector.READ_WRITE, true);
}

public void close() throws IOException {
    httpConn.close();
}

public int getResponseCode() throws IOException {
    return httpConn.getResponseCode();
}
public InputStream openInputStream() throws IOException {
    return httpConn.openInputStream();
}

public OutputStream openOutputStream() throws IOException {
    return httpConn.openOutputStream();
}
public void setRequestMethod(String method) throws IOException {
    httpConn.setRequestMethod(method);
}
public void setRequestProperty(String key, String value) throws IOException{
    httpConn.setRequestProperty(key, value);
}
public String getRequestProperty(String key) throws IOException {
    return httpConn.getRequestProperty(key);
}
public String getHeaderField(String name) throws IOException {
    return httpConn.getHeaderField(name);       
}

}`

现在你必须整合另外两个类

  1. 的HttpConnection
  2. HttpResponsein com.twitterapime.io包。
  3. `package com.twitterapime.io; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public interface HttpConnection {     public static final String GET =“GET”;

    public static final String POST = "POST";
    
    public static final String HEAD = "HEAD";
    
    public static final int HTTP_OK = 200;
    
    public static final int HTTP_FORBIDDEN = 403;
    
    public static final int HTTP_UNAVAILABLE = 503;
    
    public static final int HTTP_NOT_MODIFIED = 304;
    
    public static final int HTTP_BAD_REQUEST = 400;
    
    public static final int HTTP_UNAUTHORIZED = 401;
    
    public static final int HTTP_NOT_FOUND = 404;
    
    public static final int HTTP_NOT_ACCEPTABLE = 406;
    
    public static final int HTTP_INTERNAL_ERROR = 500;
    
    public static final int HTTP_BAD_GATEWAY  = 502;
    
    public void open(String url) throws IOException;
    
    public void close() throws IOException;
    
    public int getResponseCode() throws IOException;
    
    public InputStream openInputStream() throws IOException;
    
    public OutputStream openOutputStream() throws IOException;
    
    public void setRequestMethod(String method) throws IOException;
    
    public void setRequestProperty(String key, String value) throws IOException;
    
    public String getRequestProperty(String key) throws IOException;
    
    public String getHeaderField(String name) throws IOException;
    

    Bwlow是HttpResponse Class`

    `package com.twitterapime.io;

    import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException;

    public final class HttpResponse {     private int code;

    private String body;
    
    private InputStream stream;
    
    private HttpConnection conn;
    
    HttpResponse(HttpConnection conn) throws IOException {
        this.conn = conn;
        code = conn.getResponseCode();
        stream = conn.openInputStream();
    }
    
    public boolean wasSuccessful() {
        return code >= 200 && code < 400;
    }
    
    public String getBodyContent() throws IOException {
        return body != null ? body : (body = parseBody(stream));
    }
    
    public InputStream getStream() {
        return stream;
    }
    
    public int getCode() {
        return code;
    }
    
    public String getResponseField(String key) throws IOException {
        return conn.getRequestProperty(key);
    }
    
    private String parseBody(InputStream in) throws IOException {
        if (in == null) {
            return null;
        }
        //
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
        byte[] buffer = new byte[1024];
        //
        for (int n; (n = in.read(buffer)) > 0;) {
            out.write(buffer, 0, n);
        }
        //
        try {
            return new String(out.toByteArray(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new IOException(e.getMessage());
        }
    }
    

    }`

    使用以下mathod检查您的连接参数。此方法会自动检查设备连接可用性,并根据您的连接添加连接参数。

    protected HttpConnection getConnection(String url) throws IOException {
        url += HttpConnectionImpl.getConnectionParams();
        //
        return (HttpConnection)Connector.open(url);
    }
    

    以上HttpConnection方法返回带有连接参数的网址..比你可以在你InputStream中使用此连接并打开任何网址和网络服务。

    我希望这能帮到你......

答案 2 :(得分:0)

谢谢大家。我设法通过向URL添加; interface = wifi; deviceside = false来解决此问题。 :d

答案 3 :(得分:0)

我有同样的问题,我解决了这个问题,使用Networkutils获取连接字符串,并将此连接字符串附加到BaseUrl,我的问题得到解决。我认为这也将解决您的问题。而NetworkUtils类如下......

public  String formatURL(String httpBaseURL) {
        initializeTransportAvailability();

        /**
         * Rest of this method simply tries to communicate over different transports
         * that are available. For each transport it will retry 'retries' many times if
         * an attempt fails.
         */
        /** Direct TCP using HTTP */
        if (coverageTCP) {
            System.out.println("Direct TCP (HTTP)");
            return getTCPURL(httpBaseURL);
        }

        if (srMDS != null && coverageMDS) {
            System.out.println("MDS (HTTP)");
            return getMDSURL(httpBaseURL);
        } else {
            if (srMDS == null) {
                System.out.println("No MDS service records found.");
            }
            if (!coverageMDS) {
                System.out.println("MDS coverage is not available");
            }
        }

        if (srUnite != null && coverageUnite) {
            System.out.println("Unite (HTTP)");
            return getUniteURL(httpBaseURL);
        } else {
            if (srUnite == null) {
                System.out.println("No Unite service records found.");
            }
            if (!coverageUnite) {
                System.out.println("Unite coverage is not available");
            }
        }

        if (srBIS != null && coverageBIS) {
            System.out.println("BIS-B (HTTP)");
            return getBISURL(httpBaseURL);
        } else {
            if (srBIS == null) {
                System.out.println("No BIS-B service records found.");
            }
            if (!coverageBIS) {
                System.out.println("BIS-B coverage is not available");
            }
        }

        getWAPURL(httpBaseURL);
        if (srWAP != null && !wapParametersUnavailable && coverageWAP) {
            System.out.println("WAP (HTTP)");
            return getWAPURL(httpBaseURL);
        } else {
            if (srWAP == null) {
                System.out.println("No WAP service records found.");
            }
            if (!coverageWAP) {
                System.out.println("WAP coverage is not available");
            }
            if (wapParametersUnavailable) {
                System.out.println("Please provide WAP parameters");
            }
        }

        if (srWAP2 != null && coverageWAP2) {
            System.out.println("WAP2 (HTTP)");
            return getWAP2URL(httpBaseURL);
        } else {
            if (srWAP2 == null) {
                System.out.println("No WAP2 service records found.");
            }
            if (!coverageWAP2) {
                System.out.println("WAP2 coverage is not available");
            }
        }

        if (srWiFi != null && coverageWiFi) {
            System.out.println("WiFi (HTTP)");
            return getWiFiURL(httpBaseURL);
        } else {
            if (srWiFi == null) {
                System.out.println("No WiFi service records found.");
            }
            if (!coverageWiFi) {
                System.out.println("WiFi coverage is not available");
            }
        }

        return httpBaseURL;
    }

    /**
     * Initializes the ServiceRecord instances for each transport (if available). Otherwise leaves it null.
     * Also determines if sufficient coverage is available for each transport and sets coverage* flags.
     */
    private void initializeTransportAvailability() {
        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) {
                    srBIS = myRecord;
                }

                // BES
                if (cid.indexOf("ippp") != -1 && uid.indexOf("gpmds") == -1) {
                    srMDS = myRecord;
                }
                // WiFi
                if (cid.indexOf("wptcp") != -1 && uid.indexOf("wifi") != -1) {
                    srWiFi = myRecord;
                }
                // Wap1.0
                if (getConfigType(myRecord) == CONFIG_TYPE_WAP && cid.equalsIgnoreCase("wap")) {
                    srWAP = myRecord;
                }
                // Wap2.0
                if (cid.indexOf("wptcp") != -1 && uid.indexOf("wifi") == -1 && uid.indexOf("mms") == -1) {
                    srWAP2 = myRecord;
                }
                // Unite
                if (getConfigType(myRecord) == CONFIG_TYPE_BES && myRecord.getName().equals(UNITE_NAME)) {
                    srUnite = myRecord;
                }
            }
        }
        if (CoverageInfo.isCoverageSufficient(CoverageInfo.COVERAGE_BIS_B)) {
            coverageBIS = true;
            System.out.println("Coverage Status: BIS-B - Online");
        }
        if (CoverageInfo.isCoverageSufficient(CoverageInfo.COVERAGE_DIRECT)) {
            coverageTCP = true;
            System.out.println("Coverage Status: COVERAGE_DIRECT - Online");
            coverageWAP = true;
            System.out.println("Coverage Status: WAP 1.0, 1.1 - Online");
            coverageWAP2 = true;
            System.out.println("Coverage Status: WAP 2.0 - Online");
        }
        if (CoverageInfo.isCoverageSufficient(CoverageInfo.COVERAGE_MDS)) {
            coverageMDS = true;
            System.out.println("Coverage Status: MDS - Online");
            coverageUnite = true;
            System.out.println("Coverage Status: Unite - Online");
        }

        if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) {
            coverageWiFi = true;
            System.out.println("Coverage Status: Wifi - Online");
        }
    }

    /**
     * Gets the config type of a ServiceRecord using getDataInt below
     * @param record A ServiceRecord
     * @return configType of the ServiceRecord
     */
    private int getConfigType(ServiceRecord record) {
        return getDataInt(record, 12);
    }

    /**
     * Gets the config type of a ServiceRecord. Passing 12 as type returns the configType.
     * @param record A ServiceRecord
     * @param type dataType
     * @return configType
     */
    private int getDataInt(ServiceRecord record, int type) {
        DataBuffer buffer = null;
        buffer = getDataBuffer(record, type);

        if (buffer != null) {
            try {
                return ConverterUtilities.readInt(buffer);
            } catch (EOFException e) {
                return -1;
            }
        }
        return -1;
    }

    /**
     * Utility Method for getDataInt()
     */
    private DataBuffer getDataBuffer(ServiceRecord record, int type) {
        byte[] data = record.getApplicationData();
        if (data != null) {
            DataBuffer buffer = new DataBuffer(data, 0, data.length, true);
            try {
                buffer.readByte();
            } catch (EOFException e1) {
                return null;
            }
            if (ConverterUtilities.findType(buffer, type)) {
                return buffer;
            }
        }
        return null;
    }

    /**
     * Constructs a Direct TCP url from the baseURL provided by the user
     * @return A url with Direct TCP parameters
     */
    private String getTCPURL(String baseURL) {

        UiApplication.getUiApplication().invokeAndWait(new Runnable() {

            public void run() {
                // TODO Auto-generated method stub

                if(GCAppSettings.APN.trim().length() < 2 && (!apnDialogueShown)){
                    String[] buttons = { "Ok", "Cancel" };
                    Dialog dialog = new Dialog("", buttons, null, 0, Bitmap.getPredefinedBitmap(Bitmap.INFORMATION));

                    EditField apnField = new EditField("APNName: ", "", 
                            TextField.DEFAULT_MAXCHARS, EditField.NO_NEWLINE);
                    dialog.add(apnField);

                    BasicEditField usernameField = new BasicEditField("Username: ", "", 
                            15,EditField.EDITABLE);
                    dialog.add(usernameField);
                    PasswordEditField passwordField = new PasswordEditField("Password: ", "", 
                            15, EditField.EDITABLE);
                    dialog.add(passwordField);

                    if (dialog.doModal() == 0) {
                        GCAppSettings.APN = apnField.getText();
                        GCAppSettings.APN_Username = usernameField.getText();
                        GCAppSettings.APN_Password = passwordField.getText();
                    }
                    apnDialogueShown = true;
                }
            }
        });
        String url = baseURL + ";deviceside=true";
        String apn = GCAppSettings.APN;//""; //inputs.getEfTcpAPN();
        String username = GCAppSettings.APN_Username; //inputs.getEfTcpAPNUser();
        String password = GCAppSettings.APN_Password;//""; //inputs.getEfTcpAPNPassword();
        if (apn.length() > 0) {
            url += ";apn=" + apn;
        }
        if (username.length() > 0) {
            url += ";TunnelAuthUsername=" + username;
        }
        if (password.length() > 0) {
            url += ";TunnelAuthPassword=" + password;
        }
        return url;
    }

    /**
     * Constructs a MDS url from the baseURL provided by the user
     * @return A url with MDS parameters
     */
    private String getMDSURL(String baseURL) {
        return baseURL + ";deviceside=false";
    }

    /**
     * Constructs a Unite url from the baseURL provided by the user
     * @return A url with Unite parameters
     */
    private String getUniteURL(String baseURL) {
        return baseURL + ";deviceside=false" + ";ConnectionUID=" + srUnite.getUid();
    }

    /**
     * Constructs a BIS-B url from the baseURL provided by the user
     * @return A url with BIS-B parameters
     */
    private String getBISURL(String baseURL) {
        return baseURL + ";deviceside=false"; // Not implemented since this is only available to ISV partners of RIM
    }

    /**
     * Constructs a WAP2.0 url from the baseURL provided by the user
     * @return A url with WAP2.0 parameters
     */
    private String getWAP2URL(String baseURL) {
        return baseURL + ";deviceside=true" + ";ConnectionUID=" + srWAP2.getUid();
    }

    /**
     * Constructs a WiFi url from the baseURL provided by the user
     * @return A url with WiFi parameters
     */
    private String getWiFiURL(String baseURL) {
        return baseURL + ";interface=wifi";
    }

    /**
     * Constructs a WAP1.0 url from the baseURL provided by the user
     * @return A url with WAP1.0 parameters
     */
    private String getWAPURL(String baseURL) {
        String url = baseURL + ";deviceside=true";
        String gatewayIP = ""; //inputs.getEfWapGatewayIP();
        String gatewayAPN = ""; //inputs.getEfWapGatewayAPN();
        String gatewayPort = ""; //inputs.getEfWapGatewayPort();
        String sourceIP = ""; //inputs.getEfWapSourceIP();
        String sourcePort = ""; //inputs.getEfWapSourcePort();
        String username = ""; //inputs.getEfWapUser();
        String password = ""; //inputs.getEfWapPassword();
        if (gatewayIP.length() > 0) {
            url = url + ";WapGatewayIP=" + gatewayIP;
            wapParametersUnavailable = false;
        }
        if (gatewayAPN.length() > 0) {
            url = url + ";WapGatewayAPN=" + gatewayAPN;
            wapParametersUnavailable = false;
        }
        if (gatewayPort.length() > 0) {
            url = url + ";WapGatewayPort=" + gatewayPort;
            wapParametersUnavailable = false;
        }
        if (sourceIP.length() > 0) {
            url = url + ";WapSourceIP=" + sourceIP;
            wapParametersUnavailable = false;
        }
        if (sourcePort.length() > 0) {
            url = url + ";WapSourcePort=" + sourcePort;
            wapParametersUnavailable = false;
        }
        if (username.length() > 0) {
            url = url + ";TunnelAuthUsername=" + username;
            wapParametersUnavailable = false;
        }
        if (password.length() > 0) {
            url = url + ";TunnelAuthPassword=" + password;
            wapParametersUnavailable = false;
        }

        /*if (inputs.getCfWapEnableWTLS()) {
            url = url + ";WapEnableWTLS=true";
            wapParametersUnavailable = false;
        }*/
        if (wapParametersUnavailable && srWAP != null) {
            return url;
        }/** Not implemented */
        else {
            return url;
        }
    }