예제 #1
0
        private void OnReceive(IAsyncResult state)
        {
            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);

            if (PortOpen)
            {
                try
                {
                    ArtNetReceiveData receiveState = (ArtNetReceiveData)(state.AsyncState);

                    if (receiveState != null)
                    {
                        receiveState.DataLength = EndReceiveFrom(state, ref remoteEndPoint);

                        //Protect against UDP loopback where we receive our own packets.
                        if (LocalEndPoint != remoteEndPoint && receiveState.Valid)
                        {
                            LastPacket = DateTime.Now;

                            ProcessPacket((IPEndPoint)remoteEndPoint, ArtNetPacket.Create(receiveState));
                        }
                    }
                }
                catch (Exception ex)
                {
                    OnUnhandledException(ex);
                }
                finally
                {
                    //Attempt to receive another packet.
                    StartReceive();
                }
            }
        }
예제 #2
0
    protected override void OnReadPacket(byte[] buffer, int length, IPEndPoint source)
    {
        var recieveState = new ArtNetRecieveData();

        recieveState.buffer     = buffer;
        recieveState.DataLength = length;
        var artNetPacket = ArtNetPacket.Create(recieveState);

        if (0 < receiveLimit && receivedDataQueue.Count < receiveLimit)
        {
            lock (receivedDataQueue)
                receivedDataQueue.Enqueue(artNetPacket);
            if (artNetPacket.OpCode == ArtNet.Enums.ArtNetOpCodes.Dmx)
            {
                var dmxPacket     = (ArtNetDmxPacket)artNetPacket;
                var universe      = dmxPacket.Universe;
                var dmxData       = dmxPacket.DmxData;
                var mergedDmxData = DmxMerge.GetMergedDmxData(universe, dmxData, dmxMergeMode, source);

                if (!universeDmxDataMap.ContainsKey(universe))
                {
                    universeDmxDataMap.Add(universe, Enumerable.Repeat((byte)0, 512).ToArray());
                }
                System.Buffer.BlockCopy(mergedDmxData, 0, universeDmxDataMap[universe], 0, mergedDmxData.Length);

                if (!updateUniverseQueue.Contains(universe))
                {
                    lock (updateUniverseQueue)
                        updateUniverseQueue.Enqueue(universe);
                }
            }
        }
    }
예제 #3
0
        async void Run()
        {
            artnetUdpClient = new UdpClient(artNetPort);
            groupEP         = new IPEndPoint(IPAddress.Any, artNetPort);

            ArtNetPacket anpacket = null;

            try
            {
                while (true)
                {
                    Console.WriteLine("...");
                    byte[] bytes = artnetUdpClient.Receive(ref groupEP);
                    anpacket = await ArtNetPacket.Unpack(groupEP, bytes);

                    Console.WriteLine("Received broadcast from {0} :\n{1}\n", groupEP.ToString(), anpacket?.ToString());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("EXCEPTION : " + ex.ToString());
            }
            finally
            {
                artnetUdpClient.Close();
            }
        }
예제 #4
0
 private void ProcessPacket(IPEndPoint source, ArtNetPacket packet)
 {
     if (packet != null)
     {
         if (NewPacket != null)
         {
             NewPacket(this, new NewPacketEventArgs <ArtNetPacket>(source, packet));
         }
     }
 }
예제 #5
0
        void Communicator_DataReceived(object sender, UdpPacket e)
        {
            var packet = new ArtNetPacket(e.EndPoint, e.RawData);

            if (packet.IsValid)
            {
                //Console.WriteLine("{0}: Code: {1} - {2}", e.EndPoint, packet.OpCode, e.RawData.Length);
                RoutePacket(packet);
            }
        }
예제 #6
0
    public void OnArtNet(ArtNetPacket packet)
    {
        opCode   = packet.OpCode;
        protocol = packet.Protocol;

        if (opCode == ArtNetOpCodes.Dmx)
        {
            dmxData = ((ArtNetDmxPacket)packet).DmxData;
        }
    }
예제 #7
0
파일: Tests.cs 프로젝트: OsOmE1/Art.Net
        public void TestPacketSerialization()
        {
            var data      = new ArtNetData();
            var pollReply = new ArtPollReply
            {
                IP   = IPAddress.Parse("127.0.0.1").GetAddressBytes(),
                Port = 0x1936,
                Mac  = NetworkInterface.GetAllNetworkInterfaces()
                       .Where(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                       .Select(nic => nic.GetPhysicalAddress().GetAddressBytes())
                       .FirstOrDefault(),

                GoodInput   = new byte[] { 0x08, 0x08, 0x08, 0x08 },
                GoodOutput  = new byte[] { 0x80, 0x80, 0x80, 0x80 },
                PortTypes   = new byte[] { 0xc0, 0xc0, 0xc0, 0xc0 },
                ShortName   = "ShortName Test",
                LongName    = "Art.Net LongName Test",
                EstaManLo   = 0,
                VersInfoH   = 6,
                VersInfoL   = 9,
                SubSwitch   = 0,
                OemHi       = 0,
                Oem         = 0xFF,
                UbeaVersion = 0,
                Status1     = 0xd2,
                SwMacro     = 0,
                SwRemote    = 0,
                Style       = StyleCodes.StNode,
                NumPortsHi  = 0,
                NumPortsLo  = 4,
                Status2     = 0x08,
                BindIp      = IPAddress.Parse("127.0.0.1").GetAddressBytes(),
                SwIn        = new byte[] { 0x01, 0x02, 0x03, 0x04 },
                SwOut       = new byte[] { 0x01, 0x02, 0x03, 0x04 },
                GoodOutput2 = new byte[] { 0x80, 0x80, 0x80, 0x80 },

                NodeReport = "NodeReport Test",
                Filler     = new byte[168]
            };

            data.Buffer = pollReply.ToArray();

            var altPacket = ArtNetPacket.FromData(data);

            Assert.AreEqual(altPacket.OpCode, pollReply.OpCode);

            var pollReplyPacket = altPacket.Cast <ArtPollReply>();

            Assert.AreEqual(pollReplyPacket.ShortName, pollReply.ShortName);
            Assert.AreEqual(pollReplyPacket.LongName, pollReply.LongName);

            Assert.AreEqual(pollReplyPacket.NodeReport, pollReply.NodeReport);

            Assert.Pass();
        }
예제 #8
0
        public void OnArtNet(ArtNetPacket packet)
        {
            opCode   = packet.OpCode;
            protocol = packet.Protocol;

            if (opCode == ArtNetOpCodes.Dmx)
            {
                var dmxPacket = (ArtNetDmxPacket)packet;
                universe = dmxPacket.Universe;
                dmxData  = dmxPacket.DmxData;
            }
        }
예제 #9
0
        private void ProcessPacket(IPEndPoint source, ArtNetPacket packet)
        {
            if (packet != null)
            {
                if (NewPacket != null)
                {
                    NewPacket(this, new NewPacketEventArgs <ArtNetPacket>(source, packet));
                }

                ArtRdmPacket rdmPacket = packet as ArtRdmPacket;
                if (rdmPacket != null && NewRdmPacket != null)
                {
                    RdmPacket rdm = RdmPacket.ReadPacket(new RdmBinaryReader(new MemoryStream(rdmPacket.RdmData)));
                    NewRdmPacket(this, new NewPacketEventArgs <RdmPacket>(source, rdm));
                }
            }
        }
예제 #10
0
        /// <summary>
        /// Unicasts a <see cref="ArtNetPacket"/> to a recipient at a certain interval
        /// </summary>
        public CancellationTokenSource SendToIpWithInterval(ArtNetPacket packet, IPAddress ip, int ms)
        {
            CancellationTokenSource cts = new();

            new Thread(() =>
            {
                while (true)
                {
                    if (cts.IsCancellationRequested)
                    {
                        break;
                    }
                    SendToIp(packet, ip);
                    Thread.Sleep(ms);
                }
            }).Start();
            RunningIntervals.Add(cts);
            return(cts);
        }
예제 #11
0
        void Communicator_DataReceived(object sender, UdpPacket e)
        {
            var packet = new ArtNetPacket(e.EndPoint, e.RawData);

            Debug.Log("Received From: " + e.EndPoint);
            if (packet.IsValid)
            {
                universe = packet.RawData[14] % 16;
                net      = packet.RawData[15];
                subnet   = packet.RawData[14] / 16;
                for (int i = 0; i < 512; i++)
                {
                    DMXdata[i] = packet.RawData[18 + i];
                }
                for (int i = 0; i < 170; i++)
                {
                    DMXpix[universe * 170 + i] = new Color32(DMXdata[i * 3], DMXdata[i * 3 + 1], DMXdata[i * 3 + 2], 255);
                }
            }
        }
예제 #12
0
        protected override void OnReadPacket(byte[] buffer, int length, IPEndPoint source)
        {
            if (recieveState == null)
            {
                recieveState = new ArtNetRecieveData();
            }
            recieveState.buffer     = buffer;
            recieveState.DataLength = length;

            var artNetPacket = ArtNetPacket.Create(recieveState);

            if (0 < receiveLimit && receivedDataQueue.Count < receiveLimit)
            {
                lock (receivedDataQueue)
                    receivedDataQueue.Enqueue(artNetPacket);
                if (artNetPacket.OpCode == ArtNet.Enums.ArtNetOpCodes.Dmx)
                {
                    var dmxPacket     = (ArtNetDmxPacket)artNetPacket;
                    var universe      = dmxPacket.Universe;
                    var dmxData       = dmxPacket.DmxData;
                    var mergedDmxData = DmxMerge.GetMergedDmxData(universe, dmxData, dmxMergeMode);

                    if (dmx == null)
                    {
                        dmx = new byte[512][];
                    }
                    if (dmx[universe] == null)
                    {
                        dmx[universe] = new byte[512];
                    }
                    System.Buffer.BlockCopy(mergedDmxData, 0, dmx[universe], 0, mergedDmxData.Length);

                    if (!updateUniverseQueue.Contains(universe))
                    {
                        lock (updateUniverseQueue)
                            updateUniverseQueue.Enqueue(universe);
                    }
                }
            }
        }
예제 #13
0
        private void OnRecieve(IAsyncResult state)
        {
            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);

            if (!open)
            {
                return;
            }

            try
            {
                ArtNetData recieveState = (ArtNetData)(state.AsyncState);

                if (recieveState == null)
                {
                    // Packet was invalid continue receiving
                    ReceiveArtNet();
                }
                recieveState.DataLength = EndReceiveFrom(state, ref remoteEndPoint);

                // Protect against UDP loopback where we recieve our own packets.
                if (LocalEndPoint != remoteEndPoint && recieveState.Valid)
                {
                    LastPacket = DateTime.Now;
                    var packet = ArtNetPacket.FromData(recieveState);
                    if (packet == null)
                    {
                        ReceiveArtNet();
                    }

                    NewPacket?.Invoke(this, new NewPacketEventArgs <ArtNetPacket>((IPEndPoint)remoteEndPoint, packet));
                }
            }
            catch (Exception ex)
            {
                UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, false));
            }
            ReceiveArtNet();
        }
        /// <summary>
        /// 接收数据回调函数
        /// </summary>
        /// <param name="state">状态信息以及自定义数据</param>
        private void OnRecieve(IAsyncResult state)
        {
            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);

            if (PortOpen)
            {
                try
                {
                    // 获取自定义数据
                    ArtNetRecieveData recieveState = (ArtNetRecieveData)(state.AsyncState);

                    if (recieveState != null)
                    {
                        // 结束挂起的、从指定 IP 地址 进行异步读取
                        recieveState.DataLength = EndReceiveFrom(state, ref remoteEndPoint);

                        // 防止UDP环回,不接收自己发出的数据包.
                        if (remoteEndPoint != LocalEndPoint && recieveState.Valid)
                        {
                            LastPacket = DateTime.Now;

                            // 根据接收数据的 OpCode 来创建对应的 ArtNet 数据包对象并开始解析
                            ProcessPacket((IPEndPoint)remoteEndPoint, ArtNetPacket.Create(recieveState));
                        }
                    }
                }
                catch (Exception ex)
                {
                    OnUnhandledException(ex);
                }
                finally
                {
                    // 继续接收下一个数据包
                    StartRecieve();
                }
            }
        }
예제 #15
0
        void RoutePacket(ArtNetPacket packet)
        {
            if (PacketReceived != null)
            {
                PacketReceived(this, packet);
            }

            switch (packet.OpCode)
            {
            case OpCode.OpPoll:
                if (PollPacketReceived != null)
                {
                    PollPacketReceived(this, new ArtPollPacket(packet));
                }
                break;

            case OpCode.OpDmx:
                if (DmxPacketReceived != null)
                {
                    DmxPacketReceived(this, new ArtDmxPacket(packet));
                }
                break;
            }
        }
예제 #16
0
 public void Send(ArtNetPacket packet)
 {
     Send(packet, BroadcastAddress);
 }
예제 #17
0
 public void Send(ArtNetPacket packet, IPAddress destAddr)
 {
     SendTo(packet.ToArray(), new IPEndPoint(destAddr, Port));
 }
예제 #18
0
 /// <summary>
 /// Unicasts a <see cref="ArtNetPacket"/> to a recipient
 /// </summary>
 public void SendToIp(ArtNetPacket packet, IPAddress ip)
 {
     SendTo(packet.ToArray(), new IPEndPoint(ip, Port));
 }
 /// <summary>
 /// 点播方式发送 ArtNet 数据包
 /// </summary>
 /// <param name="packet">ArtNet 数据包</param>
 /// <param name="remote">目标 终结点</param>
 public void Send(ArtNetPacket packet, IPEndPoint remote)
 {
     SendTo(packet.ToArray(), remote);
 }
 /// <summary>
 /// 广播方式发送 ArtNet 数据包
 /// </summary>
 /// <param name="packet">ArtNet 数据包</param>
 public void Send(ArtNetPacket packet)
 {
     Send(packet, new IPEndPoint(BroadcastAddress, Port));
 }
예제 #21
0
 public void Send(ArtNetPacket packet, IPAddress remoteIP)
 {
     SendTo(packet.ToArray(), new IPEndPoint(remoteIP, Port));
 }
예제 #22
0
 public void Send(ArtNetPacket packet, RdmEndPoint address)
 {
     SendTo(packet.ToArray(), new IPEndPoint(address.IpAddress, Port));
 }
예제 #23
0
 public void Send(ArtNetPacket packet)
 {
     SendTo(packet.ToArray(), new IPEndPoint(BroadcastAddress, Port));
 }