Member 11247684 Ответов: 1

Как передавать информацию между различными объектами из одного класса и других классов в качестве событий в C#


Я рисую топологию а, где каждый узел является объектом класса SensorNode, синие ссылки указывают на связи между каждым узлом и его соседями, где круги вокруг узлов представляют дальность передачи для каждого узла. Раковина также является объектом класса раковина. Мне нужно создать экземпляр обмена сообщениями и связи между ними, но я понятия не имею, какие механизмы я должен использовать для выполнения передачи сообщений между этими объектами (сенсорными узлами), где каждый узел имеет свой уникальный идентификатор, приемник имеет фиксированный идентификатор, который равен 1 в моем коде, потому что я использую только один приемник.

Ниже приведены классы, в которых я все еще застрял на том, как реализовать send receive и forward с точки зрения того, чтобы сделать эту связь применимой между этими различными объектами...

1-Класс "Сенсорнод"

class SensorNode
    {
       public int snID;
       public string snName;
       public int snDepth;
       public DateTime schedulingTime;
       public double holdingTime;
       public double energy;

       public List<int> queue11 = new List<int>();
       public List<DateTime> queue12 = new List<DateTime>();

       public List<Packet> queue21 = new List<Packet>();
       public List<DateTime> queue22 = new List<DateTime>();

       public SensorNode(int id,string name,int depth, double energy)
       {
           this.snID = id;
           this.snName = name;
           this.snDepth = depth;
           this.energy = energy;
       }

       public void insertHistoryQueue(int packetID, DateTime receivingTime)
       {
           queue11.Add(packetID);
           queue12.Add(receivingTime);
       }

       public void insertPriorityQueue(Packet packet, DateTime schedulingTime)
       {
           queue21.Add(packet);
           queue22.Add(schedulingTime);
       }

       public DateTime schedulingTimeCalculations(double holdingTime, DateTime systemTime)       
       {
           schedulingTime = DateTime.FromOADate(holdingTime).Date + systemTime.TimeOfDay;

           return schedulingTime; 
       }

       public double holdingTimeCalculations(double alpha, double depth, double beta)
       {
           holdingTime = alpha * depth + beta;

           return holdingTime; 
       }

       public void receive(Packet packet)
       {
       }

       public void forward(Packet packet, int neighborID)
       {
       }

       public void remove()
       {
       }

       public void sendDirect(int rxID, Packet packet)
       {
       }
    }


2-Класс "Раковина"


class Sink
    {
        public string name;
        public int sinkID;
        public int sinkX;
        public int sinkY;

        public List<Packet> queue1 = new List<Packet>();
        public List<DateTime> queue2 = new List<DateTime>();

        public Sink(string name, int Id , int xLocation, int yLocation)
        {
            this.name = name;
            this.sinkID = Id;
            this.sinkX = xLocation;
            this.sinkY = yLocation;
        }

        public void insert(Packet packet, DateTime receivingTime)
        {
            queue1.Add(packet);
            queue2.Add(receivingTime);
        }
    }




Любая идея, мне нужны ваши предложения и ваша помощь, так как я не знаю, как передавать информацию между этими объектами (сенсорными узлами) и между сенсорными узлами и раковиной. Что такое библиотека, которая отвечает за это приложение в C#?

Что я уже пробовал:

Для начала связи между узлами (событиями)

[no name]

Вам нужно исследовать события и делегатов.

1 Ответов

Рейтинг:
1

FranzBe

Что NotPolitcallyCorrect написал правильно. Возможно, следующее может дать вам некоторую отправную точку.

void Main()
{
	var s1 = new SensorNode(1, "don't care", 0, 0);
	var s2 = new SensorNode(2, "don't care", 0, 0);
	
	var sink = new Sink("don't care", 3, 0, 0);

	sink.AddSensor(s1);
	sink.AddSensor(s2);
	
	s1.SendNewData();
	s2.SendNewData();
	s1.SendNewData();

}


public class EventArgs<T> : EventArgs
{
	private readonly T _value;

	public EventArgs(T value)
	{
		_value = value;
	}

	public T Value
	{
		get { return _value; }
	}
}

public class Packet
{ 
	public int SensorId { get; set; }
	public string theData { get; set; }
	public Packet(int id, string data)
	{
		SensorId = id;
		theData = data;
	}
}

public interface ISensorNode
{ 
	event EventHandler<EventArgs<Packet>> DataSend;
}


class SensorNode : ISensorNode
{
	public event EventHandler<EventArgs<Packet>> DataSend;
	public int Id { get; set; }
	public SensorNode(int id,string name,int depth, double energy)
	{
		Id = id;
	}

	public void SendNewData()
	{
		Packet p = new Packet(Id, "123.4");
		var handler = DataSend;
		var args = new EventArgs<Packet>(p);
		handler?.Invoke(this, args);
	}
	
}


class Sink
{ 
	public Sink(string name, int Id , int xLocation, int yLocatio)
	{
		
	}

	public void AddSensor(ISensorNode newSensor)
	{		
		newSensor.DataSend += OnDataReceived;
	}

	private void OnDataReceived(object sender, EventArgs<Packet> e)
	{
		Packet packed = e.Value;
		Console.WriteLine($"received data {packed.theData} from sensor with id {packed.SensorId}");
	}
}