Research and Development 1/^Archief/2009-2010/04/Fase 2/Eindproduct
- Property "Auteur1" (as page type) with input value " Research and Development 1/^Archief/2009-2010/04Gebruiker:Tim Cooijmans" contains invalid characters or is incomplete and therefore can cause unexpected results during a query or annotation process.
- Property "Auteur2" (as page type) with input value " Research and Development 1/^Archief/2009-2010/04Gebruiker:Manu Drijvers" contains invalid characters or is incomplete and therefore can cause unexpected results during a query or annotation process.
- Property "Auteur3" (as page type) with input value " Research and Development 1/^Archief/2009-2010/04Gebruiker:Patrick Verleg" contains invalid characters or is incomplete and therefore can cause unexpected results during a query or annotation process.
- Property "Auteur4" (as page type) with input value " Research and Development 1/^Archief/2009-2010/04" contains invalid characters or is incomplete and therefore can cause unexpected results during a query or annotation process.
Eindproduct
Op deze pagina is de code van het eindproduct te vinden. Alle code is gedocumenteerd met JavaDoc.
Toelichting
De code dient twee doelen:
- Het is een proof-of-concept voor de implementatie van het protocol.
- Het is een raamwerk voor mensen die ons protocol willen implementeren.
Door op bepaalde plaatsen code toe te voegen die eigen is voor het te maken artefact, kan de code gebruikt worden voor de aansturing van dat artefact. Om de code duidelijker te maken hebben we gekozen om twee properties van een lamp toe te voegen (aan/uit en lichtintensiteit). Iemand die een ander artefact maakt zal deze code aanpassen, en wellicht nog andere code toevoegen, om zo tot een door hem of haar gewenst artefact te komen.
De documentatie
Het eindproduct is gedocumenteerd in JavaDoc. De documentatie is hier te vinden als zip-bestand. Pak het uit en kies voor index.html om de documentatie te bekijken.
De code
Klik om code weer te geven voor Main.java. | |||
---|---|---|---|
Main.java: <source lang="java"> package tiot; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * De Mainklasse verzorgt het aanmaken en instellen van het artefact (in dit * geval een lamp) en het instantiëren van de netwerkservice. Daarna worden * de attributen ingesteld die specifiek zijn aan dit artefact (een lamp) * * @author Tim Cooijmans T.J.P.M.Cooijmans@student.ru.nl * @author Manu Drijvers ManuDrijvers@student.ru.nl * @author Patrick Verleg P.Verleg@student.ru.nl */ public class Main { ExecutorService executor; /** * @param args the command line arguments */ public static void main(String[] args) { new Main(); } private Main() { //this artefact is a lightbulb Artefact bulb = new Artefact(); //create networkservice executor = Executors.newCachedThreadPool(); NetworkService ns = null; try { ns = new NetworkService(bulb); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } executor.execute(ns); //and attach it to the lightbulb bulb.attachNetworkService(ns); //set the lightbulb properties bulb.addAttribute("/light/on", true); bulb.addAttribute("/light/intensity", 0.5); } } </source> |
Klik om code weer te geven voor Artefact.java. | |||
---|---|---|---|
Artefact.java: <source lang="java"> package tiot; import java.net.InetAddress; import java.util.ArrayList; /** * De artefact-klasse representeert het artefact waarvoor dit * programma is geschreven. Er kunnen attributen aan worden toegevoegd * om de verschillende fysieke eigenschappen te representeren * * @author Tim Cooijmans T.J.P.M.Cooijmans@student.ru.nl * @author Manu Drijvers ManuDrijvers@student.ru.nl * @author Patrick Verleg P.Verleg@student.ru.nl */ public class Artefact { //de attributen van dit artefact private ArrayList<Attribute> attributes = new ArrayList(); //de listeners die luisteren naar dit artefact private ArrayList<Listener> listeners = new ArrayList(); //de networkservice waarover dit artefact kan communiceren protected NetworkService ns; /** * Zoekt een artefact op dat bij een bepaalde uri hoort. * @param uri de uri waarop gezocht moet worden * @return het attribuut dat gevonden is op de opgegeven uri, of null wanneer * er geen attribuut is gevonden. */ public Attribute getAttribute(String uri) { int size = this.attributes.size(); for (int i = 0; i<size; i++) { if (this.attributes.get(i).getUri().equals(uri)) { return this.attributes.get(i); } } return null; } /** * Voegt een attribuut met een gespecificeerde waarde toe op de opgegeven uri * @param uri de uri van het attribuut * @param value de waarde van het attribuut */ protected void addAttribute(String uri, Object value) { this.attributes.add(new Attribute(this.ns, uri, value)); } /** * Voegt een networkservice toe aan dit artefact. De networkservice is het object * waarmee dit artefact kan communiceren met de buitenwereld * @param ns de networkservice waarover de communicatie verloopt */ public void attachNetworkService(NetworkService ns) { this.ns = ns; } /** * Voegt een listener toe aan dit artefact voor de gespecificeerde remoteUri, localUri en ip. * De localUri zal veranderen naar de waarde van de remoteUri wanneer er een event ontvangen * wordt die beluisterd wordt van het opgegeven ip. * @param ip het ip waarnaar dit artefact luistert * @param remoteUri de uri van het attribuut van het verzendende artefact * @param localUri de uri van het attribuut van dit artefact */ public void addListener(InetAddress ip, String remoteUri, String localUri) { this.listeners.add(new Listener(ip, remoteUri, localUri)); } /** * Verwijdert alle listeners van dit object die naar het gespecificeerde ip, remoteUri * en localUri luisteren (dit kunnen er ook nul zijn) * @param ip het ip van de listener * @param remoteUri de remoteUri van de listener * @param localUri de localUri van de listener */ public void removeListener(InetAddress ip, String remoteUri, String localUri) { int length = this.listeners.size(); for (int i = 0; i < length; i++) { if (this.listeners.get(i).getRemoteUri().equals(remoteUri) && this.listeners.get(i).getLocalUri().equals(localUri) && this.listeners.get(i).getIp().equals(ip)) { this.listeners.remove(i); } } } /** * Veranderd de waarde van de in de (eerder toegevoegde) uri van de listener naar de waarde * van de zojuist ontvangen remoteUri van het opgegeven ip. * @param ip het ip-adres waarvan een remoteUri is gewijzigd * @param remoteUri de uri van een attribuut van het artefact dat de event heeft verstuurd * @param remoteValue de waarde die wordt ontvangen uit een event */ public void listenToEvent(InetAddress ip, String remoteUri, Object remoteValue) { int length = this.listeners.size(); for (int i = 0; i < length; i++) { if (this.listeners.get(i).getRemoteUri().equals(remoteUri) && this.listeners.get(i).getIp().equals(ip)) { String localUri = this.listeners.get(i).getLocalUri(); this.getAttribute(localUri).setValue(remoteValue); } } } }
|
Klik om code weer te geven voor Attribute.java. | |||
---|---|---|---|
Attribute.java: <source lang="java"> package tiot; import java.net.InetAddress; import java.util.ArrayList; /** * Attributen representeren de fysieke attributen van een artefact. * Hierop kan een ander artefact subscriben: dit artefact wordt dan * op de hoogte gesteld van wijzigingen van de waarde van dit attribuut. * * @author Tim Cooijmans T.J.P.M.Cooijmans@student.ru.nl * @author Manu Drijvers ManuDrijvers@student.ru.nl * @author Patrick Verleg P.Verleg@student.ru.nl */ public class Attribute { //de subscribtions voor dit attribute private ArrayList<InetAddress> subscriptions = new ArrayList(); //de value van dit attribute private Object value; //de uri via waar dit attribute te bereiken is private String uri; //de networkservice waarover dit attribute kan communiceren private NetworkService ns; /** * Maakt een attribuut die zijn berichten verzend over de opgegeven networkService, * op de gegeven uri, met standaardwaarde value * @param ns de networkservice * @param uri de uri van het attribuut * @param value de standaardwaarde van het attribuut */ Attribute(NetworkService ns, String uri, Object value) { this.ns = ns; this.uri = uri; this.setValue(value); } /** * Stelt de waarde van dit attribuut in, en stelt eventuele subscribers * op de hoogte * @param value de nieuwe waarde van dit attribuut */ public void setValue(Object value) { //only notify when the value has really changed if (value.equals(this.value)) { return; } int size = this.subscriptions.size(); for (int i = 0; i<size; i++) { InetAddress ip = this.subscriptions.get(i); this.ns.sendEvent(ip, this.uri, value); } this.value = value; } /** * Geeft de waarde van dit attribuut * @return de waarde van dit attribuut */ public Object getValue() { return this.value; } /** * Geeft de uri van dit attribuut * @return de uri van dit attribuut */ public Object getUri() { return this.uri; } /** * Voegt een subscribtion toe voor dit attribuut, met het opgegeven ip-adres * en de opgegeven key. Deze worden in de KeyStorage opgeslagen * @param ip het ip-adres waarnaar een bericht moet worden gestuurd bij verandering * @param key de key die gebruikt moet worden bij het versturen van het bericht */ public void addSubscription(InetAddress ip, String key) { //Each ip can only have one subscription per attribute. Double subscriptions have to fail silently. if (!this.subscriptions.contains(ip)) { this.subscriptions.add(ip); this.ns.getKeyStorage().addKey(ip, key); } } /** * Verwijdert een subscription voor een gespecificeerd ip * @param ip het ip waarvan de subscription verwijderd moet worden */ public void removeSubscription(InetAddress ip) { //Fail silently when removing an ip that is not subscribed to this attribute. if (this.subscriptions.contains(ip)) { this.subscriptions.remove(ip); this.ns.getKeyStorage().removeKey(ip); } } }
|
Klik om code weer te geven voor KeyStorage.java. | |||
---|---|---|---|
KeyStorage.java: <source lang="java"> package tiot; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; /** * Het protocol maakt gebruik van private en public keys. * In de keystorage worden deze keys opgeslagen. Ook zijn hier * enkele veelgebruikte functies te vinden die betrekking hebben * op de keys. * * @author Tim Cooijmans T.J.P.M.Cooijmans@student.ru.nl * @author Manu Drijvers ManuDrijvers@student.ru.nl * @author Patrick Verleg P.Verleg@student.ru.nl */ public class KeyStorage { //de private key van dit artefact. Deze dient geheim te zijn. public static final String PRIVATEKEY = "RZ2TTKQ6LAJ8STE658WO"; //in keyStorage worden de keys opgeslagen, gekoppeld aan de ip-adressen. private HashMap keyStorage = new HashMap(); /** * De constructor van de KeyStorage heeft enkele keys voorgedefineerd. Normaal * moet men deze keys op de interface van het aparaat invoeren. */ KeyStorage() { try { this.keyStorage.put(InetAddress.getByName("95.96.171.001"), "4A3EU5H729TFFMN0OC4P"); this.keyStorage.put(InetAddress.getByName("95.96.171.002"), "RYRBZ2HZ2LJ5EOECVKFK"); this.keyStorage.put(InetAddress.getByName("95.96.171.003"), "9CVQW87BJYMYJJB49WSO"); this.keyStorage.put(InetAddress.getByName("95.96.171.004"), "D0M7T7LPL3O5RXJCQ4P6"); } catch (UnknownHostException ex) { Logger.getLogger(KeyStorage.class.getName()).log(Level.SEVERE, null, ex); } } /** * Zoekt een key op die bij een meegegeven ip-adres hoort. * @param ip het ip-adres waar de key van opgezocht dient te worden * @return de opgezochte key */ public String getKey(InetAddress ip) { if (this.keyStorage.containsKey(ip)) { return (String) this.keyStorage.get(ip); } else { return null; } } /** * Maakt een md5-hash van de opgegeven key en de opgegeven unix timestamp * @param key de key * @param utime de unix timestamp * @return de resulterende md5-hash */ public static String createHash(String key, String utime) { return KeyStorage.MD5(key + utime); } /** * Maakt een md5-hash van het opgegeven ip-adres en de opgegeven unix timestamp * @param ip het ip-adres * @param utime de unix timestamp * @return de resulterende md5-hash */ public String createHash(InetAddress ip, String utime) { return KeyStorage.MD5(this.getKey(ip) + utime); } /** * Codeert de opgegeven string volgens het MD5 algoritme. Zie http://tools.ietf.org/html/rfc1321. * @param string de string die omgezet moet worden * @return de resulterende string */ public static String MD5(String string) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] array = md.digest(string.getBytes()); StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; ++i) { sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); } return sb.toString(); } catch (java.security.NoSuchAlgorithmException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } return null; } /** * Voegt een ip-key-combinatie toe aan de KeyStorage * @param ip het ip van de combinatie * @param key de key van de combinatie */ public void addKey(InetAddress ip, String key) { //Each ip can only have one subscription per attribute. Double subscriptions have to fail silently. if (!this.keyStorage.containsKey(ip)) { this.keyStorage.put(ip, key); } } /** * Verwijdert een ip-key-combinatie uit de KeyStorage * @param ip het ip van de te verwijderen key */ public void removeKey(InetAddress ip) { //Fail silently when removing an ip that is not subscribed to this attribute. if (this.keyStorage.containsKey(ip)) { this.keyStorage.remove(ip); } } }
|
Klik om code weer te geven voor NetHandler.java. | |||
---|---|---|---|
NetHandler.java: <source lang="java"> package tiot; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; /** * De NetHandler regelt het ontvangen en parsen van berichten van een binnenkomende * connectie. Voor elke binnenkomende connectie wordt een apparte thread aangemaakt. * * @author Tim Cooijmans T.J.P.M.Cooijmans@student.ru.nl * @author Manu Drijvers ManuDrijvers@student.ru.nl * @author Patrick Verleg P.Verleg@student.ru.nl */ class NetHandler implements Runnable { //Het interval waarop gekeken moet worden voor nieuwe berichten private static final int POLLINGINTERVAL = 50; //interval in ms. //het artefact waarvoor de NetworkService berichten verzendt private Artefact artefact; //de networkService waarover berichten moeten worden verstuurd private NetworkService ns; private final Socket socket; private BufferedReader in; /** * Maakt een nieuwe handler aan die omgaat met een binnenkomende verbinding. * @param ns de networkservice * @param artefact het artefact waarvoor deze nethandler berichten parsed * @param socket de socket voor de nethandler */ NetHandler(NetworkService ns, Artefact artefact, Socket socket) { this.ns = ns; this.artefact = artefact; this.socket = socket; try { this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); } catch (IOException ex) { Logger.getLogger(NetHandler.class.getName()).log(Level.SEVERE, null, ex); } } /** * kijkt elke interval of er nieuwe berichten zijn, en parsed die berichten. */ public void run() { System.out.println("Client connected."); while (true) { //sleep for a while try { Thread.sleep(POLLINGINTERVAL); } catch (InterruptedException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } //receive messages try { if (this.in.ready()) { String message = in.readLine(); if ((message != null) && (message.length() != 0)) { this.parseMessage(message); } } } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } } /** * Controleert aan de hand van ons protocol of een bericht van een geautenticeerde * afzender is. * @param pkey de public key uit het bericht * @param utime de unix timestamp uit het bericht * @return bericht wel of niet geldig */ private boolean validateMessage(String pkey, String utime) { //unix timestamp valid (in right time range)? int sendTime = Integer.parseInt(utime); int receiveTime = (int) (System.currentTimeMillis() / 1000L); if (Math.abs(sendTime-receiveTime) > 60*30) { return false; } //calculate and match hashes String md5 = KeyStorage.createHash(KeyStorage.PRIVATEKEY, utime); if (!md5.toString().equals(pkey)) { return false; } //passed all tests. Message is valid. return true; } /** * Parseert een bericht volgens het protocol * @param msg het bericht dat geparseerd moet worden */ private void parseMessage(String msg) { String[] msgPart = msg.split("\\|"); //A message always needs a type, unix timestamp and public key if (msgPart.length < 3) { return; } //validate message if (!this.validateMessage(msgPart[1], msgPart[2])) { return; } //Code to execute when a RET was recieved if (msgPart[0].equals("R") && msgPart.length == 4) { //Artefact's designer can add some custom logic for a return here. } //Code to execute when an EVENT was recieved. In addition to custom logic, notify all //listeners else if (msgPart[0].equals("E") && msgPart.length == 5) { //Artefact's designer can add some custom logic for an event here. //Change properties from listened-to attributes (if any) this.artefact.listenToEvent(this.socket.getInetAddress(), msgPart[3], msgPart[4]); } //When a GET was received, send a message with the asked value else if (msgPart[0].equals("G") && msgPart.length == 4) { try { int time = (int) (System.currentTimeMillis() / 1000L); String hash = this.ns.getKeyStorage().getKey(this.socket.getInetAddress()); this.ns.sendMessage(this.socket.getInetAddress(), "R|" + hash + "|" + time + "|" + msgPart[3] + "|" + this.artefact.getAttribute(msgPart[3]).getValue()); } catch (NullPointerException ex) {} //fail silently on unknown attributes catch (IOException ex) {} //fail silently on unknown attributes } //When a SET was received, set the value of the specified uri to the specified value else if (msgPart[0].equals("S") && msgPart.length == 5) { try { this.artefact.getAttribute(msgPart[3]).setValue(msgPart[4]); } catch (NullPointerException ex) {} //fail silently on unknown attributes } //When a SUBSCRIBE was received, execute a subscription else if (msgPart[0].equals("SU") && msgPart.length == 6) { InetAddress notifyAddr; try { notifyAddr = InetAddress.getByName(msgPart[5]); this.artefact.getAttribute(msgPart[3]).addSubscription(notifyAddr, msgPart[4]); } catch (UnknownHostException ex) {} //fail silenty on misformed hostname catch (NullPointerException ex) {} //fail silently on unknown attributes } //When a UBSUBSCRIBE was received, execute a unsubscription else if (msgPart[0].equals("US")) { InetAddress notifyAddr; try { notifyAddr = InetAddress.getByName(msgPart[4]); this.artefact.getAttribute(msgPart[3]).removeSubscription(notifyAddr); } catch (UnknownHostException ex) {} //fail silenty on misformed hostname catch (NullPointerException ex) {} //fail silently on unknown attributes } //When a LISTEN was received, execute a listen for the specified uri, ip and localuri else if (msgPart[0].equals("LI") && msgPart.length == 6) { try { this.artefact.addListener(InetAddress.getByName(msgPart[5]), msgPart[3], msgPart[4]); } catch (UnknownHostException ex) { Logger.getLogger(NetHandler.class.getName()).log(Level.SEVERE, null, ex); } } //When an UNLISTEN was received, execute a unlisten for the specified uri, ip and localuri else if (msgPart[0].equals("IL") && msgPart.length == 6) { try { this.artefact.addListener(InetAddress.getByName(msgPart[5]), msgPart[3], msgPart[4]); } catch (UnknownHostException ex) { Logger.getLogger(NetHandler.class.getName()).log(Level.SEVERE, null, ex); } } } }
|
Klik om code weer te geven voor NetworkService.java. | |||
---|---|---|---|
NetworkService.java: <source lang="java"> package tiot; import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; import java.util.Random; /** * De NetworkService regelt het verzenden van berichten het en accepteren van nieuwe * connecties. De NetworkService is een apparte thread, en maakt * nog een NetHandler-thread aan voor elke binnenkomende connectie. * * @author Tim Cooijmans T.J.P.M.Cooijmans@student.ru.nl * @author Manu Drijvers ManuDrijvers@student.ru.nl * @author Patrick Verleg P.Verleg@student.ru.nl */ public class NetworkService implements Runnable { //de poort waarop de dienst draait public final static int PORT = 28191; //het maximale aantal verbindingen public final static int POOLSIZE = 1024; //het artefact waarvoor de NetworkService berichten verzendt private Artefact artefact; //de keystorage waarin de ip-key-combinaties staan. private KeyStorage ks; private Random random; private final ServerSocket serverSocket; private final ExecutorService pool; private PrintWriter out; private Socket outSocket; /** * Maakt een networkservice aan voor het opgegeven artefact * @param artefact het artefact waarvoor deze networkservice werkt * @throws IOException Exceptie wanneer de socket niet geopend kon worden */ public NetworkService(Artefact artefact) throws IOException { this.ks = new KeyStorage(); this.artefact = artefact; this.serverSocket = new ServerSocket(PORT); this.pool = Executors.newFixedThreadPool(POOLSIZE); this.random = new Random(); } /** * Stuurt een bericht naar remoteIp. * @param remoteIp het ip waarna het bericht verstuurd moet worden * @param message het te versturen bericht. Dit moet opgesteld zijn volgens het protocol. * @throws IOException Er wordt een exception gegooid waneer het bericht niet verzonden kan worden */ public void sendMessage(InetAddress remoteIp, String message) throws IOException { //pick a random port number between 3,000 and 20,000. int localPort = this.random.nextInt(17000) + 3000; try { this.outSocket = new Socket(remoteIp, PORT, InetAddress.getLocalHost(), localPort); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.WARNING , null, ex); } this.out = new PrintWriter(outSocket.getOutputStream(), true); //send message this.out.print(message); //and close output buffer and socket this.out.close(); this.outSocket.close(); } /** * Stuurt een GET (zoals gedefineerd in het protocol) voor een attribuut op een uri * naar een bepaald ip. * @param ip ip van het ontvangende artefact * @param uri de uri van de attribuut */ public void sendGet(InetAddress ip, String uri) { Long time = System.currentTimeMillis() / 1000L; try { this.sendMessage(ip, "G|" + this.ks.createHash(ip, time.toString()) + "|" + time.toString() + "|" + uri); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } /** * Stuurt een SET (zoals gedefineerd in het protocol) voor een attribuut op een uri * naar een bepaald ip. * @param ip ip van het ontvangende artefact * @param uri de uri van het attribuut * @param newValue de nieuwe waarde van het attribuut */ public void sendSet(InetAddress ip, String uri, Object newValue) { Long time = System.currentTimeMillis() / 1000L; try { this.sendMessage(ip, "S|" + this.ks.createHash(ip, time.toString()) + "|" + time.toString() + "|" + uri + "|" + newValue); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } /** * Stuurt een SUBSCRIBE (zoals gedefineerd in het protocol) voor een attribuut op een uri * naar een bepaald ip. Er wordt meegegeven voor welk IP en met welke bijbehorende key de SUBSCRIBE geldt. * @param ip ip van het ontvangende artefact * @param uri de uri van het artefact waarvoor de subscribtion geldt * @param key de key waarvoor de subscribtion geldt * @param remoteIp het ip waarvoor de subscribtion geldt */ public void sendSubscribe(InetAddress ip, String uri, String key, InetAddress remoteIp) { Long time = System.currentTimeMillis() / 1000L; try { this.sendMessage(ip, "SU|" + this.ks.createHash(ip, time.toString()) + "|" + time.toString() + "|" + uri + "|" + key + "|" + remoteIp.toString()); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } /** * Stuurt een UNSUBSCRIBE (zoals gedefineerd in het protocol) voor een attribuut op een uri * naar een bepaald ip. Er wordt meegegeven voor welk IP de SUBSCRIBE geldt. * @param ip ip van het ontvangende artefact * @param uri de uri van het attribuut waarvoor de ubsubscribe geldt * @param remoteIp het ip waarvoor de unsubscribe geldt */ public void sendUnsubscribe(InetAddress ip, String uri, InetAddress remoteIp) { Long time = System.currentTimeMillis() / 1000L; try { this.sendMessage(ip, "US|" + this.ks.createHash(ip, time.toString()) + "|" + time.toString() + "|" + uri + "|" + remoteIp.toString()); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } /** * Stuurt een LISTEN (zoals gedefineerd in het protocol) voor een attribuut op een uri * naar een bepaald ip. Er wordt meegegeven voor welk IP en welke lokale uri de SUBSCRIBE geldt. * @param ip ip van het ontvangende artefact * @param uri de uri van het attribuut * @param localUri de lokale uri die veranderd moet worden * @param remoteIp het ip-adres waarvoor de LISTEN geldt */ public void sendListen(InetAddress ip, String uri, String localUri, InetAddress remoteIp) { Long time = System.currentTimeMillis() / 1000L; try { this.sendMessage(ip, "LI|" + this.ks.createHash(ip, time.toString()) + "|" + time.toString() + "|" + uri + "|" + localUri + "|" + remoteIp.toString()); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } /** * Stuurt een UNLISTEN (zoals gedefineerd in het protocol) voor een attribuut op een uri * naar een bepaald ip. Er wordt meegegeven voor welk IP en welke lokale uri de SUBSCRIBE geldt. * @param ip ip van het ontvangende artefact * @param uri de uri van het attribuut * @param localUri de lokale uri die veranderd moet worden * @param remoteIp het ip-adres waarvoor de UNLISTEN geldt */ public void sendUnlisten(InetAddress ip, String uri, String localUri, InetAddress remoteIp) { Long time = System.currentTimeMillis() / 1000L; try { this.sendMessage(ip, "IL|" + this.ks.createHash(ip, time.toString()) + "|" + time.toString() + "|" + uri + "|" + localUri + "|" + remoteIp.toString()); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } /** * Stuurt een EVENT (zoals gedefineerd in het protocol) voor een attribuut op een uri * naar een bepaald ip. Er wordt meegegeven welke waarde is veranderd, en wat de nieuwe waarde is. * @param ip ip van het ontvangende artefact * @param uri de uri van het attribuut dat is gewijzigd * @param value de nieuwe waarde van de uri */ public void sendEvent(InetAddress ip, String uri, Object value) { Long time = System.currentTimeMillis() / 1000L; try { this.sendMessage(ip, "E|" + this.ks.createHash(ip, time.toString()) + "|" + time.toString() + "|" + uri + "|" + value); } catch (IOException ex) { Logger.getLogger(NetworkService.class.getName()).log(Level.SEVERE, null, ex); } } /** * Blijft continue kijken of er nieuwe connecties wachten op geaccepteerd te worden. */ public void run() { try { while (true) { pool.execute(new NetHandler(this, this.artefact, serverSocket.accept())); } } catch (IOException ex) { pool.shutdown(); } } /** * Geeft de keystorage * @return de keystorage */ public KeyStorage getKeyStorage() { return this.ks; } } </source> |
Klik om code weer te geven voor Listener.java. | |||
---|---|---|---|
Listener.java: <source lang="java"> package tiot; import java.net.InetAddress; /** * Listener is een object dat de combinatie van ip, remoteUri en localUri bevat. * Listeners worden gebruikt om aan te geven naar welke waarde een attribuut met * een locale uri moet krijgen bij het wijzigen van een bepaalde remote uri (uri van * een ander artefact) van een bepaald ip. Voorbeeld: als op het ip van de schakelaar, de * property '/knop/aanuit1' wijzigt, dan moet lokaal het attribuut '/lamp/aan' wijzigen. * * @author Tim Cooijmans T.J.P.M.Cooijmans@student.ru.nl * @author Manu Drijvers ManuDrijvers@student.ru.nl * @author Patrick Verleg P.Verleg@student.ru.nl */ public class Listener { private String remoteUri, localUri; private InetAddress ip; /** * Maakt een listener voor het opgegeven ip, remoteUri en localUri * @param ip het ip waarvan events worden geaccepteerd * @param remoteUri de uri waarnaar geluisterd wordt * @param localUri de lokale uri die aangepast wordt */ Listener(InetAddress ip, String remoteUri, String localUri) { this.ip = ip; this.remoteUri = remoteUri; this.localUri = localUri; } /** * Levert de remoteUri op van dit listener-object * @return de remoteUri */ public String getRemoteUri() { return this.remoteUri; } /** * Levert het ip op van dit listener-object * @return het ip */ public InetAddress getIp() { return this.ip; } /** * Levert de localUri op van dit listener-object * @return de localUri */ public String getLocalUri() { return this.localUri; } }
|