public void SendBackgroundRdm(RdmPacket packet) { if (!IsTcpConnectionAlive()) { throw new InvalidOperationException("No healthy TCP connection exists for RDMNet broadcast."); } //Fill in addition details packet.Header.SourceId = RdmSourceId; packet.Header.DestinationId = UId.Broadcast; //Create Rdm Packet MemoryStream rdmData = new MemoryStream(); RdmBinaryWriter rdmWriter = new RdmBinaryWriter(rdmData); //Write the RDM sub-start code. rdmWriter.Write((byte)RdmVersions.SubMessage); //Write the RDM packet RdmPacket.WritePacket(packet, rdmWriter); //Write the checksum rdmWriter.WriteNetwork((short)RdmPacket.CalculateChecksum(rdmData.GetBuffer())); //Create sACN Packet RdmNetPacket dmxPacket = new RdmNetPacket(); dmxPacket.Framing.SourceName = SourceName; dmxPacket.Framing.EndpointID = (short)0; dmxPacket.RdmNet.RdmData = rdmData.GetBuffer(); AliveTcpSocket.SendPacket(dmxPacket); RaiseRdmPacketSent(new NewPacketEventArgs <RdmPacket>(null, packet)); }
/// <summary> /// Processes the packet that have been recieved and allocated to this filter. /// </summary> /// <param name="source">The source IP address of the packet.</param> /// <param name="header">The header information for the ACN packet.</param> /// <param name="data">The data reader for the remaining packet data.</param> /// <remarks> /// Only packets that have supported protocol ID's will be sent to this function. /// </remarks> void IProtocolFilter.ProcessPacket(IPEndPoint source, AcnRootLayer header, AcnBinaryReader data) { RdmNetPacket newPacket = AcnPacket.ReadPacket(header, data) as RdmNetPacket; if (newPacket != null) { RdmBinaryReader dmxReader = new RdmBinaryReader(new MemoryStream(newPacket.RdmNet.RdmData)); //Skip Start Code and sub-start code dmxReader.BaseStream.Seek(1, SeekOrigin.Begin); RdmPacket rdmPacket = RdmPacket.ReadPacket(dmxReader); RaiseNewRdmPacket(new RdmEndPoint(source, newPacket.Framing.EndpointID), rdmPacket); } }
public void SendRdm(RdmPacket packet, RdmEndPoint targetAddress, UId targetId, UId sourceId) { if (BlockRDM) { return; } //Fill in addition details packet.Header.SourceId = sourceId; packet.Header.DestinationId = targetId; SubDeviceUId id = targetId as SubDeviceUId; if (id != null) { packet.Header.SubDevice = id.SubDeviceId; } //Create Rdm Packet MemoryStream rdmData = new MemoryStream(); RdmBinaryWriter rdmWriter = new RdmBinaryWriter(rdmData); //Write the RDM sub-start code. rdmWriter.Write((byte)RdmVersions.SubMessage); //Write the RDM packet RdmPacket.WritePacket(packet, rdmWriter); //Write the checksum rdmWriter.WriteNetwork((short)RdmPacket.CalculateChecksum(rdmData.GetBuffer()) + (byte)DmxStartCodes.RDM); //Create sACN Packet RdmNetPacket dmxPacket = new RdmNetPacket(); dmxPacket.Framing.SourceName = SourceName; dmxPacket.Framing.EndpointID = (short)targetAddress.Universe; dmxPacket.RdmNet.RdmData = rdmData.GetBuffer(); SendPacket(dmxPacket, targetAddress); RaiseRdmPacketSent(new NewPacketEventArgs <RdmPacket>(targetAddress, packet)); }