姜 浩
(寧波職業(yè)技術(shù)學(xué)院,寧波 315800)
隨著家電智能化的普及和安卓系統(tǒng)的飛速發(fā)展,集成化程度高的、擁有類似智能手機(jī)觸摸交互方式的一體機(jī)廚房電器已經(jīng)受到越來越多消費(fèi)者的喜愛,但目前廚房電器普遍功能單一,操作方式也是傳統(tǒng)的按鈕式的,這成為觸發(fā)筆者研究智能烹飪軟件系統(tǒng)實(shí)現(xiàn)方式的背景。該智能烹飪系統(tǒng)主要分三部分:主控機(jī)、執(zhí)行模塊和串口;主控機(jī)上部署安卓系統(tǒng),是智能烹飪系統(tǒng)的核心,管理著所有烹飪?nèi)蝿?wù)的執(zhí)行狀態(tài);執(zhí)行模塊由多個(gè)單一的烹飪單元組成,來執(zhí)行烹飪?nèi)蝿?wù);串口是主控機(jī)和執(zhí)行模塊之間進(jìn)行通信單元,系統(tǒng)框架見圖1。本文主要研究該系統(tǒng)軟件部分的實(shí)現(xiàn)。
圖1 智能烹飪系統(tǒng)框架
安卓系統(tǒng)在較早的版本已經(jīng)提供了串口通信的實(shí)現(xiàn)接口,比如4.4版本,但該接口是@hide 隱藏的,不對外開放,只有系統(tǒng)級才能調(diào)用。智能烹飪模塊為應(yīng)用層級的軟件系統(tǒng),因此無法實(shí)現(xiàn)接口的直接調(diào)用。雖然也可以通過反射機(jī)制繞過這一限制,但反射調(diào)用會(huì)影響軟件系統(tǒng)運(yùn)行的性能,為了讓整套系統(tǒng)能更高效地運(yùn)行,再三思考后決定選用Github 上開源的android-serialportapi 項(xiàng)目作為串口通信的方案。
android-serialport-api 項(xiàng)目是native 層的實(shí)現(xiàn),因此我們需要在Android Studio 開發(fā)環(huán)境中添加NDK 環(huán)境,在應(yīng)用工程的build.gradle 腳本中增加cmake 編譯語句,把它編譯成*.so 格式的本地庫,集成到安卓應(yīng)用中,供應(yīng)用層Java 代碼調(diào)用來實(shí)現(xiàn)串口的打開、關(guān)閉、設(shè)置波特率等接口。腳本修改部分見圖2。
圖2 build.gradle腳本修改
利用JNI 開發(fā)技術(shù),實(shí)現(xiàn)Java 層對android-serialport-api 項(xiàng)目中提供的native 接口的調(diào)用和封裝,供安卓應(yīng)用層訪問串口設(shè)備使用。Java 層串口訪問接口見圖3。
圖3 串口通信的Java層接口
智能烹飪模塊是該軟件系統(tǒng)的核心,它包括人機(jī)交互界面、智能烹飪管理器和串口服務(wù)。其中智能烹飪管理器負(fù)責(zé)管理所有的烹飪?nèi)蝿?wù),支持預(yù)約、暫停、繼續(xù)、停止以及報(bào)警等烹飪功能。串口服務(wù)是智能烹飪模塊的核心,它負(fù)責(zé)監(jiān)聽串口數(shù)據(jù)的變化,獲得執(zhí)行模塊的各單元的工作狀態(tài),從而更新狀態(tài)給人機(jī)交互界面和智能烹飪管理器,它是一個(gè)安卓后臺服務(wù),它管理著一個(gè)輪詢讀取串口數(shù)據(jù)的線程,每200毫秒會(huì)讀取串口中最新的數(shù)據(jù)。為什么采用輪詢方式呢?因?yàn)閳?zhí)行模塊在執(zhí)行單元狀態(tài)發(fā)生變化時(shí),會(huì)把最新的狀態(tài)寫入到串口設(shè)備中,但是它無法主動(dòng)通知到智能烹飪模塊,因此在智能烹飪模塊側(cè)只能通過輪詢監(jiān)聽方式來獲取狀態(tài)更新。串口服務(wù)的軟件流程見圖4。
圖4 串口服務(wù)軟件流程圖
本文介紹了基于串口通信的智能烹飪軟件系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn),基于該方案設(shè)計(jì)原型系統(tǒng),對系統(tǒng)功能、性能進(jìn)行測試與分析,結(jié)果顯示,該方案完全能適用并滿足于廚房電器一體化智能控制中心系統(tǒng)的要求。