Research and Development 1/^Archief/2009-2010/04/Fase 1
- 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.
Inhoud
Fase 1
Server Applicatie
Agenda Lezen
Java-code om een ical bestand te lezen en er de eerstvolgende afspraak uit te halen:
Klik om code weer te geven. | |||
---|---|---|---|
Main.java: <source lang="java"> import java.io.FileInputStream; import java.io.IOException; import net.fortuna.ical4j.data.CalendarBuilder; import net.fortuna.ical4j.model.*; /** * Main * @author Manu */ public class Main { public static void main(String[] args) { FileInputStream fin; try { fin = new FileInputStream("C:\\Users\\Manu_PC\\Desktop\\iCal_2010-03-11_19-03-25.ics"); //path naar het kalender bestand CalendarBuilder builder = new CalendarBuilder(); Calendar calendar = builder.build(fin); calendarReader calread = new calendarReader(calendar); System.out.println(calread.firstAppointment()); } catch(IOException e) { System.out.println("IOException"); } catch(net.fortuna.ical4j.data.ParserException e) { System.out.println("ParserException"); } } } </source> calenderReader.java: <source lang="java"> import java.text.ParseException; import net.fortuna.ical4j.model.*; import net.fortuna.ical4j.model.component.VFreeBusy; /** * * @author Manu */ public class calendarReader { private Calendar cal; private VFreeBusy fb; /** * Constructor * @param cal De kalender die deze calenderReader gaat lezen */ public calendarReader(Calendar cal) { this.cal = cal; DateTime start = new DateTime(); DateTime end = new DateTime(start.getTime() + 1000 * 60 * 60 * 24 * 1); VFreeBusy request = new VFreeBusy(start, end); this.fb = new VFreeBusy(request, this.cal.getComponents()); } /** * @return De VFreeBusy van deze kalender */ public VFreeBusy getFreeBusy() { return this.fb; } /** * @return de string waarin de tijden van afspraken staan uit de VFreeBusy this.fb */ private String getFreeBusyString() { String freeBusyNaam = new String("FREEBUSY:"); boolean gevonden = false; int i; for (i = 0; i < this.fb.toString().length() && !gevonden; i++) { if (this.fb.toString().regionMatches(i, freeBusyNaam, 0, freeBusyNaam.length())) { gevonden = true; } } if (gevonden) { boolean gevonden2 = false; int j; for (j = i + freeBusyNaam.length(); j < fb.toString().length() && !gevonden2; j++) { if (this.fb.toString().charAt(j) == '/') { gevonden2 = true; } } if (gevonden2) { return this.fb.toString().substring(i + freeBusyNaam.length()-1, j-1); } else { return ""; } } else { return ""; } } /** * @return De DateTime van het begin van de eerstvolgende afspraak in de calender this.cal */ public DateTime firstAppointment() { try { return new DateTime(this.getFreeBusyString()); } catch (ParseException e) { System.out.println("Parse Exception in firstAppointment, dus of getFreeBusyString werkt niet goed, of er zijn geen appointments in de komende 24 uur"); return null; } } } </source> |
Gebruikte bronnen:
Data versturen
Code om connecties (sockets) te openen en data verzenden.
Klik om code weer te geven. | |||
---|---|---|---|
Main.java: <source lang="java"> package ipv6; /** * * @author Patrick */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { Server server = new Server(); int bulbId = server.addConnection("::1", 15); int radioId = server.addConnection("::1", 16); server.sendData(radioId, "on"); server.sendData(bulbId, "off"); server.stopServer(); } }
<source lang="java"> package ipv6; import java.util.ArrayList; /** * * @author Patrick */ public class Server { private ArrayList<Connection> connections; public Server() { //start server } public void sendData(int connectionId, String data) { this.connections.get(connectionId).send(data); } public int addConnection(String address, int port) { this.connections.add(new Connection(address, port)); return this.connections.size(); } public void stopServer() { for(Connection c : this.connections ) { c.stop(); } } }
Server.java: <source lang="java"> package ipv6; import java.io.*; import java.net.*;
* * @author Patrick */ public class Connection { private int port; private Socket socket = null; private PrintWriter out = null; //private BufferedReader in = null; (not receiving data yet) private InetAddress addr = null; public Connection(String address, int port) { //create InetAddress from string address try { this.addr = InetAddress.getByName(address); } catch (UnknownHostException e) { System.out.println("Unknown host: " + e.getMessage()); System.exit(1); } //setup the connection this.setup(); } private void setup() { try { this.socket = new Socket(this.addr, this.port); this.out = new PrintWriter(this.socket.getOutputStream(), true); //this.in = new BufferedReader(new InputStreamReader(socket.getInputStream())); (not receiving data yet) } catch (UnknownHostException e) { System.out.println("Unknown host: " + e.getMessage()); System.exit(1); } catch (IOException e) { System.out.println("IO Error: " + e.getMessage()); System.exit(1); } } public void stop() { try { this.out.close(); //this.in.close(); (not receiving data yet) this.socket.close(); System.out.println("Bye!"); } catch (IOException e) { System.out.println("Server could not be stopped. (" + e.getMessage() + ")"); } catch (NullPointerException e) { //one or more sockets have not been created yet. So we don't need //to close them. } } public void send(String data) { this.out.write(data); } } </source> |
Toelichting:
Java en IPv6
In Java hoef je niet expliciet rekening te houden met IPv6. Als het OS van de server en het OS van de client IPv6 ondersteunen, kan je IPv6 adressen gebruiken op dezelfde manier als je normaal IPv4 gebruikt.
Using IPv6 in Java is easy; it is transparent and automatic. Unlike in many other languages, no porting is necessary. In fact, there is no need to even recompile the source files. [...] You can run the same bytecode for this example in IPv6 mode if both your local host machine and the destination machine (taranis) are IPv6-enabled.
(bron: http://java.sun.com/j2se/1.5.0/docs/guide/net/ipv6_guide/index.html)
Server initieert de verbinding
Momenteel zet de server een connectie op naar de client, in plaats van andersom. Dat is me handiger; een client (een lamp bijvoorbeeld) heeft niet altijd een interface waarop je kan instellen hoe je server heet. De server heeft dat natuurlijk wel. Als de server de verbinding initieert, hoeft de lamp geen schermpje te hebben (ip adres kan je uitlezen via router, eventueel wachtwoord kan de fabrikant met een stickertje op het apparaat plakken).
We evalueren nog of dit de beste aanpak is.
TCP vs. UDP
Als protocol kiezen we TCP. Het voordeel van TCP is dat het protocol error-correctie heeft, waar UDP dat niet heeft. Dat houdt dus in dat je er via TCP zeker van kan zijn dat pakketten aankomen. Dit is voor ons doel essentieel. UDP heeft snelheid als grootste voordeel. Voor ons doel is dit niet erg belangrijk. We kiezen daarom voor TCP.
Gebruikte bronnen:
Protocol
Een apparaat heeft attributen, op deze attributen kun je de volgende operaties uitvoeren: GET: Geef de waarde van het attribuut SET: Zet de waarde van het attribuut SUBSCRIBE: Meld je aan om op de hoogte te worden gehouden van veranderingen. LISTEN: Geef aan bij welke events het attribuut de waarde van het event moet krijgen. Verder is er nog: EVENT: Wordt gestuurd naar de aangemelde apparaten als dat attribuut veranderd. Attributen zitten in een tree structuur: Je kan GETs uitvoeren op "mappen", hierbij krijg je de inhoud van de map op niveau 1. Je kan GETs uitvoeren op attributen, hierbij krijg je de waarde en type van het attribuut. Je kan SETs uitvoeren op attributen, hierbij zend je de beoogte waarde in het goede type. Je kan SUBSCRIBEs uitvoeren op attributen, hierbij zend je je eigen key en IP-adres en of je wilt afmelden Je kan LISTENs uitvoeren op attributen, hierbij zend je het adres en het pad van het event waarbij het attribuut veranderd moet worden. Bericht SEND: [SIGN van ontvanger, ?? bytes][UNIXTIME, 4bytes] + voor GET: [ATTRIBUTE URI] voor SET: [ATTRIBUTE URI][TYPE][VALUE] voor SUBSCRIBE: [ATTRIBUTE URI][KEY of device to send events to][IPV6 to send events to] voor UNSUBSCRIBE: [ATTRIBUTE URI][IPV6 to send events to] voor LISTEN: [ATTRIBUTE URI to listen][ATTRIBUTE URI to change][IPV6 to listen to] voor UNLISTEN: [ATTRIBUTE URI to listen][ATTRIBUTE URI to change][IPV6 to listen to] voor EVENT: [ATTRIBUTE URI][TYPE][VALUE] Bericht RET: [SIGN van verzender, ?? bytes][UNIXTIME, 4bytes] + voor: [ATTRIBUTE URI][TYPE][VALUE]
Implementatie van het protocol
De implementatie van het protocol is verplaatst naar de Eindproduct-pagina.