BlackBerry simulator can connect to web service, b

2019-01-20 04:06发布

I am developing BlackBerry application that connects to the web service.

When I developed on simulator, I used BlackBerry MDS for simulator and everything just went fine. My application (running on simulator) can connect with my web service perfectly. Please note that the simulator and the web service are on different PCs.

Now, my project is done. I tried deploying my app to the real device (BB 8520). When I used the app on the device, I found it can't connect to the web service. I did a research on the Internet and I am sure it must be due to MDS issue. It seems like I have to do something with MDS on the computer where my web service resides, but I still can't find the obvious answer.

Anyone please help me...

PS. My web service is published on IIS and is developed in Visual Studio 2010. The BlackBerry application is developed in Eclipse and connects to web service via ksoap2. Firewall on the computer where web service resides is closed. The connection used is WIFI.

4条回答
我命由我不由天
2楼-- · 2019-01-20 04:44

Thank you all. I managed to solve this problem by adding ;interface=wifi;deviceside=false to the URL. :D

查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-01-20 04:50

if your device using wifi concat ";interface=wifi" Sring to URL.

查看更多
Rolldiameter
4楼-- · 2019-01-20 04:54

I have the same problem and i solved this with using Networkutils to get the connection string and append this connection string with BaseUrl and my problem get solved .I think this will Solve your problem too. And the NetworkUtils class is as follows...

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;
        }
    }
查看更多
Viruses.
5楼-- · 2019-01-20 04:55

You have to add all connection parameter into your URL using HTTPConnetion. Create one Custom class to check connetion parameter .. USE the below 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());
}
}

After integrating above class u have to make one package with name impl.javame.com.twitterapime.io and add below class.

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

}`

Now you have to integrate another two class

  1. HttpConnection
  2. HttpResponsein com.twitterapime.io package.

`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 is 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());
    }
}

}`

Use the below mathod to check your connetion parameter. This method automatically check your device connetion availability and add connetion parameter based on your connection.

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

The above HttpConnection method return URL with connetion parameter .. than u can use this connetion in yout InputStream and open any url as well as webservice.

i hope this will help you...

查看更多
登录 后发表回答