2

我正在開發連接到Web服務的BlackBerry應用程序。BlackBerry模擬器可以連接到Web服務,但真實的設備不能

當我在模擬器上開發時,我使用BlackBerry MDS進行模擬器,一切都很順利。我的應用程序(在模擬器上運行)可以完美地與我的Web服務連接。請注意,模擬器和Web服務位於不同的PC上。

現在,我的項目完成了。我嘗試將我的應用程序部署到真實設備(BB 8520)。當我在設備上使用該應用程序時,發現它無法連接到Web服務。我在互聯網上做了一項研究,我相信這一定是由於MDS問題。似乎我必須在我的Web服務所在的計算機上使用MDS進行操作,但我仍然無法找到明顯的答案。

任何人都請幫助我...

PS。我的Web服務在IIS上發佈,並在Visual Studio 2010中開發。BlackBerry應用程序在Eclipse中開發,並通過ksoap2連接到Web服務。 Web服務駐留的計算機上的防火牆已關閉。使用的連接是WIFI。

+0

您是否檢查Device中的連接..?如果可以的話。首先檢查設備的默認瀏覽器,以提供諸如「http://www.google.com」之類的內容。如果瀏覽器不工作,那就是你的DEVICE問題。 – alishaik786 2012-01-13 12:24:38

+0

設備連接到WIFI,我可以打開谷歌,Facebook和任何網站。順便說一句,我想我正在聽到一條線索。好像我需要在Web服務URL之後放置參數like; deviceside = false。 (但我還沒有嘗試過。) – NandNand 2012-01-13 14:44:11

回答

2

您必須使用HTTPConnetion將所有連接參數添加到您的URL中。創建一個自定義類來檢查連接參數。使用以下​​。

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

以上級合併後u必須作出一個包名稱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 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);  
} 

}`

現在你必須整合另外兩個類

  1. 的HttpConnection
  2. HttpResponsein com.twitterapime.io包。

`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`

`包com.twitterapime。IO;

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

public final class HttpResponse私有int代碼;

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以及web服務。

我希望這會幫助你...

3

如果您的設備使用WiFi concat ";interface=wifi" Sring到URL。

0

謝謝大家。我設法通過在URL中添加interface = wifi; deviceside = false來解決此問題。 :D

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; 
     } 
    } 
相關問題