2015-05-22 64 views
0

Pushbullet的令人敬畏的服務有一個websocket流,您可以訂閱,然後聽取推送到您的設備,這正是我想要的。我希望我的應用程序能夠連接到消息流,並根據他們所說的去做東西。在Android上連接到Pushbullet的Secure Websocket

我試過使用https://github.com/andrepew/Java-WebSocket/tree/1.3.0-Android-SSL-Fix(從https://github.com/TooTallNate/Java-WebSocket分叉),但我沒有運氣。有點超時後,連接響應回來與

onClose -1, draft [email protected] refuses handshake, false 

05-22 03:24:30.709 15423-15904 java.lang.NullPointerException: ssl == null 
05-22 03:24:30.710 15423-15904 com.android.org.conscrypt.NativeCrypto.SSL_read_BIO(Native Method) 
05-22 03:24:30.710 15423-15904 com.android.org.conscrypt.OpenSSLEngineImpl.unwrap(OpenSSLEngineImpl.java:477) 
05-22 03:24:30.710 15423-15904 javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:1006) 

我的代碼來獲取的(沒有我的訪問令牌......)甚至嘗試了「信任所有主機「建議破解,

private void createConnection() 
{ 
    URI uri = URI.create("wss://stream.pushbullet.com/websocket/" + pushAT); 

    final WebSocketClient mWebSocketClient = new WebSocketClient(uri) { 
     @Override 
     public void onOpen(ServerHandshake serverHandshake) { 
      Log.d(TAG, "onOpen " + serverHandshake); 
     } 

     @Override 
     public void onMessage(String s) { 
      Log.d(TAG, "onMessage " + s); 
     } 

     @Override 
     public void onClose(int i, String s, boolean b) { 
      Log.d(TAG, "onClose " + i + ", " + s + ", " + b); 
     } 

     @Override 
     public void onError(Exception e) { 
      Log.d(TAG, "onError " + e); 
      e.printStackTrace(); 
     } 
    }; 

    Log.d(TAG, "Connecting to " + uri); 
    trustAllHosts(mWebSocketClient); 

    mWebSocketClient.connect(); 
    Log.d(TAG, "Connecting to " + uri); 
} 

public void trustAllHosts(WebSocketClient wsc) { 
    // Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[]{}; 
     } 

     public void checkClientTrusted(X509Certificate[] chain, 
             String authType) throws CertificateException { 
     } 

     public void checkServerTrusted(X509Certificate[] chain, 
             String authType) throws CertificateException { 
     } 
    }}; 


    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("TLS"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     wsc.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(sc)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

回答

1

從這個錯誤我只能猜測它可能有一些問題與SSL。還有一個替代(未記錄)的流式端點,您可以嘗試這可能有助於調試此問題。如果您向https://stream.pushbullet.com/streaming/ACCESS_TOKEN_HERE發出請求,它將返回一個分塊的HTTP響應,直到斷開連接爲止。如果你能弄清楚如何讀取這個流式響應(許多http客戶端可以做到這一點),那麼至少該部分起作用,它只是你的websocket庫。

您可以使用命令行中的流媒體事件與curl --no-buffer。連接後應立即看到一條nop消息。

+0

嗯,現在我正在考慮它,有一個一致的str一般來說,開放可能不是最好的方法。應用程序如何做,我認爲這是更普通的推送通知方式,而不是WSS,是嗎?任何方式,我可以捎帶只是在那些?我的意思是,塔斯克如何搶佔? – seaders

+0

Android應用程序使用標準的GCM推送通知。我不確定塔斯克如何抓住這些,但我會檢查與Android的人。我可能會爲其他應用程序實現一個使用GCM推送通知的事情,但尚未完成此任務。 –

1

您可能更容易在Android上使用流式傳輸(長期存在的HTTP連接)而不是WebSocket。以下是我在Android上爲此工作的一些示例代碼:

final URL url = new URL("https://stream.pushbullet.com/streaming/" + <USER_API_KEY>); 
final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setReadTimeout(38000); 
connection.setConnectTimeout(8000); 
connection.setRequestMethod("GET"); 
connection.setDoInput(true); 

L.i("Connecting to stream server"); 

connection.connect(); 

final int responseCode = connection.getResponseCode(); 
if (responseCode != 200) { 
    throw new QuietException("Unable to connect to stream, server returned " + responseCode); 
} 

final InputStream inputStream = connection.getInputStream(); 

try { 
    final BufferedReader stream = new BufferedReader(new InputStreamReader(inputStream)); 

    final String line = stream.readLine(); 
    final JSONObject message = new JSONObject(line); 
    // And now you can do something based on this message 
} finally { 
    inputStream.close(); 
} 

這會在您的應用程序打開時工作得很好。如果你想一直收到消息,那就更難了。您需要通過GCM接收郵件,這意味着要創建一個設備讓我們將這些郵件發送給您的應用。如果這是您需要的,我建議發郵件給[email protected]獲取更多幫助。

0

據我所知,從錯誤中可以看出,你使用的是比較舊的Draft_10。

你應該使用當前的草案[Draft_17]是這樣的:

final WebSocketClient mWebSocketClient = new WebSocketClient(uri, new Draft_17()) { 

,並加入到進口:

import org.java_websocket.drafts.Draft_10; 

如果你有興趣,你可能會發現更多的草案在這裏:

https://github.com/TooTallNate/Java-WebSocket/wiki/Drafts