enkel key
[energimaaling.git] / sentral / PdaInstans.cs
blob69b79267ee18ba8367e453b79f6f301b046cee09
1 using System;
3 using System.Text;
4 using System.Net;
5 using System.Net.Sockets;
6 using System.Threading;
7 using System.Security.Cryptography;
8 using System.Collections.Generic;
10 using System.IO;
12 using energimaaling;
14 namespace sentral
16 public class PdaInstans
18 public enum StateType { UNCONNECTED, UNAUTHENTICATED, AUTHENTICATED };
20 private TcpClient tcpClient;
21 private NetworkStream ns;
23 private Thread PdaInsP;
25 private StateType state = StateType.UNAUTHENTICATED;
27 private static volatile List<Hus> HusData;
28 public volatile Hus hus;
30 public PdaInstans (TcpClient tc, ref List<Hus> hd)
32 tcpClient = tc;
33 HusData = hd;
34 ns = tc.GetStream ();
37 log ("Starter tråd..");
38 PdaInsP = new Thread (new ThreadStart (PdaInstansP));
39 PdaInsP.Start ();
43 private void PdaInstansP ()
45 /* TODO: Takle kommunikasjon frå Pda
47 * 1. Autentiser
48 * 2. Vent på kommando
49 * 3. Oppretthold kontakt
50 * 4. Lukk og slett frå HusData liste om kontakt er broten (Event)
54 bool run = true;
56 while (run) {
57 TCPKomm.TCPMelding tm;
59 try {
60 tm = TCPKomm.MottaMelding (ns);
62 } catch (Exception e) {
63 log ("Tilkobling brutt: " + e.Message);
64 break;
67 /* Skriv DEBUG til skjerm uansett tilstand */
68 if (tm.type == TCPKomm.Type.DEBUG) {
69 TCPKomm.Debug d = (TCPKomm.Debug)Serialiser.Deserialize(tm.data, typeof(TCPKomm.Debug));
70 log ("[DEBUG] " + d.msg);
72 } else {
74 switch (state)
76 case StateType.UNAUTHENTICATED:
77 if (tm.type == TCPKomm.Type.AuthQuery) {
78 TCPKomm.AuthQuery aq = (TCPKomm.AuthQuery) Serialiser.Deserialize (tm.data, typeof (TCPKomm.AuthQuery));
79 foreach (Hus h in HusData) {
80 if (h.Kundenr == aq.kundenr) {
81 if (h.CheckPassword (aq.passord)) {
82 hus = h;
83 state = StateType.AUTHENTICATED;
88 // response
89 TCPKomm.TCPMelding tr;
90 tr.type = TCPKomm.Type.AuthResponse;
91 TCPKomm.AuthResponse ar;
92 if (state == StateType.AUTHENTICATED) ar.Accepted = true;
93 else ar.Accepted = false;
94 tr.data = Serialiser.Serialize (ar);
96 // send
97 TCPKomm.SendMelding (ns, tr);
99 log ("Autentikasjonsforsøk, godkjent: " + ar.Accepted.ToString ());
100 run = ar.Accepted; // Lukk dersom ikkje godkjent.
102 } else {
103 TCPKomm.TCPMelding res = new TCPKomm.TCPMelding ();
104 res.type = TCPKomm.Type.Error;
105 TCPKomm.Error err = new TCPKomm.Error();
106 err.et = TCPKomm.ErrorType.UnexpectedData;
107 res.data = Serialiser.Serialize(err);
108 TCPKomm.SendMelding (ns, res);
110 break;
113 case StateType.AUTHENTICATED:
115 switch (tm.type)
117 case TCPKomm.Type.PdaQuery:
118 TCPKomm.TCPMelding tres;
119 tres.type = TCPKomm.Type.PdaData;
121 TCPKomm.PdaData pd;
122 pd.adresse = hus.Adresse;
123 pd.alarm = hus.TempAlarm;
124 pd.effekt = hus.Effekt;
125 pd.navn = hus.Navn;
126 pd.reduser = Hus.Reduser;
128 tres.data = Serialiser.Serialize (pd);
130 TCPKomm.SendMelding (ns, tres);
132 break;
134 case TCPKomm.Type.Close:
135 TCPKomm.Close cm = (TCPKomm.Close) Serialiser.Deserialize (tm.data, typeof (TCPKomm.Close));
136 log ("Lukker: " + cm.msg);
137 run = false;
138 this.Shutdown ();
139 break;
140 default:
141 /* Alle andre er feile */
142 TCPKomm.TCPMelding tcl;
143 tcl.type = TCPKomm.Type.Close;
144 TCPKomm.Close c;
145 c.msg = "Feil data.";
146 tcl.data = Serialiser.Serialize (c);
148 try {
149 TCPKomm.SendMelding (ns, tcl);
150 } catch { }
152 run = false;
153 this.Shutdown ();
154 break;
157 break;
162 tcpClient.Close ();
165 public void Shutdown ()
167 // response
168 TCPKomm.TCPMelding tr;
169 tr.type = TCPKomm.Type.Close;
170 TCPKomm.Close c;
171 c.msg = ("Shutting down.");
172 tr.data = Serialiser.Serialize (c);
173 try {
174 TCPKomm.SendMelding (ns, tr);
175 } catch { }
177 tcpClient.Close ();
178 PdaInsP.Abort ();
181 public StateType State {
182 get { return state; }
185 private void log (String s) {
186 Console.WriteLine ("[PdaInstans] [" + state.ToString () + "] " + s);