实战Linux Bluetooth编程 (九) SDP层编程

本文作者的博客地址:http://blog.sina.com.cn/samzhen1977
作者:Sam (甄峰) sam_code@hotmail.com

 

 

先前的章节谈过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

来源:(http://blog.sina.com.cn/s/blog_602f87700100jaog.html ) - 实战Linux Bluetooth编程(九) SDP层编程_samzhen_新浪博客

注意,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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux蓝牙内核协议是指作为Linux操作系统的一部分,在其内核中实现的一系列蓝牙相关协议和功能。这些协议包括了蓝牙核心规范以及各种蓝牙协议的实现,用于支持Linux系统与蓝牙设备之间的通信和交互。 蓝牙内核协议主要包括以下组成部分: 1. L2CAP(逻辑链路控制和适配):提供面向连接和面向无连接的逻辑数据链路,并在数据包上提供流控制、定时和可靠数据传输等功能。 2. SCO(同步连接导向):用于支持蓝牙音频和传真等应用,提供一种带宽有限但实时性要求高的同步数据通信。 3. HCI(主机控制接口):作为内核和蓝牙控制器之间的接口,提供控制和配置蓝牙硬件设备的功能。 4. RFCOMM(串行端口传输协议):用于模拟串行端口的传输方式,使得蓝牙设备可以像传统串口设备一样进行通信。 5. SDP(服务发现协议):用于在蓝牙设备之间发现和获取服务的信息,以便进行通信和配对。 6. HID(人机接口设备协议):用于支持蓝牙键盘和鼠标等人机接口设备的连接和通信。 蓝牙内核协议Linux操作系统中实现蓝牙功能的重要组成部分,它使得Linux能够与各种蓝牙设备进行通信,并提供了一系列协议和功能支持。通过这些协议Linux用户可以方便地连接、配对和传输数据到蓝牙设备,实现无线通信和接口控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值