Main Functions that are used to work with SDP

Embedded Systems Software
Training Center
BluRapport SDK
BluRapport SDK basic
lLearn how to work with SDK, referring to the demo
l Implement Inquire request using the Demo project's
l Implement additional Inquiry functions
BluRapport SDK basics
SDK provides API procedures which are used for
management BluRapport Bluetooth stack kernel.
SDK contains functions for working with
following protocols:
- HCI (Host Controller Interface)
- L2CAP (Logical Link Control and Adaptation
- GAP (SDK for access to Generic Access Profile)
BluRapport SDK basics
Generic Access Profile
The main purpose of this profile is to describe the use of the lower layers of the
Bluetooth protocol stack (LC and LMP). To describe security related alternatives,
also higher layers (L2CAP, RFCOMM and OBEX) are included.
BluRapport SDK basics
SDK contains functions for all profiles and protocols
in BluRapport. For each layer is used special
• HCI – prefix `rx_hci_`
• L2CAP – prefix `rx_l2cap_`
• RFCOM – prefix `rx_rfcom_`
• SDP – prefix `rx_sdp_`
• OBEX – prefix `rx_obex_`
• etc
BluRapport SDK basics
SDK structure:
rxbt/SDK/include – contains list of headers. These headers
describes all API functions and required structures (i.e.
rx_errors and etc) of BluRapport SDK
rxbt/SDK/lib – compiled static and dynamic libraries
rxbt/bin – kernel of BluRapport Bluetooth stack
rxbt/samples – samples of applications
Common procedures and structures in RXBT API:
rx_ret_t rx_sdk_init() - function initializes conection between your application and BluRapport Kernel
int rx_socket(rx_socktype_t sock_type, rx_sockproto_t proto) - function creates socket for required
type and protocol and returns error code or created socket
- sock_type – determinate type of socket. See structure rx_socktype_t in rx_sdk.h
- proto – type of protocol. See structure rx_sockproto_t in rx_sdk.h
rx_ret_t rx_close(int sock) — close socket.
- sock - socket created by rx_socket() call
rx_string_to_sockaddr_no_type(TRS_CALL &serv_addr, in_buf, RX_PF_HCI);
Demo of Inquiry process
Main Functions that are used to work with HCI Inquiry:
rx_ret_t rx_start_inquiry(int sock, hci_access_code_t LAP, unsigned duration_ms, ex_uint8_t
num_resp, rx_bool_t purge_list_before_inquiry) — function starts inquiry process for HCI socket.
- sock : HCI socket identifier
- LAP: either General or Limited Inquiry
- num_resp: max # of responses, 0 means infinite
- purge_list_before_inquiry – if true, clear devices list before inquiry
rx_renew_remote_names(TRS_CALL sock) – perform inquiry request and getting symbolic name of
rx_ret_t rx_get_next_inquiry_result(int sock, rx_remote_device_user_t *info) — get next Discovery
iteration results.
- sock : HCI socket identifier
- info: remote device info see structure rx_remote_device_user_t in rx_sdk.h
SDP common
Service Discovery Protocol (SDP) is the layer in the Bluetooth protocol stack
where programs query for device information, the services those devices
provide, and their characteristics (or attributes). The querying unit then uses
this information to establish connections between devices, and ad-hoc
networking gets underway. SDP enables network devices, applications, and
services to seek out and find other complementary network devices,
applications, and services needed to properly complete specified tasks. SDP
allows developers to:
- query a Bluetooth device for the services hosted by this device
- browse the services hosted by a Bluetooth device
- advertise the availability of a service
- provide self service information.
Demo of SDP process
Main Functions that are used to work with SDP:
rx_ret_t rx_sdp_create_connection_handle(rx_sdp_handle_t *sdp_handle, rx_sockaddr_t *addr) Create a handle of a remote SDP database
- sdp_handle - pointer to a place to put the handle.
- serv_addr - remote SDP server address.
See rx_sdp_sdk.h
Types of services (full list see in rx_sdp_sdk.h), we use it for create SDP request to remote side
Demo of SDP process
Main Functions that are used to work with SDP:
rx_ret_t rx_sdp_service_search_attribute_request(rx_sdp_handle_t sdp_handle,
rx_sdp_iterator_t *sdp_iterator,
rx_sdp_uuid_t search_pattern[],
rx_uint32_t search_pattern_element_count,
rx_uint32_t attribute_id_list[],
rx_uint32_t attribute_id_list_element_count) - Generates an SDP_ServiceSearchAttributeRequest to
retrieve specified attribute values from a service records that match the service search pattern given in
the parameters of function. If request successfully executed then ServiceIterator will be created and
pointered on first service. (see rx_sdp_sdk.h)
- sdp_handle - connection handle.
- sdp_iterator - pointer to a place to put the ServiceIterator.
- search_pattern –UUID of requested service.
- search_pattern_element_count - count of elemens in search_pattern.
- attribute_id_list - list of desired attribute IDs (see next slide).
- attribute_id_list_element_count - count elements in list.
NOTE: rx_sdp_delete_iterator() should be called to free the ServiceIterator handle, when it
is no longer needed.
Demo of SDP process
Main Functions that are used to work with SDP:
NOTE: The AttributeIDList is a data element sequence where each element in the list is either an
attribute ID or a range of attribute IDs. Each attribute ID is encoded as a 16-bit unsigned integer data
element. Each attribute ID range is encoded as a 32-bit unsigned integer data element, where the high
order 16 bits are interpreted as the beginning attribute ID of the range and the low order 16 bits are
interpreted as the ending attribute ID of the range. The attribute IDs contained in the AttributeIDList
must be listed in ascending order without duplication of any attribute ID values.
rx_ret_t rx_sdp_create_attribute_iterator(rx_sdp_iterator_t service_iterator,
rx_sdp_iterator_t *attribute_iterator) - Create AttributeIterator from ServiceIterator and point it to
first attribute for Service on which currently pointered ServiceIterator
- service_iterator - ServiceIterator handle (see sdp_iterator from
- attribute_iterator - pointer to a place to put the AttributeIterator.
Demo of SDP process
Main Functions that are used to work with SDP:
rx_ret_t rx_sdp_next(rx_sdp_iterator_t iterator) - Put iterator to next element (record, attribute,
service or element in list).
- iterator - iterator which should be changed.
rx_ret_t rx_sdp_delete_iterator(rx_sdp_iterator_t iterator) - Delete the existing iterator.
- iterator - iterator which should be deleted.
- serv_addr - remote SDP server address.
See rx_sdp_sdk.h
rx_ret_t rx_sdp_close_handle(rx_sdp_handle_t sdp_handle) - Close SDP handle created earlier in
rx_sdp_create_connection_handle() or in rx_sdp_create_database_handle(). See rx_sdp_sdk.h
- sdp_handle - handle which should be closed.
Demo of SDP process
Main Functions that are used to work with SDP:
rx_ret_t rx_sdp_goto_attribute_by_id(rx_sdp_iterator_t iterator, rx_sdp_attribute_id_t
attribute_id) - Put AttributeIterator on attribute with desired ID.
- iterator - AttributeIterator handle.
- attribute_id - desired attribute ID.
rx_ret_t rx_sdp_get_value_as_string(rx_sdp_iterator_t iterator, char *string, rx_uint32_t
max_string_size) - Get STRING value.
- iterator - either AttributeIterator or ListIterator handle.
- string - pointer to a place to put the STRING value.
- max_string_size - buffer size, if string is more than the size of buffer string will be cut down.
- This function accept AttributeIterator or ListIterator.
- String will be returned without Null terminate character.
Your Task 1
Use Demo project functions to create simple scan
application (Inquiry) to getting remote devices info. So
you must sending inquire request and create list with
information about devices.
Your Task 2
Use SDP and HCI API procedures for searching OBEX
File Transport Server. Getting RFCOMM channel for
OBEX File Transport
rx_uint32_t range = RX_SDP_BUILD_ATTRIBUTE_RANGE(0,
ret = rx_sdp_create_connection_handle(TRS_CALL &sdp_handle, &address);
ret = rx_sdp_service_search_attribute_request(TRS_CALL
RX_SDP_BUILD_UUID16(&uuid, service),
1, &range, 1);
ret = rx_sdp_get_pdl_parameter_by_protocol_as_integer(TRS_CALL service_iterator, &ch, 0,
if (ret == RET_OK)
*channel = ch;
rx_sdp_delete_iterator(TRS_CALL service_iterator);
rx_sdp_close_handle(TRS_CALL sdp_handle);

similar documents