(WS19-01)Wetterballon Entwicklung: Unterschied zwischen den Versionen

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche
Zeile 23: Zeile 23:
 
+ potentiell beste Performance
 
+ potentiell beste Performance
 
+ maximale Kontrolle
 
+ maximale Kontrolle
+ Unabhängigkeit von I2C-Bibliotheken -> bessere Portabilität bei identischem Prozessor aber unterschiedlichen OSs
+
+ Unabhängigkeit von I2C-Bibliotheken -> bessere Portabilität bei identischem Prozessor auf unterschiedlichen Betriebssystemen
 
o root-only
 
o root-only
 
- komplexer -> fehleranfälliger, zeitraubender, aber es gibt eine gute Vorlage zur Implementierung
 
- komplexer -> fehleranfälliger, zeitraubender, aber es gibt eine gute Vorlage zur Implementierung
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Nach der Abwägung der Vor- und Nachteile haben wir uns für eine Implementierung mittels der bcm2835-Bibliothek entschieden, da uns die bessere Performance den größten Vorteil bei der Erfüllung der Anforderungen bietet, auch wenn darunter die Benutzerfreundlichkeit leidet.
+
Nach der Abwägung der Vor- und Nachteile haben wir uns für eine Implementierung mittels der bcm2835-Bibliothek entschieden, da uns die bessere Performance den größten Vorteil bei der Erfüllung der Anforderungen bot, auch wenn die Benutzerfreundlichkeit darunter litt.
  
 +
== Versenden einer SMS über den Pi ==
 +
Um die Bergung nach der Landung zu vereinfachen, haben wir die GPS-Daten regelmäßig per SMS übermittelt. Neben dem Pi und dem GPS-Modul benötigten wir einen USB-Dongle (Huawei E3372), eine Sim-Karte und folgende Softwarepakete für den Pi:
  
== Versenden einer SMS über den Pi ==
 
Um die Bergung nach der Landung zu vereinfachten, werden wir die GPS-Daten regelmäßig übermitteln. Als erste Variante nutzen wir dazu SMS. Neben dem Pi und dem GPS-Modul benötigen wir einen USB-Dongle (Huawei E3372), eine Sim-Karte und folgende Softwarepakete für den Pi:
 
 
usb-modeswitch
 
usb-modeswitch
 
usb-modeswitch-data
 
usb-modeswitch-data
Zeile 39: Zeile 38:
  
 
Da der USB-Surfstick vom Pi nur als Massenspeicher erkannt wird, muss dieser in den Modem-Modus gewechselt werden:
 
Da der USB-Surfstick vom Pi nur als Massenspeicher erkannt wird, muss dieser in den Modem-Modus gewechselt werden:
 +
 
<syntaxhighlight>
 
<syntaxhighlight>
 
sudo usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000011062000000100000000000000000000'  
 
sudo usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000011062000000100000000000000000000'  
 
</syntaxhighlight>
 
</syntaxhighlight>
Die passenden Werte für -v und -p können über das Terminal mittels lsusb ermittelt werden.
 
  
Leider hat diese Methode unseren Stick nicht in den passenden Modus überführt. Für den passenden Modus muss zusätzlich unter ''/ets/usb_modeswitch.d/'' eine Datei mit dem Namen ''12d1:1f01''und folgendem Inhalt angelegt werden:
+
Die passenden Werte für -v und -p können über das Terminal mittels <code>lsusb</code> ermittelt werden.
 +
 
 +
Leider hat diese Methode unseren Stick nicht in den passenden Modus gebracht. Es musste zusätzlich unter ''/ets/usb_modeswitch.d/'' eine Datei mit dem Namen ''12d1:1f01''und folgendem Inhalt angelegt werden:
 +
 
 
<syntaxhighlight>
 
<syntaxhighlight>
 
# Huawei E3372 (fallback mode)
 
# Huawei E3372 (fallback mode)
Zeile 52: Zeile 54:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Nun sollten alle notwendigen Schritte erledigt sein und der Pi kann SMS verschicken. Dazu muss einfach nur eine Datei in den Ordner ''/var/spool/sms/outgoing/'' verschoben werden.
+
Nun kann der Pi eine SMS verschicken. Dazu muss einfach nur eine Datei in den Ordner ''/var/spool/sms/outgoing/'' verschoben werden. Zu beachten ist dabei, dass die Datei nach folgendem Schema aufgebaut ist.
Zu beachten ist dabei, dass die Datei nach folgendem Schema aufgebaut ist.
 
  
 
<syntaxhighlight>
 
<syntaxhighlight>
Zeile 62: Zeile 63:
  
 
Eine kleine Funktion zum Testen:
 
Eine kleine Funktion zum Testen:
 +
 
<syntaxhighlight lang = "c">
 
<syntaxhighlight lang = "c">
  
Zeile 71: Zeile 73:
 
#include <string.h>
 
#include <string.h>
  
void send(char *message){
+
void send(char *message) {
 +
 
 
int fd_to, geschrieben;
 
int fd_to, geschrieben;
 
char *path = "/var/spool/sms/outgoing/data.txt";
 
char *path = "/var/spool/sms/outgoing/data.txt";
  
 
fd_to = open(path, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
 
fd_to = open(path, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
 +
 
if (fd_to == -1) {
 
if (fd_to == -1) {
 +
 
printf("Error opening file");
 
printf("Error opening file");
 
return;
 
return;
 
}
 
}
 +
 
printf("Größe: %d\n", strlen(message));
 
printf("Größe: %d\n", strlen(message));
 
printf("Geöffnet\n");
 
printf("Geöffnet\n");
Zeile 93: Zeile 99:
 
}
 
}
  
int main(int argc, char *argv[])
+
int main(int argc, char *argv[]) {
{
+
 
send("Hallo Freunde");
+
send("Hallo Welt");
 
return 0;
 
return 0;
 
}
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>

Version vom 11. Februar 2020, 17:11 Uhr

Formalia

C-Styleguide

CSV-Format

Doxygen

Implementierung

Als Implementierungssprache standen Python und C zur Auswahl. Unsere Wahl fiel auf C, da damit alle Gruppenmitglieder schon erste Erfahrungen sammeln konnten. Zur Ansteuerung der über I²C angeschlossenen Sensoren standen uns die Schnittstellen i2c-dev, WiringPi und die Registermanipulation mittels der bcm2835-Bibliothek zur Auswahl. Um die passende Methode zu finden, haben wir uns mit allen Varianten beschäftigt und die Vor- und Nachteile wie folgt zusammengefasst:

i2c-dev:
+ einfache Verwendung
- adapter_nr muss ermittelt werden
- Umweg über Filesystem -> schlechtere Performance

WiringPi:
+ sehr einfache Verwendung
o bis auf Setup, zu unflexible Funktionen (Alternative: Verwendung von write und read)
- Umweg über Filesystem -> schlechtere Performance

Low Level (Registermanipulation):
+ potentiell beste Performance
+ maximale Kontrolle
+ Unabhängigkeit von I2C-Bibliotheken -> bessere Portabilität bei identischem Prozessor auf unterschiedlichen Betriebssystemen
o root-only
- komplexer -> fehleranfälliger, zeitraubender, aber es gibt eine gute Vorlage zur Implementierung

Nach der Abwägung der Vor- und Nachteile haben wir uns für eine Implementierung mittels der bcm2835-Bibliothek entschieden, da uns die bessere Performance den größten Vorteil bei der Erfüllung der Anforderungen bot, auch wenn die Benutzerfreundlichkeit darunter litt.

Versenden einer SMS über den Pi

Um die Bergung nach der Landung zu vereinfachen, haben wir die GPS-Daten regelmäßig per SMS übermittelt. Neben dem Pi und dem GPS-Modul benötigten wir einen USB-Dongle (Huawei E3372), eine Sim-Karte und folgende Softwarepakete für den Pi:

usb-modeswitch usb-modeswitch-data smstools

Da der USB-Surfstick vom Pi nur als Massenspeicher erkannt wird, muss dieser in den Modem-Modus gewechselt werden:

sudo usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000011062000000100000000000000000000'

Die passenden Werte für -v und -p können über das Terminal mittels lsusb ermittelt werden.

Leider hat diese Methode unseren Stick nicht in den passenden Modus gebracht. Es musste zusätzlich unter /ets/usb_modeswitch.d/ eine Datei mit dem Namen 12d1:1f01und folgendem Inhalt angelegt werden:

# Huawei E3372 (fallback mode)
TargetVendor=  0x12d1
TargetProduct= 0x155f
MessageContent="55534243123456780000000000000011063000000100010000000000000000"

Nun kann der Pi eine SMS verschicken. Dazu muss einfach nur eine Datei in den Ordner /var/spool/sms/outgoing/ verschoben werden. Zu beachten ist dabei, dass die Datei nach folgendem Schema aufgebaut ist.

To: Empfängernummer(Bsp: 4915201234567)

Text, der übermittelt werden soll.

Eine kleine Funktion zum Testen:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

void send(char *message) {

	int fd_to, geschrieben;
	char *path = "/var/spool/sms/outgoing/data.txt";

	fd_to = open(path, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);

	if (fd_to == -1) {

		printf("Error opening file");
		return;
	}

	printf("Größe: %d\n", strlen(message));
	printf("Geöffnet\n");
	char *msg = "To: xxxxxxxxxx\n\n";
	
	char *fullmsg = malloc(strlen(msg) + strlen(message) + 1);
	strcpy(fullmsg, msg);
	strcat(fullmsg, message);
	strcat(fullmsg, "\n\0");
	 	
	geschrieben = write(fd_to, fullmsg, strlen(fullmsg));
	free(fullmsg);
}

int main(int argc, char *argv[]) {

	send("Hallo Welt");
	return 0;
}