audiotech,看起来nest-firebase 正在使用WebSockets 将更新发送回客户端。我正在使用 C# WindowsForms,但我发现的内容对您有用。
我可以使用以下方法获取我的结构信息:
HttpWebRequest myStructHttpWebRequest=(HttpWebRequest)WebRequest.Create("https://developer-api.nest.com/structures/?auth=" + AccessToken);
myStructHttpWebRequest.Method = "GET";
myStructHttpWebRequest.MaximumAutomaticRedirections=3;
myStructHttpWebRequest.AllowAutoRedirect=true;
myStructHttpWebRequest.Accept = "text/event-stream; application/json";
myStructHttpWebRequest.Credentials = CredentialCache.DefaultCredentials;
myStructHttpWebRequest.KeepAlive = false;
using(HttpWebResponse myHttpWebResponse = (HttpWebResponse) myStructHttpWebRequest.GetResponseAsync())
{
if (null != myHttpWebResponse)
{
// Store the response.
Stream sData = myHttpWebResponse.GetResponseStream();
StreamReader readStream = new StreamReader (sData, Encoding.UTF8);
string data = readStream.ReadToEnd();
readStream.Close();
Debug.WriteLine("Response Structure stream received: " + data);
success = deserializeStructure(data);
}
}
我将上面的代码更改为: myStructHttpWebRequest.AllowAutoRedirect=false; 并获得了重定向地址路径:
if (HttpStatusCode.TemporaryRedirect == myHttpWebResponse.StatusCode)
{
string[] redirect = myHttpWebResponse.Headers.GetValues("Location");
path = redirect[0];
}
我使用此函数启动到此新路径的 Web 套接字连接,并从 firebase 服务器接收此消息:"{\"t\":\"c\",\"d\":{\"t\": \"h\",\"d\":{\"ts\":1406745104997,\"v\":\"5\",\"h\":\"firebase-apiserver01-tah01-iad01.dapi .production.nest.com:9553\",\"s\":\"session-819323581\"}}}"
这是我的 WebSocket 代码:
private async void startNestWebSocketConnection(string path)
{
try
{
listener = new ClientWebSocket();
if (path.StartsWith("https:"))
{
path = "wss:" + path.Substring(6) + ":" + COMMUNICATION_PORT.ToString();
}
await listener.ConnectAsync(new Uri(path),CancellationToken.None);
var buffer = new byte[1024 * 4];
Debug.WriteLine("ClientWebSocket connected " + listener.State.ToString());
while (true)
{
ArraySegment<byte> segment = new ArraySegment<byte>(buffer);
WebSocketReceiveResult result = await listener.ReceiveAsync(segment, CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
Debug.WriteLine("ClientWebSocket CLOSING");
await listener.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "Closing ClientWebSocket", CancellationToken.None);
return;
}
int count = result.Count;
while (!result.EndOfMessage)
{
if (count >= buffer.Length)
{
await listener.CloseAsync(WebSocketCloseStatus.InvalidPayloadData, "That's too long", CancellationToken.None);
return;
}
segment = new ArraySegment<byte>(buffer, count, buffer.Length - count);
result = await listener.ReceiveAsync(segment, CancellationToken.None);
count += result.Count;
Debug.WriteLine("ClientWebSocket getting " + count.ToString());
}
string message = Encoding.UTF8.GetString(buffer, 0, count);
Debug.WriteLine(">" + message);
}
}
catch (Exception ex)
{
Debug.WriteLine("startNestWebSocketConnection path=" + path + " Exception=" + ex.ToString());
}
}
我还不知道回复是什么意思,但它显示了一个时间戳和一个会话 ID!当我做更多测试时,我会告诉你更多。