3 .\" Copyright (c) 2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
4 .\" All rights reserved.
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
9 .\" 1. Redistributions of source code must retain the above copyright
10 .\" notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\" notice, this list of conditions and the following disclaimer in the
13 .\" documentation and/or other materials provided with the distribution.
15 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 .\" $Id: sdp.3,v 1.1 2006/06/19 15:44:36 gdamore Exp $
28 .\" $FreeBSD: src/lib/libsdp/sdp.3,v 1.10 2005/06/15 19:04:04 ru Exp $
53 .Nd Bluetooth SDP routines
60 .Fn SDP_GET16 "s" "cp"
61 .Fn SDP_GET32 "l" "cp"
62 .Fn SDP_GET64 "l" "cp"
63 .Fn SDP_GET128 "l" "cp"
64 .Fn SDP_GET_UUID128 "l" "cp"
66 .Fn SDP_PUT16 "s" "cp"
67 .Fn SDP_PUT32 "l" "cp"
68 .Fn SDP_PUT64 "l" "cp"
69 .Fn SDP_PUT128 "l" "cp"
70 .Fn SDP_PUT_UUID128 "l" "cp"
72 .Fn sdp_open "bdaddr_t const *l" "bdaddr_t const *r"
74 .Fn sdp_open_local "char const *control"
76 .Fn sdp_close "void *xs"
78 .Fn sdp_error "void *xs"
81 .Fa "void *xs" "uint32_t plen" "uint16_t const *pp" "uint32_t alen"
82 .Fa "uint32_t const *ap" "uint32_t vlen" "sdp_attr_t *vp"
84 .Ft "char const * const"
85 .Fn sdp_attr2desc "uint16_t attr"
86 .Ft "char const * const"
87 .Fn sdp_uuid2desc "uint16_t uuid"
89 .Fo sdp_register_service
90 .Fa "void *xss" "uint16_t uuid" "bdaddr_t const *bdaddr" "uint8_t const *data"
91 .Fa "uint32_t datalen" "uint32_t *handle"
94 .Fn sdp_unregister_service "void *xss" "uint32_t handle"
96 .Fo sdp_change_service
97 .Fa "void *xss" "uint32_t handle" "uint8_t const *data" "uint32_t datalen"
107 macros are used to get byte, short, long, long long and 128-bit integer
108 from the buffer pointed by
111 The pointer is automatically advanced.
120 macros are used to put byte, short, long, long long and 128-bit integer
121 into the buffer pointed by
124 The pointer is automatically advanced.
129 macros are used to get and put 128-bit UUID into the buffer pointed by
132 The pointer is automatically advanced.
138 functions each return a pointer to an opaque object describing SDP session.
143 function should point to a source BD_ADDR.
153 function should point to a
156 Remote BD_ADDR cannot be
160 function takes path to the control socket and opens a connection to a local
162 If path to the control socket is
170 function terminates active SDP session and deletes SDP session object.
173 parameter should point to a valid SDP session object created with
180 function returns last error that is stored inside SDP session object.
183 parameter should point to a valid SDP session object created with
187 The error value returned can be converted to a human readable message by
194 function is used to perform SDP Service Search Attribute Request.
197 parameter should point to a valid SDP session object created with
203 parameter is a Service Search Pattern - an array of one or more Service
205 The maximum number of Service Class IDs in the array is 12.
208 parameter is the length of the Service Search pattern.
211 parameter is an Attribute ID Range List - an array of one or more SDP Attribute
213 Each attribute ID Range is encoded as a 32-bit unsigned integer data
214 element, where the high order 16 bits are interpreted as the beginning
215 attribute ID of the range and the low order 16 bits are interpreted as the
216 ending attribute ID of the range.
217 The attribute IDs contained in the Attribute ID Ranges List must be listed in
218 ascending order without duplication of any attribute ID values.
219 Note that all attributes may be requested by specifying a range of
223 parameter is the length of the Attribute ID Ranges List.
225 .Fn SDP_ATTR_RANGE "lo" "hi"
226 macro can be used to prepare Attribute ID Range.
229 parameter should be an array of
234 structure describes single SDP attribute and defined as follows:
235 .Bd -literal -offset indent
238 #define SDP_ATTR_OK (0 << 0)
239 #define SDP_ATTR_INVALID (1 << 0)
240 #define SDP_ATTR_TRUNCATED (1 << 1)
241 uint16_t attr; /* SDP_ATTR_xxx */
242 uint32_t vlen; /* length of the value[] in bytes */
243 uint8_t *value; /* base pointer */
245 typedef struct sdp_attr sdp_attr_t;
246 typedef struct sdp_attr * sdp_attr_p;
251 function is expected to prepare the array of
253 structures and for each element of the array both
260 function will fill each
262 structure with attribute and value, i.e., it will set
268 The actual value of the attribute will be copied into
271 Note: attributes are returned in the order they appear in the Service Search
273 SDP server could return several attributes for the same record.
274 In this case the order of the attributes will be: all attributes for the first
275 records, then all attributes for the secord record etc.
281 functions each take a numeric attribute ID/UUID value and convert it to a
282 human readable description.
285 .Fn sdp_register_service
287 is used to register service with the local SDP server.
290 parameter should point to a valid SDP session object obtained from
294 parameter is a SDP Service Class ID for the service to be registered.
297 parameter should point to a valid BD_ADDR.
298 The service will be only advertised if request was received by the local device
305 then the service will be advertised to any remote devices that queries for it.
310 parameters specify data and size of the data for the service.
311 Upon successful return
312 .Fn sdp_register_service
315 with the SDP record handle.
316 This parameter is optional and can be set to
320 .Fn sdp_unregister_service
322 is used to unregister service with the local SDP server.
325 parameter should point to a valid SDP session object obtained from
329 parameter should contain a valid SDP record handle of the service to be
333 .Fn sdp_change_service
334 function is used to change data associated with the existing service on
335 the local SDP server.
338 parameter should point to a valid SDP session object obtained from
342 parameter should contain a valid SDP record handle of the service to be changed.
347 parameters specify data and size of the data for the service.
349 When registering services with the local SDP server the application must
350 keep the SDP session open.
351 If SDP session is closed then the local SDP server will remove all services
352 that were registered over the session.
353 The application is allowed to change or unregister service if it was registered
354 over the same session.
356 The following example shows how to get
357 .Dv SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST
359 .Dv SDP_SERVICE_CLASS_SERIAL_PORT
360 service from the remote device.
361 .Bd -literal -offset indent
363 uint8_t buffer[1024];
365 uint16_t serv = SDP_SERVICE_CLASS_SERIAL_PORT;
366 uint32_t attr = SDP_ATTR_RANGE(
367 SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST,
368 SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST);
369 sdp_attr_t proto = { SDP_ATTR_INVALID,0,sizeof(buffer),buffer };
371 /* Obtain/set remote BDADDR here */
373 if ((ss = sdp_open(BDADDR_ANY, remote)) == NULL)
375 if (sdp_error(ss) != 0)
376 /* exit sdp_error(ss) */
378 if (sdp_search(ss, 1, &serv, 1, &attr, 1, &proto) != 0)
379 /* exit sdp_error(ss) */
381 if (proto.flags != SDP_ATTR_OK)
382 /* exit see proto.flags for details */
384 /* If we got here then we have attribute value in proto.value */
393 if memory allocation for the new SDP session object fails.
394 If the new SDP object was created then caller is still expected to call
396 to check if there was connection error.
400 .Fn sdp_register_service ,
401 .Fn sdp_unregister_service
403 .Fn sdp_change_service
404 functions return non-zero value on error.
405 The caller is expected to call
407 to find out more about error.
414 .An Maksim Yevmenkin Aq m_evmenkin@yahoo.com
417 Please report bugs if found.