BlueFoto - synchronisiert digitale Fotos via BlueTooth
Funktionen von BlueFoto
bluefoto - Listing des Skript V.0.3
bls - Listing des Skript BLS
Einrichten (pairing) der BlueTooth Verbindung
Linux Skripte ... kleine Helfer
BlueFoto - Übersicht
Skript zum Listen und Auslesen von Digitalen Fotos via BlueTooth
BlueFoto testet ob das Handy erreichbar ist, ob auf dem Handy neue Fotos vorhanden sind und überträgt ggf. digitale Fotos vom Handy zum PC via Bluetooth. Dazu benutzt es das Programm ObexFTP und das Skript bls von Mirko Dölle.
Die Idee zu diesem Programm basiert auf dem Artikel Blauer Zauber des CT-Magazins Heft 19/2007. Das original Skript bls finden Sie im CT-Download 0719-202.zip
oder modifiziert weiter unten als BLS Skript auf dieser Seite.
Per apt-get oder Synaptic sind zu installieren: obexftp und sdptools.
Zu Beginn des Skripts werden variable definiert:
### set variables here ###
MNAME="K810i"
BDADDR="00:1B:59:xx:xx:xx"
MPHOTODIR="Memory Stick/DCIM/100MSDCF/"
LPHOTODIR=${HOME}/Fotos/K810i
Dort können/sollten Sie das Skript an Ihre Gegebenheiten anpassen.
MNAME ist der Gerätename
BDADDR ist die Bluetooth Device Adresse, zu finden mit hcitool (siehe weiter unten)
MPHOTODIR ist das Foto-Verzeichnis innerhalb des Handys
LPHOTODIR ist das lokale Verzeichnis der Fotos im PC
Funktionen von Zu Beginn des Skripts werden variable definiert. Bluefoto
BlueFoto testet zuerst, ob eine Verbindung zum entsprechenden Handy aufgebaut werden kann und führt dann die ausgewählte Funktion durch. Die BDADDR (BlueTooth Adresse) des Handys kann mit
$ hcitool scan 00:1B:59:xx:xx:xx K810i
abgescannt werden und ist im Skript entsprechend eingetragen.
Es wird eine Hilfsdatei last.log angelegt, in der die größte Bildzahl der letzten Übertragung hinterlegt wird. Diese Datei darf nicht geändert oder gelöscht werden (außer man weiß was man tut).
Für den Fall, dass Sie im Handy den Bildzähler rücksetzen, sollten Sie alle Bilder, die Sie aufheben möchten aus dem Bildverzeichnis in ein anderes Verzeichnis kopieren und dann die last.log löschen oder die darin enthaltene Bildnummer auf "00000" setzen. Dann werden die neuen Bilder ab DSC00001.JPG kopiert. Ein evtl. noch im Verzeichnis liegendes "altes" Bild gleicher Bildnummer wird dabei gnadenlos überschrieben.
BlueFoto - Optionen:
Valid options: -c copy photos from mobile to local disk -d copy like -c, but delete photos on mobile after copy -l list all photos at mobile -L same as -l but colored output -n list only new photos -r remove (older) photos from mobile which are delete in local directory -R ##### - remove photos with numbers smaller then ###
BlueFoto Beispiel:
$ bluefoto -L DSC00486.JPG DSC00488.JPG DSC00490.JPG DSC00493.JPG DSC00495.JPG DSC00497.JPG DSC00407.JPG DSC00487.JPG DSC00489.JPG DSC00492.JPG DSC00494.JPG DSC00496.JPG DSC00408.JPG Total of 13 images found on K810i - 2 are not yet transfered Low-No. = 00407 - High-No. = 00493 Exist on both sides New Images Candidates to delete Maybe overwritten
bluefoto -L listet die im Handy befindlichen Dateien und verwendet dabei Farben zur besseren Übersicht. Dateien, die im Handy und PC existieren werden schwarz dargestellt. Neue, d.h. Fotos die jünger sind (eine höhere Dateinummer haben) als die zuletzt kopierte Datei, werden grün dargestellt. In Grau sind Kandidaten zum Löschen gelistet und in Rot Dateien, die aus beiden Seiten existieren, deren Nummer aber kleiner der Nummer in last.log ist. D.h. diese Dateien werden auf dem PC mit dem aktuellen Bild aus dem Handy überschrieben.
Low-No zeigt die kleinste Bildnummer an und High-No die in last.log eingetragene Nummer. Im Beispiel erscheint die DSC00494 in rot, weil sie zwar auf beiden Systemen existiert, jedoch lt. last.log noch nicht übertragen sein kann. Falls es ein "altes" Foto ist, wird es beim nächsten Kopieren durch die Datei des Handys überschrieben.
Das Shell Script bluefoto
Das Skript kann einfach per copy and paste übernommen werden. Mit den Variablen zu Beginn des Scripts kann es leicht an die eigenen Umgebung angepasst werden.
#!/bin/bash
#######################################################################
# Title : bluefoto
# Author : Bernd Holzhauer {bholz@cc-c.de}
# Date : 2007-09-27
# Requires : bls, obexftp, sdptool
# Category : Bluetooth Copy Tools
#######################################################################
# Description
# Script to list and get photos from mobile phone via bluetooth
# It also can delete photos at the mobile.
# Note:
# - Only newer images are copied ... if you want an image fetched
# again from your mobile, please delete or rename it at local disk
# - the image files are not in a sorted order. The last=biggest
# photo number is saved in local file last.dat, please do not
# delete this file ...
# .... except when you reset the pic counter in you cam
#######################################################################
### set variables here ###
MNAME="K810i"
BDADDR="00:1B:59:xx:xx:xx"
MPHOTODIR="Memory Stick/DCIM/100MSDCF/"
LPHOTODIR=${HOME}/Fotos/K810i
##### Do not change below #####
PN=`basename "$0"` # Program name
VER='0.3'
Usage () {
echo >&2 "$PN - handles photos on a mobile, Version $VER
The program can list, copy and delete photos on a mobile phone
using the Bluetooth communication.
Valid options:
-c copy photos from mobile to local disk
-d copy like -c, but delete photos on mobile after copy
-l list all photos at mobile
-L same as -l but colored output
-n list only new photos
-r remove (older) photos from mobile which are delete in local directory
-R ##### - remove photos with numbers smaller then ###
...."
exit 1
}
COLOR="";
while [ $# -gt 0 ]
do
case "$1" in
-c) COPY=true;;
-d) DELETE=true; COPY=true;;
-l) LIST_A=true;;
-L) LIST_A=true; COLOR=true;;
-n) LIST_N=true;;
-r) REMOVE=true;;
-R) REMOVE1=true; shift; LOW=$1;;
*) Usage;;
esac
shift
done
if [ $REMOVE1 ] && [ "$LOW" = "" ]; then Usage; exit; fi
##### check if the mobile is reachable #####
RET=`sdptool browse ${BDADDR} | grep Failed | wc -l`
if [ $RET -ne 0 ]; then
echo "*** Cannot contact the $MNAME - make sure it is switched on ***"
exit
fi
#### set some variables
IFS=$'\n'
_BLACK="\033[30m"
_RED="\033[31m"
_GREEN="\033[32m"
_GREY="\033[37m"
_NORMAL="\033[m"
cd ${LPHOTODIR}
if [ -f "last.dat" ]; then
LAST=`tail -1 last.dat`
else
LAST="00000"
fi
FIRST="99999"
NEW=$LAST
i=1
cnt_T=0
cnt_N=0
cnt_C=0
cnt_D=0
##### process files from mobile one by one #####
for f in $(bls -r ${BDADDR} ${MPHOTODIR} ); do
NAME=${f##*/} # name is DSCxxxxx.JPG
NUMMER=${NAME##*DSC} # remove DSC
NUMMER=${NUMMER%%.*} # remove .JPG
let cnt_T=$cnt_T+1
if [ $NUMMER -lt $FIRST ]; then
FIRST=$NUMMER
fi
# list them all 5 in a row
if [ $LIST_A ]; then
if [ $COLOR ]; then
if [ -e "$NAME" ]; then
if [ $NUMMER -le $LAST ]; then
echo -e -n "$_BLACK"
else
echo -e -n "$_RED"
fi
else
if [ $NUMMER -le $LAST ]; then
echo -e -n "$_GREY"
else
echo -e -n "$_GREEN"
fi
fi
fi
echo -n "$NAME "
let i=$i+1
if [ $COLOR ]; then echo -e -n "$_NORMAL"; fi
if [ $i -gt 5 ]; then echo ""; i=1; fi
fi
# list newer only
if [ $NUMMER -gt $LAST ]; then
let cnt_N=$cnt_N+1
if [ $LIST_N ]; then
echo "new Image $NAME found"
fi
fi
# copy = get files
if [ $COPY ]; then
if [ $NUMMER -gt $NEW ]; then NEW=$NUMMER; fi
# just transfer without delete
if [ ! -e "$NAME" ] && [ ! $DELETE ]; then
obexftp -b ${BDADDR} -g ${f}
let cnt_C=$cnt_C+1
fi
# transfer and delete on source
if [ ! -e "$NAME" ] && [ $DELETE ]; then
obexftp -b ${BDADDR} -G ${f}
let cnt_C=$cnt_C+1
let cnt_D=$cnt_D+1
echo "deleting $NAME"
# -G does not work with K810i
obexftp -b ${BDADDR} -k ${f} >/dev/null 2>/dev/null
fi
fi
# remove (kill) files from mobile (only if transfered before)
if [ $REMOVE ]; then
if [ ! -e "$NAME" ] && [ $NUMMER -le $LAST ]; then
echo "$NAME will be deleted"
obexftp -b ${BDADDR} -k ${f} >/dev/null 2>/dev/null
let cnt_D=$cnt_D+1
fi
fi
# remove (kill) files from mobile (only if transfered before)
if [ $REMOVE1 ]; then
if [ $NUMMER -le $LOW ] && [ $NUMMER -le $LAST ]; then
echo "$NAME will be deleted"
obexftp -b ${BDADDR} -k ${f} >/dev/null 2>/dev/null
let cnt_D=$cnt_D+1
fi
fi
done
if [ $LIST_A ]; then echo ""; fi
# save number of LAST transfered image
if [ $COPY ]; then
echo -e "bluefoto: do not edit or delete this file\n$NEW" > last.dat
fi
# output statistics
if [ $cnt_C -ne 0 ]; then
echo "$cnt_N new Images found - $cnt_C files copied"
#echo "new LAST number is $NEW"
fi
if [ $cnt_D -ne 0 ]; then
echo "$cnt_D Images deleted on $MNAME"
fi
if [ $cnt_C -eq 0 ] && [ $cnt_D -eq 0 ] && [ ! $List_N ]; then
echo -n "Total of $cnt_T images found on $MNAME - "
if [ $cnt_N -ne 0 ]; then
echo "$cnt_N are not yet transfered"
else
echo "all are already copied"
fi
echo "Low-No. = $FIRST - High-No. = $NEW"
fi
if [ $List_N ]; then
if [ $cnt_N -ne 0 ]; then
echo "$cnt_N new images in $MNAME"
else
echo "No new images found"
fi
fi
if [ $COLOR ]; then
echo -en "${_BLACK}Exist on both sides ${_GREEN} New Images ${_GREY} "
echo -e "Candidates to delete ${_RED} Maybe overwritten${_NORMAL}"
fi
cd - >/dev/null
zum Seitenanfang
Einrichten (pairing) der BlueTooth Verbindung
Unter Ubuntu (ggf. auch anderen Linux Distributionen) lässt sich eine ausgehende Verbindung (ein pairing mit dem Handy) nur aufbauen, wenn das Gnome BlueTooth Applet läuft. Dazu muss per apt-get oder Synaptic bluez-gnome installiert sein/werden.
Dann bluetooth-applet & aufrufen und eine Verbindung, z.B. mit bls -r 00:1B:59:xx:xx:xx "Memory Stick/", aufrufen. Das Handy sollte jetzt (bei dem ersten Verbindungsversuch) nach der PIN fragen und anschließend öffnet bluetooth-applet ein Fenster um die gleiche PIN auf dem PC einzugeben. Damit sollte das Pairing abgeschlossen sein.
bls - Listing des Skript bls
Das ursprüngliche Skript BLS stammt von Mirko Dölle und wurde in der CT 19/2007 unter Blauer Zauber vorgestellt. Das Skript verlangt die Eingabe einer BlueTooth-ID (BADDR) ... was ich ziemlich nervig finde. Die BlueTooth-ID meines Telefons ist aus anderen Gründen bereits in der Datei /etc/bluemacs hinterlegt. Was liegt also näher, als die BADDR aus dieser Datei zu lesen. Die entsprechende Zeile in der /etc/bluemacs sieht wie folgt aus:
00:1B:59:xx:xx:xx # K810i
Ich habe das Skript BLS entsprechend modifiziert, damit man den Namen des Mobil-Telefons anstelle der BADDR eingeben kann. Dadurch ist es möglich BLS wie folgt aufzurufen: bls -r k810 "Memory Stick/". Die Pfad-Angabe ist wegen der darin enthaltenen Leerzeichen in Anführungszeichen zu setzen.
Dabei bitte die Groß-/Kleinschreibung beachten ... wird vom Telefon zwingend vorgegeben.
Ansonsten funktioniert es wie das Original und kann für BlueFoto verwendet werden. BLS verwendet Obexftp um auf die Verzeichnisse des Handys zuzugreifen.
#!/bin/bash
# von Mirko Dölle <mid@ct.heise.de>
# Dies ist freie Software nach GPL.
#
# bls: Listet den Inhalt eines Verzeichnisses im Handy-Speichers auf.
# Erwartet als Parameter die Bluetooth-Adresse des Geräts und das
# Verzeichnis. Verzeichnisse tragen stets einen / am Ende des Namens.
# Parameter -f zeigt nur Dateien an, -d nur Verzeichnisse, -r zeigt
# rekursiv alle Dateien unterhalb des angegebenen Verzeichnisses mit
# ihrem kompletten Pfad an.
# Script modified by Bernd Holzhauer 11.Nov.2007
function ListBDir
{
obexftp -b ${baddr} -l "${1}" 2>/dev/null | while read; do
if [ -z "${REPLY/<folder name=*}" ]; then
Name=${REPLY#*<folder name=\"}
Name=${Name%\"*}
if [ -n "${Recursive}" ]; then
ListBDir "${1%/}/${Name}"
elif [ -n "${Directories}" ]; then
echo "${Name}"
elif [ -n "${Files}" ]; then
:
else
echo "${Name}/"
fi
elif [ -z "${REPLY/<file name=*}" ]; then
Name=${REPLY#*<file name=\"}
Name=${Name%\" size=*}
Size=${REPLY#*<file name=* size=\"}
Size=${Size%\"*}
if [ -n "${Recursive}" ]; then
echo "${1%/}/${Name}"
elif [ -n "${Directories}" ]; then
:
else
echo "${Name}"
fi
fi
done
}
case "${1}" in
-r)
Recursive=1
shift
;;
-d)
Directories=1
shift
;;
-f)
Files=1
shift
;;
esac
if [ $# -eq 0 ]; then
echo "Aufruf:"
echo " $0 [Parameter] [name|Bluetooth-Adresse] [Verzeichnis]"
exit 1
fi
if [ -n "${1/??:??:??:??:??:??}" ]; then
baddr=`grep -i "$1" /etc/bluemacs | awk '{print $1}'`
if [ "$baddr" = "" ]; then
echo "Handyeintrag $1 nicht in /etc/bluemacs gefunden"
else
shift
fi
echo "baddr=$baddr"
if [ -n "${baddr/??:??:??:??:??:??}" ]; then
echo "keine baddr gefunden"
echo "usage: $0 [Parameter] [Bluetooth-Adresse] [Verzeichnis]"
exit
fi
else
baddr=${1}
shift
fi
IFS=$'\n'
for d in "${@}"; do
ListBDir ${d}
done
zum SeitenanfangWarenzeichen und Marken sind Eigentum der jeweiligen Besitzer.
Das Ing.Büro Bernd Holzhauer distanziert sich grundsätzlich von gesetzeswidrigen und möglicherweise illegalen Inhalten in Seiten, auf die über www.cc-c.de verwiesen wird. Sollte Ihnen diesbezüglich etwas auffallen, melden Sie es uns bitte per email.
