黃思遠,周淵平,苗青
(1.四川大學電子信息科學技術學院,成都610065;2.78167 部隊610017)
隨著人們的生活水平不斷提升,街道上的車輛增加許多,道路上騎行的風險也驟增,車禍事故頻發(fā)。不少摩托車事故都是因為駕駛員在駕駛過程中操作手機引起的。為了減少這種風險,設計了一款智能騎行頭盔,可以在騎行時便捷地完成一些手機的功能。此頭盔使用藍牙通信技術,將手機端和頭盔端聯(lián)系起來,可以在騎行時無需操作手機就可以便捷地通過語音操控手機的一些功能。這樣,既解放了雙手,又可以讓騎行者專注于騎行。對于廣大騎行者,該頭盔有著巨大的市場潛力。
為了滿足頭盔和手機的交互的便利性和功能封裝聚合的需求,本文設計了一款頭盔控制軟件系統(tǒng)。方便頭盔端和手機端的交互,包括數(shù)據(jù)通信、語音控制、地圖導航、音樂控制等功能,提高了用戶體驗的同時,強化了頭盔的功能,為使用者提供了便利。
本節(jié)將簡單介紹系統(tǒng)的操作系統(tǒng)、開發(fā)環(huán)境、開發(fā)語言和使用的工具類,然后介紹系統(tǒng)的主要邏輯結構和功能組成。
合適的系統(tǒng)集成環(huán)境可以使系統(tǒng)的運行更高效更穩(wěn)定。Android系統(tǒng)開源免費,是全球使用最廣泛的操作系統(tǒng),因此本軟件采用了Android系統(tǒng)。本軟件采用Android Studio平臺開發(fā),支持Android 4.0到Android 7.0的系統(tǒng)。語音識別和文本理解使用了科大訊飛的API,地圖導航使用了百度地圖的API,藍牙連接使用了谷歌的android.bluetooth包。
表1 系統(tǒng)集成環(huán)境
如圖1所示,一個完整的藍牙智能騎行頭盔An?droid終端系統(tǒng),主要包括監(jiān)聽輸入、藍牙通信、語音處理、功能實現(xiàn)。整個藍牙智能騎行頭盔Android終端系統(tǒng)的功能可以分為兩個,一是語音指令的獲取和解析,二是語音指令的具體功能實現(xiàn)。語音指令獲取過程:手機收到我們的按鍵提示后監(jiān)聽藍牙麥克風的語音輸入,如果監(jiān)聽到語音信號輸入,則通過藍牙串口傳輸?shù)绞謾C。串口數(shù)據(jù)進入手機后由后臺線程通過調用訊飛的語音解析接口將語音信號轉成文字形式的字符串,得到文本數(shù)據(jù)[1],提取其中的關鍵詞,隨即開啟一條線程傳入?yún)?shù),執(zhí)行語音命令所對應的功能。系統(tǒng)結構如圖1所示。
圖1 系統(tǒng)結構
硬件系統(tǒng)包括C8051F020單片機和藍牙模塊BK8000L。C8051F020是基于CIP-51的微控制器,比傳統(tǒng)8051系列單片機執(zhí)行速度提升很大。藍牙模塊BK8000L體積小、重量輕、功能強大,可以跟許多類型手機連接。將藍牙和麥克風分別連在單片機上,將其放置在頭盔上。效果如圖2所示。
圖2 硬件組成
藍牙連接協(xié)議結構可分為底層硬件模塊、中間協(xié)議層和高端應用層三大部分,底層硬件模塊為數(shù)據(jù)的無線傳輸提供硬件支持。中間協(xié)議層定義了4個藍牙核心協(xié)議,是其他上層協(xié)議實現(xiàn)的基礎。高端應用層可以讓開發(fā)者自定義各種應用模型的剖面(Profile)。
本系統(tǒng)主要配置了高端應用層中的藍牙鏈路方式。藍牙物理鏈路分兩種,同步鏈路SCO(Synchronous Connection Oriented)和異步鏈路 ACL(Asynchronous Connectionless)。本系統(tǒng)的采用的是SCO方式,此連接類型主要適用于同步語音傳輸。SCO連接為對稱連接,通過有規(guī)律的使用保留時隙來維持SCO鏈接,可以傳輸對時間要求很高的數(shù)據(jù)通信。傳輸即時、快速,符合頭盔傳輸?shù)囊蟆?/p>
在本系統(tǒng)中,通過調用mAudioManager類的start?BluetoothSco()方法打開SCO連接。藍牙SCO連接建立需要時間,連接建立后,使用廣播接收該消息而進入后續(xù)邏輯。
軟件系統(tǒng)主要由兩部分構成:一是手機界面設計,二是后臺線程設計。下面對這兩部分的具體實現(xiàn)做詳細闡述。
本軟件的界面主要有四個,分別是初始連接界面,主界面以及導航界面。初始連接界面負責連接藍牙;主界面負責識別語音指令以及響應結果。
系統(tǒng)的界面布局均使用了相對布局RelativeLayout管理器。界面設計使用了XML(Extensible Markup Lan?guage)布局和代碼控制 UI(User Interface)界面相結合。主界面使用了Botton、ImageView、RadioButton等控件,地圖導航使用了MapView、EditText等控件,本系統(tǒng)的主界面如圖3所示。點擊下方正中心的圓圈按鈕即可開始語音識別;點擊上傳聯(lián)系人按鈕能將本地通信錄信息上傳,便于撥打電話和發(fā)送短信;點擊地圖按鈕或語音識別可以進入地圖界面,開啟導航功能。選項設置可以個性化配置語音識別功能;點擊手機按鈕可以選擇使用手機端還是頭盔端發(fā)出語音消息。當使用播放歌曲功能時,歌曲的信息如封面、歌曲名稱、加載進度,播放進度會顯示在上方。
圖3 軟件主界面
后臺線程有藍牙連接、語音識別、音樂播放、地圖導航以及打電話發(fā)短信查天氣,等等。其中最核心的是語音識別,依靠快速可靠的語音識別,才能最大地發(fā)揮軟件的作用。
(1)藍牙連接模塊
在手機與頭盔的連接中,手機為客戶端,頭盔為服務端,手機端主動請求連接頭盔端。首先調用Blue?toothAdapter檢查當前手機是否支持藍牙,如果不支持的話退出軟件,如果支持藍牙且藍牙未啟用,則請求用戶授權打開藍牙開關。之后獲取BluetoothAdapter對象device,使用藍牙適配器搜索附近藍牙設備信息,因為藍牙在搜索到設備和搜索完畢都是通過廣播發(fā)送的,這里我們需要注冊廣播接收器[2]。注冊完畢后,通過廣播接收器獲取搜索得到的藍牙設備信息,然后通過設備MAC(Media Access Control)地址獲取藍牙設備對象。手機作為客戶端,通過 UUID(Universally Unique Identifier)打開一條道服務器的信道來獲取設備的BluetoothSocket對象,通過此對象來連接兩個藍牙設備,語音信息以流的形式傳輸[3]。
在藍牙連接成功后,即可開始藍牙通信,這個線程一直維持到程序退出,隨時等候發(fā)送數(shù)據(jù)到頭盔端或者接受頭盔端傳輸?shù)臄?shù)據(jù),保障手機端和頭盔端暢通的通信環(huán)境。藍牙通信模塊的流程圖如圖4所示。
圖4 藍牙通信流程圖
(2)語音識別模塊
當點擊語音識別按鈕后,頭盔端監(jiān)聽到的語音信息隨即通過藍牙Socket通信傳輸?shù)绞謾C端的軟件中,語音識別線程在手機端軟件獲取到語音信息后開始執(zhí)行。
語音識別就是識別語音信號,將其轉變成便于智能終端處理的文字信息。當手機端接收到頭盔端的語音指令開啟監(jiān)聽信號后,藍牙麥克風將采集到的聲波,通過藍牙發(fā)送給手機端,隨后開始語音識別[4]。
首先調用語音接口向服務器請求解析語音信號,服務器驗證通過后將解析語音信息轉換成文字信息,返回 JSON(JavaScript Object Notation,JS對象簡譜)數(shù)據(jù)包,然后對數(shù)據(jù)本地解析,獲取文字的字符串。這個過程通過SpeechRecognizer類調用語音識別服務。通過TextUnderstander類調用文本理解服務,自行提取其中的關鍵字。語音識別模塊流程圖如圖5所示。
圖5 語音識別流程圖
(3)音樂播放模塊
考慮到方便使用語音控制,音樂播放模塊是在線實時播放音樂的。開啟音樂線程時會傳入歌曲名字,因為網(wǎng)頁解析和服務器請求都是耗時的網(wǎng)絡請求,在Android 4.0系統(tǒng)之后建議將這些請求放在子線程中,所以在子線程中使用Jsoup類解析地址,獲取網(wǎng)頁上的歌曲 ID(Identification),然后通過 URLConnection(Uni?form Resource Locator)類向網(wǎng)站服務器請求對應歌曲ID的數(shù)據(jù),服務器驗證后響應請求返回數(shù)據(jù)包,本地解析JSON數(shù)據(jù),獲取歌曲的在線播放鏈接和封面圖片鏈接,并且設置歌曲的圖片和名字等信息顯示,隨后調用MediaPlayer類,設置好參數(shù)后,調用start()方法播放歌曲,播放結束后該線程就會終止。音樂播放模塊的流程圖如圖6所示。
圖6 音樂播放流程圖
(4)地圖導航模塊
地圖導模塊使用了百度地圖的SDK(Software Devel?opment Kit),該SDK小巧方便,功能強大,被大量應用于實際開發(fā)。百度地圖GeoCoder類提供從地址到經(jīng)緯度坐標或者從經(jīng)緯度坐標到地址的轉換服務。BikeNavi?gateHelper提供路徑規(guī)劃和實時導航服務。從語音指令獲取起點終點參數(shù)后,首先校驗SDK的版本是否正確。計算出起點和終點的經(jīng)緯度。在地圖上標記出起點和終點,然后計算起點和終點的經(jīng)緯度,并且在map中標記。然后進行路徑規(guī)劃。規(guī)劃好路徑后,即可開始騎行導航。如果要讓導航更精確需要開啟定位服務,默認開啟語音播報。這樣無需查看地圖,騎行者戴著頭盔聽語音即可接受導航[5]。導航過程中會有一些提示,如偏離導航、平均速度等、已行駛路程、距離終點距離等提示音,方便用戶導航。地圖導航流程圖如圖7所示。
圖7 地圖導航流程圖
(5)打電話模塊和發(fā)短信模塊
這兩個功能都首先需要獲取聯(lián)系人的電話。通過使用ContenResolver類的query()方法查詢保存在An?droid的手機通訊錄中的聯(lián)系人,此方法在主線程中查詢數(shù)據(jù),使用query()方法后,返回數(shù)據(jù)庫的游標Cur?sor。通過游標遍歷通訊錄中的所有聯(lián)系人信息,匹配聯(lián)系人姓名,遍歷完后需要手動關閉Cursor。如果匹配成功,則返回電話號碼,進行下一步打電話或者發(fā)短信操作。開啟線程時傳入聯(lián)系人名字,和本地存儲的通信錄進行匹配。如果是打電話,則傳入?yún)?shù),參數(shù)為電話號碼,調用系統(tǒng)的線程ACTION_CALL。如果是發(fā)短信,則調用短信管理器的sendTextMessage()方法發(fā)送短信,傳入?yún)?shù)電話號碼短信內(nèi)容,值得注意的是,如果發(fā)送的內(nèi)容過大,則需要調用divideMessage()方法將短信內(nèi)容分段多條發(fā)送。如果發(fā)送短信成功會通過語音播報出發(fā)送詳情。流程圖如圖8所示。
圖8 打電話和發(fā)短信流程圖
(6)查詢天氣模塊
查詢天氣時,向天氣網(wǎng)站接口請求對應的城市天氣,返回JSON數(shù)據(jù)包,經(jīng)過本地解析后,獲取完整的天氣各項指標,如風向、濕度、溫度、天氣等情況,再通過語音播報出來。
系統(tǒng)測試主要測試以下幾個方面:
(1)藍牙麥克風和手機端的藍牙連接是否能可靠。
(2)語音信號是否足夠清晰,識別足夠準確。
(3)功能執(zhí)行是否正常,頁面顯示是否正常。
(4)系統(tǒng)長時間運行是否穩(wěn)定、流暢。
實際測試表明,該軟件能夠對有效、穩(wěn)定地幫助騎行者減少騎行時操作手機的頻率,能夠做到可靠準確的執(zhí)行語音指令。部分演示圖如圖9、圖10所示。
圖9 音樂播放流演示
圖10 地圖導航演示
本軟件系統(tǒng)基于Android平臺開發(fā),采用了多線程并發(fā)技術進行軟件設計。對各個線程之間的執(zhí)行進行了合理的分配,對不同版本的Android系統(tǒng)有著良好的兼容性,為后續(xù)的軟件應用奠定了基礎。