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.