예제 #1
0
        public async Task Run(
            [EdgeHubTrigger("opc")] Message message,
            [EdgeHub(OutputName = "dtdl")] IAsyncCollector <Message> output,
            ILogger logger
            )
        {
            byte[] messageBytes = message.GetBytes();
            logger.LogInformation($"OPC-UA Message Recieved: {Encoding.UTF8.GetString(messageBytes)}");

            var opcMessages = new OpcMessage[] { };

            try
            {
                opcMessages = JsonConvert.DeserializeObject <OpcMessage[]>(Encoding.UTF8.GetString(messageBytes));
            }
            catch (Exception e)
            {
                logger.LogInformation($"Failed to deserialize opc message as an array. Exception: {e}");
                logger.LogInformation($"Attempting single instance deserialization");
                opcMessages[0] = JsonConvert.DeserializeObject <OpcMessage>(Encoding.UTF8.GetString(messageBytes));
            }

            var dtdlMessages = BuildDtdlMessage(opcMessages);

            for (int i = 0; i < dtdlMessages.Length; i++)
            {
                var messageString       = JsonConvert.SerializeObject(dtdlMessages[i]);
                var outputMessageString = Encoding.UTF8.GetBytes(messageString);

                var outputMessage = new Message(outputMessageString);
                await output.AddAsync(outputMessage);
            }
        }
예제 #2
0
      private static async Task <MessageResponse> ProcessOPCInput(Message message, object userContext)
      {
          Console.WriteLine("Processing OPC input");

          var counterValue = Interlocked.Increment(ref counter);

          try
          {
              ModuleClient    deviceClient = (ModuleClient)userContext;
              var             opcMessage   = new OpcMessage(message);
              List <DynoCard> cards        = new List <DynoCard>();

              if (opcMessage != null)
              {
                  // var dynoCard = await opcMessage.ToDynoCard();

                  // if (dynoCard.SurfaceCard != null && dynoCard.PumpCard != null)
                  // {
                  //     cards.Add(dynoCard);
                  //     Console.WriteLine("Parsing OPC dyno card values.");
                  // }
              }

              foreach (var card in cards)
              {
                  string json = JsonConvert.SerializeObject(card);
                  //System.Console.WriteLine(json);

                  int cardID = await(new DataHelper()).PersistDynoCard(card);

                  if (cardID > 0)
                  {
                      card.Id = cardID;

                      var dynoCardMessage = card.ToDeviceMessage();
                      await deviceClient.SendEventAsync("output1", dynoCardMessage);
                  }
              }

              // Indicate that the message treatment is completed
              return(MessageResponse.Completed);
          }
          catch (AggregateException ex)
          {
              foreach (Exception exception in ex.InnerExceptions)
              {
                  Console.WriteLine();
                  Console.WriteLine("Error in OPC input: {0}", exception);
              }

              return(MessageResponse.Completed);
          }
          catch (Exception ex)
          {
              Console.WriteLine();
              Console.WriteLine("Error in OPC input: {0}", ex.Message);

              return(MessageResponse.Completed);
          }
      }
예제 #3
0
파일: Program.cs 프로젝트: piers7/PiCandy
        private static void HandleMessageReceived(object sender, OpcMessage message)
        {
            Log.DebugFormat("Handling message received {0}", message);
            if (message.Command == OpcCommandType.SetPixels)
            {
                // render no more data than we can (pixel count)
                for (int i = 0; i < _renderer.PixelCount; i++)
                {
                    var r = message.Data[i * 3];
                    var g = message.Data[i * 3 + 1];
                    var b = message.Data[i * 3 + 2];

                    _renderer.SetPixelColor(i, r, g, b);
                }
                _renderer.Show();
            }
        }
예제 #4
0
        /// <summary>
        ///  Creates a dyanmic object in the appropraite DTDL format
        /// </summary>
        /// <param name="opcMessage">The OPC-UA message to convert</param>
        private dynamic BuildDtdlMessage(OpcMessage opcMessage)
        {
            dynamic dtdlMessage = new ExpandoObject();
            var     dict        = (IDictionary <string, object>)dtdlMessage;

            dict.Add("NodeId", ParseNodeId(opcMessage.NodeId));

            if (string.IsNullOrEmpty(opcMessage.ApplicationUri))
            {
                dict.Add("ApplicationUri", _Options.DefaultApplicationUri);
            }
            else
            {
                dict.Add("ApplicationUri", ParseApplicationUri(opcMessage.ApplicationUri));
            }

            dict.Add("Status", opcMessage.Status);
            dict.Add("SourceTimestamp", opcMessage.Value.SourceTimestamp);
            dict.Add(opcMessage.DisplayName, opcMessage.Value.Value);

            return(dtdlMessage);
        }
예제 #5
0
 private static void HandleMessageReceived(OpcMessage message)
 {
     Console.WriteLine(message.ToString(12));
 }