Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接到Pushbullet&x27;Android上的安全Websocket_Android_Ssl_Websocket_Pushbullet - Fatal编程技术网

连接到Pushbullet&x27;Android上的安全Websocket

连接到Pushbullet&x27;Android上的安全Websocket,android,ssl,websocket,pushbullet,Android,Ssl,Websocket,Pushbullet,Pushbullet是一个很棒的服务,它有一个websocket流,你可以订阅它,然后监听对你设备的推送,这正是我想要的。我希望我的应用程序能够连接到消息流,并根据他们所说的做一些事情 我试过使用(从中分叉),但运气不好。经过一段时间的超时后,连接响应返回 onClose -1, draft org.java_websocket.drafts.Draft_10@a38fd36 refuses handshake, false 及 我的代码是(没有我的访问令牌…)甚至尝试“信任所有主机”建议的黑

Pushbullet是一个很棒的服务,它有一个websocket流,你可以订阅它,然后监听对你设备的推送,这正是我想要的。我希望我的应用程序能够连接到消息流,并根据他们所说的做一些事情

我试过使用(从中分叉),但运气不好。经过一段时间的超时后,连接响应返回

onClose -1, draft org.java_websocket.drafts.Draft_10@a38fd36 refuses handshake, false

我的代码是(没有我的访问令牌…)甚至尝试“信任所有主机”建议的黑客攻击

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

从这个错误中,我只能猜测它可能与SSL有一些问题。您可以尝试另一种(未记录的)流式处理端点,这可能有助于调试此问题。如果您向它发出请求,它将返回一个分块的HTTP响应,该响应将一直持续到您断开连接为止。如果您能够了解如何读取此流式响应(许多http客户端都可以这样做),那么至少这部分工作正常,并且它只是您的websocket库


您可以在命令行中将流式处理与
curl--no buffer
一起使用。您应该在连接后立即看到nop消息。

在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();
}
最终URL=新URL(“https://stream.pushbullet.com/streaming/" + );
最终的HttpURLConnection连接=(HttpURLConnection)url.openConnection();
connection.setReadTimeout(38000);
连接。设置连接超时(8000);
connection.setRequestMethod(“GET”);
connection.setDoInput(true);
L.i(“连接到流服务器”);
connection.connect();
final int responseCode=connection.getResponseCode();
如果(响应代码!=200){
抛出新的QuietException(“无法连接到流,服务器返回”+响应代码);
}
final InputStream InputStream=connection.getInputStream();
试一试{
最终BufferedReader流=新的BufferedReader(新的InputStreamReader(inputStream));
最后一行字符串=stream.readLine();
最终JSONObject消息=新JSONObject(行);
//现在你可以根据这个信息做一些事情了
}最后{
inputStream.close();
}

当你的应用程序打开时,这将非常有效。如果你想一直收到信息,那就有点难了。您需要通过GCM接收消息,这意味着我们需要为您的应用程序创建一个发送消息的设备。如果这是你需要的,我建议你发电子邮件api@pushbullet.com获取更多帮助。

从错误中我可以看出,您使用的是非常旧的草稿

您应该像这样使用当前草稿[draft_17]:

final WebSocketClient mWebSocketClient = new WebSocketClient(uri, new Draft_17()) {
并在进口中添加:

import org.java_websocket.drafts.Draft_10;
如果您感兴趣,可以在此处找到有关草稿的更多信息:


Hmmm,现在我在考虑这个问题,一般来说,保持一致的流开放可能不是最好的方法。应用程序是如何做到这一点的,我假设它是更标准的一般方法中的推送通知,而不是WSS,是吗?我有没有办法就靠这些钱?我的意思是,Tasker是如何抓住机会的?android应用程序使用标准的GCM推送通知。我不确定Tasker是如何抓到这些的,但我会和android的家伙核实一下。我可能会为其他应用程序实现一个使用GCM推送通知的功能,但还没有实现。
import org.java_websocket.drafts.Draft_10;