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)

 

时间: 2024-10-28 02:05:05

linux下bluetooth编程(八)SDP层编程的相关文章

linux下基于C语言的信号编程实例_C 语言

本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive si

linux下bluetooth编程(二)blueZ协议栈

Linux下开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的Affix, Axis公司的OpenBT和官方协议栈BlueZ.我们主要对Bluez进行探讨.   BlueZ基础代码均是由Maxim Krasnyansky完成的.包括:HCI,L2CAP,RFCOMM和基本socket的实现.他就职于Qualcomm(高通).Marcel Holtmann开发层的协议和应用,包括:BNEP, CMTP等.当然,这些中也有Maxim Krasnyansky的参预.有部分代码由

深入分析Linux下如何对C语言进行编程_C 语言

1.源程序的编译    在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c):  int main(int argc,char **argv)  {printf("Hello Linux/n");  } 要编译这个程序,我们只要在命令行下执行: gcc -o hello hello.c gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello

linux下bluetooth编程(三)HCI层编程

  1. HCI层协议概述: HCI提供一套统一的方法来访问Bluetooth底层.如图所示:     从图上可以看出,Host Controller Interface(HCI)  就是用来沟通Host和Module.Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle. 在Host这一端:application,SDP,L2cap等协议都是软件形式提出的(Bluez中是以kernel层程序).在Mo

linux下bluetooth编程(六)L2CAP层编程实例

  例一:发送Signaling Packet: Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输.所以得Signaling Command使用CID 0x0001. 多个Command可以在一个C-frame(control frame)中发送.    如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket.这样才有机会自己填充Command Code,Identifier等.   以下是一个发送sig

linux下bluetooth编程(七)SDP协议

  Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性. 服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征.SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法.这个协议定义了客户如何能够寻找基于特定属性的服务而不让客户知道可用服务的任何知识.SDP提供发现新服务的方法,在

linux下bluetooth编程(一)基础概念

  一:Bluetooth基本概念:   Bluetooth是爱立信.诺基亚.东芝.IBM和Intel 5家公司在1998年联合推出的一项无线网络技术.其宗旨是提供一种短距离.低成本的无线传输应用技术.在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术.行业组织人员,在经过一夜关于欧洲历史和未来无限技术发展的讨论后,有些人认为用Blatand国王的名字命名再合适不过了.Blatand国王将现在的挪威,瑞典和丹麦统一起来:就如同这项即将面世的技术,将标准不一的短距离无线传输技术统一起

linux下php实现C/C++扩展编程

某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数.下面做一个简单的例子,使用的操作系统是Fedora Core 6.     首先做一个简单的so文件:     /**      * hello.c      * To compile, use following commands:      *   gcc -O -c -fPIC -o hello.o hello.c

Linux下串口编程入门

简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍.   串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定