.NET Works with Nest - C# 调用 Nest API 指南
如何使用 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 访问权限,您必须注册您的客户端。
请在此处完成此简单无忧的步骤:
- 登录
- 注册
- 客户端(登录后可用)
- 注册新客户端
- OAuth 重定向 URI
- 输入 https://:9000/api/oauth 以成功运行此演示(授权后,Nest 将调用此 URL 并提供授权码)。
- 权限
- 至少选择“恒温器 > 读取”权限,以成功运行此演示。
- OAuth 重定向 URI
- 注册新客户端
恭喜您,您现在拥有了客户端 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。
如果您在此过程中遇到任何问题,请按照说明进行操作。简而言之:
- 启动 Google Chrome。
- 安装 Nest Developer Chrome Extension。
- 浏览到 https://home.nest.com/。
- 打开开发者工具。
- 打开 Nest 选项卡。
- 添加恒温器。
恭喜您,您现在拥有一个虚拟设备,可以模拟实时事件,我们将在下一步中对其进行处理。
处理实时更新
通过 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 作者的一篇博文中提到过,可以在这里阅读。
历史
- 已添加已完成项目下载链接。
- 已删除重复附件。