1

新しくリリースされた API を使用して、Nest サーモスタットのフィールドを変更する Android コードを作成しています。認証とフィールド値の取得は完璧に機能していますが、フィールド値の変更に問題があります。フィールド値を変更するための API に基づいて、HTTP put を使用する必要がありますが、これを実行すると、デバイスで何も起こりません (値 (たとえば、target_temperature_f の値は変更されません!))。

ここに私のアンドロイドコードがあります:

    String url = "https://developer-api.nest.com/devices/thermostats/" 
            + this.device_id + "?auth=" + this.access_token;    
    try{
        HttpClient httpclient = new DefaultHttpClient();

        /** set the proxy , not always needed  */
        HttpHost proxy = new HttpHost(proxy_ip,proxy_port);
        httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);       

        // Set the new value
        HttpPut httpPut = new HttpPut(url);

        httpPut.setHeader("Content-Type", "application/json");

        JSONObject jsonObj = new JSONObject("{\"target_temperature_f\":'60'}");
        HttpEntity put_entity =  new StringEntity(jsonObj.toString());
        httpPut.setEntity(put_entity);

        HttpResponse put_response = httpclient.execute(httpPut);

ただし、Linuxでは「curl」コマンドを使用してデバイスにフィールドを設定できます!! したがって、デバイスは正常に動作しています。

どんな助けでも大歓迎です!

4

1 に答える 1

2

DefaultHttpClientを使用してそれを行う方法がわかりません。ドキュメントによると、 HttpURLConnectionを支持して廃止されました。

Hue ライトでテストした HttpURLConnection を使用するコードを次に示します。

これにより、URL 接続が開き、指定された本文で POST クエリが実行されます。readFromHttpConnection メソッドは、JSON 応答を想定しています。Nest は JSON を使用しているように見えるので、これはあなたのニーズに合うかもしれません。

private String synchronousPostMethod(String destination, String body)
{
    Log.i(TAG, "Attempting HTTP POST method. Address=" + destination + "; Body=" + body);

    String responseReturn;

    try
    {
        HttpURLConnection httpConnection = openConnection(destination);
        httpConnection.setDoOutput(true);
        httpConnection.setRequestMethod("POST");

        writeToHttpConnection(httpConnection, body);

        responseReturn = readFromHttpConnection(httpConnection);
    }
    catch(Exception e)
    {
        responseReturn = RESPONSE_FAIL_MESSAGE + "; exception = " + e;
    }

    Log.i(TAG, "Result of HTTP POST method: " + responseReturn);

    return responseReturn;
}

これらはヘルパー メソッドです。

private HttpURLConnection openConnection(String destination)
{
    HttpURLConnection httpConnection = null;

    try
    {
        URL connectionUrl = new URL(destination);
        httpConnection = (HttpURLConnection) connectionUrl.openConnection();
    }
    catch(MalformedURLException malformedUrlException)
    {
        Log.w(TAG, "Failed to generate URL from malformed destination: " + destination);
        Log.w(TAG, "MalformedURLException = " + malformedUrlException);
    }
    catch(IOException ioException)
    {
        Log.w(TAG, "Could not open HTTP connection. IOException = " + ioException);
    }

    return httpConnection;
}

private boolean writeToHttpConnection(HttpURLConnection httpConnection, String data)
{
    // No data can be written if there is no connection or data
    if(httpConnection == null || data == null)
    {
        return false;
    }

    try
    {
        OutputStreamWriter outputStream = new OutputStreamWriter(httpConnection.getOutputStream());
        outputStream.write(data);
        outputStream.close();
    }
    catch(IOException ioException)
    {
        Log.w(TAG, "Failed to get output stream from HttpUrlConnection. IOException = " + ioException);

        return false;
    }

    return true;
}

private String readFromHttpConnection(HttpURLConnection httpConnection)
{
    String responseReturn = "";

    if(httpConnection != null)
    {
        try
        {
            InputStream response = httpConnection.getInputStream();
            int size;

            do
            {
                byte[] buffer = new byte[mResponseBufferSize];
                size = response.read(buffer, 0, mResponseBufferSize);

                // Convert the response to a string then add it to the end of the buffer
                responseReturn += new String(buffer, 0, size);
            }while(size < mResponseBufferSize || size <= 0);

            // Cleanup
            response.close();
        }
        catch (IOException ioException)
        {
            Log.w(TAG, "Failed to get input stream from HttpUrlConnection. IOException = " + ioException);
        }
    }

    return responseReturn;
}
于 2014-08-02T01:00:34.017 に答える