徐奇+朱煉
摘要:隨著社會(huì)的不斷發(fā)展變化,對(duì)現(xiàn)代安保行業(yè)的要求也在不斷提高,為適應(yīng)現(xiàn)代安保業(yè)通信需求,提高安保人員的工作效率,開(kāi)發(fā)設(shè)計(jì)一套功能強(qiáng)大、性?xún)r(jià)比高的ios客戶(hù)端是非常必要的,基于通信技術(shù),百度地圖SDK,Speex語(yǔ)音編解碼庫(kù)等技術(shù),可以實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)、組呼、對(duì)講等多種呼叫功能??刂浦行目刹捎谜Z(yǔ)音調(diào)度系統(tǒng),可實(shí)現(xiàn)安保人員的及時(shí)調(diào)度等功能。軟件設(shè)計(jì)以用戶(hù)體驗(yàn)為核心,結(jié)合項(xiàng)目需求和系統(tǒng)特點(diǎn),采用MVC的框架結(jié)構(gòu)搭建,并借鑒DDMenu側(cè)滑菜單的使用,讓此款軟件體驗(yàn)更加簡(jiǎn)潔,便于用戶(hù)操作。
關(guān)鍵詞:ios系統(tǒng);安保調(diào)度項(xiàng)目;軟件開(kāi)發(fā)
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)31-0071-03
Abstract: With the continuous development of social changes, the requirements of modern security industry has been improved, in order to adapt to modern communication needs security industry, improve the working efficiency of the security guards, development and design a set of powerful, cost-effective ios client is very necessary. In this paper, based on the communication technology, baidu map SDK, Speex audio codec library such as technology, can realize the point-to-point, group, intercom and other call function. Control center can use voice dispatching system, and can realize security personnel timely scheduling, etc. Software design of the user experience as the core, combined with the project requirements and the characteristics of the system, using the MVC frame structure building, and draw lessons from DDMenu lateral spreads the use of the menu, make the software experience more concise, easy to user operation.
Key words:Ios system; security scheduling project; development
1 緒論
安保行業(yè)近年來(lái)發(fā)展迅速,各類(lèi)信息化技術(shù)不斷在安保行業(yè)中獲得廣泛應(yīng)用。當(dāng)前,隨著智能手機(jī)與智能平板的廣泛應(yīng)用,為其開(kāi)發(fā)專(zhuān)用的安保調(diào)度項(xiàng)目成為關(guān)注的焦點(diǎn)。有針對(duì)性的開(kāi)發(fā)群組對(duì)講、語(yǔ)音電話(huà)、我的位置、打卡考核和培訓(xùn)學(xué)習(xí)等模塊。
在該項(xiàng)目中,通過(guò)群組對(duì)講和語(yǔ)音電話(huà)及時(shí)和其他調(diào)度人員進(jìn)行及時(shí)交流交換信息。從我的地圖模塊可以清晰地看見(jiàn)其他調(diào)度人員的位置,可以及時(shí)性的安就近原則調(diào)度安保人員,達(dá)到及時(shí)性和可靠性,避免不必要的人力資源浪費(fèi)。通過(guò)培訓(xùn)學(xué)習(xí)模塊考核并提高每位安保人員的服務(wù)意識(shí)和安全意識(shí),熟練掌握各項(xiàng)安全業(yè)務(wù)技能,加強(qiáng)安保人員的綜合素質(zhì),才能更好地為服務(wù)于安保行業(yè)。打卡考核模塊可以上傳工作日志包括現(xiàn)場(chǎng)圖片,更加拓寬日??记诘墓芾?。
2 系統(tǒng)模塊設(shè)計(jì)
蘋(píng)果手機(jī)移動(dòng)端軟件的開(kāi)發(fā)環(huán)境主要有兩大方面,即硬件環(huán)境和軟件環(huán)境兩大類(lèi)。硬件環(huán)境:本文使用mac book、iOS設(shè)備若干臺(tái),軟件環(huán)境:本文采用Mac OS 10.09系統(tǒng)、Xcode7.0版本。需要iOS設(shè)備若干臺(tái)是為了在測(cè)試時(shí),檢查軟件在不同的系統(tǒng)版本和分辨率的客戶(hù)端下是否存在兼容性的問(wèn)題,對(duì)于適配,系統(tǒng)的API比較麻煩,一般使用Masonry[1]。項(xiàng)目釆用蘋(píng)果的開(kāi)發(fā)工具Xcode及Objective-C作為主要的開(kāi)發(fā)語(yǔ)言。
2.1 主界面介紹
在進(jìn)入安保調(diào)度的主界面是給使用者的第一印象,頁(yè)面的美化度、是否存在明顯BUG、操作是否流暢不卡頓、用戶(hù)是否操作別扭等因素都能直接影響了用戶(hù)對(duì)這個(gè)應(yīng)用的喜歡。
點(diǎn)擊客戶(hù)端,打幵的是新手引導(dǎo)頁(yè),新手引導(dǎo)頁(yè)的主要作用是介紹本軟件的特點(diǎn),用圖文并茂的方式介紹本軟件特色。包括實(shí)時(shí)對(duì)講、移動(dòng)打卡、組織架構(gòu)、學(xué)習(xí)培訓(xùn)。實(shí)時(shí)對(duì)講隨時(shí)隨地了解安保團(tuán)隊(duì)信息、單呼組呼、呼叫調(diào)度臺(tái)、創(chuàng)建組群。移動(dòng)打卡保障安保人員出勤到崗,含有考情統(tǒng)計(jì),簽到記錄。組織架構(gòu)提高員工效率,釋放組織潛能,設(shè)有分級(jí)管理、角色管理和權(quán)限管理。學(xué)習(xí)培訓(xùn)審核和提高安保人員專(zhuān)業(yè)技能。
登錄頁(yè)面設(shè)計(jì)簡(jiǎn)潔清爽,登陸主要有手機(jī)號(hào)和驗(yàn)證碼組成,因此鍵盤(pán)設(shè)置默認(rèn)只有數(shù)字鍵盤(pán),避免不必要的錯(cuò)誤輸入,其次讓客戶(hù)端更加簡(jiǎn)潔。登陸時(shí)會(huì)有加載提示,讓用戶(hù)更加清晰了解登錄狀態(tài)。
第一次登陸默認(rèn)首界面是安保對(duì)講界面,進(jìn)入主界面使用蘋(píng)果官方的reachability這個(gè)類(lèi)檢測(cè)網(wǎng)絡(luò)狀態(tài),可以區(qū)分移動(dòng)端是否聯(lián)網(wǎng),并且區(qū)分出是否是手機(jī)網(wǎng)絡(luò)還是wifi網(wǎng)絡(luò)。界面主要采用DDMenu抽屜式菜單。點(diǎn)擊導(dǎo)航欄左側(cè)按鈕可查看菜單模塊。菜單模塊主要采用表格形式和圖文并茂的方式展現(xiàn)此款軟件的主要功能。功能列表主要包括:組織架構(gòu)、安保對(duì)講、企業(yè)群組、信息資訊、交流中心、學(xué)習(xí)培訓(xùn)、我的位置、考勤管理、系統(tǒng)設(shè)置、我的中心。
2.2 我的位置模塊
位置模塊也是安保調(diào)度的重要模塊,此模塊搭建百度地圖SDK,點(diǎn)擊進(jìn)入可顯示我的當(dāng)前位置和同時(shí)在線(xiàn)的其他安保人員,并具有更隨功能,即移動(dòng)端位置更新,地圖上的大頭針也隨之改變,大頭針采用頭像和姓名組合簡(jiǎn)單明了。同時(shí)點(diǎn)擊大頭針可動(dòng)畫(huà)彈出表格菜單具有呼叫、發(fā)送信息和查看軌跡功能。
此模塊具有查看軌跡功能,在啟動(dòng)軟件的同時(shí)已開(kāi)啟分線(xiàn)程和定時(shí)器每三秒獲取當(dāng)前地理位置,并和上次地理位置信息的經(jīng)緯度進(jìn)行比較篩選,如果相差不大則篩除不進(jìn)行上傳,避免不必要的流量浪費(fèi)和大數(shù)據(jù)量的信息存儲(chǔ)。篩選的操作可以簡(jiǎn)易的和上次的經(jīng)緯度比較在去除末兩位的情況下的字符串是否相同。依次比較,但是若第一次數(shù)據(jù)就出現(xiàn)偏移那么后面的數(shù)據(jù)比較都會(huì)出現(xiàn)錯(cuò)誤。所以必須確保第一次上傳的經(jīng)緯度的準(zhǔn)確性,一般開(kāi)始的位置信息不進(jìn)行上傳,而是在比較是否在合理的范圍內(nèi),再上傳后續(xù)的位置信息。
查看軌跡功能也具有查看他人軌跡信息,但是這是由權(quán)限限制。不同的角色具有不同的權(quán)限,但是本人是可以查看自己的所有歷史軌跡,點(diǎn)擊導(dǎo)航欄右側(cè)按鈕,并選擇對(duì)應(yīng)日期,就可以查看,但是由于是數(shù)據(jù)量達(dá)到上千甚至上萬(wàn)時(shí),CPU對(duì)于數(shù)據(jù)處理也是有限的,耗用CPU非常大會(huì)卡死主線(xiàn)程,此時(shí)就需開(kāi)辟分線(xiàn)程進(jìn)行繪制軌跡。在采用addOverlay進(jìn)行繪制前同樣對(duì)數(shù)據(jù)進(jìn)行篩選,采用百度地圖API提供的空間關(guān)系判斷提供相應(yīng)的接口,判斷點(diǎn)與圓的位置關(guān)系。比較一個(gè)點(diǎn)是否在內(nèi)一個(gè)點(diǎn)的范圍內(nèi),根據(jù)三秒時(shí)間內(nèi)這點(diǎn)與另一點(diǎn)的空間距離是否合理來(lái)進(jìn)行偏移點(diǎn)篩選。
2.3 安保對(duì)講模塊
音頻數(shù)據(jù)的編碼是在原始數(shù)據(jù)基礎(chǔ)上進(jìn)行編碼,編碼后的大小必須是20字節(jié)才能和安卓客戶(hù)端大道互通的效果。通過(guò)HTTP請(qǐng)求將壓縮后的音頻數(shù)據(jù)發(fā)送到服務(wù)器。同理通過(guò)回調(diào)函數(shù)得到服務(wù)器返回的音頻數(shù)據(jù),同樣設(shè)置和錄音相同的參數(shù)設(shè)置并進(jìn)行解碼,通過(guò)隊(duì)列源源不斷播放直到結(jié)束。在播放前必須設(shè)置好默認(rèn)播放輸出端,是揚(yáng)聲器或者是聽(tīng)筒。本文設(shè)置默認(rèn)是揚(yáng)聲器播放音頻。在p2p語(yǔ)音電話(huà)通信狀態(tài)下開(kāi)啟傳感器功能。為了減輕長(zhǎng)期點(diǎn)亮屏幕引起的電量消耗和屏幕誤觸。使用接近傳感器首先要啟用接近傳感設(shè)置,注冊(cè)針對(duì)傳感器狀態(tài)發(fā)生變化的通知。當(dāng)遮擋傳感器時(shí)就可達(dá)到揚(yáng)聲器和聽(tīng)筒進(jìn)行切換。
對(duì)于不希望啟動(dòng)接近傳感器功能的使用者,如果需要進(jìn)行揚(yáng)聲器和聽(tīng)筒進(jìn)行切換過(guò)程中,則必須通過(guò)啟用接近傳感器來(lái)進(jìn)行聲音輸出模式的切換,與此同時(shí),則必須注意,如果當(dāng)聲音通過(guò)聽(tīng)筒進(jìn)行播放完畢時(shí),此時(shí)仍在聽(tīng)筒模式輸出,如果此時(shí)關(guān)閉傳感器功能,則導(dǎo)致在離開(kāi)聽(tīng)筒時(shí),由于傳感器功能已經(jīng)關(guān)閉,應(yīng)用無(wú)法再次收到注冊(cè)的傳感器變更通知,而此時(shí)如果未能將底層的聲音輸出模式切換,則導(dǎo)致相關(guān)的聲音輸出仍從聽(tīng)筒中輸出,即使引起傳感器反映的障礙已經(jīng)離開(kāi)傳感器作用范圍,但應(yīng)用中獲取的傳感器狀態(tài)仍未接近狀態(tài),使根據(jù)傳感器狀態(tài)進(jìn)行切換聲音輸出模式操作失效。
3 語(yǔ)音模塊技術(shù)開(kāi)發(fā)
3.1 錄音模塊的數(shù)據(jù)結(jié)構(gòu)
采用音頻隊(duì)列錄音需要三個(gè)要素:音頻隊(duì)列(Audio queues)、隊(duì)列緩沖區(qū)(Audio queue buffers)和回調(diào)函數(shù)(callback functions),音頻隊(duì)列既可以是錄制音頻也可以是播放音頻的對(duì)象。數(shù)據(jù)類(lèi)型采用AudioQueueRef來(lái)描述,它在AudioToolbox.framework框架中的AudioQueue.h 頭文件中聲明。音頻隊(duì)列包含以下數(shù)據(jù)結(jié)構(gòu):音頻隊(duì)列緩沖區(qū)數(shù)組(audio queue buffers),數(shù)組中的每個(gè)緩沖區(qū)都是用來(lái)存儲(chǔ)臨時(shí)的音頻數(shù)據(jù)。 緩沖區(qū)隊(duì)列(buffer queue ),隊(duì)列中包含著audio queue buffers并且將它們有序的排列。最后調(diào)用回調(diào)函數(shù)獲取音頻數(shù)據(jù)解碼后放到隊(duì)列中按序播放[2]。
3.2 AudioQueue的工作模式
AudioQueue內(nèi)部存在一套緩沖隊(duì)列(Buffer Queue)機(jī)制。在啟動(dòng)AudioQueue之后通過(guò)AudioQueueAllocateBuffer生成若干個(gè)AudioQueueBufferRef緩存結(jié)構(gòu),這些生成的Buffer可以用來(lái)存儲(chǔ)回調(diào)的將要播放的音頻數(shù)據(jù),而且這些Buffer受生成它們的AudioQueue實(shí)例對(duì)象管理,此時(shí)內(nèi)存也已經(jīng)被分配成功,當(dāng)AudioQueue被Dispose時(shí)這些Buffer緩沖區(qū)也會(huì)隨之被銷(xiāo)毀。
當(dāng)有音頻數(shù)據(jù)需要播放時(shí)會(huì)被memcpy到AudioQueueBufferRef的mAudioData中(mAudioData所指向的內(nèi)存也已經(jīng)被分配好,之前AudioQueueAllocateBuffer所做的工作),并給mAudioDataByteSize賦值傳入的數(shù)據(jù)大小。然后調(diào)用AudioQueueEnqueueBuffer把存儲(chǔ)的音頻數(shù)據(jù)的Buffer放入到AudioQueue內(nèi)置的Buffer隊(duì)列之中。當(dāng)隊(duì)列中存在buffer的情況下可以調(diào)用AudioQueueStart,此時(shí)AudioQueue就會(huì)按照Enqueue順序依次使用隊(duì)列中的buffer進(jìn)行播放,每當(dāng)前一個(gè)Buffer使用完畢之后數(shù)據(jù)就會(huì)從Buffer隊(duì)列中被移除并且會(huì)觸發(fā)一個(gè)回調(diào)來(lái)通知使用者,某個(gè)AudioQueueBufferRef已經(jīng)使用完畢[3],此時(shí)可以繼續(xù)重用這個(gè)對(duì)象來(lái)存儲(chǔ)后續(xù)回調(diào)的音頻數(shù)據(jù)。按此循環(huán)操作音頻數(shù)據(jù)就會(huì)被逐個(gè)播放直到結(jié)束。
3.3 錄音初始化設(shè)置
錄制音頻隊(duì)列是以移動(dòng)端的麥克風(fēng)作為錄音功能音頻隊(duì)列的音頻輸入端,按住錄音按鈕或者p2p通信時(shí)輸入端就會(huì)不斷地將音頻數(shù)據(jù)傳放置到緩沖隊(duì)列中,此時(shí)再通過(guò)回調(diào)函數(shù)將緩沖塊的數(shù)據(jù)傳出再做的處理,而已被讀取數(shù)據(jù)的緩沖區(qū)就會(huì)再次被放到隊(duì)列的尾端再次循環(huán)使用,因?yàn)橐纛l隊(duì)列具有循環(huán)引用的功效。將音頻原始數(shù)據(jù)進(jìn)行編碼發(fā)送,通過(guò)回調(diào)函數(shù)獲取編碼音頻數(shù)據(jù)進(jìn)行播放,便可達(dá)到循環(huán)功效。
緩沖區(qū)的個(gè)數(shù)設(shè)置也是至關(guān)重要的,并非越多越好,如果數(shù)量過(guò)多則會(huì)造成播放延遲,反之有些音頻數(shù)據(jù)可能來(lái)不及播放,由于iOS設(shè)備的內(nèi)存容量不多,經(jīng)反復(fù)測(cè)試最終設(shè)置為3個(gè)緩沖區(qū)較為合適。
在錄音初始化前,必須進(jìn)行相關(guān)參數(shù)設(shè)置,創(chuàng)建好緩沖區(qū)。音頻數(shù)據(jù)流的采樣幀數(shù),本文釆用8000Hz,本文采用單聲道,所以值取1,聲道包含的采樣率的值取16bit[4] 。主要有這三個(gè)參數(shù)決定音頻流的采樣,其他參數(shù)可由此計(jì)算得來(lái)。
3.4 集成speex庫(kù)
Speex壓縮庫(kù)給語(yǔ)音編碼提供了快速有效幫助,它適用于多種平臺(tái),可以在多個(gè)平臺(tái)達(dá)到互通的效果。它不僅提供了語(yǔ)音的編解碼功能,而且在還提供了聲音降噪和聲學(xué)回聲消除功能,給語(yǔ)音通信提供了更高的技術(shù)支持。Speex支持多種比特率而且。speex在各個(gè)平臺(tái)上的運(yùn)行做的非常好,使用和安卓對(duì)應(yīng)版本的speex編解碼庫(kù),就可以很好的在兩平臺(tái)互用,iOS移動(dòng)端可以使用Speex庫(kù),可以在speex官網(wǎng)下載或者在github查找相應(yīng)版本的靜態(tài)庫(kù)或framework框架[5]。
3.5 音頻流數(shù)據(jù)編解碼實(shí)現(xiàn)
3.5.1 編碼流程
在進(jìn)行對(duì)音頻數(shù)據(jù)流進(jìn)行編碼需要采用Speex的API函數(shù)進(jìn)行如下步驟:
1)自定義一個(gè)SpeexBits類(lèi)型的變量bits和一個(gè)Speex編碼狀態(tài)的變量enc_state。
2)然后調(diào)用speex_bits_init(&bits)函數(shù)初始化bits。
3)接著調(diào)用speex_encoder_init(&speex_nb_mode)函數(shù)來(lái)初始化enc_state。其中speex_nb_mode表示的是窄帶模式。speex_wb_mode表示寬帶模式、speex_uwb_mode表示超寬帶模式。
4)調(diào)用函數(shù)int speex_encoder_ ctl來(lái)設(shè)置編碼器參數(shù),state參數(shù)表示編碼器的狀態(tài);request參數(shù)表示需要定義的參數(shù)類(lèi)型。
5)初始化設(shè)置完畢后,再對(duì)每一幀聲音作如下處理:調(diào)用函數(shù)speex_bits_reset(&bits)再次設(shè)定SpeexBits,然后調(diào)用函數(shù)speex_encode(enc_state, input_frame, &bits)[6],參數(shù)bits中即存儲(chǔ)著編碼后的數(shù)據(jù)流,在此處便可以獲取并作處理。
6)若編碼結(jié)束,便可進(jìn)行摧毀。
3.5.2 解碼流程
同理,對(duì)從服務(wù)器回調(diào)的已經(jīng)編碼過(guò)的音頻數(shù)據(jù)進(jìn)行解碼需要經(jīng)過(guò)以下步驟:
1)首先自定義一個(gè)SpeexBits類(lèi)型變量bits和一個(gè)Speex編碼狀態(tài)變量enc_state。
2)需調(diào)用speex_bits_init(&bits)來(lái)初始化bits。
3)調(diào)用speex_decoder_init (&speex_nb_mode)來(lái)初始化enc_state對(duì)象。
4)調(diào)用speex_decoder_ctl 函數(shù)來(lái)設(shè)定編碼參數(shù)。
5)調(diào)用 speex_decode函數(shù)對(duì)bits中的音頻數(shù)據(jù)進(jìn)行解編碼,參數(shù)out中便是保存解碼后的數(shù)據(jù)流,然后進(jìn)行放置到音頻隊(duì)列中進(jìn)行播放。
6)最后調(diào)用函數(shù)關(guān)閉或銷(xiāo)毀SpeexBits和解碼器。
4 結(jié)束語(yǔ)
本文主要介紹了關(guān)于整個(gè)安保調(diào)度項(xiàng)目的相關(guān)模塊和主要技術(shù)要點(diǎn)分析,安保工作對(duì)于社會(huì)所產(chǎn)生的價(jià)值也是無(wú)形的,對(duì)于每個(gè)都是有利也是無(wú)法衡量的。所以此款軟件對(duì)于服務(wù)于安保人員,更好地確保社會(huì)安全,這也是我們共同的理想。
參考文獻(xiàn):
[1] Matt Drance, Paul Wanen. iOS應(yīng)用開(kāi)發(fā)攻略[M]. 北京: 人民郵電出版社, 2012.
[2] Paul Deitel. iPhone應(yīng)用程序開(kāi)發(fā)名家解析[M]. 北京: 電子工業(yè)出版社, 2010.
[3] Aaron Hillegass著. 蘋(píng)果開(kāi)發(fā)之Cocoa編程[M]. 北京: 電子工業(yè)出版社, 2009.
[4] 趙淼. 基于Telematics的iPhone手機(jī)客戶(hù)端系統(tǒng)的研究及應(yīng)用[D].長(zhǎng)春: 吉林大學(xué), 2014.
[5] 張立文, 吳迪, 宋占偉. 基于Speex的嵌入式無(wú)線(xiàn)數(shù)字音頻交互系統(tǒng)[J]. 吉林大學(xué)學(xué)報(bào):信息科學(xué)版, 2013, 31(4): 353-358.
[6] 李榮榮, 胡昌奎, 余娟. 基于譜熵的語(yǔ)音端點(diǎn)檢測(cè)算法改進(jìn)研究[J]. 武漢理工大學(xué)學(xué)報(bào), 2013, 35(7): 134-139.