找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

[嵌入式/ARM] 智能手机的无线网络会议白板软件系统开发

[复制链接]
admin 发表于 2013-3-23 01:11:05 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
摘  要: 智能手机的众多娱乐功能和无线商用吸引了越来越多的用户。采用J2ME技术,在智能手机上开发了无线网络会议白板应用。给出了无线网络白板应用的服务器和客户端编程。服务器端通过定义线程结构表来区分参加会议的手机用户。
关键词: 智能手机;无线商用;J2ME;电子白板
       随着移动通信技术的快速发展,智能手机正在成为另一种形式的计算机终端,吸引越来越多的用户的关注和使用。人们使用手机,不再只是局限于通话功能,而是追求无线商用和娱乐等高端需求。智能手机由于类似于个人PC的“操作系统+应用软件”的架构,将成为手机市场的主流产品,甚至正在逐渐挤占个人PC和笔记本电脑的市场份额。
 智能手机目前以众多娱乐功能吸引用户,而其无线商用功能还处于萌牙阶段,这是因为智能手机技术,包括硬件处理器、内存、操作系统、应用软件等目前仍处于高速发展阶段,其无线商用功能还有待业界描述和定义并相应地开发出应用软件。同时,无线商用可能要求移动基础网络保持较高的数据传输速率,这在升级为3 G的各大城市不成问题,因为移动3G网络的通信速率在高速移动情况下可以达到384 kb/s,在慢速移动和静止的情况下更高,已经能够满足智能手机的无线商用要求。何况移动通信的基础网络还在向4 G发展和演进。
 无线网络会议电子白板系统是利用J2ME开发平台为智能手机描述和定义的一种无线商用,目的是为那些处于移动状态而无法通过有线方式和笔记本电脑进行在线交流的移动用户而开发的一种服务。智能手机的无线网络白板应用类似于有线电视的电话会议,不同之处是利用智能手机和移动通信网络。无线网络白板应用与移动用户的点对点通信有很大的不同。无线网络白板继承了PC机下电子白板的所有功能,例如参与会议的多个手机用户可以通过手机对同一幅图像进行处理和实时显示,这种协同操作方式较之点对点通信方式大大提高了效率。
1 开发环境
 目前智能手机使用的主流操作系统有:诺基亚公司的Sybian操作系统、微软公司的Windows Mobile移动操作系统、谷歌公司的Android操作系统。由于前两者是具有公司专属专利权的操作系统,所以应用和发展比较缓慢,而Android则是Google于2007年11月5日推出的基于Linux平台的开源手机操作系统。由于Android系统的源代码开放性以及众多的应用接口,所以一经推出仅用三年多的时间就超过了推出十多年的Sybian操作系统。Android开发平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。Android以Java为编程语言,其中开发智能手机应用程序采用Java中的J2ME最为合适。J2ME由SUN公司推出,主要针对数字机顶盒、移动电话和PDA之类嵌入式消费电子设备的开发。J2ME把智能手机等类似的运算能力和电力供应有限地装置归入到称为“CLDC”的嵌入式开发设备类型之中,在CLDC中有一个专门针对移动信息设备开发的简表MIDP,像智能手机或PDA等内存和处理器资源有限的嵌入式设备开发都利用J2ME的MIDP进行。本文正是在Android操作系统下,利用J2ME开发工具的MIDP进行开发的。
2 服务器端程序开发
 参加电子会议的所有客户端都可以通过自由竞争或选举成为服务器,但每时每刻只能有一个客户端竞争成为服务器。服务器相当于电子会议的主持人。通常参加电子会议的一组客户端会按参加会议的人员身份确定一个服务器,服务器是按参加会议人员的实际情况确定,并不需要自由竞争。如果成为服务器的手机客户临时有事退出电子会议,则可以由实际参加会议的人员身份情况告知另一个客户端成为服务器,如果没有告知则可以通过竞争成为服务器。
 服务器的主要功能包括建立一个电子白板会议,服务器能够发起与客户端的连接,也能够响应客户端的连接请求,发送、接收和转发客户端的数据,服务器还对电子白板会议进行维护,使得电子会议能够顺利推进。
2.1服务器的线程结构表
 服务器端程序较多并且复杂。服务器端主要通过维护有多个线程的结构表来实现相关的功能。线程的结构表程序如下:
 struct ThreadStruct{
  int threadID;
  int userID;
  boolean connected;
  string mobileIP;
  int mobilePort
  }
 上述的线程结构表可以同时建立和维护多个线程,不同的线程使用threadID来标识,ID值可以自由定义,理论上可以在0~1 204之间。每个线程ID对应一个移动用户。同时结构表中包含使用此线程的移动手机IP和端口号。服务器开启后,默认情况下所有线程连接为未连接状态值“false”。只有当服务器接收到某个客户端的连接请求后,选择其中一个空的线程和客户端连接,这时该线程的连接状态由“false”改变为“true”。一般情况下,发起连接的客户端一旦与服务器建立连接后,会成为永久连接。也可以设置为经过若干时间没有数据响应则断开此连接。当该线程客户端断开后,该线程数据结构的连接状态重新设置为未连接“false”。下面的全局静态变量定义的是线程结构表中的线程组值大小和端口号。
     final static int MAX_COUNT = 80;
 final static int USER_PORT = 4 545;
2.2 线程连接的初始化
 for(int i=0;i< MAX_COUNT;i++){
          users = new UserThread(this,i);
          users.start();
        }
     服务器在完成上程线程结构表的创建和线程的初始化后,将通过socket监听发起线程连接的客户端,并将连接成功的用户加入到线程组。
    try{
         serverSocket = new ServerSocket(USER_PORT,5);
         users = new UserThread[MAX_COUNT];
         }
2.3 服务器和客户端的数据交互
 当服务器和某个客户端建立连接后,服务器可以接收某个用户发送过来的数据,并调用sendDraw函数,再把数据转发到其他客户端。While(connected)函数检测到和某个用户连接成功,databag函数类可以看作是要传送的电子白板数据。
  While(connected){
                  databag.color = io_in.readInt();
                  databag.x0 = io_in.readInt();
                  databag.y0 = io_in.readInt();
                  databag.x1 = io_in.readInt();
                  databag.y1 = io_in.readInt();
                  databag.commandCenter = io_in.readInt();
                  switch(databag.commandCenter){
                  case ANSWER_SYNC:
                      System.out.println("ANSWER_SYNC");
                      sendSyncAnswer(databag);
                      break;
                  case DRAW_LINE:
                      sendDraw(databag);
                      break;
                  case ERASE:
                      System.out.println("ERASE");
                      sendDraw(databag);
                      break;
                  case ZOOM_IN:
                      System.out.println("ZOOM_IN");
                      sendDraw(databag);
                      break;
                  case ZOOM_OUT:
                      sendDraw(databag);
                      break;                    
                  }
  sendDraw函数功能是把接收到的电子白板数据发给其他处于连接状态的用户。
  void sendDraw(DataBag databag){
       for(int i=0;i<users.length;i++){
       if(users.connected==true &amp;& users.usersocket.isClosed())
       users.connected = false;
       if(users.connected & users.userID!=userID){
       users.send(databag);
              }
          }
      }
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-24 03:16 , Processed in 0.052360 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表