一. 概述
專微App是一款面向互聯(lián)網(wǎng)的語音對講系統(tǒng)的應(yīng)用,整體架構(gòu)借鑒了局域網(wǎng)開發(fā)語音對講項(xiàng)目先慷,首先通過UDP廣播在mq服務(wù)器上發(fā)送并接受數(shù)據(jù),實(shí)現(xiàn)局域網(wǎng)內(nèi)的語音對講,然后通過http協(xié)議與網(wǎng)絡(luò)服務(wù)器建立連接夭谤,實(shí)現(xiàn)互聯(lián)網(wǎng)語音對講。
二. 局域網(wǎng)語音對講實(shí)現(xiàn)原理
具體項(xiàng)目參考項(xiàng)目地址:
目前已實(shí)現(xiàn)的功能:
- 通過UDP廣播實(shí)現(xiàn)Android局域網(wǎng)Peer Discovering(2017/4/8)
- 實(shí)時(shí)Android語音對講系統(tǒng)架構(gòu)(2017/4/22)
- 改進(jìn)Android語音對講系統(tǒng)的方法(2017/5/25)
相關(guān)知識體系架構(gòu)可參考:
三. 網(wǎng)絡(luò)連接實(shí)現(xiàn)原理
通過c/s架構(gòu)采用http協(xié)議建立與網(wǎng)絡(luò)服務(wù)器之間的連接巫糙±嗜澹客戶端采用okhttputils工具類實(shí)現(xiàn)訪問網(wǎng)絡(luò)服務(wù)器請求接口参淹,用戶登錄成功后建立與網(wǎng)絡(luò)服務(wù)器的連接。
四. 項(xiàng)目整體架構(gòu)及涉及到的開源庫
- VisionClient應(yīng)用整體沿用intercom-master這種MVC架構(gòu)設(shè)計(jì)
- 注解框架應(yīng)用的butterknife
- 用戶數(shù)據(jù)個(gè)人信息存儲在SharedPreference里面
- 網(wǎng)絡(luò)請求數(shù)據(jù)采用gson數(shù)據(jù)解析
- 語音數(shù)據(jù)保存通過greenDAO
- 權(quán)限自己手寫的框架參考的Android 6.0 運(yùn)行時(shí)權(quán)限處理解析
四. 項(xiàng)目應(yīng)用技術(shù)
1.為實(shí)現(xiàn)黑屏起麥這一功能,首先通過注冊系統(tǒng)白名單,保證應(yīng)用進(jìn)程不被后臺回收殺死卵惦,另一方面保證在一個(gè)tcp上的socket通信利用心跳保持長連接沮尿。
2.無法注冊白名單的終端采用service雙進(jìn)程守護(hù)盡可能地保證進(jìn)程不被殺死,原理是通過aidl跨進(jìn)程通信實(shí)現(xiàn)兩個(gè)進(jìn)程間的相互調(diào)用庸疾。
3.客戶端與服務(wù)器建立tcp socket的長連接届慈,登錄群組聊天室上傳信息到mq服務(wù)器金顿,某個(gè)客戶端通過頂層socket協(xié)議向服務(wù)器發(fā)送實(shí)時(shí)語音渠概,再由mq服務(wù)器對語音socket通信發(fā)送給客戶端播揪,接受者通過用戶id和所在群組判斷接受的語音信息猪狈。
五. 交接具體問題
1.C10終端加入白名單的具體操作步驟?
交接文件中的PC_Tools_R01.00.01文件中執(zhí)行PCTools.exe文件疆前,點(diǎn)擊配置查看應(yīng)用白名單,如果應(yīng)用未注冊白名單碾牌,點(diǎn)擊應(yīng)用白名單添加應(yīng)用名稱即可征冷,包括添加C10鍵值也是一樣检激,添加好之后點(diǎn)擊寫入等待系統(tǒng)重啟即可叔收。
2.中山警鈴上架過程
更新版本代碼之后饺律,升級versionCode和versionName兩個(gè)參數(shù),導(dǎo)出最新版本的應(yīng)用包乒省,聯(lián)系中山警鈴上架應(yīng)用的負(fù)責(zé)人劉中明,微信號lzm61818十籍,提供.apk的文件和這兩個(gè)參數(shù)即可上架
3.專微GIT上的分支介紹
目前版本的VisionClient在Gitblit上的所有分支已經(jīng)合并娶吞,只有一個(gè)主分支妒蛇,二具體產(chǎn)生的兩個(gè)版本則是由AndroidManifest.xml文件控制,中山版本LAUNCHER進(jìn)程啟動(dòng)的是LoginActivity陶耍,而北京啟動(dòng)的是LoginActivityForBJ。中山版本和北京版本另一個(gè)區(qū)別是有無圖標(biāo)啟動(dòng)也就是是否有
以北京的版本為例:
<activity
android:exported="true"
android:name=".activity.LoginActivityForBJ"
android:hardwareAccelerated="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|stateUnchanged"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- <data android:host=".activity.loginactivity" android:scheme="com.vision.dev" />-->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
中山的版本只需要把LoginActivityForBJ改成LoginActivity,并把注釋的這行隱式即可。
<data android:host=".activity.loginactivity" android:scheme="com.vision.dev" />
4.一些代碼上需要注意的地方
代碼核心部分其實(shí)就兩點(diǎn):
1.網(wǎng)絡(luò)通信
2.線程池
前期各項(xiàng)參數(shù)集中在ConnectionModel類中砚作,參數(shù)設(shè)置完畢后與服務(wù)器建立連接,代碼關(guān)鍵部分集中在HistoryFragment中米同,包括連接后點(diǎn)擊先向網(wǎng)絡(luò)服務(wù)器發(fā)送請求后得到success后才能發(fā)送語音數(shù)據(jù)信息,語音的各種信息封裝在一個(gè)MessageBean中,接受的語音通過流的形式傳遞到創(chuàng)建的語音文件中钱磅,語音的數(shù)據(jù)通過線程池方式發(fā)送和接收,
ExecutorService threadPool = Executors.newCachedThreadPool();
利用的是5種線程池中的緩存線程池:newCachedThreadPool()創(chuàng)建似枕,五個(gè)參數(shù)分別是ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue())盖淡。
含義是池中不保持固定數(shù)量的線程,隨需創(chuàng)建凿歼,最多可以創(chuàng)建Integer.MAX_VALUE個(gè)線程(說一句褪迟,這個(gè)數(shù)量已經(jīng)大大超過目前任何操作系統(tǒng)允許的線程數(shù)了),空閑的線程最多保持60秒答憔,多余的任務(wù)在SynchronousQueue中等待味赃。
客戶端發(fā)送時(shí)通過線程池發(fā)送有確認(rèn)發(fā)送connection參數(shù)等信息的ReadDataThread到服務(wù)端,接受的時(shí)候通過判斷接收參數(shù)connection的回調(diào)來實(shí)現(xiàn)對于接收信息的監(jiān)聽(connection實(shí)現(xiàn)了底層對于監(jiān)聽回調(diào)的監(jiān)聽虐拓,直接用就行)
附專微App交接文件網(wǎng)盤下載地址:
鏈接:https://pan.baidu.com/s/1-s2OkVRtInBq6bXlIz6Y3g
提取碼:ylwo