热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

 BlueZ提供的SDPAPI,常见的如下: 1.sdp_session_t*sdp_create(intsk,uint32_tflags)参数1:sk:socket参数2: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)

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


推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • 开发笔记:读《分布式一致性原理》JAVA客户端API操作2
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了读《分布式一致性原理》JAVA客户端API操作2相关的知识,希望对你有一定的参考价值。创 ... [详细]
  • java多线程获取线程返回结果
    我们在使用java多线程编写相关业务代码时,往往有这样一种情况,某个线程依赖于其他线程执行结果。也就是说,我们需要在一个线程中获取另一个线程的信息。可以分为两种情况,一种是轮询,一 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
author-avatar
黑仔小阿哥-炫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有