實(shí)戰(zhàn)Linux Bluetooth編程(二) BlueZ簡(jiǎn)介
作者: Sam(甄峰)?sam_code@hotmail.com
?
Linux下Bluetooth協(xié)議棧的實(shí)現(xiàn).Linux下開放的藍(lán)牙協(xié)議棧主要包括IBM公司的BlueDrekar,Nokia公司的Affix,Axis公司的OpenBT和官方協(xié)議棧BlueZ。我們主要面對(duì)Bluez來探討。
?
BlueZ基礎(chǔ)代碼均是由MaximKrasnyansky完成的。包括:HCI,L2CAP,RFCOMM和基本socket的實(shí)現(xiàn)。他就職于Qualcomm(高通)。MarcelHoltmann開發(fā)層的協(xié)議和應(yīng)用,包括:BNEP, CMTP等。當(dāng)然,這些中也有MaximKrasnyansky的參預(yù)。有部分代碼由Nokia提供的。
Bluez是如何實(shí)現(xiàn)Bluetooth協(xié)議棧的呢? 它分2部分實(shí)現(xiàn):
?
1.Kernel層實(shí)現(xiàn):
正如上一篇所談到的,bluetooth協(xié)議棧有多層結(jié)構(gòu),最底層的硬件協(xié)議在硬件中就已經(jīng)實(shí)現(xiàn)了。(例如broadcom的芯片中,底層硬件協(xié)議已經(jīng)包含于芯片之中了)。軟件級(jí)別的協(xié)議實(shí)現(xiàn),從HCI這一層起就可以了。BlueZ對(duì)各層協(xié)議的實(shí)現(xiàn)是依托于Socket的。BlueZ首先創(chuàng)建了一個(gè)新的Socket中的協(xié)議--PF_BLUETOOTH?(AF_BLUETOOTH=31).(也就是說,Socket()的第一個(gè)參數(shù):domain必須是:PF_BLUETOOTH?)。這也意味著,地址類型需要使用Bluetooth所定義的。
?
其實(shí)很簡(jiǎn)單,就是在net_families(網(wǎng)絡(luò)協(xié)議列表)中添加了PF_BLUETOOTH這一項(xiàng)。如果對(duì)LinuxKernel有了解的話,就知道這個(gè)注冊(cè)動(dòng)作一定在Bluetooth init部分作的。
同樣,各個(gè)協(xié)議層(如:HCI,L2CAP,HID等)都將自己的行為規(guī)范添加到PF_BLUETOOTH協(xié)議中。
?
2.應(yīng)用程序?qū)訉?shí)現(xiàn):
雖然Kernel層已經(jīng)將Bluetooth協(xié)議棧完全實(shí)現(xiàn)了,但如果要使用起來,還是非常不方便的。畢竟應(yīng)用程序與kernel最方便的交流通道就是ioctl().這非常不直觀。于是,BlueZ又提供了一套API,這個(gè)API幫助開發(fā)者方便的與Kernel層協(xié)議打交道。當(dāng)然,這些API底層的實(shí)現(xiàn)其就是是ioctl.
?
BlueZ的時(shí)間,基本就是這樣了。下面咱們具體研究如何使用BlueZ所提供的這套API。