1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
|
delegate void changementEtat(Equipement sender);
class Equipement
{
public Point Position;
public int iId_Equipement;
public int iAdresse_RGS;
public string sCE;
public string sAutoroute;
public string sSens_de_circulation;
public string sAdresse_IP;
public int iPort;
public string sBoucle_Terrain;
//public int iCoordonnees_X;
//public int iCoordonnees_Y;
public string sNom;
public string sConstructeur;
public IPAddress ipaddr = IPAddress.Loopback;
private int port;
private bool AddrIsValid = true;
TcpClient client = new TcpClient();
byte[] inStream = new byte[15000];
public string lastMessage = "";
private string TramesRecues = "";
public Boolean bEtat = false;
public int LocalAddr = -1;
public int DefEDF = 0;
public DateTime Date_Dernier_Message;
public event changementEtat onChange;
public bool bConnect = false;
/// <summary>
/// envoi d'un message vers le client
/// </summary>
public void Messageecrit(string message)
{
try
{
// pas d'écriture si pas connecté au client
if (!client.Connected)
{
if (!Connect()) return;
}
try
{
byte[] outstream = System.Text.Encoding.ASCII.GetBytes(message);
client.GetStream().Write(outstream, 0, outstream.Length);
}
catch
{
}
}
catch
{
}
}
/// <summary>
/// Ouvre la connection IP vers le client et lance la scrutation des flux entrants
/// </summary>
public bool Connect()
{
if (!IPAddress.TryParse(sAdresse_IP, out ipaddr)) AddrIsValid = false;
//this.port = iPort;
client.SendTimeout = 1000;
client.ReceiveTimeout = 1000;
IAsyncResult ar;
if (AddrIsValid == false) return false;
// connection
try
{
// tente une connection
ar = client.BeginConnect(sAdresse_IP, iPort, null, null);
}
catch
{
return false;
}
//attent 1 seconde
bool Success = ar.AsyncWaitHandle.WaitOne(1000, false);
// pas de lecture si pas connecté au client
if (!client.Connected) return false;
// lancement de la méthode asynchrone de lecture des flux entrants
client.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
return true;
}
/// <summary>
/// procédure appelé lors d'un flux entrant
/// </summary>
/// <param name="result"></param>
private void Fluxentrant(IAsyncResult result)
{
int nbOctetsLus;
try
{
nbOctetsLus = client.GetStream().EndRead(result);
}
catch
{
nbOctetsLus = 0;
}
if (nbOctetsLus != 0)
{
// converti les octets lus en chaine de caractère
string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
// on ajout les caractères reçus aux éventuelles trames déjà reçu précédemment
TramesRecues += returndata;
DecompositionMessagesReçus();
}
else
{
bEtat = false;
//Console.WriteLine("Etat=false");
change();
}
// relance l'écoute des flux entrants suivants
try
{
if (client.Connected)
{
IAsyncResult ar = client.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
}
}
catch
{
}
}
private void DecompositionMessagesReçus()
{
// s'il y a des ! ou des ?, on coupe pour avoir un message "complet"
while (TramesRecues.Contains("!") || TramesRecues.Contains("?"))
{
int positionOK = TramesRecues.IndexOf('!');
int positionNonOK = TramesRecues.IndexOf('?');
int pos = 0;
if (positionOK == -1) pos = positionNonOK;
else
if (positionNonOK == -1) pos = positionOK;
else pos = Math.Min(positionOK, positionNonOK);
// coupe suivant la plus petite des positions
string message = TramesRecues.Substring(0, pos + 1);
TraitementMessage(message);
TramesRecues = TramesRecues.Remove(0, message.Length-1);
}
}
private void TraitementMessage(string message)
{
try
{
lastMessage = message;
Date_Dernier_Message = DateTime.Now;
if (message.EndsWith("!"))
{
//message Ok
TraitementMessageOk(message);
bEtat = true;
}
if (message.EndsWith("?"))
{
//message non Ok
bEtat = false;
}
change();
}
catch
{
}
}
private void TraitementMessageOk(string message)
{
try
{
if (message.StartsWith("STATUS")) traitementStatus(message);
if (message.StartsWith("\r\nSTATUS")) traitementStatus(message);
}
catch
{
}
}
private void change()
{
if (onChange != null) onChange(this);
}
public Equipement()
{
}
public void scrutation()
{
Messageecrit("ST\r");
}
public void Deconnexion()
{
client.Close();
}
} |
Partager