Experimente mit einem GainSpan WiFi Modul

Ein paar Informationen zur eingesetzten Hardware gibt es in diesem Blogpost.

Hinweise zur Funktionsweise

Da ich jetzt schon zum zweiten mal danach gefragt wurde folgen hier ein paar Worte zur generellen Funktionsweise.

Mal ne Frage zum Verständnis. Das Modul leitet die gesamte Nachricht weiter und ich muss den TCP/IP Stack selbst übernehmen?
Jetzt stellt sich eine Frage, wie das mit den Netzwerk-Protokollen funktioniert?? Muss man sich selber darum kümmern?? Wie funktioniert das, dass sich das WLAN Modul mit dem vorhandenen Netzwerk verbindet??

Um grundlegende Netzwerkprotokolle wie TCP oder UDP zum versenden von Daten oder DHCP zum Beziehen einer dynamischen IP Adresse kümmert sie die Firmware des WLAN Moduls.

Über einfache ASCII Befehle (AT-Befehle), die über die serielle Schnittstelle an das WLAN Modul gesendet werden kann das WLAN-Modul dann konfiguriert werden (IP, Gateway, DHCP, DNS, infrastructure/ad-hoc/access point mode).

Danach kann man über weitere AT-Befehle TCP oder UDP Ports auf dem WLAN Modul öffnen, wenn jetzt ein anderer PC Daten, z.B. den String "Hello World\n" an einen bestimmten Port des WLAN Moduls sendet leitet das WLAN Modul diese über die serielle Schnittstelle an den Mikrocontroller weiter, es fügt aber noch einen Header hinzu, damit man weiß von welcher IP:Port die Daten kommen, so das man dann eine Antwort zurückschicken kann.

Das Hello Word kommt dann so beim Mikrocontroller an:

"\x1bS1Hello World\n\x1bE"

"\x1b" markiert dabei den Start eines Datenpakets und "\x1bE" das Ende. "S1" ist die Connection ID, die angibt von wo das Datenpaket kam, über einen anderen AT-Befehl kann man sich alle momentanen Verbindungen mit Port und IP anzeigen lassen.

Wenn man jetzt eine Antwort schicken will sendet man vom Mikrocontroller über die serielle Schnittstelle einfach:

"\x1bS1Antworttext\x1bE"

Da der TCP/IP Stack auf dem Modul integriert ist muss man dann nur noch die Daten, die vom WLAN Modul kommen, verarbeiten.

Einen HTTP oder Telnet Server, falls erwünscht, muss man dann selber implementieren.

Firmwareupdate zur Nutzung der WPA2-PSK Verschlüsselung

http://www.sparkfun.com/products/10505:

So far, Gainspan module DOES NOT perform AP mode. AT+WM=2 as per the datasheet. That command returns ERROR: INVALID INPUT. The firmware that ships with the device does not even recognize this as a valid command! You are forced to sign a Non-Disclosure in the hopes of getting the firmware 2.3.1 to install (which it won’t). So this device does not do what the datasheet says it will do. Neither Gainspan or Sparkfun will support you on this. Stay away from this device if you think it will do Access Point mode. It will not. It might be Sparkfun’s breakout board that’s causing the device to reboot every time I attempt to upload a new firmware…but I can’t get any support so I don’t know how to troubleshoot this. That’s not the only problem. AT&V shows the exact same settings as I used for AT+WA=MySSID,, and that command returns “OK” where ATA returns “ERROR” which doesn’t help…. AT+WM=0 and AT+WAUTO=0,MySSID,, so ATA should not be failing. But ERROR doesn’t tell me what the problem is.

UPDATE: 11/01/11 8:39PM – I was contacted by Michelle in Sparkfun’s customer service who said she is looking into it for me. Keeping fingers crossed, will keep you posted. (Please note, I sent two emails to Sparkfun, one to try and get the firmware and a second once I had the firmware to ask about loading the firmware, which is what triggered her response, not my wanking here in the comments)

UPDATE: 11/04/11 11:04PM – I was contacted by Gainspan who told me I needed to pull G27 high (3.3v) during boot. Then I ran the gs_flashprogram.exe (installed from C:\GainSpan\EvalKit\2_3_1\tools\gs_flashprogram\gui_version folder) and selected the C:\GainSpan\EvalKit\2_3_1\WLAN Firmware (WFW)\bin\WFW-REL-2_0_27.bin file and the two from C:\GainSpan\EvalKit\2_3_1\userapps\Serial to Wi-Fi (S2W)\bin\Wi-Fi Protected Setup (WPS). I am now able to use these commands to manually setup limited AP mode.

AT+WM=2 AT+NSET=192.168.1.80,255.255.255.0,192.168.1.80 AT+WSEC=8 AT+WWPA=testing2 ATC1 AT+DHCPSRVR=1 AT+WRXACTIVE=1 AT+WA=Gainspan,,9 AT&W0

However, the unit will not take AT+WAUTO=2,Gainspan,,9 and therefore will not auto boot into AP mode. It also fails to understand AT+DHCPSRVR=1 and it doesn’t seem to want to boot in any security mode other than “open.”

Nach der Installation von Evalkit_Setup.exe befindet sich unter C:\GainSpan\EvalKit\2_3_5\tools\gs_flashprogram\gui_version ein GS Flash Programmer User Guide (0_4).pdf und der Installer gs_flashprogram.msi um das Firmware Update Tool zu installieren. Nach der Installation befindet sich dann eine gs_flashprogram-Verknüpfung auf dem Desktop.

To program the board, the GainSpan Module device must be placed into “Program Mode”. This is accomplished by holding GPIO27 high during power-on; Ich hab den Pin auf eine Stiftleiste nach Außen geführt, das sollte also kein Problem sein.
Das Firmware Update hat funktioniert.

Das Firmware Update hat funktioniert.

Konfiguration des Limited AP-Modus

Die folgenden Befehle sind notwendig um das Modul in den Limited AP-Modus zu versetzen (werden im Dokument AN039 - Provisioning Methods with S2W.pdf beschrieben):

AT+WD

Von eventuell verbundenen Netzwerken trennen.

AT+WSEC=8

Verschlüsselung wählen, 8 für WPA2-PSK Verschlüsselung.

AT+WPAPSK=WiFi-Control,password123

SSID und PASSPHRASE für das WLAN Netzwerk festlegen.

AT+NSET=192.168.1.1,255.255.255.0,192.168.1.1

Statische IP festlegen.

AT+WM=2

Limited AP-Modus wählen.

AT+WA=WiFi-Control,,11

Netzwerknamen und Kanal für den Limited AP-Modus festlegen.

AT+DHCPSRVR=1

DHCP-Server aktivieren.

AT+DNS=1,wifi.jann.cc

DNS-Server starten, das WLAN Modul bekommt den Hostnamen wifi.jann.cc zugewiesen alle DNS anfragen dazu beantwortet der interne DNS Server mit der IP des WLAN Moduls.

Note

Der DNS Server läuft auf dem Application Prozessor, wenn man direkt von GainSpan ein SDK kauft, bekommt man auch den Sourcecode dazu, so das man den DNS Server so anpassen kann, dass er alle DNS Anfragen auf die interne IP Adresse des WLAN Moduls auflöst.

AT+NSUDP=4000

UDP Server starten, der am Port 4000 auf Verbindungen wartet.

Jetzt liegt der Stromverbrauch der Platine bei etwa 112mA.

Ping an das WLAN Modul

Ping an das WLAN Modul nachdem ich mich mit dem Netzwerk WiFi-Control verbunden habe.

Jetzt kann man sich mit dem PC über WLAN mit dem Modul verbinden und zum Beispiel über den interaktiven Python Interpreter IPython Daten per UDP an das Modul senden, die dann an der seriellen Schnittstelle des Moduls ankommen:

[chris@thinkpad ~]$ ipython
Python 2.7.3 (default, Apr 13 2012, 20:16:59)
Type "copyright", "credits" or "license" for more information.
IPython 0.12 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from socket import socket, AF_INET,SOCK_DGRAM
In [2]: data = "Hello WiFi module"
In [3]: port = 4000
In [4]: hostname = 'wifi.jann.cc'
In [5]: udp = socket(AF_INET, SOCK_DGRAM)
In [6]: udp.sendto(data,(hostname,port))
Out[6]: 17
In [7]:
Initialisierung des WLAN Modul

Oben: Initialisierung des WLAN Moduls und ankommende Daten an der seriellen Schnittstelle Unten: IPython Konsole

Eine Telnetverbindung mit dem Modul

Dazu muss man erst einmal mit dem Befehl AT+NSTCP=2000 einen TCP-Server auf dem Modul starten, über den wir uns mit einem Telnet-Programm verbinden können:

Telnetverbindung mit dem WLAN Modul

Telnetverbindung mit dem WLAN Modul.

TCP-Verbindung via Python mit dem WLAN-Modul

Dazu muss das Modul erst einmal, wie weiter oben beschrieben, initialisiert werden und ein TCP-Server am Port 2000 gestartet werden, dann kann man folgendermaßen via Python mit dem Modul kommunizieren:

from socket import *
host = '192.168.1.1'
port = 2000
s = socket(AF_INET, SOCK_STREAM)
s.connect((host, port))
s.send("Python TCP Beispiel")
Python TCP Beispiel

Python TCP Beispiel

Das Ganze funktioniert natürlich auch unter Windows:

TCP Verbindung mit Python unter Windows

TCP Verbindung mit Python unter Windows

Python Skript zur Initialisierung

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, serial, sys
from time import sleep

def open_serial():
  # Objekt zum Zugriff auf serielle Schnittstelle anlegen
  if os.name == "nt":
    # Windows: COM3 enstpricht 2, COM2: 1 usw.
    return serial.Serial(2, baudrate=9600, timeout = 0.1)
  else:
    return serial.Serial("/dev/ttyUSB0", baudrate=9600, timeout = 0.1)

s = open_serial()

# möglicherweise noch im Puffer vorhandene Daten löschen
s.flushInput()

def receive(expected = None):
  sleep(1)
  rec = s.read(300)
  if (expected != None):
    if rec != expected:
      print("Received Err %i: %r") % (len(rec),rec)
      print("Error: response does not match")
      print("Expected: %r") % expected
      return -1
    else:
      print("Received OK %i: %r") % (len(rec),rec)
  else:
    print("Received %i: %r") % (len(rec),rec)
  return rec

def send2(str, sleeptime = 1, expected = None):
  print("Sending: %r") % str
  s.write(str)
  sleep(sleeptime)
  if(expected == None):
    expected = str + "\r\nOK\r\n"
  rec = receive(expected)

def init_wifi():
  send2("AT+WD\n")
  send2("AT+WSEC=8\n")
  send2("AT+WPAPSK=WiFi-Control,password123\n",1,
        "AT+WPAPSK=WiFi-Control,password123\n\nComputing PSK from SSID and PassPhrase...\r\n")
  sleep(10)
  receive("\r\nOK\r\n");
  send2("AT+NSET=192.168.1.1,255.255.255.0,192.168.1.1\n")
  send2("AT+WM=2\n")

  send2("AT+WA=WiFi-Control,,11\n",5,
        "AT+WA=WiFi-Control,,11\n\n    IP              SubNet         Gateway   \r\n 192.168.1.1: 255.255.255.0: 19"
    "2.168.1.1\r\nOK\r\n")
  send2("AT+DHCPSRVR=1\n")
  send2("AT+DNS=1,wifi.jann.cc\n")
  send2("AT+NSTCP=2000\n",1,"AT+NSTCP=2000\n\r\nCONNECT 0\r\n\r\nOK\r\n")
  receive()

Das Skript zum Download: wifi_init.py

Initialisierung des WiFi Moduls per Python Script

Initialisierung des WiFi Moduls per Python Script.

Weitere Funktionen

Das Modul kann noch sehr viel mehr, die Firmware beinhaltet einen DHCP-Server, einen DNS-Server, einen Webserver mit Einstellungsseite zum konfigurieren der IP und Verschlüsselung, einen FTP Client, einen HTTP-Client, einen UDP-Server, einen TCP-Server und noch ein paar weitere Funktionen die sich alle über AT-Befehle starten und konfigurieren lassen. Als Anwendungsbeispiel könnte man z.B. die aktuellen Wetterinformationen von wetter.com über ein HTTP GET holen und auf einem LCD anzeigen oder eine Suchanfrage an Google senden.

Serial Port geöffnet in `Minicom

Einstellungsseite im Firefox

Im nächsten Blogpost nutze ich die Platine dann mit einem STM32F0-Discovery Entwicklungsboard um mit einer Android App über WLAN das Licht ein und aus zu schalten.