Hacks für eine WiFi-SD-Card

Bei einer SD-Karte mit WiFi hat man bisher ungeahnte Möglichkeiten, denn dort gibt es nicht nur Speicher. Bei einer Karte wie der Transcend WiFi-SD arbeitet ein Linux, was nicht nur die Peripherie für eine Funkschnittstelle bedient, sondern auch einige interessante Dienste bereitstellt. Manche von denen aktiviert man erst, wenn man etwas hinter die Kulissen schaut.

Oben genannte Karte bietet nicht nur einen eigenen Hotspot, sondern kann sich interessanterweise auch in ein bestehendes WLAN einwählen. Hat man also die Transcend mittels Android-App dazu grundlegend eingerichtet (WLAN-Zugangsdaten des eigenen Netzwerks), kann man weitere Einstellungen auch über dessen Weboberfläche vornehmen.

Auf der Karte laufen von Hause aus ein
- busybox-Linux
- ein Boa Webserver (als Single Task Webserver)

Ist sie einmal eingerichtet, kann man über

http://[ip der Karte]/cgi-bin/kcard_status.pl

ein Webinterface aufrufen, was quasi die Informationsseite der Karte ist. Zur Konfiguration über dieses Interface wird

http://[ip der Karte]/cgi-bin/tscmd?CMD=xxx

verwendet.

Um wirklich in das System einzugreifen, ist es möglich, eine "autorun.sh" in das Wurzelverzeichnis des SD-Speichers zu stellen. Nachdem die SD-Karte stromlos gemacht wurde, werden beim nächsten Hochfahren dann die im Skript befindlichen Anweisungen abgearbeitet. So startet man mittels

tcpsvd -E 0 21 ftpd -w /mnt/sd

einen FTP-Dienst mit Schreibzugriff, so dass man nun in der Lage ist, vom Netzwerk aus Dateien auf die SD-Karte zu schieben. Das geht dann zum Beispiel mit einer Datei "test.txt" in das Zielverzeichnis "temp" wie folgt in Python:

ftp = ftplib.FTP('192.168.178.42', 'admin', 'admin')
ftp.cwd("/temp")
f = open("/home/.../test.txt", "r")
ftp.storbinary("STOR test.txt", f)
f.close()

Die FTP-Zugangsdaten ("admin") sind die gleichen, wie über die Weboberfläche eingestellt. Und die IP-Adresse ist diejenige, mit welcher sich die Karte vorher im eigenen Netzwerk angemeldet hat. Sogar die Installation einer neuen busybox-Version ist möglich. Am einfachsten geht das mit folgenden Einträgen in der "autorun":

cp /mnt/sd/busybox* /sbin/busybox
chmod a+x /sbin/busybox

Das neue Busybox platziert man vor dem Kopieren in einem Unterverzeichnis auf dem SD-Speicher und setzt noch entsprechende Rechte. Theoretisch kann man so zu einer früheren Version zurückkehren oder aber eben neue Systemfunktionen realisieren oder neue Anwendungen aufspielen. Etwas Vorsicht ist natürlich geboten. Mittels

rcS6

in der "autorun.sh" erhält man außerdem Telnet. Bleiben wir bei unserer IP "192.168.178.42" (somit muss ich nicht die nervigen "xxx" schreiben), so kann man anschließend ganz simpel mittels

# telnet 192.168.178.42

zugreifen. Bekommt man dann eine Ausgabe wie:

Trying 192.168.178.42...
Connected to 192.168.178.42.
Escape character is '^]'.

kann man ein paar nutzvolle Infos aus dem Filesystem ziehen. Wie zum Beispiel:

# cat /etc/version.txt
Product Name : KeyASIC WIFI-SD
Firmware Version : V147
Build Date : 19 FEB 2013
Revision : V147
WiFi Model : Atheros AR6003 11n
Linux Kernel : 2.6.32.28
Busybox : 1.18.5

# cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 421.06
Features : swp half fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : KeyASIC Ka2000 EVM
Revision : 0000
Serial : 0000000000000000

# cat /proc/meminfo
MemTotal: 29824 kB
MemFree: 15940 kB
Buffers: 16 kB
Cached: 10388 kB
SwapCached: 0 kB
Active: 3280 kB
Inactive: 7840 kB
Active(anon): 716 kB
Inactive(anon): 0 kB
Active(file): 2564 kB
Inactive(file): 7840 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 740 kB
Mapped: 796 kB
Shmem: 0 kB
Slab: 1224 kB
SReclaimable: 364 kB
SUnreclaim: 860 kB
KernelStack: 272 kB
PageTables: 120 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 29824 kB
Committed_AS: 6568 kB
VmallocTotal: 825344 kB
VmallocUsed: 324 kB
VmallocChunk: 824240 kB

# cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00010000 "SPI NOR Flash Partition1"
mtd1: 00300000 00010000 "SPI: kernel"
mtd2: 00300000 00010000 "Ramdisk"

# busybox
BusyBox v1.18.5 (2013-02-25 15:18:08 CST) multi-call binary.
Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.
Usage: busybox [function] [arguments]...
or: busybox --list[-full]
or: function [arguments]...
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.
Currently defined functions:
ash, bash, boa, boa_indexer, bootchartd, bunzip2, buzzer, bzcat, cat,
chmod, cmd_server, cp, date, df, dhcprelay, diff, dirname, dmesg, dnsd,
dnsdomainname, dumpleases, echo, egrep, env, fgrep, find, fs_info,
ftpd, ftpget, ftpput, gen_filelist, get_authfile, grep, hostname,
ifconfig, inetd, init, insmod, instant_setupd, instant_upload,
instant_upload_clean, iu_progressd, iwconfig, iwevent, iwlist, iwpriv,
kcard_app, kcard_cmd, kcard_startup, kill, linuxrc, ln, logger,
logread, ls, lsmod, macaddr, mkdir, mount, mv, nslookup, perl, ping,
pkill, ps, pwd, readahead, rm, rmdir, rmmod, route, sh, sleep, sync,
syslogd, tcpsvd, telnetd, thumbNail, thumbnail_video, touch, tscmd,
tslist, udhcpc, udhcpd, udpsvd, umount, unzip, wget,
wifi_connect_router, wifi_download, wifi_filelist, wifi_ftp_server,
wifi_ftp_upload, wifi_get_apconfig, wifi_get_config,
wifi_get_config_real, wifi_quick_send, wifi_set_config, wifi_upload,
xargs

Die Binaries der Karte sind übrigens im Format "ELF 32-bit LSB executable, ARM, version 1 (SYSV)".

Früher war es überdies noch möglich, die Karte mittels eines Eintrags in der Weboberfläche zu überlisten, indem man mittels

http://192.168.178.42/cgi-bin/file_list.pl?dir=%2Fwww%2Fsd%2FDCIM%2F..%2F..%2F

Zugriff auf die über dem User-Speicher liegenden Systemverzeichnisse erlangt hat (Es wurde die Absicherung der ".."-Pfade vergessen). Dabei erschien dann auch eine "normale" Linux Filestruktur im Browser mit "bin", "dev", "etc" usw... Das funktioniert in der aktuellen Firmware-Version leider nicht mehr.

Es gibt auch noch ein "wifi_upload" und "uploadto" im cgi-bin Verzeichnis. Wie man deren oder sonstige Funktionen ausnutzt, das bleibt dann nicht zuletzt eurer Recherche überlassen. Hier ist bestimmt noch Spielraum für die Community, denn diverse Veröffentlichungen zum Thema sind (noch) nicht so zahlreich.

Der nächste logische Schritt sollte nun sein, eigene Programme für unser SD-Card-Linux zu schreiben und die dafür notwendigen Binaries zu erzeugen. Dazu nutzen wir unter Ubuntu "Cross-Tool", um eine diverse Toolchain und Config für eine "ARM/ucLibC"-Combo zu erhalten:

# ct-ng arm-unknown-linux-uclibcgnueabi

Nun kann der Build mittels

# ct-ng build

gestartet werden. Ein erstes "Hello World"-Programm bekommt man dann mit:

# ~/x-tools/arm-unknown-linux-uclibcgnueabi/bin/arm-unknown-linux-uclibcgnueabi-gcc -Os -s -DNDEBUG hello.c -o hello.out

Klar, dass die Karte etwas lange zum Booten braucht (etwa 20 Sekunden) und aufgrund der Platzverhältnisse und zusätzlichen Chips auch etwas warm wird. Das sollte man bei eigenen Anwendungen einfach beachten. Ansonsten ist das Ganze das kleinste embedded-System, was ich bisher untersucht habe. Und das wird sicherlich noch einige interessante Einsatzgebiete ergeben.

Derzeit genutzt wird so eine Karte bei uns zur Beschickung eines digitalen Bilderrahmens, welcher durch diverse Bilder auch Infos von den vernetzten Heimgeräten der Hausautomation weitergibt. Das entsprechende Projekt könnt ihr unter http://www.smartewelt.de/sw4/?q=homecontrol-anzeige nachlesen.

Viel Spaß beim Experimentieren!

Swen Hopfe

Kategorien: 

Kommentare

Hallo Swen
vielen Dank für die Infos - bin erst jetzt darauf gestossen.
Will die WIFI SD mit dem ESP8266 koppeln und es als Cloud in das Netz bringen.
Die Infos sind sehr ordentlich und übersichtlich - und bringen mich weiter.
Jetzt muss ich mir erst mal eine besorgen - denn ich kannte die bisher noch nicht.

lg rudi ;-)

und eine gesundes neues jahr!

Hallo Rudi,
Danke fuer Deinen Kommentar. Schoen, dass Dir der Artikel was genuetzt hat. Bei mir funktioniert die Karte immer noch zuverlässig. Aha, der ESP8266, mit solchen WLAN-Modulen hab ich noch nichts getan. Viel Erfolg dabei!
Gruesse
Swen

Hallo Swen,

bei tcpsvd -E 0 21 ftpd -w /mnt/sd im Autostart scheint bei mir das WLAN nicht zu starten.

wenn ich rcS6 im Autostart, kann ich per Telnet auf die Karte zugreifen und den FTP manuell starten, was mir dabei auffällt das dann kann "Prompt" kommt solange der Server läuft, man kann dies nur per STRG + C abbrechen. Könnte es sein das das Startupscript an der Stelle "hängt".

BTW woher bekommt man das von Dir erwähnte "neue" Busybox.

Danke für den Blogpost, das Homecontrolprojekt ist genau das wonach ich schon seit Monaten gesucht habe.

Hallo Thomas,

jetzt wird es für mich etwas schwierig, denn das Ganze ist zwar immer noch in Betrieb, die Implementierung aber schon länger her. FTP nutze ich tatsächlich mit dem Python-Script oben und schicke alle halbe Stunde 4 neue JPGs auf die Karte, die permanent in einem Bilderrahmen steckt. Manchmal klappt das nicht beim ersten Mal, es zeigt sich (für das WLAN) manchmal so eine Art "Aufweckverhalten". Aber das trifft auf Dich nicht zu. Vielleicht hängt das Script bei Dir tatsächlich, aus Gründen, die ich leider nicht gleich nachvollziehen kann.
FTP bei der Karte getestet hab' ich bei mir ganz konventionell. tcpsvd -E 0 21 ftpd -w /mnt/sd war erfolgreich gestartet, dann hab' ich mit filezilla Dateien schieben können. Alle Dienste sind bei mir von Hause aus problemlos gestartet. Vielleicht liegt es auch daran, dass die OS-Version mittlerweile wieder verändert worden ist.
Ich nutze nur die originale damalige Busybox-Version, den Link aus dem Netz von damals (Post in einem Forum) habe ich leider nicht mehr. So Sorry!

Auch, wenn ich nicht viel helfen konnte:

Viele Grüße
Swen

Hallo Thomas
Hatte das selbe Problem wie du. Karte hat nicht mehr gestartet. Musste bei bei mir in autostart.sh "tcpsvd -vE 0.0.0.0 21 ftpd -w /mnt/sd &" rein packen und dann gings.

Ich hab nun das Problem das wenn ich nun Fotos mache, sie mir auf dem FTP Server nicht mehr angezeigt werden (die neuen die ich gemacht habe) Sobald ich die Karte raus nehme und frisch starte werden sie mir angezeigt.

Neuen Kommentar schreiben

Filtered HTML

  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.