WindowsMobile开发总结.doc_第1页
WindowsMobile开发总结.doc_第2页
WindowsMobile开发总结.doc_第3页
WindowsMobile开发总结.doc_第4页
WindowsMobile开发总结.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows Mobile开发总结结合自己4,5月份开发手机视频监控系统经历, 来对那段时间的Windows Mobile开发进行总结一下. 说起Windows Mobile开发这事自己几乎是从零开始起步, 原先主要从事J2EE/Asp.Net下的Web应用开发, 从来没有接触过移动应用开发方面; 说零起步, 夸张点了, 好在至少对自己决定采用的开发工具Vs 2005还是有相当了解的, 从大学开始就用它开发Asp.Net/WinForm项目, 那就是说在开发工具上没有什么大问题了, 一个好的工具, 可以极大地提高我们的开发效率; 以及加上去年进入这家主要从事安防监控方面的公司, 虽然安排主要还是做Web开发, 但供Web监控使用的视频监控ActiveX控件也需由我来实现; 毕业之后一直使用的不是C#就是Java, 在大学里学得那点C+, 早就还给老师了. 针对自己这点可怜的C+开发基础, 对即将从事的手机上应用, 明显不足. 后来我花了2周时间去巩固C+, 主要学习Socket网络通信, 多线程处理等跟项目关联密切内容(主要是在C+博客上看别人的博文, 前几天把那段时间收藏的C+开发相关文章整理了一下, 见博文C+开发文章收藏); 如果你打算学习Win32来开发WM应用的话, Programming.Windows与Programming WinCE NET 3rd这2本书不错, 当然入门对照着MSDN看微软SDK带的例子学习更加是一个好途径, 基本上开发常见功能都有介绍, 如菜单,对话框全屏,TreeView控件等, 值得用心去体会. 如果是C#的话也类似, 边看书,边看文章,边看WebCast,基础要尽量打扎实。该项目平台是vs 2005 + WM 5.0 SDK(Pocket PC), 开发语言采用Win32(直接是C+ + SDK API), 因为公司就安排我一个人做手机客户端开发, 提供视频流的服务端由另外人来完成. 希望能够与有跟我有着类似经历或者有志于WM开发的XDJM多多交流, 下面我将从开发环境搭建, 模拟器使用, 具体应用开发等方面来加以总结. 我的弯路大家可以避免, 我的经验大家可以分享。手机视频监控系统 先允许我简单介绍一下什么是手机视频监控系统? 手机视频监控作为手机上多媒体/流媒体应用其中一种, 特别是在当前国内3大电信公司大力推行3G网络背景下, 其在音视频应用方面占了较大比重, 也是3G下的一大亮点. 手机视频监控系统是通过用户的手机随时随地来观看远程监控点的视频。并允许用户进行远程云台控制, 本地录像存储与回放, 监控场地发生意外情况时,通过活动视频向手机报警或短信, 彩信截图通知. 实际可应用的范围: - 商业店铺:商场店铺的监控,收银、货架、出入口监控 - 居民住宅:室内远程图象报警、小区 / 大楼安全防范、物业的无人监控 - 教育行业:幼儿园、小学校的教学评估,家长远程监控 - 旅游行业:宾馆饭店的楼层管理、重点文物及景点的保护 更多内容可以看我前几个月的文章家庭视频监控, 手机视频监控系统, 手机视频监控系统需求, 手机流媒体技术简介, 手机视频监控系统小结.Windows Mobile开发环境搭建 01. 开发环境搭建 开发环境搭建对一个初学者来说是一件很头疼麻烦的事情, 好在在DevDiv论坛上看到了一个讲述环境搭建与快速入门的视频教程与相关介绍帖子, 很值得一看! 另外一个帖子Windows Mobile开发环境搭建也不错, 后来网友alalmn贡献了一份C+开发Mobile(手机系统)开发系列视频教程.02. VS2005/VS 2008创建智能设备项目失败的解决方法当初微软发布IE8的时候, 下载安装看看, 谁知道搞得VS 2005弹出一个窗口提示网页脚本错误, 创建智能设备项目失败. 好像IE7下也有这个问题, 我是立马把IE8干掉了, 后来在网上发现别人找到了解决方法, 可以看这里. 更多开发过程中会碰到的疑难杂症, 希望我整理的Windows Mobile 开发系列文章收藏 - 疑难杂症对你有帮助.03. 调试问题在启动模拟器调试时候提示DLL无法加载,找不到指定的模块,以及遇调试中系统找不到指定的路径的问题, 应该怎么解决呢? 这类问题一般是由程序所需的DLL没有跟应用程序一起部署到手机上. 可以看看这2个帖子, 求助,各位高人,DLL无法加载,找不到指定的模块,怎么解决啊!快崩溃了 , 再遇调试中系统找不到指定的路径的问题(再解决) .模拟器 04. 模拟器部署程序不成功, 无法启动程序模拟器部署程序不成功,不外乎3个原因, 1跟问题3类似缺少dll, 2上次运行程序没有正常退出, 还在运行, 可以从开始-设置-系统-内存下检查有没有相关进程在运行, 3共享冲突且文件无法删除. 开发时候, 不时模拟器上出一些怪异现象, 我几次发现调试socket时候, 程序死活连不上服务器, 程序出现错误异常报告, 不知道何原因. 发现模拟器问题。可以采用如下步骤:软重启,如果启动后无效进入下一步(选择模拟器菜单Soft Reset一般情况下上述问题都可以在这里得到解决, 平时保存模拟器状态前先把手机上的网络链接断开)硬重启,如果还是无效进入下一步卸载images,再次安装。05. 模拟器上网最简单方式是通过ActiveSync来上网, 另外一种比较复杂需要安装一个Microsoft Virtual PC通过PC网卡上网, 具体可以看原创模拟器上网的两种方法, 有一步步操作截图说明, 很直观清晰, 堪称经典之著.06. 模拟器上中文显示Vs 2005默认安装是英文版的模拟器, 在其上面, 中文不是显示成或者就是?, 甚至就是空白, 在界面上啥都没有显示出来; 这个问题你可以安装中文版的模拟器来解决, WM5安装Windows Mobile 5.0 Emulator Images for Pocket PC - CHS.msi, 如果你是采用WM6开发的话安装Windows Mobile 6 Professional Images (CHS).msi, 至于相关模拟器下载可以参考文章Windows Mobile 开发系列文章收藏 - Device Emulator.UI等具体实现 07. 全屏窗体实现在实现全屏窗体时候经常会碰到如何隐藏mobile默认最下方的bar条, 输入法又突然冒出来; 实际上要实现全屏, 一般情况下采用SHFullScreen + MoveWindow + WM_SETTINGCHANGE, 如果你要考虑一些更加多的细节, 下面这个帖子有可能对你有帮助, 关于Mobile的全屏实现的一点心得. 值得一提的是在网上同时看到1篇文章, 可以说是讲述相反问题, 八股文的”实现真正的非全屏窗口和自定义消息对话框”很不错.08. 如何去掉窗体上的关闭按钮?SHDoneButton(hWnd,SHDB_HIDE);SetWindowLong(hWnd,GWL_STYLE,WS_NONAVDONEBUTTON );同时进行一下基础知识扫盲, PPC上窗体的关闭与最小化, 图来自黎波老师的博客文章. 在默认情况下,我们新建的窗体运行时屏幕右上角显示一个按钮,按照我们使用 Windows 的习惯,应该是用来关闭窗体。其实不是,它只是最小化窗体,并没有关闭。如果这个窗体是一个应用程序的主窗体,那么该程序并没有退出,而是隐藏了。可以通过重新运行该程序的 exe 文件来恢复显示程序的运行界面或者到运行程序列表中进行激活显示。09. 关于SIP开关后对话框的显示问题也就是怎样实现软键盘打开, 对话框自动适应? 我们在开发过程中也会碰到, 如果对窗体中控件位置计算不正确, 会出现当输入法打开时把窗体上的编辑框给档住了,怎样实现输入法打开对话框自动上移? 可以响应WM_SETTINGCHANGE消息,通过SHSipInfo函数去得到输入法面板参数和桌面可视区域参数,然后配置你的对话框。SIPINFO si = 0; si.cbSize = sizeof(si);SHSipInfo(SPI_GETSIPINFO, 0, &si, 0);BOOL bShow = si.fdwFlags&SIPF_ON; / 如果bShow为TRUE,则软键盘显示,否则隐藏;使用si.rcSipRect和si.rcVisibleDesktop来实现你的需求。 10. WM手机默认中文编码是什么?默认编码是Unicode, 所有的WM手机都是UNICODE的, 且SP平台和PPC都一样! 很多跟我一样刚接触WM开发的人都会碰到一个问题, 为什么同样的代码在VC6开发的应用程序中没有问题, 但把相关代码复制到Windows Mobile上运行就出现如此多的编译错误, 如error C2664: CWnd:MessageBoxW : cannot convert parameter 1 from char 100 to LPCTSTR. 都是没有考虑到这一点(编码问题), 需要使用提供的字符串相关的API与函数加以处理. 字符串处理函数可以看这篇文章WinCE下非常有用的字符串操作函数.下面简单介绍Unicode C-Runtime 转换函数mbstowcs(wchar_t*wcstr,/Outputstring.constchar*mbstr,/Inputstring.size_tcount);/Charactercountwcstombs(char*mbstr,/Outputstring.constwchar_t*wcstr,/Inputstring.size_tcount);/CharactercountMultiByteToWideChar与WideCharToMultiByte/演示API使用,UTF-8转换Unicode汉字代码(Copy修改即可)charstr256=(char)0xE4,(char)0xBD,(char)0xA0,(char)0xE5,(char)0xA5,(char)0xBD,(char)0x61,(char)0x62,(char)0x63,(char)0;/一段UTF-8编码WCHAR*strA;inti=MultiByteToWideChar(CP_UTF8,0,(char*)str,-1,NULL,0);strA =newWCHARi;MultiByteToWideChar(CP_UTF8,0,(char*)str,-1,strA,i);i=WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);char*strB=newchari;WideCharToMultiByte(CP_ACP,0,strA,-1,strB,i,NULL,NULL);/strB即为所求/AfxMessageBox(strB);deletestrA;deletestrB; 11. 在Windows Mobile下使用XMLXML当前被大量使用于应用程序配置, 存储少量数据以及Web Services等应用; 甚至到通信报文内容也以xml格式来传递, 方便服务端数据在不同手机与开发平台上解析. 因为不管是C+, C#, 还是Java语言都有提供相关API来解析XML格式内容.在WM开发中, 可以使用微软提供的COM接口或者第三方开源XML解析库如TinyXML, 相关内容请自行浏览在Windows Mobile下使用MSXML, TinyXml 介绍, Windows Mobile下tinyXML的开发等博文.12. 如何建立拨号链接进行网络通信在WM中需先进行拨号链接操作, 链接成功建立后才可以进行后续的Socket通信等; 感觉这方面微软处理没有Symbian下那么友好, Nokia手机会在你的应用首次使用网络时, 弹出窗口提醒你该操作可能产生GPRS流量费用, 询问你采用何种上网方式接入, 是cmnet还是cmwap. 因为讲述GPRS这方面文章很多, 可以直接看我整理的Windows Mobile 开发系列文章收藏 - GPRS/上网设置.13. 界面美化 - 贴图 用户对手机软件的界面是很在意的,做的好看了他会觉得有技术含量,做的好用了他会更加喜欢我们的产品。所以一套好的UI是必不可少的。手机软件开发的大部分工程是在做UI系统。一套好的自主的手机软件UI系统是产品核心竞争力的一部分。在Windows Mobile的界面开发,使用C + SDK做漂亮的界面不容易,一旦在界面上控件比较多,控件的布局更是头痛。横竖屏切换的时候也得考虑,不同手机屏幕尺寸可能也不一样; 不同的字体下, 界面差异也非常大 其实要做出好的界面最后还是要回归RECT,也就是自己绘制贴图。 如果要做的很漂亮,那还是自己封装一套界面控件,这样控制起来方便。横竖屏问题,你绘制的时候不应该写死的位置坐标,应该取相对坐标。在横竖屏切换的时候会触发WM_SIZE等一些消息,里面改变相对坐标的横竖屏大小就OK啦. 拿配置信息设置窗口来说, 主要需处理WM_PAINT, WM_MOUSEMOVE, WM_LBUTTONDOWN等一系列窗口消息.相关参考代码PAINTSTRUCTps;HDChdc,hdcCopy;HBITMAPhBitmap;RECTrt;intiRet=0;POINTptM;switch(message)caseWM_PAINT:/WM_ERASEBKGNDhdc=BeginPaint(hDlg,&ps);hdcCopy=CreateCompatibleDC(NULL);if(doCloseDlg)hBitmap=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_LOGINCLOSE);/鼠标移动到窗体关闭按钮时候,载入不同的位图elsehBitmap=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_LOGIN);SelectObject(hdcCopy,hBitmap);GetClientRect(hDlg,&rt);BitBlt(hdc,rt.left,rt.top,rt.right,rt.bottom,hdcCopy,0,0,SRCCOPY);DeleteObject(hBitmap);ReleaseDC(hDlg,hdc);EndPaint(hDlg,&ps);break;caseWM_MOUSEMOVE:caseWM_LBUTTONDOWN:ptM.x=LOWORD(lParam);ptM.y=HIWORD(lParam);SetRect(&rt,190,0,235,20);if(PtInRect(&rt,ptM)doCloseDlg=true;elsedoCloseDlg=false;InvalidateRect(hDlg,&rt,TRUE);UpdateWindow(hDlg);break;caseWM_LBUTTONUP:/判断当前用户鼠标点击位置是否位于关闭按钮区域ptM.x=LOWORD(lParam);ptM.y=HIWORD(lParam);SetRect(&rt,190,0,235,20);if(PtInRect(&rt,ptM)EndDialog(hDlg,LOWORD(wParam);doCloseDlg=false;break;最终实现效果大致如图下:14. 用户登录过程例子我是新开一个线程来处理, 可以灵活加入如超时控制等, 通过自定义处理消息来通知主窗体当前进度情况.这个你先定义这个消息如#define USER_LOGIN_MESSAGE WM_USER + 300, 需要触发的时候SendMessage/PostMessage给指定窗口, 如PostMessage(g_hWnd, USER_LOGIN_MESSAGE, LOADCONFIG, 0); 然后在对应的窗体消息处理里面处理, SendMessage和PostMessage后两个参数就对应WndProc的后两个参数,可用于传值。LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) switch (message) case USER_LOGIN_MESSAGE: break; return 0;用户登录大致代码#defineUSER_LOGIN_MESSAGEWM_USER+300/用户登录服务器步骤typedefenumtagTLoginStepINITMENU=0,/初始化菜单LOADCONFIG=1,/载入流媒体配置信息INITWINSOCK=2,/初始化Winsock库CREATESOCKET=3,/创建socketCONNECTSERVER=4,/正在连接服务器SENDREQUEST=5,/发送请求GETRESPONSE=6,/获取响应PARSEPACKET=7,/解析报文LOGINOK=8,/登录成功LOGINFINISH=9,/登录操作完成LOGINFAIL=10,/登录失败REFRESHVIDEO=11/刷新画面TLoginStep;/=caseIDM_LOGIN:SetCursor(LoadCursor(NULL,IDC_WAIT);/显示系统自带的WAIT进度圈ShowCursor(TRUE);PostMessage(g_hWnd,USER_LOGIN_MESSAGE,INITMENU,0);if(packetHelper=NULL)packetHelper=newPacketHelper();SetTimer(g_hWnd,1,1000,NULL);/用于实时显示视频数据传输速率hMenu=(HMENU)SHMenuBar_GetMenu(g_hWndMenuBar,IDM_HELP);if(hMenu!=NULL)EnableMenuItem(hMenu,IDM_LOGIN,MF_BYCOMMAND|MF_GRAYED);DWORDdwThreadId;HANDLEhThread;hThread=CreateThread(NULL,0,LPTHREAD_START_ROUTINE(UserLoginProc),packetHelper,0,&dwThreadId);if(hThread)CloseHandle(hThread);break;其效果大致如下图所示, 其中涉及菜单等操作可以看Windows Mobile入门中菜单部分.15. 计算当前传输速率在视频监控程序里面我们一般会在画面上同时显示当前传输速率为多少kbps, 我在这里采用通过2个变量来保存到上一秒收到的字节数以及到这一秒收到的数据量, 通过对这2数相减, 大致计算出这一秒传输了多大的数据量. 定义一个每隔1s触发的定时器, 然后在窗体中处理WM_TIMER消息. 为了能够上STATIC上字体显示成白色, 需在窗体中处理WM_CTLCOLORSTATIC消息caseWM_CTLCOLORSTATIC:SetBkMode(HDC)wParam,TRANSPARENT);SetTextColor(HDC)wParam,RGB(255,255,255);return(LRESULT)GetStockObject(BLACK_BRUSH);16. 如何制作.CAB安装包C#怎么安装 cab呢?一般情况下通过vs 2005新建安装部署工程,里面就有打包cab来生成可部署到手机上的安装包. 另外有一个WinCE CAB Manager工具可以帮忙.17. 模拟器 vs 真机要弄清楚一点, 不管当前模拟器真实度有多么高, 但其毕竟不是真机; 如果条件可以的话, 尽早把程序部署到手机上跑跑看, 会发现一些在模拟器上没有注意到的问题, 如网络情况, 稳定性, 传输速率. 当然还有其它一系列差异, 手机性能(CPU, 内存使用).更多WM应用开发的常见问题, 可以看文章WM应用开发的常见问题解答, Windows Mobile 开发常见问题集2, Windows Mobile 开发系列文章收藏 - 开篇, Windows Mobile开发文章收藏.移动流媒体应用发展与限制 1. 资费问题拿中国移动举例来说, 当前其GPRS是按流量来收费的; 就拿我自己动感地带套餐每月赠送50M流量, 按一路视频传输128kbps来计算, 让我们来看看, 可以看多少分钟视频, 50M = 50 * 1024 * 8 (传输速率是按位计算的, 1 Byte = 8 bit), 结果是大致可以看50分钟, 如果把视频传输速率调低到32kbps, 我们也只能够看3小时多的视频, 差不多也是当前智能手机电池能够支持极限, 当然这样处理同时也会降低视频画面的清晰度. 超出部分流量移动是按0.01¥/KB收取, 1分钟视频竟高达近10块大洋.这个价格可不是像我这类的普通人承担得起的. 所以3G网络下, 中国联通率先对其资费进行了更改, 独创了全新的计费方式和计费理念:以M/T作为多媒体内容的下载计费单位。可参见运营商的纠结:3G最好计费方式是什么模样2. 网络状态, 无线网络带宽窄,干扰严重我测试得到的情况是, 在办公室里面信号比较稳定, 平均传输速率在160 220kbps之间浮动. 下班回家在公交车上看视频, 视频所需缓冲时间加长, 画面显示需等待5-10s不等,在一些繁忙路口, 四周高楼大厦环境下, 存在信号盲区, 网络连接不上或者提示超时. 2.75G EDGE网络下(其速度最多236 kbps,对QCIF视频画面质量传输来说足够了), 但实际情况下,稳定的传输速率通常在30 50kbps左右。并且随着使用用户的增加,网络的性能将会进一步下降。另外无线网络的干扰严重,导致网络传输的误码的可能性大大增加。 当前的3G模块比较耗电. 未来随着3G的推广, 以及有消息称中国移动TD-LTE(4G)2010年会进入商用,下载一部164兆的电影,仅花了不到2分钟,而通常300兆的电影,则只要3到5分钟就能下载完毕。对此,业内人士介绍,4G可以达到百兆以上的速率,对于3G来说又是一个质的飞跃。如果说3G 是国道,4G就是高速公路。而对于4G与2G、3G之间最大的不同,技术人员介绍,除了速度比他们快之外,视频

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论