Using Bluetooth to Send Files on Ubuntu Core

This section describes the required steps to be able to send files over

Bluetooth using an Ubuntu Core device. It will focus on the OBEX Object Push profile which is a standard Bluetooth profile for such a use case.

Prerequisites

Make sure that:

  • The bluez snap is installed.
  • Service is up and running.
  • Both devices are paired.

Refer to the previous sections in order to learn how to do it.

The files will be sent to the server which is a Bluetooth-enabled device with the Object Push profile enabled. If this is not fulfilled then Ubuntu Core will fail to connect.

The minimal set of the Bluetooth profiles that must be available on the server device is:

Profile UUID
GAP Service 0x1800
GATT Server 0x1801
OBEX Object Push 0x1105

If you are unsure about which profiles are enabled, then check this using the

sdptool utility:

% sdptool browse 00:1A:7D:DA:71:0F
Browsing 00:1A:7D:DA:71:0F ...
Service Name: GAP Service
Service RecHandle: 0x10001
Service Class ID List:
 "Generic Access" (0x1800)
Protocol Descriptor List:
 "L2CAP" (0x0100)
   PSM: 31
 "ATT" (0x0007)
   uint16: 0x0001
   uint16: 0x0007
Language Base Attr List:
 code_ISO639: 0x656e
 encoding:    0x6a
 base_offset: 0x100
Service Name: GATT Server
Service RecHandle: 0x10002
Service Class ID List:
 "Generic Attribute" (0x1801)
Protocol Descriptor List:
 "L2CAP" (0x0100)
   PSM: 31
 "ATT" (0x0007)
   uint16: 0x000c
   uint16: 0x000f
Language Base Attr List:
 code_ISO639: 0x656e
 encoding:    0x6a
 base_offset: 0x100
Failed to connect to SDP server on 00:1A:7D:DA:71:0F: Connection refused
Service Name: OBEX Object Push
Service RecHandle: 0x10004
Service Class ID List:
 "OBEX Object Push" (0x1105)
Protocol Descriptor List:
 "L2CAP" (0x0100)
 "RFCOMM" (0x0003)
   Channel: 1
 "OBEX" (0x0008)
Language Base Attr List:
 code_ISO639: 0x656e
 encoding:    0x6a
 base_offset: 0x100
Profile Descriptor List:
 "OBEX Object Push" (0x1105)
   Version: 0x0102

Connect OPP Profile

Make sure that the pairing is successfully completed. You can learn how to do it on the Pairing page

Once the pairing is successfully completed, it is time to connect the OBEX Object Push profile. To interact with OBEX, the obexctl tool is used. Open another terminal and type

$ sudo bluez.obexctl

You will see output like this:

$ sudo obexctl
[NEW] Client /org/bluez/obex
[obex]#

This indicates that the OBEX client has been properly initialized and is awaiting interactive commands. The first thing to do is to get it connected to the remote server which is the device that has been paired in the previous step. Type:

[obex]# connect 00:25:56:D1:36:6B

You will see output like:

Attempting to connect to 00:25:56:D1:36:6B
[NEW] Session /org/bluez/obex/client/session4 [default]
[NEW] ObjectPush /org/bluez/obex/client/session4
Connection successful
[00:25:56:D1:36:6B]#

The above indicates that the connection has been established. Check the address

of the remote device in the prompt. It is now possible to send files.

Sending Files

In order to send files use the send command while connected to the OBEX Object
Push profile. For sending a file type:

[00:25:56:D1:36:6B]# send <path to file>

Note that the file you are about to send should be accessible to the snap,

therefore it must be placed in a readable location. For example:

/var/snap/bluez/current.

Also keep in mind that the regular use of the OPP shall be accomplished through

the D-Bus OBEX API

therefore the bluez snap itself does not need access to other snaps data.
Below is example output of sending a file:

[00:25:56:D1:36:6B]# send /var/snap/bluez/current/f.txt
Attempting to send /var/snap/bluez/current/f.txt to /org/bluez/obex/client/session5
[NEW] Transfer /org/bluez/obex/client/session5/transfer10
Transfer /org/bluez/obex/client/session5/transfer10
       Status: queued
       Name: f.txt
       Size: 4
       Filename: /var/snap/bluez/current/f.txt
       Session: /org/bluez/obex/client/session5
[CHG] Transfer /org/bluez/obex/client/session5/transfer10 Status: complete
[DEL] Transfer /org/bluez/obex/client/session5/transfer10

Receiving Files

By default there is no way to receive a file using Bluetooth on Ubuntu Core unless the application snap implements the receiving side. This is because the incoming transfer has to be allowed and the obexctl tool does not provide such an agent. It is assumed that the application will implement this. For reference, here is the OBEX D-Bus Agent API description.

For convenience, there is a bluez-tests snap that packages the

simple-obex-agent

Python script that implements the mentioned API. It can be used to allow incoming file transfers through OBEX. The script itself has small modifications to make it compatible with Ubuntu Core specifics (Ubuntu Core uses the system, not session bus).

This feature has not been yet released, however, it is available in the edge channel for testing.

Install the bluez-tests snap

$ sudo snap install --edge bluez-tests

When the above operation successfully finishes, you are able to use the simple-obex-agent and experiment with receiving file transfers. Open another shell on the device and start the simple-obex-agent by typing:

$ sudo bluez-tests.simple-obex-agent

From now on it will listen for incoming OBEX transfers and when such transfers happen, it will prompt for a decision: accept or deny.

Please note that the software in the edge channel is for testing purposes only, therefore, do not hesitate to report any bugs or inconveniences found.