65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 WAP 手机上的网络摄像头进行监控

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (8投票s)

2005年2月8日

CPOL

13分钟阅读

viewsIcon

155674

downloadIcon

1073

一篇关于WAP架构和示例应用程序的文章。

WapCamSdkR20

一切都始于一个想法:“我想通过我的WAP手机查看远程位置”。当我了解到WML(无线标记语言)和WBMP(WML位图)的功能时,我就有了这个想法。事实上,现在的WAP手机可以在屏幕上显示WBMP。这样,我就可以在WAP手机上显示一张图片,我可以选择图片,并且我可以决定图片在屏幕上显示的时间。如果图片之间的时间间隔非常短,我就可以获得电影效果(在电影中,每秒播放X张固定图片,让观众产生运动的错觉)。在接下来的文章中,你会发现这在一定程度上是真的。

应用程序

简而言之,WapCamSdkR20从网络摄像头捕获图像,经过一些转换后,输出一个.wbmp文件,保存在Web服务器的某个目录下。这是将图像传输到WAP手机的简单核心架构。实际上,并没有真正传输到手机,而是手机自己更新信息。因此,我们应该将WapCamSdkR20视为一种架构,而不是一个简单的.exe(在其alpha版本中,WapCamSdkR20是一个.exe)。

架构

让我们来看看WapCamSdkR20的实际架构。

我们需要从网络摄像头捕获图像,处理这些图像并生成一个.wbmp文件。我们必须每X毫秒重复这个序列,以便刷新WAP手机上的图像。

这个目标由WapCamSdkR20.exe实现。

现在我们需要找到WapCamSdkR20.exe(位于Microsoft平台)与WAP手机之间的联系:解决方案是WAP服务器与Microsoft IIS的协同作用。如果软件所在的服务器机器拥有调制解调器和电话线,我们就可以获得一个自给自足的“世界之眼”。

Windows 2000或更高版本的操作系统非常适合实现这种通信软件(因为其API和鲁棒性),而Microsoft Visual Studio(Visual C++ 6.0)是开发此应用程序的完美工具(因为它能快速开发)。

WapCamSdkR20.exe内部

我们有一个普通的.exe文件,具有SDK技术。WapCamSdkR20使用Wap.dll,该DLL导出了两个类:CWebCamCbitmap。第一个负责从网络摄像头获取信息,第二个负责处理和转换位图。在WapCamSdkR20.cpp的开头,我们有一个类CWapPhone,它继承自CWebCamCbitmapCWapPhone的实例是:“topolino”。所有操作都通过topolino实现。

WapCamSdkR20.cpp的开头,我们有

topolino.InitializeCBitmap();
topolino.InitializeCWebCam(WINWIDTH,
WINHEIGHT,
MAIN_WINWIDTH,
MAIN_WINHEIGHT );

这些方法初始化了前面两个类,之后我们创建了主窗口并执行了一些与窗口相关的操作。

topolino.SetCurrentDriverIndex((BYTE)0)获取所有网络摄像头驱动程序中的第一个驱动程序,并将其设置为WapCamSdkR20使用。

topolino.StartCamWindow(CAM_X_ORI, 
                     CAM_Y_ORI,
         MAIN_WINWIDTH,
         MAIN_WINHEIGHT,
         hDaddy )

上述方法创建了一个捕获窗口,并将其链接到hDaddy

稍后,我们创建了唯一的线程,并管理主窗口的消息队列。

在主窗口中,您可以看到两个文本框。它们负责设置位图转换算法所需的两个主要参数。稍后我们将看到这些参数,现在我们必须查看唯一线程的RealThreadProc

DWORD WINAPI RealThreadProc(void* pv) 
{
    while(1)
    {
        SaveOnFile();
        Sleep(X_Time);
    }
    return 0L;
}

SaveOnFile是唯一被反复调用的函数,而X_Time是WBMP创建之间的时间间隔。

SaveOnFile函数中,我们有FromCamWinToBmp(BitmapFile, COLORONCOLOR)用于从网络摄像头检索图像并将其存储在文件中,Load(BitmapFile)用于从上述文件中检索位图,Filter_1(Range)用于将一种算法应用于位图,ColorToBW(Threshold)用于将彩色位图转换为黑白位图,ConvertToWbmp()用于将黑白位图转换为WBMP,以及SaveWbmp(WbmpFile)用于将WBMP保存到指定路径。

Notice

您必须考虑到,此应用程序处于alpha发布阶段,因此存在一些不完善之处和冗余操作。

重要

在电影中,我们每秒大约有25帧,但WAP架构很难获得这种质量。为什么?

WAP手机是一种复杂的微型设备,具有一个特点:这些设备有一个微浏览器用于显示WML页面,然后我们通过刷新设备读取的页面来创建低电影效果。

但是,GSM通信不可靠,设备内存容量低,特别是,我们必须考虑GSM信道的低带宽。因此,当WAP手机读取WML页面时,此操作执行缓慢,两个页面之间的间隔可能高达750毫秒。

这些技术限制很可能在下一代手机中被消除。

出于所有这些原因,我们可以将X_Time设置为高达1500毫秒;这样,我们并没有牺牲WAP的性能,反而为其他线程节省了宝贵的时间。

Wap.dll内部

WAP协议中唯一的图像支持是WBMP格式,这种特殊格式仅用于小型单色图像。在Windows环境中,很容易找到创建或获取BMP格式图像的图形应用程序,但WBMP格式并非如此。因此,我们有一个简单的C++类,可以将BMP格式转换为WBMP格式。

首先,我们分析CBitmap。在此类中,您会找到与WAP手机的宽度和高度相关的两个常量(96 x 65)。这些尺寸是针对普通WAP手机的,并且在类中用于所有计算。在InitializeCBitmap方法中,有位图和文件操作所需的缓冲区分配。Load从文件中检索位图并将其推送到pMem内存缓冲区。Save将位图存储在文件中。SaveWbmp将无线位图存储在文件中。

类名是CBitmap,位于Wap.h中定义的_BartIvan命名空间内。其限制是:源图像的大小必须为96x65,您可以在Wap.h中看到这一点。

#define WAP_WIDTH 96
#define WAP_HEIGHT 65

为了管理每个字节中的比特,我们定义了以下联合体myunion,其中包含一个按位结构bits_st

union myunion {
BYTE byte;
struct bits_st { /** define 8 bits in ordinal manner*/
    unsigned char bit7:1;
    unsigned char bit6:1; 
    unsigned char bit5:1;
    unsigned char bit4:1;
    unsigned char bit3:1;
    unsigned char bit2:1;
    unsigned char bit1:1;
    unsigned char bit0:1;
    } bits;

};

位操作在类方法(静态)SetBit中实现,宏CB用于简化此操作。

#define CB(n) case n: \
        u.bits.bit##n = val; \
        break
 
/**
b     source byte
numbit    bit ordinal number
val    new bit value (0,1)
*/ 
static inline void CBitmap::SetBit( BYTE * b, int numbit, int val )
{
    myunion u;
    u.byte = *b;

    switch(numbit){
    CB(0);
    CB(1);
    CB(2);
    CB(3);
    CB(4);
    CB(5);
    CB(6);
    CB(7);
}

    *b = u.byte;
}

另一个非常重要的类方法是GetBNBitValue,它以定义BMP单个像素的三个比特和一个阈值为输入,并返回单色图像中的等效像素,即0或1。

转换分两步进行

  1. 从彩色图像到黑白图像的转换,在ColorToBW方法中实现。
  2. 从黑白图像到WBMP图像的转换,在ConvertToWbmp方法中实现。

此外,该类还支持通过Save (<filename>)SaveWbmp (<filename>)方法对黑白图像和WBMP文件的序列化,并且必须通过Load (<filename>)方法从文件加载源BMP。

下图以UML形式展示了转换的实现方式

重要

实际上,WAP手机是带有单色显示屏的设备,因此,我们必须将AviCapWindow的彩色位图转换为黑白位图,然后再将黑白位图转换为无线位图。

对于所有计算,我们使用每个彩色像素三个字节的均方值。Get3Byte_rms方法负责此计算。

Filter_1(short Range)是我们应用于从网络摄像头检索到的BMP的一个可想象的滤波器,特别是,该滤波器将当前黑白像素与前一个、后一个、上一个、下一个像素进行比较,并且在Range的某些值下,您可以看到形状的边界而不是填充的形状。

ColorToBW(char Threshold)是位图转换的主要方法。通过更改Threshold,我们必须决定像素是白色还是黑色;事实上,这个阈值与通用像素的均方值进行比较,如果满足条件,则像素将被设置为白色。在某些情况下(对于特定的BMP格式),我们遇到了问题,因此您会找到long bnAdjust变量。

ConvertToWbmp()是转换的最后一部分。此方法对于图像宽度和高度的微小值也准确。有关更多信息,您必须参考WAP规范。

现在,我们分析CwebCam。没有什么太多可说的;在InitializeCWebCam方法中,我们进行了初始化阶段,StartCamWindow方法创建了一个“AviCap_Basic”类型的窗口。

请注意,如果应用程序窗口被隐藏,WBMP文件中将不会写入任何内容,因为信息直接从AviCap窗口检索。

FromCamWinToBmp是一个方法,它实际从AviCap窗口获取图像,然后通过IPicture接口将信息保存到.bmp文件中。

一些生成的.wbmp文件如下所示

这些图片可以使用Wbmpview.exe打开,这是一个在互联网上免费提供的应用程序。您必须考虑到WAP手机通常会裁剪图像以适应其显示屏(通常是96 x 65像素)。

WAP系统和架构内部

近年来,手机变得非常受欢迎。移动WAP手机是能够运行应用程序并通过无线网络(GSM)与其他设备和应用程序通信的通信系统。

通过基于WAP(无线应用协议)的技术,可以直接从WAP手机与网络上的信息和最广泛的服务进行交互,从而实现Internet和GSM网络之间的对话,并允许开发在无线网络上运行的应用程序和服务。

WAP拥有自己的技术。因此,不可能通过WAP手机访问常见的网站和应用程序。WAP使用与Web应用程序常用的语言不同的语言。WAP最重要和最常用的语言是WML(无线标记语言)。但WAP也有自己的脚本语言,拥有自己的图像格式,并且还需要一个合适的浏览器,称为微浏览器,来显示WAP页面。微浏览器存在于最新一代的WAP手机中。

WAP模型

WAP编程模型与WWW编程模型非常相似。尽可能地,用于WWW模型的相同解决方案已被用作WAP技术的起点。

显然,WAP模型对WWW标准进行了一些修改,以使其与WAP设备和GSM网络的特性兼容。

WAP模型假定存在一个WAP网关服务器,该服务器负责

  • 编码和解码从客户端(WAP手机)发送和接收的数据。
  • 获取信息。
  • 在无线网络上传输的数据的压缩/解压缩。

在WAP模型中,WAP手机与WAP网关通信。该网关将WAP请求转换为WWW请求,从而允许WAP客户端向Web服务器提交请求。

网关WAP服务器还将Web服务器的响应编码为客户端可识别的紧凑二进制格式。如果Web服务器提供WAP内容(例如WML),WAP网关会直接从Web服务器检索。但是,如果Web服务器提供WWW内容(例如HTML),则会使用过滤器将WWW内容转换为WAP内容。例如,HTML过滤器会将HTML转换为WML。

WAP架构 – 层和协议

WAP架构由五层组成

无线应用环境 (WAE)

WAE是一个基于Web(万维网)的元素和解决方案与移动电话技术相结合的应用环境。WAE的主要目标是建立和确定一个运行环境,使运营商和服务提供商能够以高效的方式构建满足各种不同无线平台需求的应用程序和服务。

无线会话协议 (WSP)

WSP提供基于事务层协议WTP提供的事务的连接服务。

无线事务协议 (WTP)

WTP将数据传输管理为数据包(数据报)。它在安全或非安全的无线数据报网络上高效运行,并提供许多功能。

无线传输安全层 (WTLS)

WTLS是一个基于称为安全套接字层(SSL)的标准安全协议的安全协议。WTLS协议提供以下功能

  • 数据完整性
  • 客户端和服务器身份验证
  • 隐私
  • 拒绝服务攻击防护

无线数据报协议 (WDP)

WDP在物理设备层运行,并为上层提供透明通信服务。UDP协议允许上层协议独立于无线网络。

WAP解决方案:使用网络摄像头监控WAP手机

我们按固定时间间隔从网络摄像头捕获的图像被转换为两种颜色的WBMP图像。一种特殊的软件负责这种图像格式的转换。我们获得的图像存储在数据库中。

WAP应用程序按固定时间间隔调用数据库,并刷新WAP手机用户代理上所需的WBMP图像。WAP手机客户端调用一个WML页面(菜单页面),然后选择要监视的区域。WTP请求由WAP网关转换为HTTP请求,并提交给应用程序Web服务器。响应从应用程序Web服务器传递到WAP网关。网关将响应从HTTP响应转换为WTP响应,并将结果显示在WAP手机上。

显然,我们需要配置IIS Web服务器,在默认文档根目录下添加以下MIME类型

.wml         text/vnd.wap.wml
.wmls        text/vnd.wap.wmlscript
.wbmp        image/vnd.wap.wbmp
.wmlc        application/vnd.wap.wmlc
.wmlsc       application/vnd.wap.wmlscriptc

这样,例如,IIS Web服务器就知道“*.wbmp”文件是WAP的图像,“.wml”文件是文本文件。

场景

我们可以设想,客户端通过WAP手机进入一个特殊的信息菜单,然后从那里请求监视由电视摄像头监视的特定区域(我们的住所的一部分、一个居民区的一部分等等)。

监视请求到达我们的WAP网关,然后到达我们的应用程序Web服务器。应用程序Web服务器向数据库发出信息请求,提取所需的WBMP格式图像,并保持与WAP手机的连接打开,按固定时间间隔刷新同一图像。因此,WAP客户端可以在同一设备上完整监视所需区域。

WAP客户端可能的选项菜单……

…..
<wml>
    <card id="Option Menu" title="Option Menu for Monitoring Area">
        <p>    Menu </p>
        <p>
        Monitoring for Area Xxxxx
            Monitoring for residence area yyyy
            ……
            other option….
        </p>
    </card>
</wml>

关于“WAP手机上的网络摄像头”的部分源代码...

 …..
<wml>
    <card id="Photo_Card">
        <onevent type="ontimer">
            <refresh/>
      </onevent>
            <timer value="30"/>
            <p>
                .... acquire the image from database .....
                <img src="Our Image from Data Base.wbmp"  alt="monitoring"/>
            </p>
        </card>
</wml>

WAP解决方案架构

下图中描述了WAP解决方案的架构,涉及WAP请求监视图像。

该解决方案使用网关WAP服务器(如UPLink、Nokia WAP Gateway、WapLite Gateway等)和应用程序Web服务器(Microsoft IIS、Apache等)。

WAP网关实现以下功能

  • 拦截从WAP手机发来的WML或HTML请求。
  • 过滤和压缩这些请求,并将它们转换为Web服务器可识别的请求。
  • 将这些请求分发给相应的Web服务器。
  • 以可识别的格式将请求的信息返回给WAP手机。

关于WAP手机,应用程序的客户端可以使用任何支持WAP的手机。

参考文献

本文中使用的一些文章和/或书籍...

© . All rights reserved.