張 劍, 趙梗明
(上海師范大學 信息與機電工程學院,上海 200234)
?
基于Linux總線的智能網(wǎng)關(guān)驅(qū)動層的研究與設(shè)計
張 劍, 趙梗明
(上海師范大學 信息與機電工程學院,上海 200234)
目前在智能家居領(lǐng)域,還沒有相關(guān)的組織機構(gòu)提出過一套統(tǒng)一的協(xié)議標準,各個廠商在設(shè)備交互上都有著各自的通信模式與協(xié)議標準.這增加了異構(gòu)網(wǎng)關(guān)軟件框架設(shè)計的復雜性和局限性.使用Linux內(nèi)核提供的一套總線注冊管理接口,在Linux下自行注冊維護一條虛擬總線,將物理設(shè)備驅(qū)動掛接在該虛擬總線上,將通信協(xié)議的細節(jié)設(shè)計放置在底層適配器中,使得異構(gòu)網(wǎng)絡(luò)的融合更加自然.同時,基于Linux總線來設(shè)計智能網(wǎng)關(guān)系統(tǒng)的驅(qū)動層,可以讓應(yīng)用層的設(shè)計接口統(tǒng)一、邏輯清晰;使底層硬件設(shè)備的入網(wǎng)也變得更加便捷,層次分明.
智能網(wǎng)關(guān); Linux系統(tǒng); 總線驅(qū)動; 物聯(lián)網(wǎng)技術(shù)
隨著手機、平板的快速發(fā)展,以及近年來炙手可熱的物聯(lián)網(wǎng)概念的普及,智能家居的概念已經(jīng)走進人們的生活.對于智能家居系統(tǒng)而言,智能網(wǎng)關(guān)無疑占據(jù)著核心的地位,網(wǎng)關(guān)設(shè)計的優(yōu)劣不僅影響著設(shè)備管理的用戶體驗,更加決定著系統(tǒng)的穩(wěn)定性和兼容性.
現(xiàn)如今,物聯(lián)網(wǎng)界沒有提出一套統(tǒng)一的標準協(xié)議,各家設(shè)備千差萬別,不同的物聯(lián)網(wǎng)應(yīng)用又對不同的智能硬件有著各自的需求,這正導致了智能網(wǎng)關(guān)的設(shè)計呈現(xiàn)出多樣化的現(xiàn)象.每一個智能硬件的通信模式、通信協(xié)議都存在著差異.因此,針對每一個硬件都需要定制一個特定的應(yīng)用,這對于網(wǎng)關(guān)而言在拓展和升級上都不是很靈活,對于非專業(yè)的用戶來說,網(wǎng)關(guān)拓展升級過程較為復雜的同時,成本和風險也相對較大[1].
同時,隨著網(wǎng)關(guān)技術(shù)的發(fā)展,它所承擔的角色不止是一個簡單的接入設(shè)備,還漸漸變?yōu)榫C合服務(wù)處理的單元.它要求不僅能控制管理智能設(shè)備,還需要連接廣域網(wǎng)成為一個個人終端.本文作者提出以Linux下總線設(shè)備驅(qū)動模型作為網(wǎng)關(guān)驅(qū)動層的設(shè)計模式,讓具體通信協(xié)議細節(jié)對于用戶空間程序透明,使得應(yīng)用層程序調(diào)用的API高度一致,從而簡化了應(yīng)用層的開發(fā).
智能網(wǎng)關(guān)的組成一般可以抽象為應(yīng)用層、驅(qū)動層、硬件層(圖1).
圖1 智能網(wǎng)關(guān)的組成
應(yīng)用層相當于網(wǎng)關(guān)對于外界的出口,提供連接給終端服務(wù)器、轉(zhuǎn)發(fā)終端發(fā)送過來的用戶指令.而應(yīng)用層與硬件的交互,則是通過文件系統(tǒng)訪問設(shè)備文件的方式來控制硬件.因此,對于應(yīng)用層編程,可以直接調(diào)用相應(yīng)的API來操作/dev/目錄下的Linux設(shè)備文件.對于驅(qū)動層來說,僅需要實現(xiàn)對硬件設(shè)備的讀寫操作方法和協(xié)議.硬件層則負責實現(xiàn)具體的控制與實現(xiàn).這種設(shè)計思想使得應(yīng)用層、驅(qū)動層、硬件層相互獨立協(xié)同工作,這也體現(xiàn)了Linux內(nèi)核的分離分層思想與軟件設(shè)計低耦合的原則[2].
圖2 網(wǎng)關(guān)框架設(shè)計
因此,本文作者提出了如圖2所示的智能網(wǎng)關(guān)軟件框架.
應(yīng)用層調(diào)用open、write、read等系統(tǒng)調(diào)用函數(shù),在Linux內(nèi)核空間經(jīng)由虛擬文件系統(tǒng)(VFS)[4]找到文件操作的函數(shù)指針.智能總線(smart bus)是通過Linux的內(nèi)核API創(chuàng)建的一條Linux虛擬總線.從smart bus來看,對上是提供統(tǒng)一的操作API,對下通過特定的算法找到匹配的適配器后去調(diào)用指定的驅(qū)動程序,smart bus起到了承上啟下的作用.適配器則實現(xiàn)了各類通信協(xié)議(如wifi協(xié)議、USB協(xié)議、I2C協(xié)議等).
因此,設(shè)計的網(wǎng)關(guān)框架中,著重介紹Linux內(nèi)核中總線驅(qū)動模塊的設(shè)計.
圖2中,分析可知,驅(qū)動層由三大部分組成:1) 負責向上提供統(tǒng)一設(shè)備接口的設(shè)備文件層.2) 負責聯(lián)系設(shè)備文件與驅(qū)動程序的總線核心層.3) 負責實現(xiàn)具體通信算法的適配以及驅(qū)動程序?qū)?三個部分共同構(gòu)成了網(wǎng)關(guān)驅(qū)動框架.下面依次介紹三個部分的設(shè)計.
2.1 設(shè)備文件層
設(shè)備文件層的作用是提供通用的系統(tǒng)調(diào)用接口,并且在/dev目錄下創(chuàng)建一個smartbus文件.當硬件上有設(shè)備成功入網(wǎng)后,通過讀寫通用接口read、write或者ioctl函數(shù)以及攜帶特定設(shè)備地址的參數(shù)就可以訪問到特定的設(shè)備.對于這一層的設(shè)計核心即是實現(xiàn)如圖3所示結(jié)構(gòu)體中的函數(shù)指針.
根據(jù)具體的設(shè)計需求,來實現(xiàn)相應(yīng)的接口.
其中需要注意的是open函數(shù)的實現(xiàn).由于在打開設(shè)備文件的時候,并不知道硬件上是否有對應(yīng)的物理設(shè)備已在物理上進行了連接,因此,可以在此判斷偵測連接的智能硬件,普遍的方式就是利用內(nèi)核提供的內(nèi)核鏈表相關(guān)函數(shù)來遍歷總線核心層所維護的適配器鏈表.
另外,在進行read、write以及ioctl等設(shè)備讀寫操作的時候,需要提供具體硬件的地址,以及操作標識和操作數(shù)據(jù)等相關(guān)信息,在此,消息數(shù)據(jù)亦可設(shè)計成如圖4所示結(jié)構(gòu)體格式.
圖3 文件操作數(shù)據(jù)結(jié)構(gòu)
圖4 消息數(shù)據(jù)結(jié)構(gòu)
由于對于應(yīng)用層來說,操作所有硬件設(shè)備都是調(diào)用這個統(tǒng)一的接口,因此,在設(shè)計上需按照上述思想去把握,方可確保接口的通用性.
對于設(shè)備注冊、設(shè)備號申請、創(chuàng)建設(shè)備文件等內(nèi)核中相應(yīng)的內(nèi)核模塊編程流程采用常規(guī)思路即可[2].
2.2 總線核心層
總線是處理器和一個或多個設(shè)備之間的通道,在設(shè)備模型中,所有的設(shè)備都通過總線相連,總線可以相互插入[5].設(shè)備模型展示了總線和它們所控制的設(shè)備之間的實際連接.在Linux內(nèi)核總存在著許多總線,如I2C總線、spi總線、usb總線以及虛擬的platform總線.Linux也允許使用內(nèi)核提供的接口來自己定義一條總線.總線核心層就是利用內(nèi)核提供的接口來生成一條總線.
總線核心層的主要工作就是維護設(shè)備鏈表和驅(qū)動鏈表,同時提供驅(qū)動和設(shè)備的匹配規(guī)則.驅(qū)動和設(shè)備在總線上注冊和注銷過程大致如圖5、6所示.
圖5 注冊過程
圖6 注銷過程
總線核心層提供了總線驅(qū)動和設(shè)備驅(qū)動的注冊和注銷.
圖5中,如果有驅(qū)動向bus總線上注冊,則遍歷bus的驅(qū)動鏈表,如果驅(qū)動已存在則注冊失敗,如果不存在則將驅(qū)動添加到總線中的驅(qū)動鏈表中,注冊成功,然后遍歷總線中設(shè)備鏈表,如果設(shè)備鏈表中有成員,則驅(qū)動會調(diào)用探測物理設(shè)備的函數(shù).
同理如有設(shè)備向總線上注冊,則遍歷總線的設(shè)備鏈表,如果設(shè)備已存在則注冊失敗,如果不存在則將設(shè)備添加到總線的設(shè)備鏈表中,注冊成功.然后遍歷驅(qū)動鏈表,如果有驅(qū)動存在,則會調(diào)用探測物理設(shè)備.
如果要注銷總線上驅(qū)動,則遍歷總線的驅(qū)動鏈表,如果找到相應(yīng)驅(qū)動,則從鏈表中刪除對應(yīng)的適配器(adapter)驅(qū)動,否則返回注銷失敗.然后遍歷設(shè)備鏈表,將每一個設(shè)備對應(yīng)的adapter從鏈表中刪除.如果要注銷總線上的設(shè)備,則遍歷總線的設(shè)備鏈表,如果找到不到對應(yīng)的設(shè)備,注銷失敗,如果找到對應(yīng)的設(shè)備則從鏈表中刪除設(shè)備.
2.3 設(shè)備驅(qū)動層
設(shè)備驅(qū)動層抽象地表示為掛接在smartbus總線上的設(shè)備驅(qū)動.它的主要作用是實現(xiàn)硬件的訪問和內(nèi)部具體讀寫操作的實現(xiàn).該層的設(shè)計流程如圖7所示.
圖7 設(shè)備驅(qū)動層流程圖
這里用到的platform平臺子系統(tǒng)[6]是Linux眾多子系統(tǒng)之一,使用platform子系統(tǒng)使得掛接在adapter上的設(shè)備更加清晰明了.因此,每一個驅(qū)動都是掛在對應(yīng)適配器中.一個適配器可以掛接多個同一類型的平臺設(shè)備,而一個平臺設(shè)備只屬于一個適配器.適配器中包括了通信算法的函數(shù)指針,因此掛在同一個適配器上的設(shè)備有著相同的通信方式.在有平臺設(shè)備被加載的時候,平臺的驅(qū)動(driver)和平臺設(shè)備(device)會被進行名字的匹配,匹配成功則會調(diào)用平臺中的probe()函數(shù),該函數(shù)初始化并且創(chuàng)建一個adapter然后將其加入總線的驅(qū)動鏈表中以備調(diào)用.注冊的過程就將設(shè)備驅(qū)動層與總線核心層聯(lián)系了起來[3].
3.1 測試驅(qū)動模塊
介紹了以上各層的設(shè)計思路后,按照這種設(shè)計方式實現(xiàn)一個基于S3C6410的平臺,以Linux2.6.36內(nèi)核版本進行該設(shè)計的試驗,該實驗利用網(wǎng)關(guān)驅(qū)動平臺,底層實現(xiàn)操作GPIO(general purpose input/output)來點亮LED燈.實驗編寫了4個模塊,依賴關(guān)系如圖8所示.
圖8 實驗?zāi)K依賴關(guān)系
圖8中smart_core.ko完成了核心層所做的事情,smart_dev.ko完成了設(shè)備文件層的工作,smart_gpio_adapter.ko和smart_led.ko則是框架中對應(yīng)的設(shè)備驅(qū)動層,其中后者是對應(yīng)的具體設(shè)備,需要添加同類設(shè)備,僅需再添加一個這類型的模塊即可.按照圖8的驅(qū)動模塊的依賴關(guān)系,使用Linux中insmod命令進行這些模塊依次的加載.
3.2 測試應(yīng)用程序
在加載完驅(qū)動模塊后,編寫簡單的應(yīng)用程序,調(diào)用Linux系統(tǒng)調(diào)用來對驅(qū)動模塊銜接的LED驅(qū)動文件燈進行操作.測試程序如下:
圖9 測試程序代碼
圖10 實驗實物圖
在進行交叉編譯通過后,將其移植到開發(fā)板上執(zhí)行.則開發(fā)板上對應(yīng)GPIO連接的LED燈會被點亮3 s的時間后熄滅.圖10中,為了使實驗現(xiàn)象更加明顯,在LED燈上還添加了一個蜂鳴器,燈亮起的時候蜂鳴器也會報警.
3.3 測試應(yīng)用程序耗時分析
對于網(wǎng)關(guān)驅(qū)動層的操作在Linux上實際就是通過系統(tǒng)調(diào)用來進行操作,而系統(tǒng)調(diào)用的過程是程序由用戶態(tài)陷入內(nèi)核態(tài)的過程,這個過程需要一定的系統(tǒng)開銷.本設(shè)計如果在系統(tǒng)調(diào)用上的耗時比Linux自身的耗時開銷更大,則系統(tǒng)設(shè)計的意義就不大了,尤其是在嵌入式這類對于實時性要求相對較高的平臺上.因此,此處采用Linux下strace工具來對系統(tǒng)開銷時間進行測試.將strace源碼下載并交叉編譯后移植到arm開發(fā)板上測試系統(tǒng)調(diào)用的時間.單次測試結(jié)果截圖如圖11所示.
圖11 單次測試結(jié)果
圖11為對LED設(shè)備文件進行11次寫操作,觀察可以發(fā)現(xiàn)主要的時間消耗在執(zhí)行execve()和ioctl()中,為了直觀對比,表1中作出了5次測量的耗時統(tǒng)計.其中LED表示應(yīng)用程序去調(diào)一個標準的Linux下的LED驅(qū)動程序,SMART表示應(yīng)用程序去調(diào)基于網(wǎng)關(guān)框架的驅(qū)動程序.
表1 運行時間對比
該測試是基于系統(tǒng)處于同一負荷的情況下進行的,可以看出,網(wǎng)關(guān)驅(qū)動框架執(zhí)行系統(tǒng)調(diào)用的時間與標準LED程序執(zhí)行系統(tǒng)調(diào)用的時間基本差別不大.因此,只要網(wǎng)關(guān)的設(shè)計合乎情理,以Linux上下文切換速度,系統(tǒng)時間開銷不會太大.這也正驗證了該設(shè)計的可行性.
隨著現(xiàn)代傳感網(wǎng)絡(luò)以及物聯(lián)網(wǎng)的發(fā)展,在智能家居通信技術(shù)上,網(wǎng)關(guān)中將會融入更多的無線通信技術(shù),如zigbee技術(shù)[7]、433射頻技術(shù)等.而針對每一種通信協(xié)議,對于本設(shè)計的網(wǎng)關(guān)來說,需要做的僅是添加一個設(shè)備驅(qū)動層,并將其掛在總線上,對于應(yīng)用層的訪問來說,僅需要向其提供一個設(shè)備地址,所有的訪問方式在其他方面都沒有太大的區(qū)別,因此,這將大大地改進網(wǎng)關(guān)的拓展性.當然,本網(wǎng)關(guān)的設(shè)計目前僅基于研究基礎(chǔ)提出了可行性和易用性,作為智能網(wǎng)關(guān)性能方面的研究,網(wǎng)絡(luò)安全、實時性、可靠性等方面則仍需后續(xù)進一步研究.
[1] Tang D,Qin X W.Applied smart gateway of IOT [J].Information and Communications Technologies,2013(6):78-82.
[2] Cai M Q,Men A D,Yang B.Study and application for driver of I2C bus based on embedded Linux [J].Computer & Digital Engineering,2009(7):181-187.
[3] Ning Y L,Chen Q,Ma Y L.Classification for driver model frameworks of Linux device [J].Modern Electronic Technique,2013(36):5-8.
[4] Hu L P.Design and implementation of avionics embedded file system [J].Aeronautical Computer Technique,2012,42(3):107-111.
[5] Jonathan C,Alessandro R,Greg K H.Linux device drivers [M].3rd ed.Nanjing:Publishing House of Southeast University,2005.
[6] Zhao B,Gao Z X Z,Xiang B Y,et al.Analysis and implementation Linux platform driver framework [J].Journal of Dalian Institude of Light Industry,2013,32(1):71-74.
[7] Liu Z Y.Hardware design of smart home system based on zigBee wireless sensor network [J].AASRI Procedia.2014(8):75-81.
(責任編輯:包震宇,馮珍珍)
Research and implementation of intelligent gatewaydriver layer based on Linux bus
ZHANG Jian, ZHAO Gengming
(College of Information,Mechanical and Electrical Engineering,Shanghai Normal University,Shanghai 200234,China)
Currently,in the field of smart home,there is no relevant organization that yet has proposed an unified protocol standard.It increases the complexity and limitations of heterogeneous gateway software framework design that different vendor′s devices have different communication mode and protocol standards.In this paper,a serial of interfaces are provided by Linux kernel,and a virtual bus is registered under Linux.The physical device drivers are able to connect to the virtual bus.The detailed designs of the communication protocol are placed in the underlying adapters,making the integration of heterogeneous networks more natural.At the same time,designing the intelligent gateway system driver layer based on Linux bus can let the application layer be more unified and clear logical.And it also let the hardware access network become more convenient and distinct.
intelligent gateway; Linux system; bus driver; IOT technology
2015-08-13
趙梗明,中國上海市徐匯區(qū)桂林路100號,上海師范大學信息與機電工程學院,郵編:200234,E-mail:gengming@shnu.edu.cn
TP 311
A
1000-5137(2016)05-0587-06
10.3969/J.ISSN.1000-5137.2016.05.012