胡自健++楊莉+汪正道
摘要:結(jié)合調(diào)頻廣播網(wǎng)和Android智能手機(jī)終端,設(shè)計(jì)并實(shí)現(xiàn)了一款應(yīng)急通信客戶端。該客戶端可在移動(dòng)通信網(wǎng)絡(luò)失效下,接收調(diào)頻廣播網(wǎng)的語音信息和RDS文本信息。文中給出了客戶端的軟件設(shè)計(jì)方案,并對(duì)方案中的數(shù)據(jù)獲取模塊、數(shù)據(jù)解析模塊、數(shù)據(jù)存儲(chǔ)模塊和數(shù)據(jù)展示模塊的是設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行了詳細(xì)介紹。最后,通過實(shí)驗(yàn)驗(yàn)證了其可行性,可彌補(bǔ)單一應(yīng)急通信方式造成手機(jī)終端對(duì)于應(yīng)急消息接收的缺失。
關(guān)鍵詞:Android; FM; RDS; 客戶端
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)04-0039-03
1 概述
當(dāng)前,Android[1]智能終端的高速發(fā)展,其應(yīng)用范圍越來越廣,成為人民群眾生活中不可或缺的一部分。通過移動(dòng)通信網(wǎng)絡(luò),人民群眾總能使用手機(jī)獲取最新動(dòng)態(tài)。然而,當(dāng)緊急情況發(fā)生時(shí),移動(dòng)網(wǎng)絡(luò)常常因業(yè)務(wù)量激增和通信設(shè)施損壞而失效,恢復(fù)時(shí)間也較長,手機(jī)無法發(fā)揮其原有性能。通過對(duì)Android智能終端的研究發(fā)現(xiàn),其不僅支持移動(dòng)通信網(wǎng)絡(luò),還支持藍(lán)牙、無線網(wǎng)絡(luò)和調(diào)頻廣播網(wǎng),其中調(diào)頻廣播網(wǎng)具備傳播范圍廣、抗毀能力強(qiáng)等優(yōu)勢(shì)。本文在結(jié)合調(diào)頻廣播網(wǎng)和Android智能手機(jī)終端的基礎(chǔ)上,通過軟件設(shè)計(jì),實(shí)現(xiàn)手機(jī)終端對(duì)FM[2]語音和RDS[3]數(shù)字文本信息接收,彌補(bǔ)單一應(yīng)急通信方式造成手機(jī)對(duì)于應(yīng)急消息接收的缺失。
2 客戶端框架及關(guān)鍵技術(shù)
2.1 客戶端框架
客戶端主要包含數(shù)據(jù)獲取模塊、數(shù)據(jù)解析[5]模塊、數(shù)據(jù)存儲(chǔ)[6]模塊和數(shù)據(jù)展示模塊四部分。數(shù)據(jù)獲取模塊包含對(duì)手機(jī)FM芯片的管理和狀態(tài)的讀取、FM語音和RDS信息的獲取和系統(tǒng)音頻的管理;數(shù)據(jù)解析模塊,包含系統(tǒng)音頻的管理和RDS信息的解析。數(shù)據(jù)存儲(chǔ)模塊,包含數(shù)據(jù)表建立和維護(hù),解析后數(shù)據(jù)存儲(chǔ)和更新;數(shù)據(jù)展示模塊,主要用于用戶相互,信息提醒,歷史信息的查看??蛻舳苏w框架如圖1所示:
2.2 關(guān)鍵技術(shù)
FM(調(diào)頻廣播)是高頻振蕩頻率隨音頻信號(hào)幅度而變化的廣播技術(shù),具備抗干擾力強(qiáng),失真小,覆蓋范圍廣等優(yōu)點(diǎn),主要提供模擬語音服務(wù)。
RDS,則是通過FM副載波傳遞數(shù)字信息,編碼傳輸速率為每包104bit/s,可傳輸11.4個(gè)數(shù)據(jù)包/秒。RDS最大單元為組,每組四個(gè)信息塊,每塊包含16位信息字和10位校驗(yàn)字。當(dāng)前,已定義的12組RDS組型,其中2組型用于傳播廣播文本信息。2組型包含A、B兩個(gè)版本,區(qū)別表現(xiàn)為塊3的不同,B版本插入了PI碼。RDS的2組型編碼結(jié)構(gòu)如表1:
A版本可以傳送長達(dá)32個(gè)雙字節(jié)或64個(gè)單字節(jié)字符的文本消息。而B版本只能傳送16個(gè)雙字節(jié)或32個(gè)單字節(jié)字符文本消息。
3 客戶端設(shè)計(jì)與實(shí)現(xiàn)
3.1 信息獲取模塊
信息獲取模塊包含對(duì)音頻信息和RDS文本信息兩部分的處理。由于Android系統(tǒng)缺乏對(duì)于FM芯片的統(tǒng)一應(yīng)用層調(diào)用的接口API函數(shù)。本文采用JNI方法對(duì)不同F(xiàn)M射頻芯片與驅(qū)動(dòng)[7]進(jìn)行上層接口封裝與實(shí)現(xiàn),從而達(dá)到對(duì)FM芯片中信息流的讀寫以及初始化操作。封裝后的接口以靜態(tài)鏈接庫(.so)方式打包到APP或發(fā)布在Framework層使用。
在應(yīng)用程序開啟時(shí),通過調(diào)用FMRadioNative類加載靜態(tài)庫文件fm.so,實(shí)現(xiàn)客戶端對(duì)FM芯片的控制和信息讀取。開啟Service進(jìn)程并在Service進(jìn)程調(diào)用JNI方法進(jìn)行FM芯片的初始化。其中,F(xiàn)M語音信息的獲取,通過將音頻播放器MediaPlayer來源設(shè)置為MEDIATEK://MEDIAPLAYER_PLAYERTYPE_FM即可實(shí)現(xiàn)資源的綁定和獲取。而RDS信息的獲取,則通過開啟監(jiān)聽線程每隔100ms讀取指定頻點(diǎn)上RDS信息標(biāo)志位,當(dāng)發(fā)現(xiàn)標(biāo)志位不為0,則進(jìn)行RDS的讀取和處理。信息獲取基本流程如圖2所示:
3.2信息處理模塊
3.2.1 音頻處理
FM語音會(huì)占用系統(tǒng)音頻資源,而語音通話以及第三方軟件也會(huì)請(qǐng)求音頻資源??蛻舳诵鑼?duì)系統(tǒng)音頻資源進(jìn)行管理,防止音頻資源的占用影響到用戶的正常的語音通話。具體實(shí)現(xiàn)為在綁定音頻資源后設(shè)置OnAudioFocusChangeListener實(shí)時(shí)監(jiān)聽系統(tǒng)音頻請(qǐng)求,并實(shí)現(xiàn)方法onAudioFocusChange獲取音頻狀態(tài)值focusChang。當(dāng)focusChang狀態(tài)值改變時(shí),通過設(shè)置音頻播放器MediaPlayer的開啟、關(guān)閉、暫停來進(jìn)行音頻管理。
狀態(tài)值為AUDIOFOCUS_LOSS,表示音頻焦點(diǎn)失去,需停止當(dāng)前FM語音播放,并釋放資源;狀態(tài)值為AUDIOFOCUS_GAIN,表示音頻焦點(diǎn)重新獲得,可重新獲取音頻資源并恢復(fù)FM語音播放;狀態(tài)值為AUDIOFOCUS_LOSS_TRANSIENT,表示暫時(shí)失去音頻焦點(diǎn),需要保持音頻資源,但需停止音頻播放。音頻管理流程如圖3所示:
3.2.2 RDS信息處理
FMRadioNative類讀取FM芯片的RDS信息為字節(jié)流,需將其通過GBK編碼規(guī)則進(jìn)行信息的還原。由于一組RDS可攜帶的凈載荷有限,考慮到需傳輸較長信息,在信息的發(fā)送時(shí)在信息開頭出加入了信息的當(dāng)前組索引currentGroupIndex和總組數(shù)groupsCount。在信息接收后,更新已接受信息標(biāo)志receivedGroupsCount。當(dāng)發(fā)現(xiàn)currentGroupIndex、groupsCount和receivedGroupsCount三者都一致時(shí),按順序,進(jìn)行信息的拼接,還原出完整的信息。
3.3信息存儲(chǔ)模塊
經(jīng)過信息處理模塊的恢復(fù)有效信息,需進(jìn)行存儲(chǔ),為信息展示模塊做準(zhǔn)備。本次設(shè)計(jì)采用Android系統(tǒng)中SQLite輕量級(jí)數(shù)據(jù)庫實(shí)現(xiàn),SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數(shù)據(jù)庫引擎。它支持大多數(shù)的SQL92標(biāo)準(zhǔn),并且可以在主要的操作系統(tǒng)上運(yùn)行。SQLite通過利用虛擬機(jī)和虛擬數(shù)據(jù)庫引擎(VDBE),是調(diào)試、修改和擴(kuò)展SQLite的內(nèi)核變得更加方便。所有SQL語句都被編譯成易讀的、可以在SQLite虛擬機(jī)中執(zhí)行的程序集。
RDS信息存儲(chǔ)表包序列號(hào)SerialID、正文Content、組數(shù)GroupCount、接收起始時(shí)間StartTime和接收終止時(shí)間EndTime五個(gè)字段。數(shù)據(jù)存儲(chǔ)表如表2所示:
3.4信息展示模塊
信息展示模塊主要包含,信息狀態(tài)欄提醒,信息列表界面,信息詳情界面,F(xiàn)M語音界面,鈴音提示和振動(dòng)。
其中,信息狀態(tài)欄提醒和鈴音提示及振動(dòng)通過Android系統(tǒng)中Notification實(shí)現(xiàn)。收到有效信息時(shí),通過新建通知mNotification,并設(shè)置其所攜帶的信息為解析后的有效信息,設(shè)置振動(dòng)與自帶鈴聲。設(shè)置完成后,通知欄管理器NotificationManager進(jìn)行通知Notification的展示。通知欄提示關(guān)鍵代碼如下:
//新建通知
Notification mNotification = new Notification(R.drawable.emergency,
"應(yīng)急信息", System.currentTimeMillis());
//設(shè)置了鈴聲和振動(dòng)
mNotification.flags = Notification.FLAG_AUTO_CANCEL;
mNotification.flags |= Notification.FLAG_ONLY_ALERT_ONCE;
mNotification.sound = Uri.parse("android.resource://"
+ getApplicationContext().getPackageName() + "/"
+ R.raw.emmusic);
mNotification.vibrate ={ 0, 30000 };
//設(shè)置點(diǎn)擊后跳轉(zhuǎn)的頁面
mIntent = new Intent(getApplicationContext(), MainActivity.class);
PendingIntent mPendingIntent = PendingIntent.getActivity(
getApplicationContext(), 0, mIntent,
android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
mNotification.setLatestEventInfo(getApplicationContext(), "新應(yīng)急消息",
RDSContent, mPendingIntent);
mNotificationManager.notify(TEST_ID, mNotification);
信息列表界面,信息詳情界面和FM語音界面如下圖4所示
4 測(cè)試
基于上述設(shè)計(jì)實(shí)現(xiàn)后,進(jìn)行外場(chǎng)測(cè)試。在測(cè)試過程中為將設(shè)置為手機(jī)終端為飛行模式,模擬移動(dòng)通信網(wǎng)絡(luò)失效下的RDS信息的接收,測(cè)試后的結(jié)果如表3所示:
由測(cè)試數(shù)據(jù)可知:在室外環(huán)境下,在有效通信范圍內(nèi),RDS應(yīng)急信息的接收效率是可靠并且實(shí)時(shí)的,可以滿足應(yīng)急場(chǎng)景的通信要求。
5 總結(jié)
本文通過調(diào)頻廣播網(wǎng)和Android智能手機(jī)終端的結(jié)合,并進(jìn)行軟件詳細(xì)設(shè)計(jì),實(shí)現(xiàn)了移動(dòng)通信網(wǎng)絡(luò)失效下,公眾對(duì)于應(yīng)急信息的接收。經(jīng)過驗(yàn)證,滿足應(yīng)急場(chǎng)景的基本通信要求,可以作為應(yīng)急通信的補(bǔ)充。
參考文獻(xiàn):
[1] 田興強(qiáng). Android的若干關(guān)鍵技術(shù)的研究及其應(yīng)用系統(tǒng)的開發(fā)分析[J]. 電腦知識(shí)與技術(shù),2015(31):77-78.
[2] 付凱鵬. 基于無線電廣播技術(shù)的調(diào)頻收發(fā)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 科技風(fēng),2014(10):107.
[3] 陳澤虎,倪林,嚴(yán)杰.一種調(diào)頻廣播數(shù)據(jù)接收顯示系統(tǒng)的設(shè)計(jì)[J].電視技術(shù),2014,38(15):114-117.