一. 概述
专微App是一款面向互联网的语音对讲系统的应用,整体架构借鉴了局域网开发语音对讲项目,首先通过UDP广播在mq服务器上发送并接受数据,实现局域网内的语音对讲,然后通过http协议与网络服务器建立连接,实现互联网语音对讲。
二. 局域网语音对讲实现原理
具体项目参考项目地址:
目前已实现的功能:
- 通过UDP广播实现Android局域网Peer Discovering(2017/4/8)
- 实时Android语音对讲系统架构(2017/4/22)
- 改进Android语音对讲系统的方法(2017/5/25)
相关知识体系架构可参考:
三. 网络连接实现原理
通过c/s架构采用http协议建立与网络服务器之间的连接。客户端采用okhttputils工具类实现访问网络服务器请求接口,用户登录成功后建立与网络服务器的连接。
四. 项目整体架构及涉及到的开源库
- VisionClient应用整体沿用intercom-master这种MVC架构设计
- 注解框架应用的butterknife
- 用户数据个人信息存储在SharedPreference里面
- 网络请求数据采用gson数据解析
- 语音数据保存通过greenDAO
- 权限自己手写的框架参考的Android 6.0 运行时权限处理解析
四. 项目应用技术
1.为实现黑屏起麦这一功能,首先通过注册系统白名单,保证应用进程不被后台回收杀死,另一方面保证在一个tcp上的socket通信利用心跳保持长连接。
2.无法注册白名单的终端采用service双进程守护尽可能地保证进程不被杀死,原理是通过aidl跨进程通信实现两个进程间的相互调用。
3.客户端与服务器建立tcp socket的长连接,登录群组聊天室上传信息到mq服务器,某个客户端通过顶层socket协议向服务器发送实时语音,再由mq服务器对语音socket通信发送给客户端,接受者通过用户id和所在群组判断接受的语音信息。
五. 交接具体问题
1.C10终端加入白名单的具体操作步骤?
交接文件中的PC_Tools_R01.00.01文件中执行PCTools.exe文件,点击配置查看应用白名单,如果应用未注册白名单,点击应用白名单添加应用名称即可,包括添加C10键值也是一样,添加好之后点击写入等待系统重启即可。
2.中山警铃上架过程
更新版本代码之后,升级versionCode和versionName两个参数,导出最新版本的应用包,联系中山警铃上架应用的负责人刘中明,微信号lzm61818,提供.apk的文件和这两个参数即可上架
3.专微GIT上的分支介绍
目前版本的VisionClient在Gitblit上的所有分支已经合并,只有一个主分支,二具体产生的两个版本则是由AndroidManifest.xml文件控制,中山版本LAUNCHER进程启动的是LoginActivity,而北京启动的是LoginActivityForBJ。中山版本和北京版本另一个区别是有无图标启动也就是是否有
以北京的版本为例:
<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.一些代码上需要注意的地方
代码核心部分其实就两点:
1.网络通信
2.线程池
前期各项参数集中在ConnectionModel类中,参数设置完毕后与服务器建立连接,代码关键部分集中在HistoryFragment中,包括连接后点击先向网络服务器发送请求后得到success后才能发送语音数据信息,语音的各种信息封装在一个MessageBean中,接受的语音通过流的形式传递到创建的语音文件中,语音的数据通过线程池方式发送和接收,
ExecutorService threadPool = Executors.newCachedThreadPool();
利用的是5种线程池中的缓存线程池:newCachedThreadPool()创建,五个参数分别是ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue())。
含义是池中不保持固定数量的线程,随需创建,最多可以创建Integer.MAX_VALUE个线程(说一句,这个数量已经大大超过目前任何操作系统允许的线程数了),空闲的线程最多保持60秒,多余的任务在SynchronousQueue中等待。
客户端发送时通过线程池发送有确认发送connection参数等信息的ReadDataThread到服务端,接受的时候通过判断接收参数connection的回调来实现对于接收信息的监听(connection实现了底层对于监听回调的监听,直接用就行)
附专微App交接文件网盘下载地址:
链接:https://pan.baidu.com/s/1-s2OkVRtInBq6bXlIz6Y3g
提取码:ylwo