ble command
Not logged in

Name

ble - interact with Bluetooth Low Energy (BLE) devices. Requires Android 4.3 or higher.

Synopsis

package require Ble
ble subcommand ?options?

Description

This command is used to deal with Bluetooth Low Energy (BLE) devices. The legal subcommands (which may be abbreviated) are:

ble abort handle

Abort the current write transaction on the BLE connection identified by handle which was obtained earlier by a ble connect command. Returns an integer indicating success (1), failure (0), or system error (less than 0).

ble begin handle

Starts a write transaction on the BLE connection identified by handle which was obtained earlier by a ble connect command. Returns an integer indicating success (1), failure (0), or system error (less than 0).

ble callback handle ?callback?

If the callback argument is provided that argument replaces the callback function on the BLE connection identified by handle and returns the old callback function. Otherwise the current callback function is returned. In contrast to e.g. the Tk event bind mechanism, the callback argument has not all the freedom of a Tcl bind script, i.e. it must be a single command and be parseable as a list since internally the Tcl core function Tcl_EvalObjv() is used for executing the callback instead of the Tcl_Eval*() function family supporting full scripts.

ble characteristics handle suuid sinstance

Returns a list of characteristics of the service described by its UUID suuid and instance number sinstance on the BLE connection handle. The list is layed out as a table with the five columns characteristic UUID, characteristic instance number, permissions, properties, and write type suitable for iterating using foreach {cuuid cinstance perm prop wrtype} [ble characteristics ...] {...}.

ble close handle

Closes the BLE connection identified by handle which was obtained earlier by a ble connect or ble scanner command.

ble connect address callback ?flag?

Connects to the Bluetooth LE device with address address (expressed as six hexadecimal 8 bit numbers separated by colons, like a Ethernet MAC address), and arranges for the callback command to be invoked on events on the connection to this device. The optional flag is a boolean with default false controlling automatic connection setup (see the Android documentation for more details). The callback command is called with two additional arguments, the first is a string (connection, scan, service, characteristic, descriptor, or transaction) indicating the kind of event, the second is a dictionary with event related information, see the section Event Data below. For restrictions of the callback argument see the description in ble callback above. The result of the ble connect command is a handle (a string identifying the BLE connection) to be used in other ble subcommands. During connection establishment an automatic discovery takes place which detects all advertised services, characteristics, and descriptors of the remote Bluetooth LE device.

ble descriptors handle suuid sinstance cuuid cinstance

Returns a list of descriptors of the service and characteristic described by its UUIDs suuid and cuuid and instance numbers sinstance and cinstance on the BLE connection handle. The list is layed out as a table with the two columns descriptor UUID and permissions suitable for iterating using foreach {duuid perm} [ble descriptors ...] {...}.

ble disable handle suuid sinstance cuuid cinstance

Turns off notifications of a characteristic of the BLE connection handle identified by suuid (128 bit service UUID), sinstance (service instance identifier, integer, usually 0), cuuid (128 bit characteristic UUID), and cinstance (characteristic identifier, integer, usually 0).

ble disconnect handle

Initiates a disconnect of the BLE connection handle if the current connection state is disconnected. When the operation completes the callback function of the connection is invoked.

ble dread handle suuid sinstance cuuid cinstance duuid

Initiates the read of a descriptor of the BLE connection handle identified by suuid (128 bit service UUID), sinstance (service instance identifier, integer, usually 0), cuuid (128 bit characteristic UUID), cinstance (characteristic identifier, integer, usually 0), and duuid (128 bit descriptor UUID). The result is a positive integer when the descriptor read operation is in progress, 0 or negative on error. The completion of the descriptor read operation is indicated through the callback function of the connection.

ble dwrite handle suuid sinstance cuuid cinstance duuid value

Initiates the write of a descriptor of the BLE connection handle identified by suuid (128 bit service UUID), sinstance (service instance identifier, integer, usually 0), cuuid (128 bit characteristic UUID), cinstance (characteristic identifier, integer, usually 0), and duuid (128 bit descriptor UUID). value is the value to be written and should be a string or byte array. The result is a positive integer when the descriptor write operation is in progress, 0 or negative on error. The completion of the descriptor write operation is indicated through the callback function of the connection.

ble enable handle suuid sinstance cuuid cinstance

Turns on notifications of a characteristic of the BLE connection handle identified by suuid (128 bit service UUID), sinstance (service instance identifier, integer, usually 0), cuuid (128 bit characteristic UUID), and cinstance (characteristic identifier, integer, usually 0).

ble equal handle uuid1 uuid2

Tests if the given UUIDs are equal. Both can be specified in abbreviated form and are expanded before comparison. Returns true, if the UUIDs are the same. Unknown abbreviated or long UUIDs with respect to the connection handle compare always to false.

ble execute handle

Dispatches execute (commit) of the current write transaction which was started earlier using ble begin on the BLE connection identified by handle which was obtained earlier by a ble connect command. Returns an integer indicating success (1), failure (0), or system error (less than 0). The result of the transaction is reported in the callback with event kind transaction.

ble expand handle uuid

Expands the given (abbreviated, short) UUID to its 128 bit (long, canonical) form and returns a 128 bit UUID string. An error is reported if an abbreviated or long UUID is unknown with respect to the connection handle.

ble getrssi handle

Requests remote SSI information from the BLE connection identified by handle which was obtained earlier by a ble connect command. Returns an integer indicating success (1), failure (0), or system error (less than 0). The updated remote SSI is reported in later callbacks.

ble info ?handle?

Returns information of the BLE connection identified by handle as a dictionary made up the fields handle (the connection identifier), address (Bluetooth address), and state (connection state, one of disconnected, discovery, scanning, connected, or idle. If handle is omitted, a list of all known connection identifiers is returned.

ble pair address

Initiates pairing with the Bluetooth device with address address (expressed as six hexadecimal 8 bit numbers separated by colons, like a Ethernet MAC address).

ble read handle suuid sinstance cuuid cinstance

Initiates the read of a characteristic of the BLE connection handle identified by suuid (128 bit service UUID), sinstance (service instance identifier, integer, usually 0), cuuid (128 bit characteristic UUID), and cinstance (characteristic identifier, integer, usually 0). The result is a positive integer when the read operation is in progress, 0 or negative on error. The completion of the read operation is indicated through the callback function of the connection.

ble reconnect handle

Initiates a reconnect of the BLE connection handle if the current connection state is disconnected. When the operation completes the callback function of the connection is invoked with information on the new connection state.

ble scanner callback

Creates a BLE connection to be used for detection (scan) of BLE devices and returns a handle (a string identifying the BLE scanner) to be used to deal with this scanner and arranges for the callback command to be invoked on events on the connection. See the description of ble connect and the section Event Data for more details on the callback argument.

ble services handle

Returns a list of services of the BLE connection handle. The list is layed out as a table with the three columns service UUID, service instance number, and service type suitable for iterating using foreach {suuid sinstance type} [ble services ...] {...}.

ble shorten handle uuid

Shorten the given (long, canonical) UUID to its shortest (16 or 32 bit) form. An error is reported if the long UUID is unknown with respect to the connection handle. If no unique abbreviation is found, the full 128 bit UUID is returned.

ble start handle

Starts scanning for BLE devices. Scan status and scan results are indicated by invocations of the callback function given to the corresponding ble scanner command.

ble stop handle

Stops scanning for BLE devices. Scan status is indicated by invocations of the callback function given to the corresponding ble scanner command.

ble unpair address

Initiates release of the pairing with the Bluetooth device with address address (expressed as six hexadecimal 8 bit numbers separated by colons, like a Ethernet MAC address).

ble userdata handle ?data?

Associate or retrieve user data with the BLE connection handle. When data is given it replaces the former associated user data. When omitted, the current user data or an empty list is returned.

ble write handle suuid sinstance cuuid cinstance value

Initiates the write of a characteristic of the BLE connection handle identified by suuid (128 bit service UUID), sinstance (service instance identifier, integer, usually 0), cuuid (128 bit characteristic UUID), and cinstance (characteristic identifier, integer, usually 0). value is the value to be written and should be a string or byte array. The result is a positive integer when the write operation is in progress, 0 or negative on error. The completion of the write operation is indicated through the callback function of the connection. Note: not all Android implementations allow more than one active command (example, issuing a "ble read" immediately after a "ble write"). For best compatibility, you should wait for the callback that your write operation has completed before issuing the next ble write/read command.

Abbreviated UUIDs

The 128 bit UUID arguments to ble commands can be specified in abbreviated 16 or 32 bit form as long as the value is unique with respect to the UUIDs learned during the discovery phase. Examples:

 TI SensorTag Base UUID:        F0000000-0451-4000-B000-000000000000

 IR Temperature Sensor Service: F000AA00-0451-4000-B000-000000000000
          abbreviated (32 bit): F000AA00
          abbreviated (16 bit):     AA00

 IR Temperature Sensor Value:   F000AA01-0451-4000-B000-000000000000
          abbreviated (32 bit): F000AA01
          abbreviated (16 bit):     AA01

 Generic descriptor for notify: 00002902-0000-1000-8000-00805F9B34FB
          abbreviated (32 bit): 00002902
          abbreviated (16 bit):     2902

Event Data

The first argument to callback functions is the type of event, as described below.

connection

Indicates change in connection state.

scan

Indicates change in scan state or reports newly detected Bluetooth LE devices.

service

Information about a service.

characteristic

Information about a characteristic, used for data exchange.

descriptor

Information about a descriptor (meta information of a characteristic).

transaction

Indicates status of a write transaction.

The second argument to callback functions is a dictionary with keys depending on the kind of the event. The following paragraphs list the various event formats.

handle h state s

Connection state event for ble scan. state can be one of scanning or idle.

handle h address a state s rssi r

Connection state event for ble connect. state can be one of disconnected, discovery, or connected. In the discovery phase the services, characteristics, and descriptors of the remote device are gathered. The rssi field contains the last read remote SSI (signal strength indicator) in dBm as integer number.

handle h state s address a name n type t rssi r

Scan result event. address is the Bluetooth address of the remote device, name it's advertised friendly name, type the device type as integer, rssi the receive SSI in dBm as integer.

handle h address a state s rssi r suuid su sinstance si type t

Service discovery event. suuid is the UUID of the service, sinstance the instance of that service as integer number. Refer to BluetoothGattService for details.

handle h address a state s rssi r suuid su sinstance si cuuid ci cinstance ci permissions p properties q writetype w access a value v

Characteristic event. cuuid is the UUID of the characteristic, cinstance the instance of that characteristic as integer number. The items permission, properties, and writetype are integer numbers, too. The access item contains a one letter code indicating the type of access ('c' for change notification, 'd' for discovery, 'r' for read, 'w' for write). The value item holds the data of the characteristic as a byte array. It's interpretation is device/characteristic depending. This event is reported during discovery and normal operation when ble read or ble write are performed locally or notifications for the characteristic are enabled using ble enable. Refer to BluetoothGattCharacteristic for details.

handle h address a state s rssi r suuid su sinstance si cuuid ci cinstance ci duuid di permissions p access a value v

Descriptor event. duuid is the UUID of the descriptor. The item permission is an integer number, too. The access item contains a one letter code indicating the type of access ('d' for discovery, 'r' for read, 'w' for write). The value item holds the data of the descriptor as a byte array. It's interpretation is device/characteristic/descriptor depending. This event is reported during discovery and normal operation when ble dread or ble dwrite are performed locally. Refer to BluetoothGattDescriptor for details.

handle h success s

Transaction result event. success is the transaction result and is 1 for success or 0 for failure.

Example

The following example scans for Bluetooth LE devices, connects to a TI SensorTag and enables notifications of the buttons of the device.


    proc ble_handler {what data} {
        switch -- $what {
            scan {
                if {[dict get $data name] eq "SensorTag"} {
                    # found the TI SensorTag, connect it, stop the scanner
                    ble connect [dict get $data address] ble_handler 1
                    ble close [dict get $data handle]
                }
            }
            connection {
                if {[dict get $data state] == "disconnected"} {
                    # fall back to scanning
                    ble close [dict get $data handle]
                    ble start [ble scanner ble_handler]
                } elseif {[dict get $data state] == "connected"} {
                    # if the TI SensorTag buttons were found,
                    # it will be enabled for notifications now
                    set handle [dict get $data handle]
                    set cmd [ble userdata $handle]
                    if {$cmd ne {}} {
                        if {[{*}$cmd]} {
                            # success, clear userdata
                            ble userdata $handle {}
                        }
                    }
                }
            }
            descriptor {
                if {[string match "*2902-*" [dict get $data duuid]] &&
                    [string match "*FFE1-*" [dict get $data cuuid]]} {
                    # descriptor for TI SensorTag buttons found
                    set flag 0
                    # notification enable state, 16 bit little-endian
                    #  0x0000 = disabled, 0x0001 = enabled
                    binary scan [dict get $data value] s flag
                    if {!$flag} {
                        # later turn on notifications of button changes
                        set handle [dict get $data handle]
                        ble userdata $handle [list ble enable $handle \
                            [dict get $data suuid] [dict get $data sinstance] \
                            [dict get $data cuuid] [dict get $data cinstance]]
                    }
                }
            }
        }
        # dump data to stdout
        if {[dict exists $data value]} {
            # make hex string from byte array
            binary scan [dict get $data value] H* value
            dict set data value $value
        }
        puts "$what: $data"
    }

    ble start [ble scanner ble_handler]