Communication Basics - PepperDash/Essentials GitHub Wiki
In networked A/V systems, devices can use many different methods of communication: COM ports, TCP/IP sockets, Telnet, SSh. Generally, the data protocol and commands that are sent and received using any of these methods are the same, and it is not necessary for a device to know the details of the communication method it is using. A Samsung MDC protocol display in room 1 using RS232 speaks the same language as another Samsung MDC does in the next room using TCP/IP. For these, and most cases where the device doesn't need to know its communication method, we introduce the IBasicCommunication
interface.
PepperDash.Core.IBasicCommunication
PepperDash.Core.ISocketStatus
PepperDash.Core.GenericTcpIpClient
PepperDash.Core.GenericSshClient
PepperDash.Core.GenericSecureTcpIpClient
PepperDash.Essentials.Core.ComPortController
PepperDash.Essentilas.Core.StatusMonitorBase
All common communication controllers will implement the IBasicCommunication
interface, which is an extension of ICommunicationReceiver
. This defines receive events, connection state properties, and send methods. Devices that need to use COM port, TCP, SSh or other similar communication will require an IBasicCommunication
type object to be injected at construction time.
/// <summary>
/// An incoming communication stream
/// </summary>
public interface ICommunicationReceiver : IKeyed
{
event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;
bool IsConnected { get; }
void Connect();
void Disconnect();
}
/// <summary>
/// Represents a device that uses basic connection
/// </summary>
public interface IBasicCommunication : ICommunicationReceiver
{
void SendText(string text);
void SendBytes(byte[] bytes);
}
/// <summary>
/// For IBasicCommunication classes that have SocketStatus. GenericSshClient,
/// GenericTcpIpClient
/// </summary>
public interface ISocketStatus : IBasicCommunication
{
event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange;
SocketStatus ClientStatus { get; }
}
Essentials uses dependency injection concepts in its start up phase. Simply, most devices use the same methods of communication, and are often communication-agnostic. During the build-from-configuration phase, the communication method device is instantiated, and then injected into the device that will use it. Since the communication device is of IBasicCommunication
, the device controller receiving it knows that it can do things like listen for events, send text, or be notified when sockets change.
The DeviceManager will contain two new devices after this: The Cisco codec, and the codec's GenericSshClient
. This enables easier debugging of the client using console methods. Some devices like this codec will also have a StatusMonitorBase
device, for Fusion and other reporting.
ComPortController
isIBasicCommunication
as well, but methods likeConnect()
andDisconnect()
do nothing on these types.
PepperDash.Core.GenericTcpIpClient
, GenericSshClient
and some other socket controllers implement ISocketStatus
, which is an extension of IBasicCommunication
. This interface reveals connection status properties and events.
public interface ISocketStatus : IBasicCommunication
{
event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange;
SocketStatus ClientStatus { get; }
}
Classes that are using socket-based comms will need to check if the communication is ISocketStatus
and link up to the ConnectionChange
event for connection handling.