Пример #1
0
        /// <summary>
        /// HerzschlagRequest der Verbindung
        /// </summary>
        /// Sendet zyklich ein Telegramm an das Gateway dass die Verbindung noch aktiv ist
        internal void Heartbeat()
        {
            try
            {
                if (ConnectionState != KnxConnectionState.connected) // Upps, da stimmt was mit der Verbindung nicht
                {
                    HandleWrongConnectionState();
                }


                if (ConnectionState == KnxConnectionState.connected)
                {
                    KnxIpTelegrammGenerator Tele = new KnxIpTelegrammGenerator(this);
                    Tele.SetHeartbeatTelegramm();
                    byte[] TeleBytes = Tele.bytes;

                    // KnxNetForm
                    Debug("H>:" + KnxTools.BytesToString(TeleBytes));

                    udpClient.Send(TeleBytes, TeleBytes.Length);
                    ConnectionState = KnxConnectionState.hbReq;
                }
                else
                {
                    Err("Err: Heartbeat: State =" + ConnectionState.ToString());
                }
            }
            catch (Exception e)
            {
                Err("Err: Heartbeat: " + e.ToString());
            }
            return;
        }
Пример #2
0
        /// <summary>
        /// Schließen der Verbindung
        /// </summary>
        /// <returns>Rückgabewert true bedeutet die Verbindung konnte geschlossen werden</returns>
        public bool Close()
        {
            try
            {
                KnxIpTelegrammGenerator Tele = new KnxIpTelegrammGenerator(this);
                Tele.SetDisconnectTelegramm();
                byte[] TeleBytes = Tele.bytes;

                //KnxNetForm.tb_Log.AppendText(Environment.NewLine + "C>:" + KnxTools.BytesToString(TeleBytes));
                Debug("C>:" + KnxTools.BytesToString(TeleBytes));

                udpClient.Send(TeleBytes, TeleBytes.Length);
                ConnectionState = KnxConnectionState.disConReq;

                // Warten auf Antwort, maximal OpenTimeout Sekunden
                int i = 0;

                while ((i < 10 * OpenTimeout) & (ConnectionState != KnxConnectionState.disconnected))
                {
                    System.Threading.Thread.Sleep(100);
                    i++;
                }


                // Den Heartbeat Timer stoppen
                //timerHeartbeat.Stop();

                int        Anz = (int)ar.AsyncState;
                IPEndPoint e   = new IPEndPoint(IPAddress.Any, 0);
                try
                {
                    udpClient.EndReceive(ar, ref e);
                    udpClient.Close();
                }
                catch (InvalidOperationException ex)
                {
                }
                timerHeartbeat.Stop();
            }
            catch (Exception e)
            {
                Err("Close: " + e.ToString());
            }
            return(ConnectionState == KnxConnectionState.disconnected);
        }
Пример #3
0
        /// <summary>
        /// Daten auf den Bus senden
        /// </summary>
        /// <param name="emi">Telegrammdaten die gesendet werden sollen</param>
        public void Send(cEMI emi)
        {
            try
            {
                KnxIpTelegrammGenerator Tele = new KnxIpTelegrammGenerator(this);
                Tele.SetDataTelegramm(emi, SeqCounter++);
                byte[] TeleBytes = Tele.bytes;

                // KnxNetForm
                Debug("D>:" + KnxTools.BytesToString(TeleBytes));

                udpClient.Send(TeleBytes, TeleBytes.Length);
            }
            catch (Exception e)
            {
                Err("Send: " + e.ToString());
            }
            return;
        }
Пример #4
0
        internal void DataAck(byte seqNo)
        {
            try
            {
                KnxIpTelegrammGenerator Tele = new KnxIpTelegrammGenerator(this);
                Tele.SetDataAckTelegramm(seqNo);
                byte[] TeleBytes = Tele.bytes;

                // KnxNetForm
                Debug("d>:" + KnxTools.BytesToString(TeleBytes));

                udpClient.Send(TeleBytes, TeleBytes.Length);
            }
            catch (Exception e)
            {
                Err("DataAck: " + e.ToString());
            }
            return;
        }
Пример #5
0
        /// <summary>
        /// Öffnen der Verbindung
        /// </summary>
        /// <param name="gatewayIp"> IP Adresse des KnxIp-Gateways</param>
        /// <returns>Rückgabewert true bedeutet die Verbindung konnte geöffnet werden</returns>
        public bool Open(string gatewayIp)
        {
            this.gatewayIp = gatewayIp;
            //InitUdp();
            try
            {
                udpClient.Connect(gatewayIp, gatewayPort);
                myIP = ((IPEndPoint)udpClient.Client.LocalEndPoint).Address;

                KnxIpTelegrammGenerator Tele = new KnxIpTelegrammGenerator(this);
                Tele.SetConnectTelegramm();
                byte[] TeleBytes = Tele.bytes;

                //KnxNetForm.tb_Log.AppendText(Environment.NewLine + "O>:" + KnxTools.BytesToString(TeleBytes));
                Debug("O>:" + KnxTools.BytesToString(TeleBytes));

                udpClient.Send(TeleBytes, TeleBytes.Length);
                ConnectionState = KnxConnectionState.conReq;
            }
            catch (Exception e)
            {
                Err("Open: " + e.ToString());
            }

            // nun den Listener starten
            ar = udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), AnzTelegramme);

            // Warten auf Antwort, maximal OpenTimeout Sekunden
            int i = 0;

            while ((i < 10 * OpenTimeout) & (ConnectionState != KnxConnectionState.connected))
            {
                System.Threading.Thread.Sleep(100);
                i++;
            }

            // Den Heartbeat Timer starten
            timerHeartbeat.Start();

            return(ConnectionState == KnxConnectionState.connected);
        }