linux下bluetooth程式設計(八)SDP層程式設計
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協議Linux程式設計協議
- linux下bluetooth程式設計(三)HCI層程式設計Linux程式設計
- linux下bluetooth程式設計(四)L2CAP層程式設計Linux程式設計
- linux下bluetooth程式設計(六)L2CAP層程式設計例項Linux程式設計
- linux下bluetooth程式設計(五)bluetooth與socketLinux程式設計
- linux下bluetooth程式設計(一)基礎概念Linux程式設計
- linux下bluetooth程式設計(二)blueZ協議棧Linux程式設計協議
- UDP程式設計(八)UDP程式設計
- 程式設計《八榮八恥》程式設計
- 程式設計師程式設計能力層次模型程式設計師模型
- 程式碼分層設計
- (整合)Linux下的多程式程式設計Linux程式設計
- linux下的SHELL程式設計Linux程式設計
- 程式設計八步走程式設計
- Linux 程式設計之Shell程式設計(轉)Linux程式設計
- linux下使用makefile方式程式設計主程式Linux程式設計
- Linux下的OpenGL程式設計(轉)Linux程式設計
- Linux程式設計Linux程式設計
- 八. Go併發程式設計--errGroupGo程式設計
- 程式設計師必看的書(八)程式設計師
- 併發程式設計八股程式設計
- 《Go 語言程式設計》讀書筆記(十一)底層程式設計Go程式設計筆記
- Linux Shell程式設計(1)——shell程式設計簡介Linux程式設計
- 新手程式設計師程式設計必不可少的八大工具程式設計師
- 程式碼分層的設計之道
- 程式設計師的十層樓程式設計師
- Linux下串列埠程式設計基礎Linux串列埠程式設計
- linux程式設計下signal()函式Linux程式設計函式
- Linux下TCP網路程式設計流程LinuxTCP程式設計
- Linux下C語言程式設計(轉)LinuxC語言程式設計
- linux下TCP socket程式設計初步(1)LinuxTCP程式設計
- Linux環境下的Socket程式設計Linux程式設計
- Linux程式控制程式設計Linux程式設計
- Linux Bash程式設計Linux程式設計
- Linux jpeg程式設計Linux程式設計
- linux shell 程式設計Linux程式設計
- linux Socket 程式設計Linux程式設計
- linux shell程式設計Linux程式設計