文档章节

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

s
 sflfqx
发布于 2013/03/12 15:41
字数 725
阅读 200
收藏 0

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

 

本文转载自:http://blog.sina.com.cn/s/blog_602f87700100jaog.html

s
粉丝 43
博文 202
码字总数 0
作品 0
深圳
高级程序员
私信 提问
实战Linux Bluetooth编程(四) L2CAP层编程

(L2CAP协议简介,L2CAP在BlueZ中的实现以及L2CAP编程接口) 一:L2CAP协议简介: Logical Link Control and Adaptation Protocol(L2CAP) 逻辑连接控制和适配协议 (L2CAP) 为上层协议提供面向...

sflfqx
2013/03/12
317
0
实战Linux Bluetooth编程 (七) SDP协议

Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。 服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意...

sflfqx
2013/03/12
508
0
Android: Android Bluetooth

Android Bluetooth 一、Android Bluetooth现状 (1)Android2.2版 支持的蓝牙核心版本是Bluetooth 2.0 + EDR。 (2)Android 的蓝牙 使用了BlueZ协议栈,但只实现了 Handset/Handfree和A2DP/...

长平狐
2012/06/20
1K
0
Android之蓝牙驱动开发总结

一Bluetooth基本概念 3 二AndroidBluetooth架构 3 2.1Bluetooth架构图 3 2.2Bluetooth代码层次结构 3 三Bluetooth协议栈分析 4 3.1蓝牙协议栈 4 3.2Android与蓝牙协议栈的关系 6 四Bluetooth...

球球
06/11
41
0
Android开发之道(2)系统体系结构概要

转载请注明本文来自:编程艺术家Poechant的CSDN博客 http://blog.csdn.net/poechant 1、Android Architecture Overview 2、四层结构 应用层(Application Level),应用框架层(Application...

晨曦之光
2012/04/24
60
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker下使用disconf:细说demo开发

Docker下的disconf实战全文链接 《Docker搭建disconf环境,三部曲之一:极速搭建disconf》; 《Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像》; 《Docker搭建disconf环境,...

程序员欣宸
16分钟前
2
0
centos7配置nfs共享存储服务

nfs 是一种网络文件系统,需要依赖rpc进行过程调度 注意nfs只验证id,验证用户名,并且只能在类unix os上进行文件共享服务,由于它的脆弱的验证机制,所以不适宜在internet上工作,在内网使用...

老孟的Linux私房菜
19分钟前
2
0
【F5小常识】F5的 Web 应用防火墙 (WAF)有什么优势?

     现如今传统防火墙已无法满足企业安全需求,网络攻击大多发生在应用层和网络层故障,且呈上升趋势,传统的防火墙存在着很大的不足之处,包括无法检测加密的Web流量、无法扩展深度检测...

梅丽莎好
30分钟前
1
0
整合到 Mockito 2

为了能够持续改进 Mockito 和在未来提升测试体验,我们希望你能够升级到 Mockito 2.10!Mockito 按照语义化版本(semantic versioning)的方式对版本进行编排,并且只在主版本升级的时候包含...

honeymoose
30分钟前
1
0
spring boot actuator

actuator 是监控系统健康的工具,引入 spring-boot-starter-actuator会暴露一些endpoint. 可通过如下配置来配置这些endpoint的基本配置: 可通过http:${url}:28081/management/actuator/*来访...

ZH-JSON
37分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部