How to Transfer Files by Bluetooth From a Raspberry Pi to a Windows Laptop
by scanos in Circuits > Raspberry Pi
23901 Views, 19 Favorites, 0 Comments
How to Transfer Files by Bluetooth From a Raspberry Pi to a Windows Laptop
My objective was to set up a method to transfer files from a RaspberryPi (Rpi) to a Laptop by bluetooth, and vice-wersa. I am using the Pi to capture temperature data from a sensor and I want periodically to transfer the log file to the laptop where I can view it using Excel. To keep it simple, I will show how to transfer photographs but the idea is the same.
(PLEASE NOTE THAT I AM USING THIS METHOD WITHIN A CLOSED ENVIRONMENT. DO NOT USE THIS METHOD TO TRANSFER PERSONAL OR SENSITIVE DATA OR IN A PUBLIC.OPEN ENVIRONMENT)
I have a Lenovo laptop running running Windows 8.1. and to keep costs down, I am using a RPi Zero W v 1.1. which has Bluetooth installed. I installed the RPi as headless, using the image 2017-07-05-raspbian-jessie-lite - downloaded from https://www.raspberrypi.org/downloads/raspbian/
Something to say before we start. When you're setting up bluetooth, firstly,you have to configure and set up the connections with other devices. Secondly, when this is done, you can use applications such as obexftp for file transfer.
Here are the steps in summary
1. Rpi
1.1. Fix the bluetooth service issue
1.2. Make the RPi discoverable using Bluetoothctl (RPI Bluetooth Agent)
1.3. Install OpenOBEX
2. Laptop
2.1. Set up a shared Bluetooth folder
2.2. Discover the Rpi and pair it with the laptop
3. Set up the file transfer system
4. Some applications and scripts to automate this process
1.1. Fix the Bluetooth Service Issue
I logged on to the Pi using Putty and accessed the command line.
Check the current status of Pi Bluetooth Service from the command line prompt type sudo service bluetooth status
This will display the following:
● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled)
Active: active (running) since Tue 2017-08-01 16:28:15 UTC; 4s ago
Docs: man:bluetoothd(8) Main PID: 16899 (bluetoothd) Status: "Running" CGroup: /system.slice/bluetooth.service
└─16899 /usr/lib/bluetooth/bluetoothd
Aug 01 16:28:14 raspberrypi bluetoothd[16899]: Bluetooth daemon 5.23
Aug 01 16:28:14 raspberrypi bluetoothd[16899]: Starting SDP server
Aug 01 16:28:14 raspberrypi bluetoothd[16899]: Bluetooth management interface 1.14 initialized
Aug 01 16:28:14 raspberrypi bluetoothd[16899]: Sap driver initialization failed.
Aug 01 16:28:14 raspberrypi bluetoothd[16899]: sap-server: Operation not permitted (1)
Aug 01 16:28:15 raspberrypi systemd[1]: Started Bluetooth service.
To remove this sap error, change the bluetooth service to ignore Sap by using nano or another editor to access the service file
(note if you can't find this file, type sudo find / -name "bluetooth.service")
sudo nano /etc/systemd/system/bluetooth.target.wants/bluetooth.service
change
ExecStart=/usr/lib/bluetooth/bluetoothd
to
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap
Save the file and execute the following commands
sudo systemctl daemon-reload
sudo service bluetooth restart
sudo service bluetooth status
The Sap error should now be removed
1.2. Make the RPi Discoverable Using Bluetoothctl (Bluetooth Agent)
This the first of our two RPi putty sessions, is the RPI Bluetooth Agent window (bluetoothctl),
Using Putty, log onto the command line of the Rpi then type
sudo bluetoothctl (This opens a new shell)
When I do this it displays the visible Bluetooth devices, e.g.
[NEW] Controller B8:27:EB:C9:7D:BB raspberrypi [default]
[NEW] Device AC:B5:7D:E2:52:CD LENOVO-PC
[NEW] Device 60:E7:01:05:2B:38 Kestrel
I am interested in the address of my laptop, AC:B5:7D:E2:52:CD
Next
Type power on
Displays Changing power on succeeded
Type agent on
Displays Agent registered
Type default-agent
Displays Default agent request successful
Type discoverable on
Displays Changing discoverable on succeeded
[CHG] Controller B8:27:EB:C9:7D:BB Discoverable: yes
[CHG] Device AC:B5:7D:E2:52:CD Connected: yes
Keep this putty session open
1.3. Install OpenOBEX
Open a second RPi putty session, and install the software we need to transfer files via bluetooth FTP
Type apt-get install obexftp bluetooth
Click y to accept any prompts
2.1. Set Up a Shared Bluetooth Folder
Turn Bluetooth on on your laptop-
To see if blue tooth is activated on the laptop - swipe the screen to reveal the settings link, then select change PC settings, then click on PC settings. You will see the button to turn Bluetooth on.
Next, go back to the desktop and click the little arrow on the bottom right toolbar to reveal the bluetooth icon. Click on this and select open settings. Select the "Share" tab and you can see the Bluetooth Exchange folder location and then on the click the "Allow remote devices.... " box.
Go to the Options tab and check the box that allow other Bluetooth device to find or discover this computer. When pairing is complete, remember to go to your Bluetooth Device’ Options tab and uncheck the box that allow other Bluetooth device to find or discover this computer. That’s means only your computer can discover other Bluetooth device, so that can avoid your computer from discovered by other unknown Bluetooth device.
2.2. Discover the RpI and Pair With It From the Laptop
Again, on the laptop, swipe the screen to reveal the settings link, then select change PC settings, then click on PC settings. You will see the list of available bluetooth devices. Remember that for the RPi to be visible you will have to make it discoverable from the RPi putty screen (bluetoothctl) and similarly, on the Bluetooth Device options tab on the laptop.
Still on the laptop, next click on the RPi pair button and then go to the RPI putty session (bluetoothctl) and you will asked to confirm the passkey (Confirm passkey xxxxxx (yes/no): yes) Remember to to type yes -
Then flick back to the Laptop bluetooth screen and likewise, click to select. It should tell you that the RPi is connected to the laptop.
(Note, that from a security perspective, the passkey should not a default, eg 1234, and if it is, don't accept it. Also, ensure that both the RPI and Laptop are no longer discoverable)
3. Set Up the File Transfer System Between the RPi and Laptop
Open the second RPi putty session.
Remember that you should still have two RPi putty sessions running 1) for Bluetoothctl and 2) a general one
On the 2nd session, type sudo sdptool browse XXXXXXXXXXX - the address of the laptop (e,g, AC:B5:7D:E2:52:CD in my case). Remember, that you will find the laptop address in the 1st putty session which is running Bluetoothctl.
This displays a list of available bluetooth services. Importantly, you should see something like this which makes a reference to ObexFTP,
Service Name: FTP Server
Service RecHandle: 0x10015 Service Class ID List: "OBEX File Transfer" (0x1106) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 4 "OBEX" (0x0008) Language Base Attr List: code_ISO639: 0x656e encoding: 0x6a base_offset: 0x100 Profile Descriptor List: "OBEX File Transfer" (0x1106) Version: 0x0100
(NOTE - OTHER BLUETOOTH SERVICES INCLUDE AUDIO AND CAN BE ACCESSED USED APPLICATIONS OTHER THAN OBEXFTP. ALSO, SOME LOW SPEC SMART/CELLPHONES DON'T HAVE OBEX FILE TRANSFER PROGRAMS)
We are now able to transfer files to and from the bluetooth device and the laptop
From the same (2nd )putty terminal, firstly get the tree of directories from the laptop.
type sudo obexftp -b XXXXXXXX (laptop address) -c / -l
Here is an example from my laptop
sudo obexftp -b AC:B5:7D:E2:52:CD -c / -l
the output will show folders and files in the laptop Bluetooth exchange shared folder. These are shown in the image above. Importantly, it gives us the file names. We can now download a file from the laptop -
e.g. type sudo obexftp -b AC:B5:7D:E2:52:CD -c / -g IMG_20170731_111503.jpg
Obviously, replace AC:B5:7D:E2:52:CD with the address of your laptop
type ls-l to verify that you have downloaded this.
To upload, use the following syntax - obexftp -b AC:B5:7D:E2:52:CD -c / -p file.jpg
Obviously, replace AC:B5:7D:E2:52:CD with the address of your laptop
4. Some Applications and Scripts to Automate This Process
Scripting
Obviously, the bluetooth FTP process is quite intensive and it can be automated with bash scripts. The problem of course is how do you script the bluetoothctl shell commands. Here is an example of how to do this:
#!/bin/bash
bluetoothctl << EOF
power on
discoverable on
agent on
default-agent
pairable on
EOF
Applications
As well as transferring sensor logs for analysis on Excel etc, there are other applications. These include capturing system and security information from your RPi, e.g. disk usage, log size etc , particularly if your RPi is connected to external storage devices.
You may also want to grab images from your web site using wget or curl using crontab and transfer it to your laptop.
I hope you found this of some benefit and that it helps you get a grasp of bluetooth technology.