65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET Works with Nest - C# 调用 Nest API 指南

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2014年9月15日

CPOL

3分钟阅读

viewsIcon

40552

downloadIcon

493

如何使用 FirebaseSharp 从 .NET 调用 Nest API

引言

本文演示了如何使用 FirebaseSharp 从 .NET 调用 Nest API。FirebaseSharp 是一个非官方的开源 Firebase .NET 客户端。

要跟进并试用 Nest API,您无需拥有 Nest 设备,可以使用模拟器。

背景

Nest API 使开发人员能够与 Nest 学习恒温器™ 和 Nest Protect:烟雾+一氧化碳™ 集成。

尽管 API 有多种形式(Firebase、REST 和 REST Streaming),但目前在 .NET 中使用 API 的实时功能时,您会有点束手无策。

  • 官方 Firebase 客户端库目前仅支持 Web(JavaScript 客户端)、iOS 和 Android。
  • 替代的 REST Streaming 基于 EventSource,这是 .NET 开箱即用的另一个选项。
  • 最后,REST 选项并非用于实时更新,Nest 对您在特定时间段内可进行的调用次数设置了限制(因此,请忘记轮询更新)。

在寻找解决方案时,我偶然发现了 FirebaseSharp,它使您能够使用 Firebase 协议调用 Nest API 并获得所有实时功能。

请继续阅读,了解接下来的内容。

使用代码

您可以下载已完成的项目。

获取 Nest API 访问权限

要获取 Nest API 访问权限,您必须注册您的客户端。

请在此处完成此简单无忧的步骤:

  1. 登录
    • 注册
  2. 客户端(登录后可用)
    • 注册新客户端
      • OAuth 重定向 URI
        • 输入 https://:9000/api/oauth 以成功运行此演示(授权后,Nest 将调用此 URL 并提供授权码)。
      • 权限
        • 至少选择“恒温器 > 读取”权限,以成功运行此演示。

恭喜您,您现在拥有了客户端 ID 和密钥,它们将在下一步的 OAuth 中用到。

获取 Nest 设备数据访问权限

为了获取 Nest 设备数据,Nest 解释了他们为何以及如何使用 OAuth。

因此,让我们将其转换为 .NET。

首先,在 App.config 中更新您的客户端 OAuth 设置,从您的 Nest 客户端设置中复制它们。

<add key="client-id" value="<client-id>" />
<add key="client-secret" value ="<client-secret>" />

要请求访问,我们只需浏览到授权 URL,该 URL 使用您的客户端 ID 来识别请求访问的应用程序。

var authorizationUrl = string.Format("https://home.nest.com/login/oauth2?client_id={0}&state={1}",
    ConfigurationManager.AppSettings["client-id"], "dummy-random-value-for-anti-csfr");

using (var process = Process.Start(authorizationUrl))
{
    Console.WriteLine("Awaiting response, please accept on the Works with Nest page to continue");
}

如果用户同意,Nest 将重定向到您配置的 OAuth 重定向 URI。

为了使此演示保持简单和自包含在控制台应用程序中,我们自托管了 ASP.NET Web API,以处理响应。

using (WebApp.Start<Startup>(url: "https://:9000/"))
{
    // snip
}

因此,首先验证 state 参数,这应该与我们发送的防跨站伪造请求令牌匹配,以确保通信的完整性。
然后,收到的授权码用于请求访问令牌。
同样,为了简单起见,将生成的访问代码响应转换为动态类型,这样我们就可以在无需正确反序列化为强类型对象的情况下访问 token 属性。

/// <summary>
/// Called by Nest when user grants access
/// </summary>
/// <param name="state">Anti-cross-site forgery request token</param>
/// <param name="code">Code to request access token</param>
/// <returns>Access code</returns>
public HttpResponseMessage Get(string state, string code)
{
     if (!string.Equals("dummy-random-value-for-anti-csfr", state))
         throw new HttpResponseException(HttpStatusCode.BadRequest);

     var accessToken = GetAccessToken(code);
     Program.SubscribeToNestDeviceDataUpdates(accessToken);

     var response = new HttpResponseMessage(HttpStatusCode.OK) 
     {
         Content = new StringContent("Well done, you now have an access token which allows you to call Nest API on behalf of the user.") 
     };
     response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");

     return response;
}

private async Task<string> GetAccessToken(string authorizationCode)
{
    var url = string.Format("https://api.home.nest.com/oauth2/access_token?code={0}&client_id={1}&client_secret={2}&grant_type=authorization_code",
                authorizationCode, ConfigurationManager.AppSettings["client-id"], ConfigurationManager.AppSettings["client-secret"]);

    using (var httpClient = new HttpClient())
    {
        using (var response = httpClient.PostAsync(url, content: null).Result)
        {
            var accessToken = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);

            return (accessToken as dynamic).access_token;
        }
    }
}

恭喜您,您现在拥有一个允许您代表用户调用 Nest API 的访问令牌。

模拟 Nest 设备

要模拟 Nest 设备,您必须使用 Nest Developer Chrome Extension。

如果您在此过程中遇到任何问题,请按照说明进行操作。简而言之:

  1. 启动 Google Chrome。
  2. 安装 Nest Developer Chrome Extension。
  3. 浏览到 https://home.nest.com/。
  4. 打开开发者工具。
  5. 打开 Nest 选项卡。
  6. 添加恒温器。

恭喜您,您现在拥有一个虚拟设备,可以模拟实时事件,我们将在下一步中对其进行处理。

处理实时更新

通过 nuget 获取 FirebaseSharp,通过 Nuget 包管理器控制台进行安装:

Install-Package FirebaseSharp

获得访问令牌后,我们初始化一个 Firebase 客户端,它指向使用我们检索到的访问令牌的 Nest API。在这种情况下,我们监听设备,但请随时查阅 Nest API 参考,以了解您可以对细粒度进行哪些选择。

在 Nest Developer Chrome Extension 中更改当前温度,并见证实时更新!

var firebaseClient = new Firebase("https://developer-api.nest.com", _accessToken);
var response = firebaseClient.GetStreaming("devices",
        changed: (s, e) => {
            if (e.Path.Contains("ambient_temperature_f"))
                Console.WriteLine("Current temperature has been updated to: {0}.", e.Data);
        });

恭喜您,您有了一个可行的解决方案!

关注点

Firebase 可能官方支持 C#,这在 FirebaseSharp 作者的一篇博文中提到过,可以在这里阅读。

历史

  1. 已添加已完成项目下载链接。
  2. 已删除重复附件。
© . All rights reserved.