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






