/// <summary> /// Gets a command /// </summary> /// <param name="device">Device data of the device that is getting a command</param> /// <param name="onlyUnprocessed">Get commands with empty status only</param> /// <returns>Command data structure or null if there are no pending commands</returns> /// <remarks> /// This method returns all the commands that are waiting at the server since last GetCommand call. It returns immediately, regardless if there are commands to execute or not. /// </remarks> public DeviceCommand GetCommand(Device device, bool onlyUnprocessed = true) { if (CommandQueue.Count != 0) { return (DeviceCommand)CommandQueue.Dequeue(); } string TimeString = UriExtensions.EscapeDataString(LastTimeStamp); string Url = CloudUrl + DeviceCommand + device.id.ToString() + PollCommandName + TimeString + "&waitTimeout=0"; byte[] bts = null; WebResponse resp = MakeRequest(Url, null, GetMethod, device.id.ToString(), device.key); if (resp.ContentType.IndexOf(ContentType) >= 0) { if (resp.ContentLength > 0) { using (Stream rs = resp.GetResponseStream()) { bts = new byte[(int)rs.Length]; rs.Read(bts, 0, bts.Length); rs.Close(); } } } resp.Close(); if (bts != null) { JsonFormatter js = new JsonFormatter(); object o = js.FromJson(bts, typeof(DeviceCommand)); DeviceCommand dc = o as DeviceCommand; if (dc != null && (!onlyUnprocessed || StringExtensions.IsNullOrEmpty(dc.status))) { return dc; } ArrayList al = o as ArrayList; if (al != null) { if (al.Count == 0) return null; for (int x = 0; x < al.Count; ++x) { dc = (DeviceCommand)al[x]; if (!onlyUnprocessed || StringExtensions.IsNullOrEmpty(dc.status)) { CommandQueue.Enqueue(dc); } } DeviceCommand ldc = (DeviceCommand)al[al.Count - 1]; LastTimeStamp = ldc.timestamp; return CommandQueue.Count == 0 ? null : (DeviceCommand)CommandQueue.Dequeue(); } } return null; }
/// <summary> /// Gets API info. /// </summary> /// <returns><see cref="ApiInfo"/> object.</returns> public ApiInfo GetApiInfo() { byte[] bts = null; HttpWebResponse resp = MakeRequest(CloudUrl + InfoCommand, null, GetMethod, null, null) as HttpWebResponse; if (resp.ContentType.IndexOf(ContentType) >= 0) { if (resp.ContentLength > 0) { using (Stream rs = resp.GetResponseStream()) { bts = new byte[(int)rs.Length]; rs.Read(bts, 0, bts.Length); rs.Close(); } } } resp.Close(); if (bts != null) { JsonFormatter js = new JsonFormatter(); object o = js.FromJson(bts, typeof(ApiInfo)); ApiInfo ai = o as ApiInfo; if (ai != null) { return ai; } } throw new Exception("Unknown error while getting ApiInfo."); }
/// <summary> /// Gets a command /// </summary> /// <param name="device">Device data of the device that is getting a command</param> /// <returns>Command data structure or null if there are no pending commands</returns> /// <remarks> /// This method returns all the commands that are waiting at the server since last GetCommand call. It returns immediately, regardless if there are commands to execute or not. /// </remarks> public DeviceCommand GetCommand(Device device) { if (CommandQueue.Count != 0) { return (DeviceCommand)CommandQueue.Dequeue(); } string TimeString = LastTimeStamp.ToString("yyyy-MM-ddTHH\\%3Amm\\%3Ass.fff000"); string Url = CloudUrl + DeviceCommand + device.id.ToString() + GetCommandName + TimeString; byte[] bts = null; WebResponse resp = MakeRequest(Url, null, GetMethod, device.id.ToString(), device.key); if (resp.ContentType.IndexOf(ContentType) >= 0) { if (resp.ContentLength > 0) { using (Stream rs = resp.GetResponseStream()) { bts = new byte[(int)rs.Length]; rs.Read(bts, 0, bts.Length); rs.Close(); } } } resp.Close(); if (bts != null) { JsonFormatter js = new JsonFormatter(); object o = js.FromJson(bts, typeof(DeviceCommand)); DeviceCommand dc = o as DeviceCommand; if (dc != null && dc.status.IsNullOrEmpty()) { return dc; } ArrayList al = o as ArrayList; if (al != null) { if (al.Count == 0) return null; for (int x = 0; x < al.Count; ++x) { dc = (DeviceCommand)al[x]; if (dc.status.IsNullOrEmpty()) { CommandQueue.Enqueue(dc); } } DeviceCommand ldc = (DeviceCommand)al[al.Count - 1]; LastTimeStamp = ldc.timestamp; //LastTimeStamp += new TimeSpan(0, 0, 0, 0, 1); return CommandQueue.Count == 0 ? null : (DeviceCommand)CommandQueue.Dequeue(); } } return null; }
private WebResponse MakeRequest(string url, object obj, string Method, string id, string key) { //lock (this) //{ Debug.Print("Request: " + url); using (HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest) { req.Method = Method; req.ContentType = ContentType; req.KeepAlive = false; req.Headers.Add(IdHeader, id); req.Headers.Add(KeyHeader, key); req.ReadWriteTimeout = AsyncTimeout; req.Timeout = AsyncTimeout; if (obj != null) { JsonFormatter js = new JsonFormatter(); string s = js.ToJson(obj); req.ContentLength = s.Length; using (Stream rs = req.GetRequestStream()) { rs.Write(Encoding.UTF8.GetBytes(s), 0, s.Length); rs.Close(); } } HttpWebResponse resp = GetResponseAsync(req); //(HttpWebResponse)req.GetResponse(); // Debug.Print("Done. Response code = " + resp.StatusCode.ToString()); return resp; } }
// Obsolete! /// <summary> /// Polls command for execution /// </summary> /// <param name="device">Device data of the device that is polling a command</param> /// <returns>Command data structure or null if there are no commands</returns> /// <remarks> /// This method returns the next command from the command queue. If there are no commands in the queue, it waits for ~30 seconds to receive a new command. /// </remarks> public DeviceCommand PollCommand(Device device) { if (CommandQueue.Count != 0) { return (DeviceCommand)CommandQueue.Dequeue(); } //string TimeString = time.Year.ToString() + "-" // + time.Month.ToString() + "-" // + time.Day.ToString() + "T" // + time.Hour.ToString() + ":" // + time.Minute.ToString() + ":" // + time.Second.ToString(); string Url = CloudUrl + DeviceCommand + device.id.ToString() + PollCommandName;// +TimeString; byte[] bts = null; WebResponse resp = MakeRequest(Url, null, GetMethod, device.id.ToString(), device.key); if (resp.ContentType.IndexOf(ContentType) > 0) { if (resp.ContentLength > 0) { using (Stream rs = resp.GetResponseStream()) { bts = new byte[(int)rs.Length]; rs.Read(bts, 0, bts.Length); rs.Close(); } } } resp.Close(); if (bts != null) { JsonFormatter js = new JsonFormatter(); object o = js.FromJson(bts, typeof(DeviceCommand)); DeviceCommand dc = o as DeviceCommand; if (dc != null) { return dc; } ArrayList al = o as ArrayList; if (al != null) { if (al.Count == 0) return null; for (int x = 1; x < al.Count; ++x) { CommandQueue.Enqueue(al[x]); } return (DeviceCommand)al[0]; } } return null; }