Verbindung über Freifunk


#1

Hallo,

seit längerem experimentieren wir mit unserer von den Schülern gebaute Wetterstation, die neben Temperatur, Luftdruck und Luftfeuchtigkeit in erster Linie die Feinstaubbelastung hier in Hiltrup messen soll.
Probleme haben wir momentan mit der Übertragung der Daten. Das Freifunk-Netz ist recht gut, allerdings erfordert die Programmierung über Blockly ein Passwort. Das gibt es bei Freifunk allerdings nicht und wenn wir das Feld einfach freilassen, funktioniert es nicht. Können wir den Quelltext irgendwie ändern?:
"
void setup()
{ b->connectToWifi(“Freifunk”,"");
"

Oder müssen wir es noch anders programmieren? Wäre sehr dankbar für einen zeitnahen Tipp, da wir vor Ferienbeginn mit den Messungen starten möchen.

Danke und Gruß
Roland


#2

Hallo Roland,
Einfach das Passwort aka PreSharedKey weglassen funktioniert nicht wie schon festgestellt.
Die C++ Klasse “Bee” in der Datei “SenseBoxMCU.cpp” verwendet in der von Dir verwendeten Funktion “connectToWifi” die WiFi Funktion “WiFi.begin(ssid, password)”.

Diese ist in den Untiefen der Bibliotheken in “WiFi.cpp” definiert

uint8_t WiFiClass::begin(const char *ssid, const char *key)
{
    return startConnect(ssid, M2M_WIFI_SEC_WPA_PSK, key);
}

Erfordert also immer den PreSharedKey … aber, dort gibt es auch die folgenden Funktion

uint8_t WiFiClass::begin(const char *ssid)
{
return startConnect(ssid, M2M_WIFI_SEC_OPEN, (void *)0);
}

Das wäre die passenden Funktion zum anmelden im offenen Freifunknetz

Quick’n’Dirty Lösung ohne diese geprüft zu haben:

  1. Du suchst im Library Verzeichnis die Dateien “SenseBoxMCU.cpp” und “SenseBoxMCU.h” (Kopie machen nicht vergessen)
  2. In der “SenseBoxMCU.cpp” folgenden Codeblock am besten oberhalb der orginale Funktion uint8_t Bee::connectToWifi(char* ssid, char* password) hinzufügen.

uint8_t Bee::connectToWifi(char* ssid)
{
nwid = ssid;
pw = password;
if (!Serial)
{
Serial.begin(9600); //check if already connected
delay(1000);
}

if (WiFi.status() == WL_NO_SHIELD) {
Serial.println(“WiFi Bee not present.”);
while (true);
}

while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
delay(100);
Serial.println(ssid);
status = WiFi.begin(ssid);
delay(5000);
}
Serial.println(“Successfully connected to your WiFi.”);
Serial.println(this->getIpAddress());
this->storeIpAddress();

return status;
}

Wie Du siehst ist das im Prinzip eine Kopie der Orginalfunktion und nur die Passwort Referenz raus gelöscht damit die gewünschte WiFi Funktion für offene Funknetze genommen wird.

  1. In der Datei “SenseBoxMCU.h” die folgende neue Zeile in der Klasse Bee einfügen

class Bee
{
public:
Bee();
uint8_t connectToWifi(char* ssid); // <---------------------- NEU
uint8_t connectToWifi(char* ssid, char* password);
void startAP(char* ssid);
char* getSsid();
char* getPassword();
char* getIpAddress();
private:
char* nwid = “”;
char* pw = “”;
char ip[15];
int status = WL_IDLE_STATUS;
void storeIpAddress();
};

  1. Nun noch in eurem Quellcode b->connectToWifi(“Freifunk”,""); gegen b->connectToWifi(“Freifunk”); austauschen, hochladen und Du solltest Dich verbinden können.

NACHTEIL:
Wenn ein Update der Bibliothek erfolgt werden die beiden Dateien wieder überschrieben und Deine Erweiterungen sind weg. Denke aber um noch vor den Ferien Erfolg zu haben ist es ein akzeptables Risiko.

Alternativ kannst Du natürlich euren Code so umschreiben um direkt die WiFi Bibliothek zu referenzierten, was aber wohl deutlich mehr Aufwand und Fehlerquellen beinhaltet.

Viele Grüße
Bernd


#3

Hallo Roland,

die von @no01b genannte Lösung sollte funktionieren (Dankeschön!!), allerdings müsstest du dafür die Arduino IDE und entsprechendes Board Support Package installieren. Ich vermute, dass ihr bisher nur mit Blockly gearbeitet habt oder?

Ich werde versuche die Lösung von @no01b so schnell wie möglich in die Blockly und unserer Library einzuarbeiten allerdings dauert das immer ein bisschen. Leider kann ich es auch nicht hier testen, da ich zurzeit nicht in Deutschland bin und kein Freifunk bzw. freies Netzwerk habe.

Beste Grüße

Mario


#4

@Higgsteilchen ich habe soeben alle System aktualisiert und jetzt sollte die senseBox mit dem Freifunk Netz verbinden können.

Du musst dazu einfach nur die SSID eintragen und das Passwort Feld leer lassen. Der Code sieht nun auch etwas anders aus als in der bisherigen Version.

Dankeschön nochmal an @no01b für die Hilfe!

Beste Grüße

Mario


#5

Hallo Mario, seit gestern sind wir über Freifunk online! Es klappte ohne Probleme. Vielen Dank an euch beide für die schnelle Hilfe!!
https://opensensemap.org/explore/5d88d6295f3de0001a0c385a
VG Roland