• (转)linux下bluetooth编程(八)SDP层编程


     BlueZ提供的SDP API,常见的如下:

     

    1.

    sdp_session_t *sdp_create(int sk, uint32_t flags)

    参数1:sk: socket

    参数2:SDP flags. 取值如下:

    #define SDP_RETRY_IF_BUSY 0x01
    #define SDP_WAIT_ON_CLOSE 0x02
    #define SDP_NON_BLOCKING 0x04

     

    创建一个新的Session为了异步查找。

     

    Session结构如下:


    typedef struct {
     int sock;
     int state;
     int local;
     int flags;
     uint16_t tid; // Current transaction ID
     void *priv;
    } sdp_session_t;

    sdp_create只是简单的创建一个空间将Session指针返回。并将sk和flags传入Session对应值。

    同时,会创建transaction并将指针给priv.


    struct sdp_transaction {
     sdp_callback_t *cb; 
     void *udata;  
     uint8_t *reqbuf; 
     sdp_buf_t rsp_concat_buf;
     uint32_t reqsize; 
     int err;  
    };

     

    2.

    static inline int sdp_is_local(const bdaddr_t *device)

    察看参数bdaddr是否为本地bdaddr--{0, 0, 0, 0xff, 0xff, 0xff}

    如果是本地,则返回1。否则返回0。

     

    3.

    static int sdp_connect_local(sdp_session_t *session)

    连接本地。并将socket赋予参数session对应数据。

    创建 socket如下。socket(PF_UNIX, SOCK_STREAM, 0)

    sa.sun_family = AF_UNIX;
     strcpy(sa.sun_path, SDP_UNIX_PATH);

    并连接之。

     

    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信息。

     

    5.

    sdp_session_t *sdp_connect(const bdaddr_t *src,
      const bdaddr_t *dst, uint32_t flags)

    参数1:src 源BDAddr。

    参数2:dst 目标BDAddr。

    参数3:flags 取值如下:

    #define SDP_RETRY_IF_BUSY 0x01
    #define SDP_WAIT_ON_CLOSE 0x02
    #define SDP_NON_BLOCKING 0x04

    注意,SDP_RETRY_IF_BUSY 与SDP_NON_BLOCKING互斥。

     

    此函数会创建session.并创建l2cap socket,连接远端dst. PSM为1(SDP)。

     

    6.

    uuid_t *sdp_uuid16_create(uuid_t *u, uint16_t val)

    将参数2 val copy到参数1 的value.uuid16中去。

     

    7.

    sdp_list_t *sdp_list_append(sdp_list_t *p, void *d)

    将参数2 加入参数1 的链表中。

    参数1是个单向链表。将参数2加入此单向链表中。如果参数1为空,则创建一个单向链表。

     

    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

     typedef enum {
     
     SDP_ATTR_REQ_INDIVIDUAL = 1,
     
     SDP_ATTR_REQ_RANGE
    } sdp_attrreq_type_t;

    参数4:const sdp_list_t *attrids。search中指定的SDP Record中的特征链表。如果想要得到某record中所有特征。则使用0x0000ffff为内容创建链表。

    参数5:sdp_list_t **rsp: 得到的Attr的信息。

     

    这个function是用来client发送request给server。得到符合service search pattern(参数2)的SDP Record中的Attribute。例如:可以得到PNP,HID record中的属性。如VID,PID,以及report等。

     

    此function发送SDP_ServiceSearchAttributeRequest(PDU ID=0x06),并将search中包含的特征以及attrids放入参数。并等待SDP_ServiceSearchAttributeResponse。并将返回的信息放入参数5中。

     

    参数5的具体解析,则看search是什么。PNP则查PNP的文档。HID则查HID——SPEC。

     

    9.

    int sdp_close(sdp_session_t *session)

    关闭session->sock

     

     

     

     附录1:

     PDU格式:(PROTOCOL DATA UNIT FORMAT)

     

    continue my dream...
  • 相关阅读:
    python学习Day21--内置函数、反射
    python学习Day20--属性、类方法和静态方法+类多继承算法补充
    python学习Day19--面向对象的三大特性
    python学习Day18--继承
    python学习Day17--名称空间
    python学习Day16--面向对象
    python学习Day15--递归与二分查找
    python学习Day14--内置函数
    c# 深克隆与浅克隆
    css test-align 和 margin 居中什么区别
  • 原文地址:https://www.cnblogs.com/chenbin7/p/2726522.html
Copyright © 2020-2023  润新知