Sonntag, 1. Dezember 2013

Hacking the Foscam FI9821W V2

The Foscam FI9821W V2 is a low end HD colour  IP camera.

The feature list is impressive.
  • The unit has Ethernet and Wifi connectivity.
  • It can stream video in various resolutions and formats (H.264 and MJPEG) as well as audio from the built-in microphone.
  • It comes with multiple built-in infrared LEDs to get a B&W picture even in the dark.
  • The lens can pan and tilt.  You can set preset points, and define cruises from point to point. 
  • The built-in software supports motion detection with a grid of active and inactive areas.
  • With the talk-back function you can speak through the cameras loud-speaker.
  • And more

OS support

The description at Amazon promised a browser plugin for Explorer, Firefox, and Chrome, to control the camera as well as support for Windows, Mac and Linux.
As I had to find out, this didn't mean a browser plugin for Firefox that runs under Linux.  The plugin is Windows only.  It is part of the cameras firmware and can be downloaded via the cameras web interface.  It is recommended to delete the plugin after a firmware update and install the new one.

While the unit has a web interface which can be accessed from any current browser on any platform, this interface only allows you to set the basic configuration (user accounts, Ethernet and Wifi parameters, firmware upgrade, etc.).  The interface for the "advanced" features is implemented in the plugin, i.e. it is Windows only.  These advanced feature include video display, audio playback, pan and tilt, motion detection, etc.

The camera provides a rtsp video stream, which can be viewed using vlc - even under Linux.

Fortunately, Foscam provides a SDK with the description of the CGI interface, meaning that with a handful of specially crafted URLs most of the above "advanced" functions are available.  In fact, the browser plugin uses the CGI interface as well.

pyFosControl

I've started to write a Python interface to access those functions (GitHub).

One function the CGI interface can not provide is talk-back, which involves sending an audio stream to the camera.  As it turns out, the browser plug-in also uses a low-level protocol.  Even though Foscam provides a description of this protocol for its older cam, the newer ones (HD, H.264) are not (yet?) documented.

The low-level protocol

I reverse-engineered a part of this protocol. The results can be found in the "lowlevel" folder in the above mentioned pyFosControl project.  You'll also find the python program I'm using to "tickle" my camera.  If you find out more, please let me know.

Firmware and bugs

The firmware of this camera is still in development, and there have been a couple of firmware updates.  Further updates are badly needed as there are still bugs in even basic functions:
  •  You can define "privacy areas" - black masks in the video stream.  However, these only work in the video stream not for snapshot pictures.
  • Pictures and alarm videos stored on the internal SD RAM are accessible via FTP.  In the last firmware you didn't need any credentials to access them.  Currently you need admin rights. However, the credentials for the FTP server these are stored in RAM after you create an account and are gone when the unit is powered down.  You have to recreate the still existing account in order to get credential into memory. (The login to the web interface is not affected).
  • The web interface can be securely accessed using https:// thus encrypting user name and password.  However, even under these circumstances the user name and password are transmitted in the clear in various situations, making it unsuitable for accessing the camera from the Internet without the protection of a VPN.

User forum

The Foscam user forum is quite active.  Many other problems of the various Foscam cameras are discussed there, but keep in mind that forums usually attracts those who have problems.  A few friendly souls trying to help you where they can.  It's worth a visit.

[Update 2014-03-02]

Faulty IR LEDs


After a few months illumination by the IR LEDs has become erratic. The problem seems to be intermittent contact of the power supply connectors to the pcb carrying the LEDs. According to the forums, this is a common problem – which can't be solved. And as most Foscam models look similar, it is very likely that all these units are affected. :(

Montag, 18. März 2013

Die lange Reise nach OE 2.0 auf einer DreamBox DM 800 SE HD


Hinweis: Die folgenden Informationen sind nach bestem Wissen zusammengetragen worden. Für deren Richtigkeit kann ich jedoch nicht garantieren. Verwendung auf eigene Gefahr.

Das vorinstallierte Image meiner vor kurzem gekauft Dreambox 800 SE HD war schon etwas älter: ein Enigma2-Image mit OE 1.6 von Dream (DMM) aus dem Jahr 2010 und hatte hier und da ihre Macken.

Unterdessen ist es mir gelungen ein neueres Enigma2-Image von DMM mit OE 2.0 zu installieren. Das hat viele schöne neue Features und dafür andere Macken.

Wie installiert man neue Images?

Es gibt verschiedene Möglichkeiten. Die eigentlich einfachste ist das Web-Interface des „Second Stage Loader“. Dieses kann man erreichen, wenn man beim Einschalten einer völlig (mit dem Netzschalter!) ausgeschalteten Dreambox den Stand-By auf der Vorderseite gedrückt hält.

Die 800 SE zeigt in diesem Fall auf dem LED den Text *** STOP *** an. Außerdem ermittelt sie vom DHCP-Server die IP-Adresse und zeigt diese ebenfalls an. Und wenn man genau hinsieht findet man noch die Version des Bootloaders.

In diesem Zustand ist die Box über den Browser unter dieser IP erreichbar. Auf der dort angezeigten Seite gibt es einen Link „Firmware upgrade“. Klickt man darauf erscheint eine weitere Seite, über die man das zuvor aus dem Internet besorgte passende Image auswählen und mit „Flash“ in die Box hochladen können sollte.

Oder eben nicht...

So ist es zumindest in den diversen Foren beschrieben und in Youtube-Videos gezeigt – aber bei meiner Box tat nach dem Klick auf die „Flash“-Taste nichts.

Die Lösung in meinem Fall war, dass der Bootloader zu alt war. Im Webinterface wurde seine Version mit #10 angegeben. In neueren Versionen ist dieser Bug behoben. DMM stellt eine neuere Version zur Verfügung, die man zunächst flashen muss – und das klappt auch über das Webinterface des alten Bootloaders.

Nach einem Reset lassen sich dann mit dem neuen Bootloader (z.Z. #84) die „normalen“ Images wie erwartet flashen.

Den alten Bootloader erkennt man an einem grün-grauen Hintergrund. Der Pfeil zeigt auf die Versionsnummer.



Der Hintergrund des neuen Bootloaders ist neutralgrau, und die Versionsnummer ist nun nicht mehr zu übersehen.



Zu finden unter...

Sowohl das Mini-Images für den neuen Bootloader, als auch die aktuellen 1.6er und 2.0er Images gibt es unter http://dreamboxupdate.com/. Den Bootloader für die Box findet man dort unter der Link des entsprechenden Geräts im blau hinterlegten Kasten, die anderen Images in der Tabelle darunter.

Aber noch nicht das Ende vom Lied

Die DM 800 SE HD hat einen eingebauten Flash-Speicher von 64 MB und das 2.0er Image ist ca. 60 MB groß. Da bleibt nicht mehr viel übrig. Bei einem frisch geflashten 2.0er Image bleiben gerade noch 4,6 MB frei:

root@dm800se:~# df -h 
Filesystem                Size      Used Available Use% Mounted on 
/dev/root                59.0M     54.4M      4.6M  92% / 


Da ist für neue Plugins nicht mehr viel Spielraum.

Hier hilft der FlashExpander. Sein Funktionsprinzip ist vereinfacht: Er kopiert den Inhalt des Verzeichnisses /usr  auf einen USB-Speicherstick und konfiguriert das System so, dass zukünftig sämtliche Zugriffe darauf auf den Stick umgeleitet werden.

Der Stick muss zuvor mit ext2, ext3 oder ext4 formatiert sein und wird durch FlashExpander zunächst vollständig gelöscht.  Das Plugin und weitere Hinweise gibt es hier.

Und was bringt das?

Natürlich kann auch der FlashExpnder nicht magisch mehr internes Flash erzeugen. Die „Umleitung“ auf den Stick hilft in soweit, dass – wie man liest – das Installieren neuer Plugins, Skins usw. hauptsächlich im Verzeichnis /usr stattfindet. Und der so verbrauchte Platz geht dann nicht mehr zu Lasten des internen Speichers.

Natürlich ist der Zugriff auf den externen Flash-Speicher langsamer als auf den internen Speicher, da der Zugriff nicht direkt, sondern über die USB-Schnittstelle erfolgen muss. Aber ich bin froh, dass es überhaupt funktioniert – und mangels Vergleich ist mir auch keine merkbare Verlangsamung aufgefallen.


Links:





Samstag, 16. März 2013

Dreambox – Erste Schritte

Ich bin seit einige Tagen Besitzer einer Dreambox DM 800 HD SE. Die Warnungen, die ich bezüglich der Dreambox zuvor im Netz gelesen hatte sind alle wahr. Die Dreambox ist ein mächtiges Spielzeug mit einem Linux-Betriebssystem. Im Unterschied zu normalen Satellitenempfänger lässt sie sich programmieren, konfigurieren und erweitern. Aber - sobald man die ausgetretenen Pfade verlässt – sind drei Dinge besonders wichtig: Geduld, Google und die Foren. Grundkenntnisse in Linux sind ebenfalls hilfreich.

Suche nach Informationen

Im Internet gibt es sehr viele Informationen zur Dreambox. Viele beziehen sich aber nicht auf das Modell, das ich vor mir habe. Die zurzeit (März 2013) verkaufte Dreambox DM 800 HD SE kommt mit der GUI (Frontend) Enigma2 und die verwendete „Firmware“ OE 1.6. Es gibt andere GUIs für die Dreambox und auch andere „Firmware“. Man muss seine Suchergebnisse also immer darauf abklopfen, ob sie auch zur gewünschten Konfiguration passen.

Die Tabelle hier zeigt einige Grundinformationen der verschiedenen Modelle.

Die in diesen Postings veröffentlichten Informationen beziehen sich – soweit nicht anders angegeben – auf die Konfiguration meiner Dreambox (Enigma2, OE 1.6). Die Versionsnummer der Firmware wird beim Einloggen über Telnet angezeigt (s.u.).

Verbindung zur Dreambox

Eines der Features, weshalb man sich wohl eine Dreambox anschafft, ist, dass sie von außen über die Ethernet-Schnittstelle zugänglich ist. Dazu muss man natürlich wissen, unter welchem Namen oder welcher IP-Adresse sie erreichbar ist.

Je nach Konfiguration des lokalen Netzwerks ist die IP-Adresse unterschiedlich. In den meisten Fällen arbeitet im LAN ein DHCP-Server, der die angeschlossenen Geräte mit einer IP-Adresse und sonstigen Informationen versorgt.

Habe ich einen DHCP-Server?

Die häufigste Konfiguration dürfte sein, dass die Box in dem LAN eingesetzt wird, in dem auch der Rechner betrieben wird, der mit dem Internet verbunden ist. Dazu ist meist ein Router des Internetanbieters vorhanden. Wenn Sie Ihren Desktop-Rechner ohne weitere Konfiguration einfach in diesen Router einstecken können und ins Internet kommen, dann ist in diesem Router ein DHCP-Server integriert.

Welche IP-Adresse hat meine Dreambox?

Die IP-Adressen, die die DHCP-Komponente dieser Router den Geräten zuweist, hängen von der Konfiguration eben dieses DHCP-Servers ab. Sie beginnen aber meist mit 192.168.0. oder 10. Welche Adresse es nun genau ist, kann man nicht vorhersagen.

Ein weiterer Dienst, den ein solcher Router normalerweise bereitstellt ist DNS. DNS ist dafür verantwortlich, dass, wenn man www.google.de in den Browser eingibt, die richtige IP-Adresse im „Internet-Telefonbuch“ herausgesucht wird und der Browser diese IP-Adresse benutzt um eine Verbindung aufzubauen.

Meine Dreambox meldet sich bei diesem Dienst mit dem Namen dm800se an. Anstatt die genaue IP-Adresse zu kennen, reicht dm800se

Zugriff über den Browser

Ich kann also auf das Web-Interface der Box im Browser mit http://dm800se zugreifen, ohne die genaue IP-Adresse zu kennen (die von Google kenne ich ja auch nicht).

Zugriff über FTP

Auf die Dateien der Dreambox kann man per FTP zugreifen. Viele Betriebssysteme haben die Möglichkeit, FTP-Server wie ein Netzlaufwerk einzubinden, auf das und von dem man dann Dateien kopieren kann.

Hierzu sind die folgenden Angaben notwendig:

IP-Adresse bzw. Name: dm800se
Benutzername: root
Passwort: (irgendetwas - nur nicht leer)

Dies sind die Standardeinstellungen.

Zugriff über Telnet

Um Befehle auf der Dreambox auszuführen, muss man auf seinem Rechner ein „Terminal“ öffnen (bei Windows heißt das „Eingabeaufforderung“). Dort verbindet man sich mit der Box mit dem Befehl

telnet dm800se

dm800se wird – wie erklärt – automatisch in die notwendige IP-Adresse (in meinem Fall 192.168.0.101) umgewandelt.
Außerdem braucht man:
Benutzername: root
Passwort: (keins – einfach mit Enter bestätigen)

Die Ausgabe sollte ungefähr so aussehen:

$ telnet dm800se
Trying 192.168.0.101...
Connected to dm800se.localdomain.
Escape character is '^]'.

OpenDreambox 1.6.0 dm800se

dm800se login: root
root@dm800se:~#


Wenn man die letzte Zeile sieht, hat alles geklappt.

Für den Anfang kann man zunächst das Dateisystem erkunden. Das ist zwar umständlicher als bei der Variante mit dem Netzlaufwerk, aber vielleicht verliert man so die erste Scheu vor der Kommandozeile, ohne die Angst zu haben, etwas kaputt zu machen.

Hinweis:
Die Tatsache, dass man als root eingeloggt ist (sei es über Telnet oder FTP) besagt, dass man „Adminstrator-Rechte“ hat. Mit dieser Macht kann man die Box auch soweit „zerspielen“, dass sie nicht mehr läuft – ein Grund weshalb diese Möglichkeit bei den meisten Smartphones nicht so einfach zu bekommen ist. Der Umstand, dass man bei der Dreambox dafür nicht einmal ein Passwort braucht, macht die Sache auch nicht sicherer.

Hier ein paar Befehle, mit denen man nichts kaputt machen kann:

pwdAusgabe des Namens des aktuellen Verzeichnisses
cdWechsel zum Home-Verzeichnis
cd /Wechsel zum Haupt-Verzeichnis
cd /media/hdd/movieBei einer eingebauten Platte werden hier normalerweise die Aufnahmen gespeichert
cd ..Ein Verzeichnis höher
cd XYZIns Unterverzeichnis XYZ wechseln
lsDateien und Unterverzeichnisse im Verzeichnis anzeigen
ls -ldto, Anzeige in Listenform
ls -ladto, zusätzlich versteckte Dateien anzeigen (die Dateinamen versteckter Dateien/Verzeichnisse beginnen mit einem Punkt)
exitTelnet-Sitzung beenden

Sonntag, 17. Februar 2013

How to store images in mp3 files using eyeD3


(This post refers to version 0.7.1 of eyeD3)

eyeD3 is a powerful python utility for manipulating id3 tags from the command line, but it also exposes these function as a python module.

Unfortunately the documentation on the site on how to use it as a python module is sparse, although it covers most use cases:

import eyed3

audiofile = eyed3.load("song.mp3")
audiofile.tag.artist = u"Nobunny"
audiofile.tag.album = u"Love Visions"
audiofile.tag.title = u"I Am a Girlfriend"
audiofile.tag.track_num = 4

audiofile.tag.save()

Information on how to access images are not readily available. But being open source, you can look at the source code to find out:

Example on how to append an image

import eyed3

# load tags
audiofile = eyed3.load("song.mp3")

# read image into memory
imagedata = open("test.jpg","rb").read()

# append image to tags
audiofile.tag.images.set(3,imagedata,"image/jpeg",u"you can put a description here")

# write it back
audiofile.tag.save()

The constant 3 means Front Cover, 4 means Back Cover, 0 for other.
The complete list can found at eyed3/id3/frames.py

"image/jpeg" is the mime type.
u"...” is a description, which must be provided in a unicode string. EasyTAG e.g. stores the original file name in this field.


Example on how to access the images

import eyed3

# load tags
audiofile = eyed3.load("song.mp3")

# iterate over the images
for imageinfo in audiofile.tag.images:
   ...

Amoung the infos available via imageinfo are:
 .image_data - image binary data
 .mime_type  - e.g. “image/jpeg”
 .picture_type - 3, 4, 0, see above
 .description - the description field

You can access the imageinfo also like this:

audiofile.tag.images[x]

Where x is the index into an array starting with 0. Eventually you will get an out of range exception.