物联网应用课程设计实验报告--物联网在线数据智能分析系统.docx
物联网应用课程设计报告物联网在线数据智能分析系统一、系统需求说明书1 .引言1.1. 编写目的本需求说明书目的在于:将用户提供的需求描述系统化、精确化、全面化。从而实现:1 .便于用户、分析人员和设计人员进行理解和交流。2 .支持目标软件系统的确认。3 .控制系统进化过程。预期读者:软件设计者和测试者。1.2. 背景说明:a.待开发的软件系统的名称:物联网在线数据智能分析系统;b.本项目的任务提出者:物联网课程设计课题组;c.本项目的任务开发者:物联网IlOl班刘松;d.用户及实现该软件的计算中心或计算机网络:计算机科学与技术学院计算机中心;1.3. 定义用户输入:用户输入的用户名及密码用户名及口令与用户分类信息:存放在一个数据库表中,用以判断该用户是普通用户还是管理员用户;普通用户信息管理:是普通用户使用该系统的权限的表现,只能处理自己的信息和数据管理员用户信息管理:是管理员用户使用全局的表现普通用户基本信息:存放普通用户的id号,姓名,密码,用户信息,用户邮箱。管理员可以对学生状态进行修改,分为注册、注销等;数据信息:普通用户通过查询数据库的物联网在线数据信息,对数据进行分析,绘制图形,然后给出数据分析的结果。2 .任务概述2.1. 目标普通的用户登入系统后,可以对本用户的物联网在线数据进行管理和维护,分析,并得出分析结果。鉴于每位普通用户对于掌握的物联网在线数据是不同的,所以需要对应用户关联对应的数据表,普通用户有获取本用户对应数据表信息的权利,但是没有获取其他用户对应的数据表信息的权利。利用用户的id号和其对应的数据表关联起来,以保证每位普通用户对应的数据表的一致性。2.2. 假定和约束开发期限:2周项目功能:实现基本演示功能3 .需求规定3.1. 对功能的规定普通用户信息管理,包括注册,登录,更新等。a.引言普通用户信息管理,是对用户信息的基本管理的最基本的功能,当有用户需要查询和分析物联网在线数据时,需要对该用户进行注册,如果此用户已经不再管理数据,需要对此用户进行注销,更新。b.输入用户的姓名和密码c.处理过程描述检查用户的状态,如果用户还未注册且现在过来注册,则将用户状态置为注册;如果用户已经是系统中的用户一员,则验证用户名和密码,正确,让用户进入对应的物联网在线数据管理系统。d.输出操作成功或失败的提示信息1 .用户对物联网在线数据的管理和分析,从关联的数据中进行选择a.引言用户对应的物联网在线数据处理,是每个用户进入系统后,想要分析和处理数据并且得出结果的必要处理部分,用户的id号对应着用户所对应的处理数据。b.输入用户id号,对应的数据集c.处理过程描述用户在处理对应的数据集时,经过核心算法处理,调用相应的绘图组件,绘出用户需要的数据分析图形d.输出物联网在线数据的分析结果图对功能的需求可用如下的数据流图描述:一级数据流图:二级数据流图:显示处理:显示分为正常显示和出错显示:用户登入和注册模块用户输入输入处理口令无效显示口令无效口令有效用户判断管理员用户普通用户用户分类信息数据字典普通用户信息:存放用户的id,姓名,密码,邮箱,个人基本信息介绍。用户可以查询,管理员可以对学生状态进行修改。数据信息:数据的X值和数据的y值3. 2.对性能的规定4. 2.1.精度数值要求精确到整型个位即可,要求邮箱和密码完全正确,姓名可以进行部分匹配。5. 2.2.时间特性要求a.响应时间:小于0.5秒b.更新处理时间:小于2秒c.数据的转换和处理时间:小于5秒3. 2.3.灵活性a.操作方式的变化:鼠标,键盘,触摸屏,手机等都可以使用b.运行环境的变化:在多种平台上都可以使用c.精度和有效时限的变化:精度变化要对系统的影响到最小d.计划的变化或改进:较易改进4. 3.输入输出要求输入数据基本为:用户名、邮箱、用户密码;输出为用户界面,数据结构图和分析结果图5. 4.数据管理能力要求需要管理的记录个数为:大于1万,其中分为多个表3. 5.故障处理要求发生错误时,保证数据完整,对于数据库发生故障时要能够进行故障恢复,以保证数据的一致性同时也要定期进行数据备份。还要求此系统可以定期进行升级管理。4.运行环境规定4.1. 设备列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能,包括:a.处理器型号及内存容量:i3及以上,内存大于512M;b.外存容量、联机或脱机:10G,联机c.输入及输出设备的型号和数量,联机或脱机:联机或脱机均可;d.数据通信设备的型号和数量:服务器SeVee.功能键及其他专用硬件:快捷键4. 2.支持软件支持Windows/Linux/Mac,php/python等编译程序4. 3.接口用户接口为用户界面,通过系统提示用户可输入数据以得到自己所需要的服务;外部接口为鼠标、键盘、触摸屏等交互工具,另需配置一台中心服务器,本系统与其他系统通过调用相同的数据库中的数据而保持一致性;内部接口为用户的id号、数据id号的一致性。4. 4.控制本系统通过网络提供服务,用户通过浏览器访问服务器,向服务器发出服务请求。因此,需要使用TCP/IP网络协议,作为标准的通信控制接口。二、项目设计1 .总体设计1.1. 需求规定1 .用户登录和注册界面用户登录和注册界面,是用户进入物联网在线数据管理分析系统的入口,并且是对整个系统的设计风格的直观认识,。用户在本界面内可以自由转换注册和登录的两个功能,并且为了用户有一个良好的用户体验,注册和登录的切换效果比较流畅,整体页面采用响应式的布局。a.用户登录界面采用邮箱和密码或者用户名和密码的方式注册,保证唯一性b.用户注册界面注册信息包含:用户名,邮箱,密码,确认密码。此处需要判断密码是否一致,输入的用户名和邮箱数据库中是否已经注册,邮箱的格式是否正确。2 .首页显示用户操作在首页显示中,显示登入的用户和用户对应的数据操作。整个页面风格为简约风格,设计样式采用响应式布局。每个用户操作响应流畅,跳转和显示链接顺畅,有比较好的响应方式。a.折线图链接点击此链接,将显示用户要处理的数据以折现图的形式展现出来b.柱状图链接点击此链接,将显示用户要处理的数据以柱状图的形式展现出来c.环形图链接点击此链接,将显示用户要处理的数据以环形图的形式展现出来d.饼状图链接点击此链接,将显示用户要处理的数据以饼状图的形式展现出来e.等高线图链接点击此链接,将显示用户要处理的数据以等高线图的形式展现出来f.聚类分析图链接点击此链接,将显示用户要处理的数据先进行聚类分析算法检验,然后绘出聚类分析图3 .数据分析结果界面在数据分析结果界面中,使用简介大方的图形展示用户的处理数据,并且显示界面的布局方式也是采用响应式布局,是用户能够在不同平台下,可以阅览和处理数据。1.2. 基本设计概念和处理流程1 .系统模块(总控模块)该系统按照输入一一处理一一输出的流程进行工作用户登录在线数据处理系统返回数据结果图数据处理2 .在线数据处理系统3 .返回和显示处理数据处理结束后,需要将数据以图的方式直观显示出来获取数据处理数据图形显示 >1.3.结构主模块用户选择模块柱状图环形图折线图饼状图等高线图聚类分析图2 .程序1设计说明聚类分析模块2.1. 程序描述本程序是通过获取用户在数据库中的待分类的数据,然后通过聚类算法,将相关数据鬼好累放在一起,保存导数据库中,然后通过前端界面绘制出图形。2.2.功能2.3.性能用户可以通过id号来获取对应的数据时间特性要求:要求等待时间5秒2.4.输入项输入项名称:待分类数据类型:int或者IOng输入方式:数据库输入或者文件输入数据来源:用户提供的数据数量和频率:一次只能输入一类数据2.5.输出项输出项:分类数据数据类型:整型输出以数据库保存方式2.6.算法1.算法设计在此次算法设计中,采用k-近邻算法(KNN),基本思想是采用测量不同特征值之间的距离方法进行分类。a.基本原理存在一个样本数据集合(训练集),并且样本集中每个数据都存在标签(即每一数据与所属分类的关系已知)。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较(计算欧氏距离),然后提取样本集中特征最相似数据(最近邻)的分类标签。一般会取前k个最相似的数据,然后取k个最相似数据中出现次数最多的标签(分类)最后新数据的分类。b.算法伪码:对未知类别属性的数据集中的每个点依次执行以下操作:D计算己知类别数据集中的点与当前点之间的距离;2)按照距离递增次序排序;3)选取与当前点距离最小的k个点;4)确定前k个点所在类别的出现频率;5)返回前k个点出现频率最高的类别作为当前点的预测分类。c.欧式距离计算1)二维平面上两点xA(xl,yl)与xB(x2,y2)间的欧氏距离:a二(-2)2+(y-y2)22)两个n维向量xA(xll,xl2,Xln)与xB(x21,x22,x2n)间的欧氏距离:算法实现如F# -*-coding:utf-8-*-importmathimportnumpyasnpimportpylabasplimportrandomasrdimporturllib2importchardetimportMySQLdbimportsysreload(sys)sys.setdefaultencoding(>utf-81)# 计算平面两点的欧氏距离defdistance(a,b):return(a0-b0)*2+(al-bl)*2# K均值算法defkmeans(x,y,kcount):count=Ien(x)#点的个数#随机选择K个点k=rd.sample(range(count),kcount)k_point=xi,yiforiink#保证有序k_point.sort()whileTrue:km=foriinrange(k_count)#存储每个簇的索引#遍历所有点foriinrange(count):cp=xi,yi#当前点# 计算CP点到所有质心的距离_sse=distance(kpointj,cp)forjinrange(k_count)# CP点到那个质心最近minindex=_sse.index(min(_sse)# 把cp点并入第i簇kmminindex.append(i)#更换质心knew=foriinrange(k_count):_x=sum(xjforjinkmi)/len(kmi)_y=sum(yjforjinkmi)/len(kmi)knew,append(x,y)knew,sort()#排序if(knew!=kpoint):k_point=k_newelse:returnkm#计算SSEdefcalc_sse(x,y,kcount):count=Ien(x)k=rd.sample(range(count),kcount)k_point=xi,yiforiinkk_point.sort()ttcentroidsse=foriinrange(kcount)whileTrue:ka=foriinrange(k_count)sse=foriinrange(k_count)#遍历所有点foriinrange(count):cp=xi,yi# 计算CP点到所有质心的距离_sse=distance(kpointj,cp)# CP点到那个质心最近minindex=_sse.index(min(_sse)# 把cp点并入第i簇kaminindex.append(i)sseminindex.append(min(-sse)#更换质心knew=foriinrange(kcount):_x=sum(xjforjinkai)_y=sum(yjforjinkai)knew,append(_x,_y)knew,sort()#排序#更换质心if(knew!=kpoint):k_point=k_newelse:breaks=0foriinrange(kcount):s+=sum(ssei)returns#点的个数#随机选择K个点#保证有序#存储每个簇的索引#当前点for j in range(k_count)len(kai) len(kai)X,np.Ioadtxt(,F:/MyWeb/iot_informationwebK-mcans2.csv,delimiter=',',unpack=True)# COUnt_total=int(math,sqrt(len(x)# k_t=# foriinrange(1,counttotal+1):# s=calc_sse(x,y,i)# kt.append(s)kcount=3km=kmeans(x,y,kcount)3.将生成的数据保存到数据库的代码如下:#插入数据导数据库当中try:Conn=MySQLdb.Connect(host=z,localhostz,USer="Achelics”,PaSSWd="achelicsl23”,db="iOtinformation”,CharSCt="utf8",port=3306)cursor=conn.cursor()# 如果数据库表中有数据,先将数据库表中存在的数据删除Sqldell="deletefromdata_cluster,sql_del2="deletefromdata_cluster2/zsqlde13="deletefromdata_clustcr3”cursor,execute(sqldell)cursor,execute(sqldel2)cursor,execute(sqldel3)#向数据库表中插入数据foriinkmO:SqIl="insertintodataclusterl(datax,datay)values(%s,%s)z,%(xi,yi)templ=(xi,yi)cursor.execute(sqll)forjinkml:sql2=zzinsertintovalues(%s,%s)*%(xj,yj)#temp2=(xj,yj)cursor,execute(sql2)forkinkm2:datacluster2(datax,datay)sql3=zzinsertintovalues(%s,%s)*%(xk,yk)tttemp3=(xk,yk)cursor,execute(sql3)datacluster3(datax,datay)# 获取所有结果conn,commit()# 关闭指针cursor,close()# 关闭数据库连接conn,close()exceptMySQLdb.Error,e:print"MysqlError%d:%s"%(e.args0,e.argsl)2. 7.存储分配为了能够快速响应,元数据存储在.CSV文件名中,输出的数据保存到数据库当中。3. 8.注释设计说明准备在本程序中安排的注释,如:a.加在模块首部的注释:本程序的目的及意义;b.加在各分枝点处的注释:各分支的去向及判断条件的分类,如对用户名和密码进行判断可分支为用户名错误、密码错误,在进行用户名判断的分枝处加以注释:此处进行用户名正确性的判断,若用户名正确则进行密码判断,若错误则输出用户名错误的返回信息;c.对各变量的功能、范围、缺省条件等所加的注释:如对输入用户名变量的注释:字符串型的用户名变量是用以表示输入的用户名的信息,缺省时为*;4. 9.限制条件测试的数据目前只支持整型数据3.程序2设计说明前端图形展示界面3.1. 程序描述本程序是通过PhP显示前端界面,将用户处理好的数据从数据库中取出,然后绘出对应的图形,最后显示。3. 2.功能提供数据调用绘图程序MySql数据库得到图形3. 3.性能用户得到的图形都是响应式的,能够适应不同的平台时间特性要求:要求等待时间ls3. 4.输入项输入项名称:处理好的数据类型:整型输入方式:数据库方式数据来源:用户处理好的数据数量和频率:一次只能读取一类数据3. 5.输出项输出项:图形数据类型:图形类型输出以新的浏览器窗口输出5. 6.代码分析<?php/Content="text/PIain;CharSet=Utf-8”require_once('jpgraph/jpgraph.php,);require_once('jpgraph/jpgraphscatter.php,);1.连接到数据库require_once,db/mysqlconnect.php,;$sqll=zzselectdatax,data_yfromdata_clusterl"$sql2=/selectdatax,data_yfromdata_cluster2/,;$sql3=/zselectdata_x,data_yfromdata-cluster3z"$resultl=mysqlquery($sql1);$result2=mysql_query($sql2);$result3=mysql_query($sql3);$DATAl=array();$DATA2=array();$DATA3=array();$x_datal=array();$y_datal=array();$x_data2=array();$y_data2=array();$x_data3=array();$y_data3=array();while($rowl=mysql_fetch_assoc(Sresultl)将数据以索引方式储存在数组中($DATA1=$rowl;foreach($DATA1as$v)$x_datal=Sv,data->Sydatal=$v'datay>while($row2=mysql_fetch_assoc($result2)将数据以索引方式储存在数组中($DATA2=$row2;foreach($DATA2as$v)$x_data2=Sv,data,;$y_data2=Sv,data-y,;while($row3=mysql_fetch_assoc($result3)将数据以索引方式储存在数组中($DATA3=$row3;foreach($DATA3as$v)$x_data3=Sv,data-x,;$y_data3=Sv,datay>$graph=newGraph(600,600);Sgraph->SetScale(*linlinz,);$graph->img->SetMargin(60,60,60,60);Jgraph->SetShadow();$graph->title->Set(Clusterplot");$graph->ti11e->SetFont(FF_F0NT1,FS_B0LD);$spl=newScatterPlot($y_datal,$x_datal);$spl->mark->SetFi11Color(*red*);$sp2=newScatterPlot($y_data2,$x_data2);$sp2->mark->SetFi11Color("green");$sp3=newScatterPlot($y_data3,$x_data3);$sp3->mark->SetFiHColor(z,bluezz);$graph->Add($spl);$graph->Add($sp2);$graph->Add($sp3);$graph->Stroke();?>3.7.存储分配数据库中保存对应的数据3.8.注释设计说明准备在本程序中安排的注释,如:d.加在模块首部的注释:本程序的目的及意义;e.加在各分枝点处的注释:各分支的去向及判断条件的分类,如对用户名和密码进行判断可分支为用户名错误、密码错误,在进行用户名判断的分枝处加以注释:此处进行用户名正确性的判断,若用户名正确则进行密码判断,若错误则输出用户名错误的返回信息;f.对各变量的功能、范围、缺省条件等所加的注释:如对输入用户名变量的注释:字符串型的用户名变量是用以表示输入的用户名的信息,缺省时为*;3.9.限制条件测试的数据支持整型和浮点型数据三、任务分工由于本系统是本人一人完成的,所以不涉及分工。但是我自己有一个时间计划表,现将个人的项目进度给描述一下.2014年12月29日:选择题目,并选择开发工具,选择框架2014年12月30日:选定开发工具为PhP+python+mysql,安装和配置环境。配置WamP环境,配置Python环境。将配置环境中出现的问题给一一解决。2014年12月31日:将各个技术环节的难点给打通(因为php+pythond都是未接触过得语言),并且做好各方面的准备2015年1月1日一一2015年1月3日:放假三天,参与元旦三天不敲代码活动,项目没有继续。2015年1月4日:调试WCb前端界面,为系统的前端选型2015年1月5日:做好最基本的登录和注册功能,并且调通绘制简单图形的代码2015年1月6日:将登录和注册界面优化,将系统首页进行优化2015年1月7日:将数据从数据库中取出,并且绘制相应的图形,与此同时,用Python写好KNN分类算法2015年1月8日:系统大集成,将各个模块集成到整个系统当中,php调用mysql和启动python顺利完成2015年1月9日:最后的优化和检验系统四、项目实现L登录和注册功能1.1. 主要代码实现1、判断登录<?phpif(isset($_P0ST*submit*)&&$PoST"submit"="Login")($uSernaIne=$POST"username'$password=$POST"password"/1.连接到数据库requireonce'db/mysqlconnect.php,;$sql=/selectUSejnamc,user_psdfromiotuserwhereusername=*Susernamc,andUSCJPSd='$PaSSWOrcroruser_email=,Susernamc,andUSer_PSd='$PaSSWOrd'"$result=mysql_query($sql);$num=mysql_num_rows($result);if($num)$row=mysql_fetch_array(Sresult);将数据以索引方式储存在数组中)else(echo*<script>alert()用户名或密码不正确!');history,go(-1)j<script>z*;exit();)else(echo,/<script>alert(,提交未成功!');history,go(-1)j<script>z*;exit();)?>2、判断注册<?phpif(isset($PoST"Submit")&&$_PoST"Submit"="Sign")($username=$POST"usernamesignup'$omail=$POST"emailsignup'Spassword=$POST,passwordsignup*;Spswconfirm=$POST"passwordsignUPCOnfirm;if($password=Spswconfirm)(/1.连接到数据库require_once'db/mysql_connect.php,;$sql="selectusernamefromiotuserwhereuser_name=,Susername,"/SQL语句Sresult=mysqlqucry($sql);执行SQL语句$num=mysql_num_rows(Sresult);统计执行结果影响的行数if($num)如果已经存在该用户(echo*<script>alert(,Theusernamealreadyexists!1);history,go(-l);/script”;)else不存在当前注册用户名称(Ssqlinsert="insertintoiot_user(user_name,user_psd,useremail)values('$uSernaInc','$PaSSWorer,'$PSWcOnfirn')”;Sresinsert=mysqlquery($sql_insert);if($res_insert)(echo*<script>alert(,Thesuccessoftheregistration!,);history,go(-l);</script>")else(echo*<script>alert(,Thesystemisbusy,pleasewait!,);history,go(-l);</script>*;)else(echo*<script>alert(,Passwordsdonotmatch!,);history,go(-1)j<script>*;)else(echo*<script>alert(,Submitwithoutsuccess!*);history,go(-1)"/script)”;)?>1.2. 功能实现截图1、登录界面Please"Login-tomanagethedatachart!LOGINLOGINNotamemberyet?Joinus2、注册界面Please“Login"tomanagethedatachart!SlGNUPYourusername±mysuperusBmame690YouremailSmysuperm器©maiLcomYourpasswordIZeg.×8df90EOPleaseconfirmyourpassword,eg.X8df!90EOSIGN2.首页展示功能2.1. 首页代码实现<!DOCTYPE><html><head><metahttp-equiv=zzContent-Typoz,Content="text/html;CharSet=Utf-8”><linkrel="stylesheet“type="textcss"href=zzcssdefault.csszz><title>AchelicsIWaiting<title><!必要样式一<linkrel=*stylesheetzztypc="textcss"href="css/COmPonCnt.css”/><scriptsrc=*js/modernizr.custom,js*><script><basetarget=/_blank*><head><body><?phpif(isset($POST"submit")&&$_POST"submit"="Login")($uSernaIne=$POST"username'Spassword=$POST"password"/1.连接到数据库require_once'db/mysql_connect.php,;$SqI="selectusername,user_psdfromiotuserwhereUSernamC='$uSernaIne'andUSCJPSd='$PaSSWorcrorUSCrclnail='$username'andUSer_PSd='Spassword,”;$rCSUlt=mysqIqUery($Sql);$nUm=InySqInUmrOWS($rCSUIt);if($num)$row=mysql_fetch_array($result);将数据以索引方式储存在数组中)else(echozz<script>alert(,用户名或密码不正确!');history,go(-1);</script>*;exit();)else(echo”<script>alert('提交未成功!');history,go(l);<script>*;exit();)?><divCIaSS="container”)<headerClaSS="clearfix”><hl欢迎来到数据分析模块<hl><header><divClaSS="main”><p>点击用户下面的生成图标的链接,则可以生成对应的图形<p><divCIaSS="side”><navClaSS="dr-menu”><divclass=z,dr-trIggeryyXspanCIaSS="dr-icondr-icon-menuz>><span><aClaSS="drTabcl'>帐户<a><div><ul><li><aCIaSS="dr-icondr-icon-user*hrcf="#"><?PhPecho$row07><a><li><li><ahref="charts/Iine.html”>折线图<aXli><li><ahref=z,chartsbar.html”>柱状图<a><li><li><ahref="chartsdoughnut.html”>环形图<a><li><li><ahref="chartspie.html”>饼状图<a><li><li><ahref="charts/PoIar-area,html”>等高线图<aXli><li><ahref=z,runcluster.PhP”>聚类分析图<aXli><ul><nav><div><div><div><!/container><scriptsrc=*js/ytmenu.js*><script><body><html>2 .2.系统首页展示个点评、猜你喜欢十医生总加速器据下载卬 ® O <)二,oo%欢迎来到数据分析模块帐户点击用户下面的生成图标的链接,则可以生成对应AAchelics"=的图形折线图柱状图环形图饼状图等高线图聚类分析图3 .数据结果分析界面3.1. 主要代码实现模块由于这些模块的数据都是些测试数据,所以展现的方式暂时将这些数据保存到数据库中,测试数据直接从页面获取。大部分绘图模块的方式大同小异,所以只展示部分。1、绘制直线图的代码<!doctypehtml><html><head><metaCharSet="UTF-8”/><!<metahttp-cquiv="X-UA-COmPatible"content=z,IE=edge,chrome=lz,>><title>LineIWaiting<title><metanam。="viewport'content=zzwidth=device-width,initialscale=1.0”><metaname=,descriptio11,zContent="LoginandRegistrationFormwithHTML5andCSS3*><metaname="kCyWords'content=zzhtml5,css3,form,switch,animation,:target,pseudo-class*><metanamc="author"Content="Codrops"><linkrel=*shortcuticon"href=*./favicon,ico*><linkrel="styleshect“type="textcss"href=zzcssdemo.css*><scriptsrc=*jsChart.js*><script><head><bodyalign=z,centerzz><header><navclass=/codrops-demos*><span>曲形图形数据展示span><nav><header><divstyle=*width:50%*><div><canvasid="canvas"hcight="450"Width="600"><canvas><div><div><script>varrandomScalingFactor=function()returnMath,round(Math,random()*100);varIineChartData=labels:LJanuary,February,March,April,May,June,JulyJ,datasets:(label:"MyFirstdataset”,fillColor:"rgba(220,220,220,0.2)StrokeColor:*rgba(220,220,220,1)PointColor:"rgba(220,220,220,D,PointStrokeColor:PointHighlightFill:PointHig