基于局域网的视频聊天系统一一蛙酷
打开文本图片集
摘要:随着无线网络的发展,支持Wi-Fi的电子产品越来越多,与Wi-Fi绑定的应用也层出不穷,但还没有一款基于Wi-Fi的视频聊天软件能够满足人们的日常交互需求,因此我们开发出“蛙酷”,一款基于局域网的视频聊天软件,能够在局域网覆盖下实现随时随地视频聊天和视频会议,且无需耗费任何手机数据流量,真正给用户带来了随聊随见的交互体验。本文网络版地址:http://.cn/article/267433.htm
关键词:局域网;视频聊天;视频会议;简单实用
DOI:10.3969/j.issn.1005-5517.2015.1.014
本项目获得2014英特尔杯移动计算创新竞赛“最受欢迎作品奖”
1 引言
目前,社会所流行的聊天软件所专注的问题仅限于视频效果和软件盈利上,应用目的趋于商业化,而没有真正从用户的角度出发去设计开发软件,由于视频通讯不同于文字通讯和语言通讯,传输信息量大且十分耗费数据流量,导致用户想用能用却不敢用。基于这一点,我们提出了“蛙酷”,这是一款基于无线局域网的视频聊天软件,主要包含在线视频聊天和视频组播功能,用户可以使用这款软件与同一局域网内的任意一位好友随时随地进行视频通讯,也可邀请多名好友开启在线视频会议。这款软件最大的特性在于我们能够通过访问局域网的方式来满足各种交互需求且节省数据流量,适用于高校、企业、商城以及其它有无线局域网覆盖的各大场所,这款软件简单实用,稳定的后台服务能够让用户随时随地与好友进行视频通讯。
2 成果展示及介绍
2.1 主界面
如图l所示。
2.2系统架构
(1)视频聊天一方客户端发出邀请(发送IP及端口),然后服务器在此局域网内检索该IP地址,一旦检索到即锁定IP并发送端口号,接收端接收到邀请后,即做出应答(接受/拒绝),拒绝则关闭连接,接受则开启连接并互相发送数据给对方,实现视频聊天。
(2)视频会议由发送端客户端开启视频会议号(组播IP地址段),开启时即开始发送数据到服务器端f不管有没有终端客户端连入),开启组播后,多个终端客户端可以通过加入同一组播IP而开始接收发送端发送的数据信息,实现视频会议。3详细分析硬件与软件模块
3.1 Wi-Fi
3.1.1 Wi-Fi程序模块
(1)开源库wpa_supplicant
一个开源库,加入到Android源码中,经过修改后成为Android实现Wi-Fi功能的基础。它的代码位于./external/wpa_supplicant文件夹中,主要用C和C++写成,实现了从上层接到命令后,发送给硬件驱动程序,接着操作硬件完成需要的操作,这里是通过socket来与硬件驱动进行通信的。
(2)硬件驱动程序
前文所说的wpa_supplicant,与之通信的硬件驱动的代码位于./hardware/libhardware_legacy/wifi/wifi.e中。
(3)JNI部分
首先简要介绍一下JNI,JNI是JavaNativelnterface的缩写,它实现了Java代码与其他代码进行交互,使得在Java虚拟机中运行的java代码能够与用其他语言编写的应用程序和库进行交互。在Android中,JNI可以让Java程序调用C程序。
与Wi-Fi相关的JNI代码位于./frameworks/base/core/jni/android_net_wifi_Wifi.cpp中。
(4)Wi-Fi API部分
这部分源代码使用Java完成了对Wi-FiAPI的封装,使应用程序可以使用Wi-Fi功能,它们位于frameworks/base/services/java/com/android/server/和frameworks/base/wifi/java/android/net/wifi/中。
(5)Wi-Fi Settings应用程序部分
这是Android自带的一个应用程序,在手机的Settings中,它可以让用户手动打开或关闭Wi-Fi功能。当用户打开Wi-Fi功能后,它会自动搜索周围的无线网络,并以列表的形式显示、供用户选择,默认会连接用户上一次成功连接的无线网络。这部分代码位于./Packages/apps/Settings/src/com/android/settings/wifi中。
3.2 Wi-Fi执行过程
3.2.1 从Settings中启动Wi-Fi
当用户按下Wi-Fi按钮后,Android调用WifiEnabler的onPreferenceChange,再由WifiEnabler调用WifiManager的setWifiEnabled接口函数,通过AIDL,调用WifiService的setWifiEnabled函数,WifiService接着向自身发送一条MESSAGE_ENABLE_WIFI消息,在处理该消息的代码中做真正的使能工作:首先装载WIFI内核模块(该模块的位置硬编码为”/system/lib/modules/wlan.ko”),然后启动wpa_supplicant(配置文件硬编码为”/data/misc/wifi/wpa_supplicant.conf"),再通过WifiStateTracker启动WifiMonitor中的监视线程。
当成功使能后,广播发送WIFISTATE_CHANGED_ACTION这个Intent通知外界Wi-Fi已经成功使能。WifiEnabler创建的时候就会向Android注册接收
WIFI_STATE_CHANGED_ACTION,因此它会收到该Intent,从而开始扫描。
3.2.2 查找AccessPoint(AP)
扫描的入口函数是WifiService的startScan,它往wpa_supplicant发送SCAN命令。当wpa_supplicant处理完SCAN命令后,它会向控制通道发送事件通知扫描完成,wifi_wait_ for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行处理这个事件,WifiStateTracker接着广播SCANRESULTS_AVAILABLE_ACTION这个Intent,WifiLayer注册了接收SCANRESULTS_AVAILABLE_ACTION这个Intent,所以它的相关处理函数handleScanResultsAvailable会被凋用,在该函数中拿到SCAN的结果f最终是往wpa_supplicant发送SCAN RESULT命令并读取返同值来实现的)。
对每一个扫描返同的AP,WifiLayer会调用WifiSettings的onAccessPointSetChanged函数,从而最终把该AP加到GUI显示列表中。
3.2.3 连接AP
当用户在AcessPointDialog中选择好加密方式和输入密钥之后,再点击连接按钮,Android就会去连接这个AP。
WifiLayer会先检测这个AP是不是之前被配置过,这个是通过向wpa_supplicant发送LIST_NETWORK命令并且比较返同值来实现的,如果wpa_supplicant没有这个AP的配置信息,则向wpa_supplicant发送ADD_NETWORK命令来添加诙AP,ADD_NETWORK命令返回一个ID,WifiLayer再用这个返回的ID作为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去连接该AP。
3.2.4 配置lP地址
当wpa_supplicant成功连接上AP之后,它向控制通道发送事件通知连接上AP了,wifi_wait_for_event函数接收到该事件,WifiMonitor中的MonitorThread被执行来处理这个事件,WifiMonitor再调用WifiStateTracker的notifyStateChange, WifiStateTracker接着往自身发送EVENT_DHCP_START消息启动DHCP去获取IP地址,然后再广播发送NETWORK_STATE_CHANGED_ACTION这个Intent。
WifiLayer注册了接收NETWORK_STATE_CHANGED_ACTION这个Intent,所以它的相关处理函数handleNetworkStateChanged会被调用,当DHCP拿到IP地址之后,会再发送EVENT_DHCP_SUCCEEDED消息,WifiLayer处理EVENT_DHCP_SUCCEEDED消息,会再次广播发送NETWORK_STATE_CHANGED_ACTION这个Intent,这次带上完整的IP地址信息。至此为止,整个连接过程完成。
3.3 相机
Android的Camera包含取景器(viewfinder)和拍摄照片的功能。目前Android发布版的Camera程序功能比较简单,其程序的架构分成客户端(Client)和服务器(Server)两个部分,它们建立在Android的进程间通讯Binder的结构上。
以开源的Android为例,Camera的代码主要在以下的目录中:
Camera的JAVA程序的路径:
packages/apps/Camera/src/com/android/camera/
其中Camera.java是主要实现的文件
frameworks/base/core/java/android/hardware/Camera.java
这个类是和JNI中定义的类是一个,有些方法通过JNI的方式调用本地代码得到,有些方法自己实现。
Camera的JAVA本地调用部分(JNI):
frameworks/base/core/jni/android_hardware_Camera.cpp
这部分内容编译成为目标是libandroid runtime.SO。
主要的头文件在以下的目录中:
frameworks/base/include/ui/
Camera底层库在以下的目录中:
frameworks/base/libs/ui/
这部分的内容被编译成库libui.SO。
Camera服务部分:
frameworks/base/camera/libcameraservice/
这部分内容被编译成库libcameraservice.SO。
为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video forlinux驱动程序和jpeg编码程序实现),而这个库最终将会被Camera的服务库libcameraservice.so调用。
4 实验结果与比较
这款视频聊天软件——“蛙醋”能够稳定地完成各项功能,可以完美地实现视频聊天和视频会议等功能,经过反复测试以及调试后,程序中的BUG也已基本得到有效解决。一开始在与其他视频聊天平台的对比测试中,我们发现“蛙酷”视频传输存在延迟,延迟时间大约为0.8至1.0秒,视频画面呈现出较多的噪点,在较差的网络环境下也频繁出现视频画面卡顿的现象。对于这一系列问题,在查阅相关资料后,我们发现主要问题在于我们没有选择最佳的视频解码,还有一个问题是我们没有对网络传输进行优化。在进行了一系列优化后,视频效果已经显著改善,达到视频聊天标准。
上一篇:谈无线局域网
下一篇:探究解决局域网内DHCP冲突问题