예제 #1
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();
        }
예제 #2
0
        public static new ArtTodData FromData(ArtNetData data)
        {
            var stream = new MemoryStream(data.Buffer);
            var reader = new BinaryObjectReader(stream)
            {
                Position = 10
            };

            ArtTodData packet = reader.ReadObject <ArtTodData>();

            packet.PacketData = data;

            return(packet);
        }
예제 #3
0
 public void ReceiveArtNet()
 {
     try
     {
         var localPort    = (EndPoint) new IPEndPoint(IPAddress.Any, Port);
         var recieveState = new ArtNetData();
         BeginReceiveFrom(recieveState.Buffer, 0, recieveState.BufferSize, SocketFlags.None, ref localPort, new AsyncCallback(OnRecieve), recieveState);
     }
     catch (Exception ex)
     {
         UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(
                                        new ApplicationException("An error ocurred while trying to start recieving ArtNet.", ex), false));
     }
 }
예제 #4
0
        public static ArtNetPacket FromData(ArtNetData data)
        {
            var stream = new MemoryStream(data.Buffer);
            var reader = new BinaryObjectReader(stream);

            byte[]  id   = reader.ReadBytes(8);
            OpCodes code = (OpCodes)reader.ReadInt16();

            ArtNetPacket packet = new(code);

            packet.ID         = id;
            packet.PacketData = data;

            return(packet);
        }
예제 #5
0
파일: ArtRdm.cs 프로젝트: OsOmE1/Art.Net
        public static new ArtRdm FromData(ArtNetData data)
        {
            var stream = new MemoryStream(data.Buffer);
            var reader = new BinaryObjectReader(stream)
            {
                Position = 10
            };

            ArtRdm packet = reader.ReadObject <ArtRdm>();

            packet.RdmPacket = reader.ReadBytes((int)(stream.Length - reader.Position));

            packet.PacketData = data;

            return(packet);
        }
예제 #6
0
파일: ArtRdmSub.cs 프로젝트: OsOmE1/Art.Net
        public static new ArtRdmSub FromData(ArtNetData data)
        {
            var stream = new MemoryStream(data.Buffer);
            var reader = new BinaryObjectReader(stream)
            {
                Position = 10
            };

            ArtRdmSub packet = reader.ReadObject <ArtRdmSub>();

            packet.SubCount  = (short)((packet.SubCount << 8) + (packet.SubCount >> 8));
            packet.SubDevice = (short)((packet.SubDevice << 8) + (packet.SubDevice >> 8));
            packet.Data      = packet.Data.Reverse().ToArray();

            packet.PacketData = data;

            return(packet);
        }
예제 #7
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();
        }