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

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche
Zeile 109: Zeile 109:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
= Implementierung =
 
Als Implementierungssprache standen Python und C zur Auswahl. Unsere Wahl fiel auf C, da damit alle Gruppenmitglieder schon erste Erfahrungen sammeln konnten. Einen Styleguide haben wir unter nachfolgendem Link angeführt, um die [https://wwwvs.cs.hs-rm.de/vs-wiki/index.php/(WS19-01)Wetterballon_Styleguide]
 
Zur Ansteuerung der über I2C 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.
 
 
<syntaxhighlight>
 
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 aber unterschiedlichen OSs
 
o root-only
 
- komplexer -> fehleranfälliger, zeitraubender, aber es gibt eine gute Vorlage zur Implementierung
 
 
</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.
 

Version vom 11. Februar 2020, 15:53 Uhr

Formalia

C-Styleguide

Für die Entwicklung wurde sich auf einen gemeinsamen Styleguide geeinigt. Weiterer Text folgt.

Der Guide kann hier eingesehen werden: C-Styleguide

CSV-Konventionen

Die Sensordaten werden im zur einfacheren Auswertung im CSV-Format gespeichert. Nährere Informationen gibt es hier:

CSV-Format

Doxygen

...Cooler Text kommt noch... Infos zu Doxygen hier: Doxygen

Implementierung

Als Implementierungssprache standen Python und C zur Auswahl. Unsere Wahl fiel auf C, da damit alle Gruppenmitglieder schon erste Erfahrungen sammeln konnten. Einen Styleguide haben wir unter nachfolgendem Link angeführt, um die [1] Zur Ansteuerung der über I2C 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 aber unterschiedlichen OSs
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 bietet, auch wenn darunter die Benutzerfreundlichkeit leidet.


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-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 überführt. Für den passenden Modus muss 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 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. 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 Freunde");
	return 0;
}