一种便携式无线监控的实现

2016-12-26 09:45陈名松黄高见邱晓金许笑
现代电子技术 2016年22期
关键词:智能家居

陈名松+黄高见++邱晓金++许笑

摘 要: 为了实现一种价格低廉、便携式无线监控系统来满足智能家居的应用要求。采用一种无线路由作为终端,在手机上开发APK作为客户端接收显示视频数据,在终端上编译安装SDK包,配置内核USB摄像头的驱动,并改写内核的USB摄像头驱动程序使其支持摄像头的使用。实验结果表明,可以在安卓系统手机上运行APK自动连接路由器发出的WiFi信号,实现视频数据的清晰监控。

关键词: 智能家居; 便携式无线监控系统; APK; 嵌入式应用; 安卓开发

在智能家居[1]快速发展的今天,对便捷、智能的视频监控系统要求也越来越高。目前存在的视频监控设备虽多但是价格不低,本文开发的监控系统低于市场价格的200%~300%,而且设备体积小、安装携带非常方便。随着视频监控在家庭中应用的范围越来越广,这个监控系统很有意义。开发APK,对视频数据进行实时地监控以及拍照存储,通过视频服务器对数据进行采集存储与传输,并在Linux平台下进行shell脚本的应用开发,提高整个系统的智能化体验。

1 系统结构

图1为系统硬件结构框图。图中路由器作为监控系统终端,其采用MIPS架构的RT5350作为控制系统的控制器。存储模块由8 MB SPI FLASH和32 MB SDRAM组成,通过USB 2.0与摄像头连接,摄像头直接生成JPEG格式数据。

2 终端的开发应用

基于RT5350的硬件终端平台,要为其安装内核以及文件系统。在虚拟机上搭载运行Ubunt 9.10并对版本号为2.6.21.x的Linux系统进行编译安装。其工作流程图如图2所示。

搭建好的平台可以进行内核的配置和编译,配置内核的USB驱动使其支持UVC摄像头。

2.1 修改内核中的USB摄像头驱动

摄像头中的DSP处理CMOS摄像头传来的原始视频数据后通过USB接口传给单板,USB接口基本符合UVC协议规范,但是还是有些差别,所以修改内核中摄像头的驱动程序[2]使其支持UVC摄像头的使用。因为要修改影像资料,必须先宣告一个特别型态的指标变数,才能正确存取记忆中的资料。把UVC_driver.c与uvc_video.c拷贝到内核中并替换原有的代码,然后进行编译,生成新的UImage_new。

2.2 视频服务器

视频服务器软件主要作用:一是控制摄像头采集视频信息;二是将摄像头采集的数据通过路由器的WiFi信号发布出去。定义buffer指针来存储数据,创建pthread_cond_broadcast()发出一个更新信号,通知发送通道来取数据。图像数据输入组件input_uvc获取图像并压缩编码主要包括三个接口函数,图像输出组件output_hattp等待buffer中的数据更新,然后从buffer中取出数据。服务器的架构如图3、图4所示。

在基于IP的网络协议中,选择HTTP通信方式,创建线程服务打开TCP Socket等待客户端的连接。

2.3 视频服务器软件开机自启动

在实际的应用中必须实现路由器开启后相应的视频服务器软件自动启动,跟踪路由系统的启动步骤,在internet.sh添加编写脚本[3]run.sh路径来实现开机自启动,run.sh的编程流程如图5所示。

完成脚本后,将脚本run.sh拷贝到文件系统bin文件夹下,在脚本internet.sh中添加/bin/run.sh。

3 客户端的开发

Android[4]客户端的开发中使用Java[5]语言编写APK进行视频数据的接收与显示。MJPG?Streamer的传输是使用Socket编程模拟HTTP协议进行数据的传输,则客户端使用GET方法进行HTTP[6]的请求连接。构造ConnectTask函数继承异步类AsynTask避免HTTP连接阻塞UI的运行。其中WiFi热点的连接可以是自动或者手动,并将热点IP地址存入本模块的SharedPreference。下面对客户端的开发分三个部分来介绍:客户端总体框架结构、视频的接收显示和视频的拍照存储。

3.1 客户端总体框架结构

在开发中使用DefaultHttpClient类创建客户端,使用HttpGet方法向服务器发请求,根据服务器端的要求,发送的请求是“GET /?action=stream\n”,构造MjpegInputStream类使其继承DataInputStream,实现了Serializable接口,在这个类中根据数据帧的大小获得类位图,再构造StreamerView类继承SurfaceView实现SurfaceHolder.Callback接口,在StreamerView类中构造方法根据类位图绘制矩形,再绘制相应的位图。定义Generic类增强程序的扩展性和可读性,在这个类中构建showMsg,getNowTime,getSdCartFile,getConnectedIP以及getShrinkedPic方法来显示时间、获取当前系统时间、获取SD卡路径、获取连接到WiFi热点的所有手机IP地址以及得到照片的缩略图。

客户端实现层次如图6所示。

3.2 视频的接收与显示

视频服务器输出端输出的是一帧数据,用UE打开发现每一个JPG格式的图片开始2 B都是 0xFF,0xD8;整个数据流的形式是:HTTP头信息,帧头(0xFF 0xD8);帧数据,帧尾(0xFF 0xD9)。首先通过0xFF,0xD8找到帧头位置:帧头位置前的数据就是HTTP头,里面包含Content?Length,这个字段指示了整个帧数据的长度,帧头后面的数据就是帧图像的开始位置。创建MjpegInputStream类来实例化流。

构造readMjpegFrame方法,利用BitmapFactory.decodeStream()将输入字节流转换为类位图。在surfaceView继承类中将类位图绘制出位图,视频数据接收显示的流程图如图7所示。

surfaceview[7]的核心在于提供了两个线程:UI线程和渲染线程,绘制位图的整个过程的具体步骤是继承SurfaceView并实现SurfaceHolder.Callback接口→SurfaceView.getHolder()通过此方法获得SurfaceHolder对象→SurfaceHolder.addCallback(callback)添加回调函数→SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布→Canvas绘画→SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。

3.3 视频的拍照存储

创建MainActivity类继承Activity实现OnCheckedChangeListener,监听RadioGroup,为RadioGroup设置4个RadioButton,当RadioButton被按下或改变时触发onCheckedChanged方法,在此方法中定义了不同控件的相对应操作,实现流程图如图8所示。

在checkSdCard()方法中获得SD卡路径,创建存放图片的picturePath目录。在SD卡中根据picturePath以当前系统时间为前缀新建图片文件,调用StreamerView的getbitmap方法获得位图,如果位图不为空,根据图片文件获得缓冲输出流,调用位图的压缩方法将图片压缩为JPEG格式,刷新缓存,关闭流。

通过Java进行安卓客户端的开发,成功实现了视频数据的接收显示以及拍照存储,其效果如图9所示。

4 结 语

经过测试本监控系统可以实现55 m2的检测距离,这在家庭的应用中是足够的。同时可以实现摄像头的热拔插以及服务器软件的开机自启动。在手机上安装APK灵活地实现视频的实时监控以及拍照存储。视频延迟时间在2 s左右,延迟时间是后面要重点解决的问题。

参考文献

[1] 马季.智能家居远程监控系统的研究与实现[D].青岛:中国海洋大学,2009.

[2] 张辉.基于V4L2的嵌入式视频驱动程序开发与实现[D].合肥:安徽大学,2010.

[3] 张根宝,胡杰.Linux集群环境下监控Web服务器的Shell脚本设计[J].化工自动化及仪表,2010(10):99?101.

[4] SATYA K,DAVE M,SAYED H.精通Android 3[M].北京:人民邮电出版社,2011.

[5] ECKEL B. Thinking in Java [M]. 3rd ed. USA: Prentice Hall PTR, 2002.

[6] 李涛.基于Android的智能家居APP的设计与实现[J].苏州:苏州大学,2014.

[7] Summer.阳和移动开发网站[EB/OL].[2015?09?04].http://www.mobile?open.com/?s=surfaceview&x=0&y=0.

[8] 于艳萍,朱晓智,王中训.基于ARM9和USB摄像头的网络视频采集系统设计[J].现代电子技术,2011,34(24):49?51.

猜你喜欢
智能家居
基于PLC的智能家居控制系统研究
NeST智能家居控制系统的设计与应用
基于wifi的智能家居设计
基于Zigbee的无线通信技术在智能家居中的应用
基于STM32的智能家居控制系统设计
智能家居发展或将实现弯道超车
智能家居未来感初体验
关于智能家居真正需求的探讨
智能家居的发展趋势分析
智能家居更贴心