ESP8266 debuggen

Über diesen netten Chip habe ich bereits einen Artikel geschrieben. Lief problemlos, weil die Bauteile „zusammengepasst“ haben. Ich habe mir 2 Platinen gebastelt die Raumtemperatur und Feuchtigkeit messen. Den „Weg“ zu dieser Wetterstation habe ich auf Github abgelegt – vielleicht hilft es ja jemandem weiter

2015-10-30 20.08.48
Von oben
2015-10-30 20.09.01
Und von unten

Schwer motiviert habe ich mir noch ein paar Arduino Nanos und ESP8266 bestellt und damit hat erstmal nichts geklappt! Das ist im ersten Moment ärgerlich, hat aber auch den Vorteil, daß man sich näher mit der Materie auseinander setzen muß.

Den Chip auf Breadboards benutzen

Durch den geringen Abstand der Pins kann man den ESP8266 schlecht mit Breadboards verwenden. Deshalb mußt Du vor jeglicher Art von Bastelei einen Adapter löten um Dein Leben leichter zu machen.

Benötigt werden ein Stück Lochraster Platine, eine Buchsenleiste und eine Steckerleiste mit jeweils 8 Pins. Die Steckerleiste besteht aus einem Kunststoffteil und Pins. Ich habe den Kunststoffteil ganz nach oben gedrück und dann falsch herum eingelötet. Die Buchsen ganz normal einlöten und dann auf der Unterseite verbinden. Mangels Draht und Bock habe ich die Brücken mit dem Lötkolben gemacht. Das dauert keine 10 Minuten und der Komfortgewinn ist enorm!

adapter

Probleme mit der Spannungsversorgung

Die ESP’s laufen mit 3,3V. Der Arduino hat einen 3,3V Pin der je nach verbautem Spannungsregler nicht genügend Strom liefert (wie meine neuen Arduinos). Das Problem wird sichtbar wenn die LED’s am ESP8266 dunkler werden oder die Spannung zusammenbricht. Mit einem externen Spannungsregler wie dem. AMS1117 läßt sich das Problem beheben.

Übertragungsraten

Mein erster Satz ESP8266  hat mit einer Symbolrate 9600 Baud gearbeitet. Die nächste Charge mit 115200, Baud die schafft mein neuer Satz Nanos, aber nicht die Alten.

Laut diesem Post läßt sich die Baudrate mit einer aktuellen Firmware setzen. Muß ich unbedingt ausprobieren!

Firmware ist vom Hersteller angepasst

Der gesamte Bereich Firmware ist ungemein spannend. Der ESP8266 wurde von der Firma ESPRESSIF erfunden oder produziert oder kopiert. Mein 2. Satz Chips war von der Firma AI-Thinker, die eine eigene, leicht inkompatible Firmware auf die Geräte gespielt hat und die ich nicht will weil die Sketches nicht damit laufen!

Um angenehmer mit den Chips  rumzumachen habe ich mir einen USB TTL Konverter gekauft (kostet zwischen 3€ und 8€). An Software wird nur die unsägliche Arduino IDE benötigt. Konfiguration ist unter Linux nicht nötig. Einfach die Arduino IDE starten und den Serial Monitor öffnen. Hier solange mit der Baudrate spielen, bis man auf das Kommando AT ein OK zurückbekommt. Hier mal ein Auszug aus einem solchen seriellen Gespräch – meine Kommandos sind fett, die Antworten kursiv:

AT
OK
AT+GMR 
AT version:0.30.0.0(Jul 3 2015 19:35:49)
SDK version:1.2.0
Ai-Thinker Technology Co.,Ltd.
Build:1.2.0.A Aug 7 2015 17:21:44
OK

Dies ist die Antwort der inkompatiblen Firmware. Eine schöne Übersicht über Kommandos habe ich bei Iteadstudio gefunden.

Eine nette Anleitung um die Firmware loszuwerden gibt es im Wiki von mikrocontroller.net.

Zusammengefasst (und darum geht’s in dem Beitrag) braucht man das Esptool zum Flashen und eine aktuelle Firmware. Der Chip muß dazu auch besonders beschaltet werden. Ronny Simon von Simtronyx hat das auf seinem Blog sehr nett beschrieben. Wenn die Schaltung steht alle Serial Monitors schließen und kurz Masse an Reset legen. In das Verzeichnisse der Firmware wechseln und mit esptool flashen

ms@w530: /tmp/esp_iot_sdk_v0.9.5/bin$ sudo esptool.py -p /dev/ttyUSB2 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin
Connecting...
Erasing flash...
Wrote 2048 bytes at 0x00000000 in 0.2 seconds (81.7 kbit/s)...
Erasing flash...
Wrote 211968 bytes at 0x00001000 in 20.5 seconds (82.7 kbit/s)...
Erasing flash...
Wrote 4096 bytes at 0x0003e000 in 0.4 seconds (85.6 kbit/s)...
Erasing flash...
Wrote 4096 bytes at 0x0007e000 in 0.4 seconds (85.6 kbit/s)...
 
Leaving...

Zumindest bei mir hat danach alles wirklich super funktioniert 🙂

Alternative Firmware

Ein paar ziemlich coole Leute bieten eine eine Firmware an, die das Ausführen von LUA Script ermöglicht. Eine Anleitung gibts hier. Eine einfache Möglichkeit um an angepasste Firmware zu gelangen ist dieser Build Service. 

 

Dies waren soweit meine Probleme mit dem netten Chip. Falls neue auftreten werde ich diesen Beitrag entsprechend erweitern.

Wiedergabe pausieren in Kodi

Ich schaue mir gerne TV Streams mit meinem Kodi an. Um Bandbreite zu sparen ist es ganz nett diesen auch zu pausieren, wenn man das TV ausschaltet und nicht nur wenn man den Stop Befehl per Fernbedienung sendet. Dieses Verhalten läßt sich sehr leicht konfigurieren. Unter Einstellungen -> System -> Eingabegeräte die Option „Wiedergabe pausieren, wenn eine andere Quelle ausgewählt wird“ aktivieren.

screenshot002

 

Screenshots mit Kodi

Ich nutze Kodi auf einem Raspberry Pi2 ohne Keyboard.In dieser Konstellation erstellt man Screenshots am einfachsten per API Request.
http://192.168.0.148:8080/jsonrpc?request={%20%22jsonrpc%22:%20%222.0%22,%20%22id%22:%201,%20%22method%22:%20%22Input.ExecuteAction%22,%20%22params%22:%20{%20%22action%22:%20%22screenshot%22%20}}

Damit das klappt muß in den Settings ein Pfad gesetzt werden.

Einstellungen -> System -> Debugging
Einstellungen -> System -> Debugging

Ich ziehe die Bilder danach bequem scp oder Nautilus Caja auf den Rechner.

Kodi: Fehlende Videos identifizieren

Ich stehe des öfteren vor der Problematik, daß die Scraper in Kodi neu hinzugefügte Filme und Serien nicht finden kann. Der Ablauf um dies zu beheben ist immer der gleiche:

  1. Videos die nicht in der Library sind identifizieren
  2. umbenennen
  3. Library updaten und zurück zu Schritt 1 bis alles in der Library ist.

Um das ganze ein wenig bequemer zu gestalten und sinnloses Bewegen zwischen TV und Rechner zu vermeiden mache ich das auf der Kommandozeile.

Benötigte Programme

Falls nicht vorhanden muß sqlite3 installiert sein. Kodi läuft bei mir über OSMC auf dem Rasberry Pi 2 – da gibt es apt-get :):

sudo apt-get install sqlite3

je nach OS wird das anders installiert.

Fehlende Videos finden

Im gut organisierten Kodi Wiki findet man zwar einen Befehl samt cut Anweisung der aber eher schlecht als recht bei mir arbeitet. Abhilfe schafft ein Script aus gleicher Quelle bei dem die Pfade ein wenig angepasst werden müssen. Ich habe eine weitere Variable reingetan um das ganze zu vereinfachen:

#!/bin/bash
#
# Kodi Orphans and Widows
# v1.1
#
# created by BaerMan for XBMC-community
# includes improvements from deathinator
# This script may be used for any purposes.
# You may change, sell, print or even sing it
# but you have to use it at your own risk!
#
# This script is ugly and may under certain circumstances crash your
# computer, kill your cat and/or drink your beer.
# Use it at your own risk!
#
# This script searches for media files (actually video files only) and
# checkes for
# 1) files that are not in the library
# 2) files that are in library only
# 3) entries in the library that are 'stacked' ones
 
# To Do:
#
# * examine wether a path is marked as defined content or excluded from
# scanning (strContent=None)
# * rewrite the whole thing in python
 
# Discussion and latest version:
# http://forum.kodi.tv/showthread.php?t=62058
# http://wiki.xbmc.org/?title=Linux-Script_To_Find_Not_Scraped_Movies
 
################
### Settings ###
################
#enter the path to your homedirectory
HOMEDIR="/home/osmc"
### Full path to the video-database ; may be absolute (preceeded by a
### slash "/") or relative form the current directory
DBPATH="${HOMEDIR}/.kodi/userdata/Database/MyVideos*.db"
 
### Filenames for results and intermediate data
### You may change these to any name and place you like but beware not to
### overwrite or delete files you may still need
PREFIX="${HOMEDIR}/xbmc_"
DBPATHLIST="${PREFIX}db_path.lst"
DBFILESLIST="${PREFIX}db_files.lst"
FINDLIST="${PREFIX}find.lst"
DIFFLIST="${PREFIX}diff.lst"
DBONLYLIST="${PREFIX}db-only.lst"
FSONLYLIST="${PREFIX}fs-only.lst"
STACKEDLIST="${PREFIX}db-stacked.lst"
 
### Programs used ; either absolute path or command only if path to the
### binary is in variable $PATH ; each command may be extended by optional
### arguments - refer to the specific manpage for details
SQLITECMD="sqlite3" ; FINDCMD="find" ; SORTCMD="sort"
GREPCMD="grep" ; RMCMD="rm" ; UNIQCMD="uniq"
DIFFCMD="diff -a -b -B -U 0 -d"
 
#######################################
### Changes within the working code ###
#######################################
 
### There is a list of suffixes, that we will search for. You may add,
### delete or modify any entry to fit your needs, but respect the
### correct escaping of newlines
 
### We don't want to descent into subdirectories as they are usually
### represented by their own path-entry in the database. Deep scans would
### lead to multiple hits on the same file. But if for some reason not all
### path elements are represented in the database, you may find and delete
### the following string and force $FINDCMD to look into all subdirectories
### in any given path
### "-maxdepth 1"
 
####################
### working code ###
####################
${RMCMD} ${DBPATHLIST} ${DBFILESLIST} ${FINDLIST} ${DIFFLIST} ${STACKEDLIST} ${FSONLYLIST} ${DBONLYLIST} 2>/dev/null
${SQLITECMD} -list -separator '' ${DBPATH} \
 "select strPath from path order by strPath;" \
  | ${SORTCMD} > ${DBPATHLIST}
${SQLITECMD} -list -separator '' ${DBPATH} \
 "select strPath, strFilename from path, files where path.idPath = files.idPath order by strPath, strFilename;" \
  | ${SORTCMD} > ${DBFILESLIST}
IFS='
'
for fPATH in $(<${DBPATHLIST}) ; do
    ${FINDCMD} ${fPATH} -maxdepth 1 \( \
 -name '*.avi' -o \
 -name '*.divx' -o \
 -name '*.iso' -o \
 -name '*.m2v' -o \
 -name '*.mkv' -o \
 -name '*.mp4' -o \
 -name '*.mpeg' -o \
 -name '*.mpg' -o \
 -name '*.ogm' -o \
 -name '*.vob' \
    \) | ${SORTCMD} >> ${FINDLIST}
done
unset IFS
${DIFFCMD} ${FINDLIST} ${DBFILESLIST} | ${GREPCMD} -v "^@@" | ${GREPCMD} -v [+-]\\{3\\} | ${SORTCMD} -k 1.2 | ${UNIQCMD} -s 1 > ${DIFFLIST}
${GREPCMD} ^+ < ${DIFFLIST} | ${GREPCMD} -v '://' | ${GREPCMD} -v '^+/$' > ${DBONLYLIST}
${GREPCMD} ^- < ${DIFFLIST} > ${FSONLYLIST}
${GREPCMD} "stack:///" < ${DIFFLIST} > ${STACKEDLIST}
${RMCMD} ${DBPATHLIST} ${DBFILESLIST} ${FINDLIST} ${DIFFLIST} 2>/dev/null

Wer noch keine Erfahrung mit Bash Skripten hat sollte im wirklich schön geschriebenen Ubuntuusers Wiki Artikel nachschauen.
Das Skript legt 3 Files in Deinem Homeverzeichniss an:

  • xbmc_db-only.lst
  • xbmc_db-stacked.lst
  • xbmc_fs-only.lst

Interessant ist die Datei xbmc_fs-only.lst dort wird aufgelistet was nicht in der Library ist.

Videos umbenennen

Ich suche eigentlich nur nach Typos und versuche die Naming Conventions von Kodi einzuhalten

Library updaten

Um die Befehle aus diesem Beitrag auszuführen mußt Du per SSH auf der Kiste sein und die Http-Api aktiviert haben. Bei mir läuft das nicht auf Port 9191 wie im Wiki sondern auf Port 8080.

 curl --data-binary '{ "jsonrpc": "2.0", "method": "VideoLibrary.Scan", "id": "mybash"}' -H 'content-type: application/json;' http://localhost:8080/jsonrpc

Jenkins – Authentifizierung mit jenkins-cli.jar

Momentan konfiguriere ich mir einen Jenkins CI Server für private PHP Sachen. Da ich das nicht alle Tage mache schreibe ich mir hakelige Sachen oder Dinge die ich recherchieren mußte hier für das nächste mal nieder. Ich werde den Server primär zum Ausführen von Unit-Tests, dem Erzeugen von Dokumentation und Softwaremetriken nutzen. Eventuell hänge ich noch ein Deployment dran.

Eine schöne Anleitung für die PHP Projekte gibt es hier. Wenn man den Server per Kommandozeile steuern möchte – um z.B. Plugins zu installieren – muß man sich per SSH Key authentifizieren.

Hier die Konfiguration auf der Kommandozeile + Webinterface im Schnelldurchgang:

1. jenkins-cli.jar besorgen

Von der Seite http://yourserver.com/cli runterladen – der Eintrag im Jenkins Wiki zu dem Thema ist auch sehr nützlich

2. Key erzeugen

ms@jenkins:~$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ms/.ssh/id_rsa): id_rsa_jenkins_cli
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_rsa_jenkins_cli.
Your public key has been saved in id_rsa_jenkins_cli.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx ms@jenkins
The key's randomart image is:
+--[ RSA 4096]----+
| cxxxxxxxxxxx    |
| xxxxxxxxxxxx    |
| xxxxxxxxxxxx    |
|   xxxxxxxxxx    |
|     xxxxxxxx    |
|       x         |
|                 |
|                 |
|                 |
+-----------------+
ms@jenkins:~$ mv id_rsa_jenkins_cli* .ssh/

3. Public Key im Jenkins Webinterface eintragen

Die Url lautet https://yourserver.com/me/configure

ms@jenkins:~$ cat .ssh/id_rsa_jenkins_cli.pub

4. Beim Aufruf von jenkins-cli.jar den Pfad zum Key mit -i mitgeben.

ms@jenkins:~$ java -jar jenkins-cli.jar -i .ssh/id_rsa_jenkins_cli -s http://localhost/jenkins install-plugin checkstyle cloverphp crap4j dry htmlpublisher jdepend plot pmd violations warnings xunit
Installing checkstyle from update center
Installing cloverphp from update center
Installing crap4j from update center
Installing dry from update center
Installing htmlpublisher from update center
Installing jdepend from update center
Installing plot from update center
Installing pmd from update center
Installing violations from update center
Installing warnings from update center
Installing xunit from update center

Nginx Maintenance Mode konfigurieren

Ab und an muß man eine Website aufgrund von Konfigurations- oder Wartungsarbeiten abschalten. Idealerweise zeigt man in diesem Zeitraum eine nette Meldung, daß gerade an der Seite gebastelt wird. Damit Administratoren, Entwickler, Tester usw. trotzdem auf der normalen Seite landen muß die Konfiguration von Nginx in /etc/nginx/sites-available/ angepasst werden.

    # ---- more -----
    location / {
        index index.php;
 
        #Maintenance Mode
	#Enter your public ip and uncomment the lines below
        #if ($remote_addr != 127.0.0.1) {
        #      return 503;
        #}
        #Maintenance Mode
 
        try_files $uri $uri/ /index.php?$args;
 
	#redirect the maintenance.html
        rewrite ^/maintenance\.html / permanent;
    }
 
   error_page 503 @maintenance;
   location @maintenance {
        rewrite ^(.*)$ /maintenance.html break;
   }
   #---- more -----

Zuerst die lokale IP eingeben – einfach zu ermitteln mit

curl ifconfig.me

und die # vor dem IF Statement auskommentieren. Alle User mit einer anderen IP werden nun auf die Datei maintenance.html (sollte im Document Root liegen). Wenn die Wartungspause beendet ist wird die Url /maintenance.html auf / weitergleitet.

DNS für Entwickler

Als Webentwickler gerät man schnell in die Problematik das geschriebene Markup auf Tablets, Telefonen, TV Geräten usw. zu prüfen.  Ich schreibe eigentlich immer an mehreren Projekten gleichzeitig und löse das durch Subdomains auf localhost. Klappt auch ganz gut, aber spätestens wenn ich in oben genannte Situation komme oder ein Kollege nen Blick von seiner Maschine drauf werfen will wird es schnell doof.  Ein Dienst der Aussagen wie „Geh auf http://dev.michael.irgendwas!“ ermöglicht muß her.

In meinem Fall lautet die Lösung dnsmasq – ein im Vergleich zu bind9 sehr einfach zu konfigurierender DNS Dienst.

Dnsmasq löst dev.michael.office bis michael.office auf. Das dev erledigt meine Maschine. Das hat den Vorteil, daß man nicht für jede neue Subdomain und jeden neuen Entwickler die Config anpassen muß.

Zuerst wird im Router ein weiterer DNS Server eingetragen – in einem meiner Fälle ein Raspberry Pi. Auf der Kiste wird nach der Anleitung im Ubuntuusers Wiki dnsmasq installiert.

Die Konfiguration ist wirklich simpel.

Zuerst in der /etc/hosts auf dem dnsmasq server die domains auflösen

#......
#Ip                         Domainname             Machine 
192.168.0.105               dns.office		   this
192.168.0.104	            michael.office         michael's machine
192.168.0.104	            hans.office            hans machine

Um alle Domains die hintendran oder davor hängen (kommt auf die Leserichtung an:-) ) muß noch eine Regel erstellt werden.

Die Konfiguration meiner Kiste auf dem dnsmasq server

pi@funkybert ~ $ cat /etc/dnsmasq.d/thinkpad 
address=/.thinkpad.home/192.168.0.104

Der Rest der Domain wird lokal aufgelöst:

ms@w530 ~ $ cat /etc/hosts
 
#.........
127.0.1.1 dev.michael.office

 

Zum Debuggen ist das Tool dig sehr zu empfehlen.

ms@w530 ~ $ dig michael.office

Zeigt wie die Domain aufgelöst wird.

ms@w530 ~ $ dig michael.office @192.168.0.105

Zeigt wie die Domain von dem DNS Sever unter 192.168.0.105 aufgelöst wird.

Sim Karte dauerhaft in Ubuntu / Linux Mint entsperren / dauerhaft deaktivieren.

Mein Laptop ist mit einer fest eingebauten Datenwanze namens Ericsson Business Mobile Networks BV zu mir gekommen. Ein nerviges Feature des Modems ist das ständige Nachfragen des Netzwerkmanagers nach der PIN wenn eine SIM Karte einliegt – auch wenn man bei der Option „Automatisch entsperren“ einen Haken setzt. Das ist auf Dauer recht nervig, da ich 1,2 mal die Woche mobiles Internet benötige, aber dafür ständig belästigt werde. Um die Karte zu entfernen muß der Akku des Laptops entfernt werden (uptime im Eimer) und kleine Dinge wie SIM-Karten gehen bei mir schnell verloren. Eine Softwarelösung muß also her!

Die Pin läßt sich dauerhaft mit dem Befehl gsmctl aus dem Paket gsm-utils speichern. Dafür muß erst das Device File mit

ms@w530 ~ $ for n in `ls /sys/class/*/*{ACM,wdm}*/device/interface`;do echo $(echo $n|awk -F '/' '{print $5}') : $(cat $n);done

gefunden werden.

ttyACM0 : H5321 gw Mobile Broadband Modem
ttyACM1 : H5321 gw Mobile Broadband Data Modem
ttyACM2 : H5321 gw Mobile Broadband GPS Port
cdc-wdm0 : H5321 gw Mobile Broadband Device Management
cdc-wdm1 : H5321 gw Mobile Broadband USIM Port

In meinem Fall kann man über /dev/ttyACM0 mit dem Modem sprechen und die Pin mit dem Befehl

sudo gsmctl -d /dev/ttyACM0 -o unlock sc all 1234

dauerhaft setzen.

Das Modem kann auch deaktiviert werden. Dafür als Superuser

rfkill block wwan

in die /etc/rc.local eintragen.

Die Seite zu dem Modem im ThinkWiki verrät noch mehr über dieses Modem, auch wie man den GPS Chip in Gang setzten kann – hab ich noch nicht gemacht und nicht so schnell vor.

Ergonomisches arbeiten mit 16:9 Displays

Heute geht es nicht um Ubuntu / Linux Basteleien, sondern um komfortables Lesen und Arbeiten mit dem Rechner. Schon seit längerem bietet der Markt eigentlich nur noch LC-Displays im Format 16:9 an. Dieses Format eignet sich hervorragend zum Anschauen von Spielfilmen, dem Spielen von Computerspielen und – was eigentlich? Das Layout der meisten Texte in meinem Kulturkreis ist auf Seitenverhältnis von 1:1,41 Hochkant ausgelegt.
Das harmonisiert nicht wirklich mit den Verhältnis 1:1,78 der meisten Computerbildschirme. Den größten Teil des Tages verbringe ich mit dem Lesen und Schreiben von Texten und nicht mit Spielen oder Filme schauen – 16:9 geht also klar an meinen Bedürfnissen vorbei.
Da heute Sonntag ist habe ich ein wenig an meinen Monitoreinstellungen herumgebastelt und gearbeitet.
Bisher habe ich 3 Displays (1* 15,6″, 1* 23″, 1*24″) mit einer jeweiligen Auflösung 1920 * 1080 Pixel genutzt. Nun habe ich ein Display im Uhrzeigersinn nach rechts gedreht und Screenshots gemacht. Im unteren Display sind die Bildschirmeinstellungen.

Im ersten Screenshot ist eine normale Newsseite im Netz zu sehen. Bemerkenswert ist der graue Rand, dieser ist sichtbar, da ich zu Testzwecken die Werbung auf der Seite ausgeblendet habe. Auffällig ist das schlechte Verhältnis von grauer Fläche zu Inhalt. Im Hochformat sieht die Sache schon ganz anders aus – weniger Grau und viel mehr Text. Informationen gehen nicht verloren. Das Rumklicken und Lesen auf der Seite macht deutlich mehr Spaß auch wenn die Darstellung ein wenig ungewohnt ist.

Internetseite einmal im Hoch- und einmal im Querformat

Viel interessanter ist der zweite Screenshot. Damit verbringe ich den größten Teil meiner Arbeitstage, dem Erstellen von unformatiertem Text. Rechts und Links ist der gleiche Code dargestellt. Der graue Balken zeigt den rechten Rand nach 120 Zeichen an. Diese Größe ist für mich sehr wichtig, da ich sehr selten und auch ungern Zeilen schreibe die länger sind.

2 mal der gleiche C Code, einmal im Hoch und einmal im Querformat.
2 mal der gleiche C Code, einmal im Hoch und einmal im Querformat.

Hier überzeugt das Hochformat! Man erkennt mehr Zeilen und muß nich so sehr am Mausrad drehen. Zum rechten Rand ist noch ein wenig Platz für Ausnahmen von der Regel und statt magerer 54 Zeilen sieht man 104 Zeilen!

Reiner Text ist meiner Meinung nach auch angenehmer zu lesen.

Faust im Browser
Faust im Browser

Zum Schluss bleibt die Frage, wie Ihr Eure Displays eingestellt habt. Arbeitet Ihr nur im Hoch oder Querformat oder nutzt Ihr beides?

Serielle Kommunikation über Bluetooth

Für ein kleines Projekt (Mobiltelefon steuert Arduino) habe ich mir ein HC-06 Bluetooth Modul für wenig Geld in China besorgt. Bluetooth habe ich nie gemocht, weil ich nie viel Freude daran hatte diese Gerätschaften unter Linux zu konfigurieren, aber der Preisunterschied zu Arduino WLAN Modulen hatte dann doch den Ausschlag gegeben:).
 Über GUI ließ sich das Gerät leider nicht konfigurieren, aber  mit den bluez-utils auf der Kommandozeile ließ sich das Problem rasch beheben.

Zuerst muß die MAC Adresse des Moduls in Erfahrung gebracht werden.

ms@debian:~/$ hcitool scan
Scanning ...
	0C:DF:A4:DE:01:54	S3350
	20:14:04:11:15:16	HC-06

Das File rfcomm.conf anpassen

root@debian:/# cat /etc/bluetooth/rfcomm.conf 
#
# RFCOMM configuration file.
#
 
rfcomm0 {
#	# Automatically bind the device at startup
	bind yes;
#
#	# Bluetooth address of the device
	device 20:14:04:11:15:16;
#	# RFCOMM channel for the connection
	channel	1;
#
#	# Description of the connection
	comment "HC-06";
}

Nun die Pin des Geräts (Default ist 1234) setzen – Mac Adresse am Besten per Tabulator vervollständigen
root@debian:/# sudo echo „20:14:04:11:15:16 1234“ >> /var/lib/bluetooth/08\:3E\:8E\:E5\:1C\:5E/pincodes

Und den Bluetooth Daemon neu starten.

root@debian:/# sudo /etc/init.d/bluetooth restart

Befehle an den Bluetooth Client senden

Strings kann man nun einfach an das Gerät redirecten
ms@debian:~$ echo „beep“ >/dev/rfcomm0

Ausgabe des Bluetooth Clients lesen

Einfach mit cat die Gerätedatei ausgeben

ms@debian:~$ cat /dev/rfcomm0
==Commands==
led on
led off
beep
beep_d [duration]
==Commands==
led on
led off
beep
beep_d [duration]

fin.