掃描二維碼
隨時(shí)隨地手機(jī)看文章
3、BlueZ協(xié)議的移植 [2]
本文涉及到的硬件平臺(tái)是三星公司的S3C2410a 開發(fā)板,軟件平臺(tái)是內(nèi)核版本為 2.4.20的Linux操作系統(tǒng), 為實(shí)現(xiàn)藍(lán)牙協(xié)議棧BlueZ的移植, 可進(jìn)行以下步驟進(jìn)行移植:[!--empirenews.page--]
(1) 生成交叉編譯器,創(chuàng)建交叉編譯環(huán)境
(2) 編譯、配置實(shí)驗(yàn)開發(fā)平臺(tái)上的 Linux內(nèi)核
(3) 安裝 BlueZ 軟件包
(4) 編譯實(shí)驗(yàn)開發(fā)平臺(tái)上的Linux內(nèi)核
(5) 向s3c2410a實(shí)驗(yàn)平臺(tái)移植 通過(guò)上述步驟完成了藍(lán)牙協(xié)議棧 BlueZ的移植后,一個(gè)嵌入式藍(lán)牙應(yīng)用開發(fā)平臺(tái)就搭建
4、文件傳輸功能的實(shí)現(xiàn)
如上步驟成功移植藍(lán)牙協(xié)議棧BlueZ后,一個(gè)完整的嵌入式藍(lán)牙應(yīng)用開發(fā)平臺(tái)就已經(jīng)搭建好了,本文將利用BlueZ提供的API函數(shù)在RFCOMM層上實(shí)現(xiàn)藍(lán)牙文件傳輸?shù)墓δ?,所采用的協(xié)議路徑為:射頻(RF)—基帶與鏈路控制(BB&LC)—主機(jī)控制接口(HCI)—邏輯鏈路與適配協(xié)議(L2CAP)—串口仿真(RFCOMM)—對(duì)象交換協(xié)議(OBEX)。它的實(shí)現(xiàn)分為客戶端程序和服務(wù)器端程序,流程圖如圖2所示。
500)this.style.width=500;" border="0" />
2反映了通過(guò)藍(lán)牙實(shí)現(xiàn)文件從客戶端傳輸一個(gè)文件到服務(wù)器的過(guò)程,其中用到的協(xié)議棧中的API函數(shù)以及針對(duì)藍(lán)牙通信的設(shè)置如下 : (1)int socket(int domain, int type,int protocol) 通過(guò)這個(gè)函數(shù)建立一個(gè)套接字,其中參數(shù) domain說(shuō)明網(wǎng)絡(luò)程序所用的通訊協(xié)議族,本實(shí)驗(yàn)中我們用的是藍(lán)牙官方協(xié)議棧BlueZ,所以我們的 domain取值A(chǔ)F_BLUETOOTH,type
我們采用可靠的面向連接的 SOCK_STREAM,protocol我們采用的代表串口仿真的 BTPROTO_RFCOMM。
(2) int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
這個(gè)函數(shù)是服務(wù)器端的函數(shù),實(shí)現(xiàn)的是綁定端口功能。在我們的實(shí)驗(yàn)中,參數(shù) my_addr代表的我們用的是一個(gè)結(jié)構(gòu)體,表示本地地址信息,它的 rc_family我們?nèi)?AF_BLUETOOTH,它的rc_bdaddr我們?nèi)】梢院腿我庵鳈C(jī)通信的 INADDR_ANY。
(3) int listen(int sockfd,int backlog)
這個(gè)函數(shù)是服務(wù)器端的函數(shù),實(shí)現(xiàn)監(jiān)聽端口功能,它和我們普通Linux下的使用方法完全一樣。
(4) int accept(int sockfd, struct sockaddr *addr,int *addrlen)
這個(gè)函數(shù)是服務(wù)器端的函數(shù),完成接受客戶端的鏈接請(qǐng)求,并建立與客戶端的鏈接的功能。 [!--empirenews.page--]
(5) int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
這個(gè)函數(shù)是客戶端的函數(shù),完成向服務(wù)器端申請(qǐng)建立鏈接,與上面的綁定端口類似,參數(shù)my_addr代表的我們用的是一個(gè)結(jié)構(gòu)體,表示要申請(qǐng)鏈接的服務(wù)器地址信息,它的 rc_family我們?nèi)锳F_BLUETOOTH,它的rc_bdaddr我們?nèi)】梢院腿我庵鳈C(jī)通信的 INADDR_ANY。
(6) ssize_t write(int fd,const void *buf,size_t nbytes) ssize_t read(int fd,void *buf,size_t nbyte)
這兩個(gè)函數(shù)完成文件讀寫的功能,也完成服務(wù)器端和客戶端通信功能。在完成服務(wù)器端與客戶端通信功能時(shí),把前面建立的通道看成是文件描述符,只要往文件描述符里面讀寫信息就可以了,與向文件讀寫過(guò)程一樣。
以上是實(shí)現(xiàn)中用到的協(xié)議棧 BlueZ的主要庫(kù)函數(shù),它的客戶端核心代碼如下:
if((from_fd=open(argv[2],O_RDONLY))==-1)
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{ /* 一個(gè)致命的錯(cuò)誤發(fā)生了 */ if((bytes_read==-1)&&(errno!=EINTR)) break; else if(bytes_read>0) { ptr=buffer;
status=write(s,ptr,strlen(ptr)); memset(buffer,0,BUFFER_SIZE); }
}
它的服務(wù)器端核心代碼如下: /*創(chuàng)建目標(biāo)文件 */ memset(buf,0,BUFFER_SIZE); while(1) { bytes_read = read(client,buf,sizeof(buf));
if(bytes_read>0)
{ ptr=buf; while(bytes_write=write(to_fd,ptr,bytes_read)) { /*一個(gè)致命錯(cuò)誤發(fā)生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;/* 寫完了所有讀的字節(jié) */ else if(bytes_write==bytes_read) break; /*只寫了一部分 ,繼續(xù)寫 */ else if(bytes_write>0) { ptr+=bytes_write;
bytes_read-=bytes_write;
} } /*寫的時(shí)候發(fā)生的致命錯(cuò)誤 */ if(bytes_write==-1)break; /*這里讀完后必須把 buffer清空*/ memset(buf,0,sizeof(buf));
} else{ exit(1); }
}
5、結(jié)束語(yǔ)
在目前,對(duì)于藍(lán)牙協(xié)議棧的移植已經(jīng)有非常深入的研究,但對(duì)基于藍(lán)牙協(xié)議棧 BlueZ的源代碼級(jí)的研究還不多。本文在 ARM9+Linux環(huán)境下構(gòu)建了的藍(lán)牙工作環(huán)境, 通過(guò)官方的藍(lán)牙協(xié)議棧 BlueZ提供的庫(kù)函數(shù)編程實(shí)現(xiàn)了藍(lán)牙的文件傳輸功能。利用嵌入式系統(tǒng)和無(wú)線傳輸實(shí)現(xiàn)文件傳輸,符合數(shù)字化、網(wǎng)絡(luò)化的發(fā)展趨勢(shì)。本文作者創(chuàng)新點(diǎn) :在源代碼級(jí)別上借助藍(lán)牙協(xié)議棧 BlueZ實(shí)現(xiàn)了文件的傳輸功能。
參考文獻(xiàn):
[1]卜奎昊,基于 SAMSUNG S3C2410的嵌入式系統(tǒng)無(wú)線通信研究,安徽大學(xué)碩士畢業(yè)論文 2008
[2] 歐陽(yáng)鑫,于紅巖,呂楊,藍(lán)牙協(xié)議棧 BlueZ的移植與開發(fā). 微計(jì)算機(jī)信息,200 7
[3] 梁軍學(xué),郁濱 . Linux 藍(lán)牙協(xié)議棧的 USB 設(shè)備驅(qū)動(dòng). 計(jì)算機(jī)工程, 2008
[4] 金純,許光辰,孫睿 .藍(lán)牙技術(shù).〔M〕北京:電子工業(yè)出版社,2001
[5] www.bluez.org
北京2022年10月18日 /美通社/ -- 10月14日,國(guó)際數(shù)據(jù)公司(IDC)發(fā)布《2022Q2中國(guó)軟件定義存儲(chǔ)及超融合市場(chǎng)研究報(bào)告》,報(bào)告顯示:2022年上半年浪潮超融合銷售額同比增長(zhǎng)59.4%,近5倍于...
關(guān)鍵字: IDC BSP 數(shù)字化 數(shù)據(jù)中心東京2022年10月18日 /美通社/ -- NIPPON EXPRESS HOLDINGS株式會(huì)社(NIPPON EXPRESS HOLDINGS, INC.)旗下集團(tuán)公司上海通運(yùn)國(guó)際物流有限公司(Nipp...
關(guān)鍵字: 溫控 精密儀器 半導(dǎo)體制造 BSPLua RTOS 是一個(gè)實(shí)時(shí)操作系統(tǒng),設(shè)計(jì)在嵌入式系統(tǒng)上運(yùn)行,對(duì) FLASH 和 RAM 內(nèi)存的要求最低。目前 Lua RTOS 可用于 ESP32, ESP8266 和 PIC32MZ 平臺(tái),并可以輕松移植到其他32位...
關(guān)鍵字: Lua RTOS 操作系統(tǒng) 嵌入式系統(tǒng)