<wbr></wbr>
1.
sdp_session_t *sdp_create(int sk, uint32_t flags)
参数1:sk: socket
参数2:SDP flags. 取值如下:
#define SDP_RETRY_IF_BUSY<wbr>0x01<br> #define SDP_WAIT_ON_CLOSE<wbr>0x02<br> #define SDP_NON_BLOCKING<wbr>0x04</wbr></wbr></wbr>
<wbr></wbr>
创建一个新的Session为了异步查找。
<wbr></wbr>
Session结构如下:
typedef struct {
<wbr>int sock;<br><wbr>int state;<br><wbr>int local;<br><wbr>int flags;<br><wbr>uint16_t tid;<wbr>// Current transaction ID<br><wbr>void *priv;<br> } sdp_session_t;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
sdp_create只是简单的创建一个空间将Session指针返回。并将sk和flags传入Session对应值。
同时,会创建transaction并将指针给priv.
struct sdp_transaction {
<wbr>sdp_callback_t *cb;<wbr><br><wbr>void *udata;<wbr><wbr><br><wbr>uint8_t *reqbuf;<wbr><br><wbr>sdp_buf_t rsp_concat_buf;<br><wbr>uint32_t reqsize;<wbr><br><wbr>int err;<wbr><wbr><br> };</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
2.
static inline int sdp_is_local(const bdaddr_t *device)
察看参数bdaddr是否为本地bdaddr--{0, 0, 0, 0xff, 0xff, 0xff}
如果是本地,则返回1。否则返回0。
<wbr></wbr>
3.
static int sdp_connect_local(sdp_session_t *session)
连接本地。并将socket赋予参数session对应数据。
创建 socket如下。socket(PF_UNIX, SOCK_STREAM, 0)
sa.sun_family = AF_UNIX;
<wbr>strcpy(sa.sun_path, SDP_UNIX_PATH);</wbr>
并连接之。
<wbr></wbr>
4.
static int sdp_connect_l2cap(const bdaddr_t *src,const bdaddr_t *dst, sdp_session_t *session)
参数1:src: 源bdaddr.
参数2:dst: 目标bdaddr.
参数3: session: sdp_create所创建的session.
动作:
创建l2cap socket.并连接,同时PSM=0x01(SDP)
并将socket 存入session. 只有与对端连接后,才可以得到SDP信息。
<wbr></wbr>
5.
sdp_session_t *sdp_connect(const bdaddr_t *src,
<wbr><wbr>const bdaddr_t *dst, uint32_t flags)</wbr></wbr>
参数1:src 源BDAddr。
参数2:dst 目标BDAddr。
参数3:flags 取值如下:
#define SDP_RETRY_IF_BUSY<wbr>0x01<br> #define SDP_WAIT_ON_CLOSE<wbr>0x02<br> #define SDP_NON_BLOCKING<wbr>0x04</wbr></wbr></wbr>
注意,SDP_RETRY_IF_BUSY<wbr>与SDP_NON_BLOCKING互斥。</wbr>
<wbr></wbr>
此函数会创建session.并创建l2cap socket,连接远端dst. PSM为1(SDP)。
<wbr></wbr>
<wbr></wbr>
6.
uuid_t *sdp_uuid16_create(uuid_t *u, uint16_t val)
将参数2 val copy到参数1 的value.uuid16中去。
<wbr></wbr>
<wbr></wbr>
7.
sdp_list_t *sdp_list_append(sdp_list_t *p, void *d)
将参数2 加入参数1 的链表中。
参数1是个单向链表。将参数2加入此单向链表中。如果参数1为空,则创建一个单向链表。
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
8.
int sdp_service_search_attr_req(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrids, sdp_list_t **rsp)
这个function非常重要。
参数1:sdp_session_t *session:此session 中的sock为已SDP连接(l2cap, psm=0x01).
参数2:const sdp_list_t *search:search是想要查找SDP Record的链表。如PNP,HID等。
参数3:sdp_attrreq_type_t reqtype
<wbr>typedef enum {<br><wbr><br><wbr>SDP_ATTR_REQ_INDIVIDUAL = 1,<br><wbr><br><wbr>SDP_ATTR_REQ_RANGE<br> } sdp_attrreq_type_t;</wbr></wbr></wbr></wbr></wbr>
参数4:const sdp_list_t *attrids。search中指定的SDP Record中的特征链表。如果想要得到某record中所有特征。则使用0x0000ffff为内容创建链表。
参数5:sdp_list_t **rsp: 得到的Attr的信息。
<wbr></wbr>
这个function是用来client发送request给server。得到符合service search pattern(参数2)的SDP Record中的Attribute。例如:可以得到PNP,HID record中的属性。如VID,PID,以及report等。
<wbr></wbr>
此function发送SDP_ServiceSearchAttributeRe<wbr>quest(PDU ID=0x06),并将search中包含的特征以及attrids放入参数。并等待SDP_ServiceSearchAttributeRe<wbr>sponse。并将返回的信息放入参数5中。</wbr></wbr>
<wbr></wbr>
参数5的具体解析,则看search是什么。PNP则查PNP的文档。HID则查HID——SPEC。
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
9.
int sdp_close(sdp_session_t *session)
关闭session->sock
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr>附录1:</wbr>
<wbr>PDU格式:(PROTOCOL DATA UNIT FORMAT)</wbr>