module BLE::Service

Build information about {developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx Bluetooth Services}

To add a new service description:

BLE::Service.add '63a83b9c-0fa0-4d04-8ef9-23be4ed36231',
    name: 'World domination',
    type: 'net.cortex-minus.service.world_domination'

Returned service description will be a hash:

{
   name: "Bluetooth service name",
   type: "org.bluetooth.service.name",
   uuid: "128bit-uuid-string"
}

Constants

DB_NICKNAME
DB_TYPE
DB_UUID

Public Class Methods

[](id) click to toggle source

Get a service description from it's id. The id could be either a uuid, a type, or a nickname

@param id [Symbol,String] uuid, type or nickname @return [Hash] service description

# File lib/ble/service.rb, line 32
def self.[](id)
    case id
    when Symbol      then DB_NICKNAME[id]
    when UUID::REGEX then DB_UUID[id]
    when String      then DB_TYPE[id]
    when Integer     then DB_UUID[BLE::UUID(id)]
    else raise ArgumentError, "invalid type for service id"
    end
end
add(uuid, name:, **opts) click to toggle source

Add a service description. @example Add a service description with a 16-bit uuid

module Service
    add 0x1800,
        name: 'Generic Access',
        type: 'org.bluetooth.service.generic_access'
end

@example Add a service description with a 128-bit uuid

module Service
    add '63a83b9c-0fa0-4d04-8ef9-23be4ed36231',
        name: 'World domination',
        type: 'net.cortex-minus.service.world_domination'
end

@param uuid [Integer, String] 16-bit, 32-bit or 128-bit uuid @param name [String] @option opts :type [String] type @option opts :nick [Symbol] nickname @return [Hash] service description

# File lib/ble/service.rb, line 86
def self.add(uuid, name:, **opts)
    uuid = BLE::UUID(uuid)
    type = opts.delete :type
    nick = opts.delete :nick
    if opts.first 
        raise ArgumentError, "unknown keyword: #{opts.first[0]}" 
    end
    
    desc = DB_UUID[uuid] = {
        uuid: uuid,
        name: name,
    }

    # Add type if specified
    if type
        type = type.downcase
        desc.merge!(type: type)
        DB_TYPE[type] = desc
    end

    # Add nickname if specified or can be derived from type
    if nick.nil? && type && type =~ /\.(?<key>[^.]+)$/
        nick = $1.to_sym if type.start_with? 'org.bluetooth.service'
    end
    if nick
        if DB_NICKNAME.include?(nick)
            raise ArgumentError,
                  "nickname '#{nick}' already registered (uuid: #{uuid})"
        end
        DB_NICKNAME[nick] = desc
    end
    
    desc
end
by_nickname(id) click to toggle source

Get service description from nickname.

@param id [Symbol] nickname @return [Hash] service description

# File lib/ble/service.rb, line 46
def self.by_nickname(id)
    DB_NICKNAME[id]
end
by_type(id) click to toggle source

Get service description from type

@param id [Strig] type @return [Hash] service description

# File lib/ble/service.rb, line 62
def self.by_type(id)
    DB_TYPE[id]
end
by_uuid(id) click to toggle source

Get service description from uuid.

@param id [String] uuid @return [Hash] service description

# File lib/ble/service.rb, line 54
def self.by_uuid(id)
    DB_UUID[id]
end