private async void btnData_Click(object sender, EventArgs e) { lvData.Items.Clear(); if (lvResults.SelectedItems == null) { MessageBox.Show("Must select an attribute for data retrieval!"); return; } if (cboStreamType.SelectedItem == null) { MessageBox.Show("Must select a stream type for data retrieval!"); return; } var url = new StringBuilder(); url.AppendFormat(@"{0}/streams/{1}/{2}", baseUrl, lvResults.SelectedItems[0].SubItems[2].Text, cboStreamType.SelectedItem.ToString()); JObject jobj = await client.GetAsync(url.ToString()); lvData.BeginUpdate(); for (int i = 0; i < jobj["Items"].Count(); i++) { DataItemListViewItem lvItem; if (cboStreamType.SelectedItem.ToString().ToUpper().Equals("SUMMARY")) { var timestamp = Convert.ToDateTime(jobj["Items"][i]["Value"]["Timestamp"].ToString()).ToLocalTime(); lvItem = new DataItemListViewItem(timestamp.ToString(), jobj["Items"][i]["Value"]["Value"].ToString(), jobj["Items"][i]["Value"]["UnitsAbbreviation"].ToString()); } else { var timestamp = Convert.ToDateTime(jobj["Items"][i]["Timestamp"].ToString()).ToLocalTime(); lvItem = new DataItemListViewItem(timestamp.ToString(), jobj["Items"][i]["Value"].ToString(), jobj["Items"][i]["UnitsAbbreviation"].ToString()); } lvData.Items.Add(lvItem); } lvData.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); lvData.EndUpdate(); }
/* In production code I wouldn't put this function in a WinForm, but as I couldn't figure out in time how to * pass the websocket message out of the function as a Task Result without ending the task, I decided to just * drop it here for simplicity. Most code examples I could find usually just wrote the message out to the Console * within the function. * This piece of code is largely based on the example code from the PI Web API programmer documentation under the * Channels (Core Services) entry. I have made some moifications to suit my project such as setting the RequestHeader * and the client credentials, as well as handling the websocket message to parse the JSON and drop the data into * a ListView control. */ private async Task GetAsync(string webId, CancellationToken cancellationToken) { string baseUri = baseUrl.Replace("https", "wss"); Uri uri = new Uri(string.Format("{0}/streams/{1}/channel?includeInitialValues=true", baseUri, webId)); WebSocketReceiveResult receiveResult; byte[] receiveBuffer = new byte[65536]; ArraySegment <byte> receiveSegment = new ArraySegment <byte>(receiveBuffer); using (ClientWebSocket webSocket = new ClientWebSocket()) { try { webSocket.Options.SetRequestHeader("Authorization", "Basic"); webSocket.Options.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["userid"], ConfigurationManager.AppSettings["password"]); await webSocket.ConnectAsync(uri, CancellationToken.None); } catch (WebSocketException) { MessageBox.Show("Could not connect to server."); return; } while (true) { try { receiveResult = await webSocket.ReceiveAsync(receiveSegment, cancellationToken); } catch (OperationCanceledException) { break; } if (receiveResult.MessageType != WebSocketMessageType.Text) { await webSocket.CloseAsync( WebSocketCloseStatus.InvalidMessageType, "Message type is not text.", CancellationToken.None); return; } else if (receiveResult.Count > receiveBuffer.Length) { await webSocket.CloseAsync( WebSocketCloseStatus.InvalidPayloadData, "Message is too long.", CancellationToken.None); return; } string message = Encoding.UTF8.GetString(receiveBuffer, 0, receiveResult.Count); JObject msg = JObject.Parse(message); try { var timestamp = Convert.ToDateTime(msg["Items"][0]["Items"][0]["Timestamp"].ToString()).ToLocalTime(); var lvItem = new DataItemListViewItem(timestamp.ToString(), msg["Items"][0]["Items"][0]["Value"].ToString(), msg["Items"][0]["Items"][0]["UnitsAbbreviation"].ToString()); lvData.Items.Add(lvItem); } catch (Exception e) { MessageBox.Show(e.Message); } } await webSocket.CloseAsync( WebSocketCloseStatus.NormalClosure, "Closing connection.", CancellationToken.None); } }
private async void btnBulkData_Click(object sender, EventArgs e) { lvData.Items.Clear(); if (lvResults.SelectedItems == null) { MessageBox.Show("Must select at least one attribute for data retrieval!"); return; } if (cboStreamSetType.SelectedItem == null) { MessageBox.Show("Must select a stream type for data retrieval!"); return; } var attrWebIds = new List <string>(); foreach (AFAttributeListViewItem item in lvResults.SelectedItems) { attrWebIds.Add(item.SubItems[2].Text); } var url = new StringBuilder(); url.AppendFormat(@"{0}/streamsets/{1}?webid={2}", baseUrl, cboStreamSetType.SelectedItem.ToString(), attrWebIds[0]); for (int i = 1; i < attrWebIds.Count(); i++) // We start the iterator at 1 instead of 0, as we've already added the WebId of the first attribute to the url { url.AppendFormat(@"&webid={0}", attrWebIds[i]); } JObject jobj = await client.GetAsync(url.ToString()); lvData.BeginUpdate(); if (cboStreamSetType.SelectedItem.ToString().ToUpper().Equals("VALUE")) { for (int i = 0; i < jobj["Items"].Count(); i++) { DataItemListViewItem lvItem; var timestamp = Convert.ToDateTime(jobj["Items"][i]["Value"]["Timestamp"].ToString()).ToLocalTime(); lvItem = new DataItemListViewItem(timestamp.ToString(), jobj["Items"][i]["Value"]["Value"].ToString(), jobj["Items"][i]["Value"]["UnitsAbbreviation"].ToString()); lvData.Items.Add(lvItem); } } else { for (int i = 0; i < jobj["Items"].Count(); i++) { for (int j = 0; j < jobj["Items"][i]["Items"].Count(); j++) { DataItemListViewItem lvItem; var timestamp = Convert.ToDateTime(jobj["Items"][i]["Items"][j]["Timestamp"].ToString()).ToLocalTime(); lvItem = new DataItemListViewItem(timestamp.ToString(), jobj["Items"][i]["Items"][j]["Value"].ToString(), jobj["Items"][i]["Items"][j]["UnitsAbbreviation"].ToString()); lvData.Items.Add(lvItem); } } } lvData.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); lvData.EndUpdate(); }