Симулятор BlackBerry может подключаться к веб-сервису, но реальное устройство не может - PullRequest
2 голосов
/ 13 января 2012

Я занимаюсь разработкой приложения BlackBerry, которое подключается к веб-службе.

Когда я разрабатывал симулятор, я использовал BlackBerry MDS для симулятора, и все прошло нормально. Мое приложение (запущенное на симуляторе) может отлично соединяться с моим веб-сервисом. Обратите внимание, что симулятор и веб-сервис находятся на разных компьютерах.

Теперь мой проект завершен. Я попытался развернуть свое приложение на реальном устройстве (BB 8520). Когда я использовал приложение на устройстве, я обнаружил, что оно не может подключиться к веб-службе. Я провел исследование в Интернете, и я уверен, что это должно быть связано с проблемой MDS. Кажется, мне нужно что-то делать с MDS на компьютере, где находится мой веб-сервис, но я все еще не могу найти очевидный ответ.

Кто-нибудь, пожалуйста, помогите мне ...

PS. Мой веб-сервис опубликован на IIS и разработан в Visual Studio 2010. Приложение BlackBerry разработано в Eclipse и подключается к веб-сервису через ksoap2. Брандмауэр на компьютере, на котором находится веб-служба, закрыт. Используется соединение WIFI.

Ответы [ 4 ]

3 голосов
/ 13 января 2012

, если ваше устройство использует Wi-Fi Concat ";interface=wifi" Sring to URL.

2 голосов
/ 13 января 2012

Вы должны добавить все параметры соединения в ваш URL, используя HTTPConnetion.Создайте один пользовательский класс для проверки параметра соединения. ИСПОЛЬЗУЙТЕ приведенный ниже 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 и добавить следующий класс.1008 * `пакет impl.javame.com.twitterapime.io;импорт java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.microedition.io.Connector;import com.twitterapime.io.HttpConnection;

открытый класс 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 пакет.

`пакет com.twitterapime.io;импорт java.io.IOException;import java.io.InputStream;import java.io.OutputStream;открытый интерфейс 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`

`пакет com.twitterapime.io;

импорт java.io.ByteArrayOutputStream;импорт java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;

открытый финальный класс 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());
    }
}

} `

Используйте приведенный ниже метод для проверки вашего параметра подключения.Этот метод автоматически проверяет доступность подключения к вашему устройству и добавляет параметр подключения на основе вашего подключения.

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

Указанный выше HttpConnection URL-адрес возврата метода с параметром подключения ... чем вы можете использовать это подключение в yout InputStreamи откройте любой URL, а также веб-сервис.

Надеюсь, это поможет вам ...

0 голосов
/ 10 августа 2012

У меня та же проблема, и я решил ее с помощью 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;
        }
    }
0 голосов
/ 15 января 2012

Спасибо всем. Мне удалось решить эту проблему, добавив; interface = wifi; deviceside = false к URL. : D

...