Edit: After learning a bit of sed
magic, this is now a single
script.
This Works For Me™, and I hope it works with other phones and on other
distributions as well, but no guarantees.
Here's how:
Download
synchronize-bluetooth.sh .
chmod u+x synchronize-bluetooth.sh
sudo apt-get install gnokii
Setup Gnokii (replace the phone name ;
update: sorry, the link is dead ):
echo -e "[global]\nmodel = 6510\nport = $(hcitool scan | grep 'phone name ' | cut --fields=2)\nconnection = bluetooth" > ~/.gnokiirc
Turn Bluetooth on on the computer and the phone.
Pair the computer and phone. On Ubuntu, simply click the Bluetooth icon and
follow the "Set up new device..." wizard.
If you want to copy your existing contacts to disk, you can run
./synchronize-bluetooth.sh -r > phone.vcf
To copy vCards to the phone,
overwriting the existing contacts , run
cat *.vcf | ./synchronize-bluetooth.sh -f
Note that synchronize-bluetooth.sh
works only with the
internal phone memory . Address book entries stored in the
SIM card, phone log or
elsewhere will not be read or written.
Some features of the script:
Works with plain /bin/sh
, so it should work on any Linux / BSD
distribution.
Has separate parameters to read, write and flush contacts.
#!/bin/sh
#
# NAME
# synchronize-bluetooth.sh - Synchronize contacts with Bluetooth device.
#
# SYNOPSIS
# synchronize-bluetooth.sh [options]
#
# OPTIONS
# -f,--flush Flush entries on the phone before synchronization
# -r,--read Read phonebook entries (no synchronization)
#
# EXAMPLES
# ./synchronize-bluetooth.sh -r
# Read phone address book entries.
#
# cat *.vcf | ./synchronize-bluetooth.sh -fv
# Remove all phone address book entries and write new ones.
#
# DESCRIPTION
# Warning: Overwrites the existing entries on the phone if you give it any
# input.
#
# Some limitations:
# - Gnokii (or the phone) doesn't understand N, NICKNAME, ORG and URL
# parameters.
# - Conflicts have to be resolved manually.
# - Getting a "Data format is not valid" error for unknown reasons.
# - Needs conv.pl so long as Gnokii / phone doesn't understand the full vCard
# spec.
#
# Tested on Nokia 6300 under Ubuntu (7.10-9.10). Instructions:
# <https://paperless.blog/howto-copying-vcard-address-books-to-nokia-6300-via-bluetooth-on-ubuntu-linux>
#
# BUGS
# 1: Not yet tested on other phones or operating systems.
# 2: No automated comparison of computer and phone entries.
# 3: Should use safe temporary directory creation - See web pages.
# 4: Flushing doesn't always get rid of all address book entries.
#
# Email bugs to victor dot engmark at gmail dot com. Please include the
# output of running this script.
#
# COPYRIGHT AND LICENSE
# Copyright (C) 2008-2010 Victor Engmark
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
################################################################################
# Init
PATH = '/usr/bin:/bin'
ifs_original = " $IFS " # Reset when done
cmdname = $( basename $0 )
directory = $( dirname $0 )
# Exit codes from /usr/include/sysexits.h, as recommended by
# http://www.faqs.org/docs/abs/HTML/exitcodes.html
EX_USAGE = 64
# Output error message with optional error code
error()
{
test -t 1 && {
tput setf 4
echo " $1 " > &2
tput setf 7
} || echo " $1 " > &2
if [ -z " $2 " ]
then
exit $EX_UNKNOWN
else
exit $2
fi
}
usage()
{
# Print documentation until the first empty line
while read line
do
if [ ! " $line " ]
then
exit $EX_USAGE
fi
echo " $line "
done < $0
}
# Process parameters
params = $( getopt -o fr -l flush,read --name $cmdname -- " $@ " )
if [ $? -ne 0 ]
then
usage
fi
eval set -- " $params "
while true
do
case $1 in
-f | --flush )
flush = 1
shift
;;
-r | --read )
read = 1
shift
;;
-- ) shift
break
;;
* )
usage
;;
esac
done
if [ $read ]
then
gnokii --getphonebook ME 1 end --vcard \
|| error 'Failed to get phonebook.'
exit
fi
if [ $flush ]
then
gnokii --deletephonebook ME 1 end \
|| error 'Could not flush phone entries.'
fi
sleep 1
# Is there anything on stdin?
if [ -t 0 ]
then
exit
fi
sed -n '1h;1!H;${;g;s/\r\n //g;p}' <&0 | \
sed -E s/^ADR\; .* ?\( home\| work\) .* ?:/ADR\; TYPE = \\ 1:/i\; s/^EMAIL\; .* ?\( INTERNET\) .* ?:/EMAIL\; TYPE = \\ 1:/i\; s/^TEL\; .* ?\( CELL\| FAX\| HOME\| WORK\) .* ?:/TEL\; TYPE = \\ 1:/i | \
gnokii --writephonebook --overwrite --memory-type ME --vcard
err_code = $?
if [ $err_code -eq 20 ]
then
echo 'Data format error, eh? Dunno what to do about that for now.'
elif [ $err_code -ne 0 ]
then
error 'Could not write to phone.' $err_code
fi
If you have problems sending the vCards to your phone, you may want to
validate them
first.