/// <summary>
        /// Prepare data
        /// </summary>
        /// <param name="publisherConnection"></param>
        /// <returns></returns>
        private byte[] PrepareData(UdpPubSubConnection publisherConnection, UdpConnectionType udpConnectionType = UdpConnectionType.Networking, int networkMessageIndex = 0)
        {
            try
            {
                WriterGroupDataType writerGroup0 = publisherConnection.PubSubConnectionConfiguration.WriterGroups.First();

                IList <UaNetworkMessage> networkMessages = null;
                if (udpConnectionType == UdpConnectionType.Discovery)
                {
                    List <UInt16> dataSetWriterIds = new List <UInt16>();
                    foreach (DataSetWriterDataType dataSetWriterDataType in writerGroup0.DataSetWriters)
                    {
                        dataSetWriterIds.Add(dataSetWriterDataType.DataSetWriterId);
                    }
                    networkMessages = publisherConnection.CreateDataSetMetaDataNetworkMessages(dataSetWriterIds.ToArray());
                }
                else
                {
                    networkMessages = publisherConnection.CreateNetworkMessages(writerGroup0, new WriterGroupPublishState());
                }
                Assert.IsNotNull(networkMessages, "CreateNetworkMessages returned null");

                Assert.IsTrue(networkMessages.Count > networkMessageIndex, "networkMessageIndex is outside of bounds");

                UaNetworkMessage message = networkMessages[networkMessageIndex];

                byte[] bytes = message.Encode(ServiceMessageContext.GlobalContext);

                return(bytes);
            }
            catch
            {
                return(Array.Empty <byte>());
            }
        }
        public void ValidateUadpPubSubConnectionNetworkMessagePublishMulticast()
        {
            //Arrange
            var localhost = GetFirstNic();

            Assert.IsNotNull(localhost, "localhost is null");
            Assert.IsNotNull(localhost.Address, "localhost.Address is null");

            //create publisher configuration object with modified port
            PubSubConfigurationDataType publisherConfiguration = UaPubSubConfigurationHelper.LoadConfiguration(PublisherConfigurationFileName);

            Assert.IsNotNull(publisherConfiguration, "publisherConfiguration is null");

            IPAddress multicastIPAddress = new IPAddress(new byte[4] {
                239, 0, 0, 1
            });

            Assert.IsNotNull(multicastIPAddress, "multicastIPAddress is null");

            NetworkAddressUrlDataType publisherAddress = new NetworkAddressUrlDataType();

            publisherAddress.Url = "opc.udp://" + multicastIPAddress.ToString() + ":4840";
            publisherConfiguration.Connections[0].Address = new ExtensionObject(publisherAddress);

            //create publisher UaPubSubApplication with changed configuration settings
            UaPubSubApplication publisherApplication = UaPubSubApplication.Create(publisherConfiguration);

            Assert.IsNotNull(publisherApplication, "publisherApplication is null");

            UadpPubSubConnection publisherConnection = publisherApplication.PubSubConnections[0] as UadpPubSubConnection;

            Assert.IsNotNull(publisherConnection, "publisherConnection is null");

            // will signal that the uadp message was received from local ip
            m_shutdownEvent = new ManualResetEvent(false);

            //setup uadp client for receiving from multicast (simulate a subscriber multicast)
            UdpClient udpMulticastClient = new UdpClientMulticast(localhost.Address, multicastIPAddress, 4840);

            udpMulticastClient.BeginReceive(new AsyncCallback(OnReceive), udpMulticastClient);

            // prepare a network message
            WriterGroupDataType writerGroup0   = publisherConnection.PubSubConnectionConfiguration.WriterGroups[0];
            UaNetworkMessage    networkMessage = publisherConnection.CreateNetworkMessage(writerGroup0);

            //Act
            publisherConnection.Start();
            publisherConnection.PublishNetworkMessage(networkMessage);

            //Assert
            if (!m_shutdownEvent.WaitOne(EstimatedPublishingTime))
            {
                Assert.Fail("The UADP message was not received");
            }

            publisherConnection.Stop();
            udpMulticastClient.Close();
            udpMulticastClient.Dispose();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Publish the network message
        /// </summary>
        /// <param name="networkMessage"></param>
        /// <returns></returns>
        public override bool PublishNetworkMessage(UaNetworkMessage networkMessage)
        {
            if (networkMessage == null || m_publisherUdpClients == null || m_publisherUdpClients.Count == 0)
            {
                return(false);
            }

            try
            {
                lock (m_lock)
                {
                    if (m_publisherUdpClients != null && m_publisherUdpClients.Count > 0)
                    {
                        ServiceMessageContext messageContext = new ServiceMessageContext();

                        BinaryEncoder encoder = new BinaryEncoder(messageContext);
                        networkMessage.Encode(encoder);
                        byte[] bytes = ReadBytes(encoder.BaseStream);
                        encoder.Dispose();

                        foreach (var udpClient in m_publisherUdpClients)
                        {
                            try
                            {
                                int sent = udpClient.Send(bytes, bytes.Length, NetworkAddressEndPoint);
                            }
                            catch (Exception ex)
                            {
                                Utils.Trace(ex, "UadpPubSubConnection.PublishNetworkMessage");
                                return(false);
                            }
                        }
                        return(true);
                    }
                }
            }
            catch (Exception ex)
            {
                Utils.Trace(ex, "UadpPubSubConnection.PublishNetworkMessage");
                return(false);
            }

            return(false);
        }
 /// <summary>
 /// Generate and publish the dataset MetaData message
 /// </summary>
 private void PublishMessage()
 {
     try
     {
         UaNetworkMessage metaDataNetworkMessage = m_parentConnection.CreateDataSetMetaDataNetworkMessage(m_writerGroup, m_dataSetWriter);
         if (metaDataNetworkMessage != null)
         {
             bool success = m_parentConnection.PublishNetworkMessage(metaDataNetworkMessage);
             Utils.Trace(
                 "MqttMetadataPublisher Publish DataSetMetaData, DataSetWriterId:{0}; success = {1}",
                 m_dataSetWriter.DataSetWriterId, success);
         }
     }
     catch (Exception e)
     {
         // Unexpected exception in PublishMessages
         Utils.Trace(e, "MqttMetadataPublisher.PublishMessages");
     }
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Publish the network message
        /// </summary>
        public override bool PublishNetworkMessage(UaNetworkMessage networkMessage)
        {
            if (networkMessage == null || m_publisherUdpClients == null || m_publisherUdpClients.Count == 0)
            {
                return(false);
            }

            try
            {
                lock (m_lock)
                {
                    if (m_publisherUdpClients != null && m_publisherUdpClients.Count > 0)
                    {
                        // Get encoded bytes
                        byte[] bytes = networkMessage.Encode(MessageContext);

                        foreach (var udpClient in m_publisherUdpClients)
                        {
                            try
                            {
                                udpClient.Send(bytes, bytes.Length, NetworkAddressEndPoint);

                                Utils.Trace("UdpPubSubConnection.PublishNetworkMessage bytes:{0}, endpoint:{1}", bytes.Length, NetworkAddressEndPoint);
                            }
                            catch (Exception ex)
                            {
                                Utils.Trace(ex, "UdpPubSubConnection.PublishNetworkMessage");
                                return(false);
                            }
                        }
                        return(true);
                    }
                }
            }
            catch (Exception ex)
            {
                Utils.Trace(ex, "UdpPubSubConnection.PublishNetworkMessage");
                return(false);
            }

            return(false);
        }
        /// <summary>
        /// Prepare data
        /// </summary>
        /// <param name="publisherConnection"></param>
        /// <returns></returns>
        private byte[] PrepareData(UadpPubSubConnection publisherConnection)
        {
            try
            {
                WriterGroupDataType writerGroup0 = publisherConnection.PubSubConnectionConfiguration.WriterGroups[0];
                UaNetworkMessage    message      = publisherConnection.CreateNetworkMessage(writerGroup0);

                ServiceMessageContext messageContext = new ServiceMessageContext();
                BinaryEncoder         encoder        = new BinaryEncoder(messageContext);
                message.Encode(encoder);
                byte[] bytes = ReadBytes(encoder.BaseStream);
                encoder.Dispose();

                return(bytes);
            }
            catch (Exception)
            {
            }

            return(new byte[0]);
        }
        /// <summary>
        /// Prepare data
        /// </summary>
        /// <param name="publisherConnection"></param>
        /// <returns></returns>
        private byte[] PrepareData(UdpPubSubConnection publisherConnection, int networkMessageIndex = 0)
        {
            try
            {
                WriterGroupDataType writerGroup0 = publisherConnection.PubSubConnectionConfiguration.WriterGroups.First();

                IList <UaNetworkMessage> networkMessages = publisherConnection.CreateNetworkMessages(writerGroup0);

                Assert.IsNotNull(networkMessages, "CreateNetworkMessages returned null");

                Assert.IsTrue(networkMessages.Count > networkMessageIndex, "networkMessageIndex is outside of bounds");

                UaNetworkMessage message = networkMessages[networkMessageIndex];

                byte[] bytes = message.Encode();

                return(bytes);
            }
            catch
            {
                return(Array.Empty <byte>());
            }
        }