- 2.44 MB
- 27页
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'计算机科学与技术学院“课程设计”项目报告项目名称:石头剪刀布小游戏专业:14软件工程班级:14软件工程学号:143801013姓名:邓舒成绩:学号:143801012姓名:王威成绩:指导教师:鲁屹华申请日期:2016年春学期湖北科技学院计算机科学与技术学院制27
项目名称石头剪刀布小游戏研究起始时间2016年6月完成时间2016年7月指导教师简况姓名职称所属教研室课程名称设计内容及要求(由指导教师填写):设计一款具有明锐的感知能力,智能处理能力,自然的交互方式的物联网云平台,支持高并发并在大量连接的情况下快速反应,实现大数据存储与各种事件的响应和处理,实现各种情景调控与各种人性化操作。实施方案及实施计划1、具体研究内容、研究目标和拟解决的关键问题研究内容:设计一款具有敏锐的感知能力,智能的处理能力,自然的交互方式的物联网平台实现海量并发连接,海量数据存储,在线监控,事件告警,情景设置,数据分析等众多智能需求的物联网系统,达到任何时间,任何地点,任何物体之间的互联,推动大数据,云计算,移动互联网,物联网等与现代制造业结合已经成为业界不断追求的目标。研究目标:实现任何时间,任何地点,任何物体之间的互联,融入大数据等计算机行业的新技术,打造一个智能化的物联网云平台。解决的问题:降低对服务器的压力,采用MySQL-Redis二级存储体系,实现读写分离,降低了磁盘IO的开销,加快读写速度,高效的转发命令,降低程序之间的耦合性。2、进程安排(给出项目实施的具体分步骤计划)2016年6月:根据设计文档搭建服务器并模拟app测试服务器端代码的功能是否可用2016年6月:开始编写app端的代码,实现基本的功能2016年6月:实现app和服务器端的额外的功能,并完善前期没有完成的功能。2006年6月:不断测试并完善app和服务器端的功能,并测试其性能3、具体设计方案(3000-5000字)27
说明:主要分为四个部分(文中不允许有错别字,语句不通顺处,标点错误地方,每发现一处总成绩扣掉5分。格式错误,每处扣1分。)1.关键技术以及开发工具2.实现思路以及具体实现3.界面展示4.设计总结说明:文档结构如下(范例):1系统设计关键技术及开发工具1.1MQTT协议1.2REST架构1.3Redis高速缓存1.4c3p0数据库1.5HTTP协议1.4开发工具MyEclispe简介2设计思路及具体实现2.1系统整体分析2.2系统数据分析2.4功能模块的核心代码3系统界面展示3.1设备列表页面3.2设置界面3.3添加设备界面3.4详细设置界面27
3.5分享应用界面3.6手动添加设备界面3.7RGB灯控制界面3.8呼吸灯界面3.9舞台灯界面3.10闹钟灯界面4设计总结说明:格式如下(范例):1关键技术及开发工具字体,字号要一致。随着物联网的发展和移动终端的普及,设计一款支持高并发,海量存储的物联网平台实现对物理设备的智能化管理是人们的普遍追求。本平台在采用把服务器分成几个模块单独运行,降低了高并发对服务器的压力;采用MySQL-Redis二级存储体系,实现读写分离,降低了磁盘IO的开销,加快了读写速度;采用轻量级的MQTT协议借助MQTT代理服务器转发用户命令,使消息转发更及时、高效;采用restful风格的URI设计,是各个接口的功能和整体结构更清晰,也降低了系统的耦合性。本系统主要基于MQTT协议和HTTP协议实现安卓、服务器和远程硬件设备之间的通信,使用restful融合HTTP协议映服务器的资源为app和硬件设备提供服务,使用c3p0数据库连接池访问MySql数据库存储用户数据和设备信息和设备的操纵信息实现数据的持久存储,考虑到大数据和高并发给服务器造成巨大压力的情况,在本系统中融入了redis数据库,真正实现二级存储体系,支持高并发下,服务器快速响应,提高了资源请求的效率。1.1MQTT协议MQTT协议是由IBM开发,为物联网而设计的消息传递技术,支持发布/订阅的消息传递模式。它是一种轻量级基于代理的发布订阅消息的传输协议,其设计思想是开放,简单,轻量,容易实现,适合在低带宽、27
网络不稳定,网络代价昂贵以及处理器和存储器资源有限的嵌入式设备和移动终端上,具有开放、轻巧、可靠的特点。在本平台中通过设置cleansession为false保证硬件设备和手机客户端上线之后可以订阅到不在线时候的消息,当设备离线时使用遗嘱向MQTT代理服务器发送消息告知服务器设备离线,设备上线后处于长期订阅状态,保证及时接收app发送的消息。MQTT消息代理作为中间层,采用发布/订阅消息传递模式。这样可以把系统抽象为消息在消息代理和客户端之间相互传送。其中客户端是消息的发布者和订阅者,消息代理主要是用来统一管理和转发需要传递的消息,发布者向消息代理发送特定主题的消息,订阅者向消息代理订阅特定主题的消息。这样降低了系统间的耦合度,也可以屏蔽异构平台,网络协议和数据格式的差异。1.2REST架构在rest架构风格的概念中,任何被引用的实物都被视为资源。rest架构通常包含客户端和服务器,客户端向服务器发送请求,服务器处理请求并给出适当的响应,请求与响应都围绕着资源的描述完成。资源从本质上看可以是任何有意义的可寻址的概念。在本平台中redt框架是连接手机app和各功能模块的桥梁。首先,使用@Path标记资源路径,使用@GET、@POST、@DELETE或@PUT标记当前资源的访问方式,使用@Produces(“application/json”)标记资源类型。然后,在main函数中用component组件添加服务器并指定使用的协议类型和端口,最后把添加的服务器与自己编写的资源联系起来并启动服务器。这样就把java编写的程序映射为一台可以使用http协议访问的服务器。主程序模块与各个子模块之间也使用同样的方式把java程序映射为资源,通过http协议相互访问。2设计思路以及具体实现2.1系统整体分析本课程设计将要设计一个“剪刀,石头,布”游戏,它是由程序随机产生“剪刀,石头,布”中的一个,且不重复。玩游戏者通过由用户输入自己的答案来匹配上面所产生的。用户输入答案后,电脑会根据游戏规则判断你的胜负。首先我设计了一个游戏系统,主要是剪刀、石头、布游戏,游戏规则如下:(1).输入一个答案,答案是剪刀、石头或者布。(2).如果玩家输入的不是系统要求的答案,系统将提示您,您输入的不是数字请重新输入.(3).如果玩家输入的答案与随机生答案比交,如果能打赢系统就会提示您赢得了比赛。(4)如果玩家输入的答案与随机生成答案相比较,如果不能赢得比赛并且是输掉的话,系统就会提示您输掉了比赛。(5).如果玩家输入的答案与随机生成答案相比较,如果不能赢得比赛而是和电脑的答案相同的话系统就会提示您平局。27
2.2系统数据分析本系统共有3张数据表:用户表:设备表:27
用户操作表:2.3数据流图27
系统架构图例:27
例:27
2.4功能模块的核心代码服务器端系统开发目录结构:27
27
App端项目开发目录结构:27
27
三个模块的web.xml:org.restlet.application com.wulianwang.resletApplication.RestJaxRsApplication RestletServlet org.restlet.ext.servlet.ServerServlet RestletServlet /* 控制模块的代码:27
@POST@Path("/userOperations/")@Produces("application/json")publicStringuserOperations(Representationentity){System.out.println("用户操作");Formform=newForm(entity);System.out.println("form转换成功");Stringcontrolinfo=form.getFirstValue("controlinfo");System.out.println("controlinfo是:"+controlinfo);simpleResult=newSimpleResult();if(controlinfo!=null){controlModel=gson.fromJson(controlinfo,ControlModel.class);System.out.println("mac是:"+controlModel.getMac());simpleResult.setUserId(controlModel.getUserId());if(isClock(controlModel.getContent())){returngson.toJson(simpleResult);}else{Stringparam="controlinfo="+controlinfo;result=HttpPost.sendPost(MqUrl,param);//Mqtt发布消息//result=Client.update(url,form);//result=HttpPost.sendPost(MqUrl,param);//Mqtt发布消息SimpleResultsimpleResult2=newSimpleResult();simpleResult2=gson.fromJson(result,SimpleResult.class);if(simpleResult2.isResult()){simpleResult.setResult(true);simpleResult.setReason("控制成功");HttpPost.sendPost(DbUrl,param);System.out.println("用户操作存入数据库");}else{simpleResult.setResult(false);simpleResult.setReason("控制失败");}}}else{simpleResult.setResult(false);simpleResult.setReason("传入的实体是空的");}returngson.toJson(simpleResult);}27
MQTT发布的代码:@POST@Path("/release/")@Produces("application/json")//publicvoidpublish(Stringcontext,Stringtopic){publicStringpublish(Representationentity){System.out.println("mqttRelease");Formform=newForm(entity);System.out.println("form转换成功");StringcontrolInfo=form.getFirstValue("controlinfo");System.out.println("controlInfo是:"+controlInfo);Gsongson=newGson();ControlModelcontrolModel=gson.fromJson(controlInfo,ControlModel.class);Stringtopic=controlModel.getMac();System.out.println("topic是:"+topic);Stringcontext=controlModel.getContent();System.out.println("context是:"+context);release();connection.publish(topic,context.getBytes(),QoS.EXACTLY_ONCE,false);System.out.println("MQTTFutureServer.publishMessage"+"TopicTitle:"+topic+"context:"+context);SimpleResultsimpleResult=getResultSuccess();returngson.toJson(simpleResult);}MQTT订阅的代码:privatevoidhandleMessage(StringtempMessage,Stringtopic){String[]list=tempMessage.split("##");//将消息按照##进行拆分(与硬件约定好了的)Stringresult="";SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");//设定时间格式if(list[0].equals("DeviceStatus")){//如果前缀为"DeviceStatus".(与硬件约定好了的)System.out.println("DeviceStatus");result=Client.updateDevice(list[1]);//更新状态至数据库System.out.println("result1:"+result);if(result.equals("ok")){//更新数据库成功Stringmessage=sdf.format(newDate().getTime());connection.publish(topic,message.getBytes(),QoS.EXACTLY_ONCE,false);//将当前时间返回}27
}elseif(list[0].equals("DeviceOn")){//如果前缀为"DeviceOn".(与硬件约定好了的)System.out.println("DeviceOn");StringBuildertemp=newStringBuilder(list[1]);temp=temp.insert(0,"status,").insert(11,"1,");//System.out.println("temp:"+temp);result=Client.updateDevice(temp.toString());//跟新状态至数据库System.out.println("result2:"+result);list[1]=list[1].replace("mac","add");//拼凑字符串System.out.println("添加订阅:"+flushTopic(list[1]));}elseif(list[0].equals("DeviceOff")){//如果前缀为"DeviceOff".(与硬件约定好了的)System.out.println("DeviceOff");StringBuildertemp=newStringBuilder(list[1]);temp=temp.insert(0,"status,").insert(11,"0,");System.out.println("result3:"+Client.updateDevice(temp.toString()));list[1]=list[1].replace("mac","delete");System.out.println("移除订阅:"+flushTopic(list[1]));}System.out.println("list:"+Arrays.toString(list));}3系统界面展示说明:界面展示(例):27
27
3.1设备列表页面3.2设置界面27
3.3添加设备界面3.4详细设置界面27
3.5分享应用界面3.6手动添加设备界面27
3.7RGB灯控制界面3.8呼吸灯界面27
3.9舞台灯界面3.10闹钟灯界面27
4设计总结经过两个星期的努力研究,每一次突破,都给我们带来喜悦。最终获得成果,两个星期来的汗水没有白流,不仅收获得如何设计一款小游戏的经验,同时也收获到享受成功时的那份心情,从苦到甜。从本次课程设计中,我深深体会到自己实际动手能力方面的不足,经过这次考验,学会了运用很多以前学过的知识,去实现我们想要做的东西;我们也学会了执着与坚持,因为要想获得成功就得需要很强的毅力。回头想想,一项研究真的不是一朝一夕的事情,往往心急是做不出来的,要经过不断努力和试验才能实现。此次课程设计实验课使我了解到了设计一个小游戏的基本方法,虽然只是一次尝试,但为我以后的学习打下了基础。在游戏设计的过程中,我发现不是你有没有能力把它作好,而在于你有无信心把它作好。我对使用java设计小游戏这块领域相当的陌生,在开始做设计之前我几乎不知道第一步该干什么,但是我很有信心的投入到书本中去,困难只有靠双手才能够解决的,我深有体会;而在写代码的过程中,我体会到了学习编程的辛苦,为了一个算法的实现而思考,为了一个小小的编译错误而花时间去寻找,这需要很大的毅力和耐心,而且要有良好的思维,这才使得我完成这个任务,也使我感到一分喜悦,毕竟自己完成了一个有模有样的程序。于此,我也发现自己的一些不足,良好的编程习惯的养成,坚定的毅力和耐心仍是我要加强的,同别人的交流也是必须的,这样才能不断使我进步。27
终于可以自己设计程序了,以前感觉学的都用不到,现在才知以前学的用途真大,想学编程是少不了的。以前感觉,编程是多么的神秘,现在通过自己实践,才知道,编程也没那么神秘,但却很有乐趣的。那种看到自己亲手编的程序运行出结果的感觉是无法用言语表达的当然我的实际作品还存在很多不足,还要做很多改进,但是介于我的时间和知识储备都有限,所以未能一一解决。这次设计的作品还很不成熟,只是实现了基本的功能,对现实生活中的一些复杂情况还未考虑在内。比如“剪刀,石头,布”小游戏的界面还是很粗糙,猜数字灵敏性还不够,功能还不齐全。这就需要我们加深学习,争取在以后的学习中把这些问题解决掉,能够设计制作出符合现实生活要求的猜数字游戏因此我建议,以后多组织一些这方面的实验,有一个挑战自己的机会。4、主要参考资料[1]刘建歌,慕德俊,张慧翔,毛保磊.电能实时远程在线监控系统设计与实现.计算机技术与发展.2013.[2]姜妮,张宇,赵志军.基于MQTT物联网消息推送系统.网络新媒体技术.2014.[3]关余庆.基于MQTT协议的移动社交网络客户端的设计与实现.硕士毕业论文.2014.[4]朱亚兴,余爱民,王夷.基于Redis+MySQL+MongoDB存储架构应用.软件天地.2014.[5]程冬梅,王瑞聪等.基于REST架构风格的物联网服务平台研发.计算机工程与应用.2012.[6]付国强,张显金.适用于WoT架构的物联网协议分析.电信网技术.2014.[7]杨楠,李世国.物联网环境下的智能产品原型设计研究.包装工程.2014.[8]陈海明,崔莉,谢开斌.物联网体系结构与实现方法的比较研究.计算机学报.2013.[9]王光明.远程环境检测数据中心设计.硕士毕业论文.2013.[10]聂鹏.基于Nginx的云计算访问访问控制网关的设计与实现.硕士毕业论文.2011.[11]曾超宇,李金香.Redis在高速缓存系统中的应用.软件天地.2013.[12]白鑫.基于Redis的信息存储优化技术研究与应用.硕士毕业论文.2011.[13]陈伟玲.物联网通信服务平台保障系统的设计与实现.硕士毕业论文.201427
说明:附:答辩记录1.service里的publicListshowPhoto(Stringphoto_theme)方法作用?答:根据主题查找图片的相关信息2.TimeTools工具类作用?答:获取当前时间的,两种方法分别是获取两种格式的时间,一个是20160101222222,一个2016-01-0122:22:223.applicationContext.xm里作用?答:注入会话工厂,相当于new一个对象userBeanDao,然后将sessionFactory注入里面问:在并发连接的时候是怎么处理的?答:现在是采用把一个完整的服务器端的程序分成几个不同的不同的项目,使整个服务器端的程序可以放在不同的主机上运行,以浪费主机的方式达到快速响应的目的,后期会采用Nginx负载均衡的方式处理高并发的情况。问:在你的系统中是怎样对数据存储的?答:在本系统中采用了二级存储体系,传统的mysql数据库实现数据的实时存储,为了提高用户访问服务器的速度,把活跃用户的信息和设备信息存储在redis数据库中。问:一键配置是怎样实现的?答:本系统中的一键配置是用TI的源代码修改的,在TI源代码的基础上按照我们自己的方案设计的。问:rest架构是什么?答:在rest架构风格的概念中,任何被引用的实物都被视为资源。在本系统中rest与http协议结合在一起使用,提高了访问的效率。问:StringurlPost="http://10.0.3.2:8080/MyMSCPService/servlet/LoginRegisterServlet"作用?答:通过手机用post方法连接后台。27
问:如何连接后台数据库答:后台服务器通过httpservlet的doPost方法实现数据库连接。问:for(Map.Entryentry:params.entrySet()){stringBuilder.append(entry.getKey()).append("=");stringBuilder.append(URLEncoder.encode(entry.getValue(),"UTF-8"));stringBuilder.append("&");作用?答:将要发送的账户名和密码拼接到网址发送到后台servlet的dopost方法。27'