Logo


Computer Communication & Consulting

Linux - BASH Scripts

letzte Änderung 11.11.2007

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

zum Seitenanfang

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.

zum Seitenanfang

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
Listing: bluefoto Shell Script © Bernd Holzhauer

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.

zum Seitenanfang

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 Seitenanfang




Home Page
Ranking-Hits
Copyright © 2001-2014 Bernd Holzhauer. Alle Rechte vorbehalten.
Warenzeichen 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.