温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
基于NFC的智能家居环境监测系统设计和实现
计算机专业
基于
NFC
智能家居
环境监测
系统
设计
实现
4.5.3 概念设计分析
概念设计主要是讲需求分析得到的结果抽象为信息结构的概念模型,根据设计需求把系统分为若干对象和对应的关系,再将所有实体和实体的属性模块化,进而组成一个整体,通过概念设计分析,数据库的模型清晰明了,对后期维护和修改有很大帮助。
根据设计需求,传感器数据库系统的E-R图如下所示:
图4.12 传感器数据库E-R图
Fig 4.12 E-R diagram of sensor database
E-R图中各个实体的对应结构为:
主板标签:MainBoard(mno,mname,mcompany);
传感器:Sensor(sensor_id,sensor_name,sensor_range);
测量结果:Record(mno,sensor_id,record).
4.5.4 逻辑设计阶段
在概念设计完成后需要进行逻辑设计,即完成概念内容到符合数据库管理系统的逻辑结构,数据组织和数据处理是这一阶段的两个要点,通过这一阶段可以理清实体与实体、实体与属性之间的关系,这对建立关系型数据库来说是不可或缺的条件。
上述E-R图中描述的关系模型种实体与属性的关系为:
主板标签:属性有(标签编号, 标签名称, 生产厂家);
传感器:属性有(传感器编号, 传感器名称, 传感器量程);
测量结果:属性有(标签编号, 传感器编号, 测量数值).
这三个实体之间的联系如下:
一个主板标签有且仅有一个唯一编号,一个主板可配备多个传感器,一种传感器可供多个主板使用,因此,主板与传感器之间具有多对多的关系;
一个主板标签可以有多个传感器的测量结果,一种传感器的测量结果可以是多个主板标签,因此主板标签和传感器测量结果是多对多的关系;
一个传感器对应一个测量结果,一个测量结果对应一个传感器,因此传感器与传感器测量结果具有一对一的联系。
4.5.5 物理设计阶段
物理设计阶段是将逻辑数据模型应用为物理结构的过程,要保证数据库在存储数据时有较好的存储结构和存取方法,同时还有注重存取时的时间效率和空间效率。在查询表格时,为数据表建立索引可提高查询速率,本系统中存在较多的查询操作和较少的插入操作,非常适合在数据表中建立索引以提高查询效率,本数据库中建立索引如下:
1、 主板标签表的主键mno和传感器表的主键sensor_id存在且唯一,查询主板数据和传感器数据时中经常以此为查询条件,故分别在该属性上建立唯一性索引;
2、 测量结果表中的属性mno和sensor_id分别是主板标签表和传感器表中的外键,也是此表中的联合主键,查询时这两个属性通常成对出现,故在这两个属性上建立复合索引;
4.5.6 建立数据表
使用SQL语句建立设计出的数据表,主要代码如下:
(1)主板标签信息表:
CREATE TABLE mainboard (
mno CHAR(10) NOT NULL AUTO INCREMENT,
mname CHAR (20) NULL,
mcompany CHAR (10) NULL,
PRIMARY KEY (mno)
)
(2)传感器信息表:
CREATE TABLE sensor (
sensor_id CHAR(10) NOT NULL AUTO INCREMENT,
sensor_name CHAR (20) NULL,
sensor_range CHAR (10) NULL,
PRIMARY KEY (sensor_id)
)
(3)测量结果信息表:
CREATE TABLE record (
record_id INT(10) NOT NULL AUTO INCREMENT,
mno CHAR(10) NOT NULL,
sensor_id CHAR (10) NOT NULL,
record CHAR (10) NULL,
PRIMARY KEY (mno,sensor_id),
FOREIGN KEY (mno) references mainboard (mno),
FOREIGN KEY (sensor_id) references sensor (sensor_id),
)
4.6 服务器程序设计
4.6.1 服务器socket通信程序设计
Socket通信和生活中拨打电话的场景类似,打电话之前需要拨通电话号码,对方听到电话铃声后拿起电话,此时通话连接就建立起来,等到电话结束,挂断电话连接也随之结束。Socket通信过程需要在创建前配置好IP地址和监听端口号,本机测试时使用的IP地址为192.168.1.106,端口号为8087,这里需要注意端口号尽量选择空闲端口以免与其它软件发生冲突导致接收不到数据。配置好IP地址和端口号之后,调用socket()函数创建一个socket进程,然后将IP地址和端口号绑定到这个socket会话进程上,对目标端口号进行监听listen(),accept()方法会进行阻塞知道接收一个socket连接,此时就可以调用read()函数读取接收到的数据。最后关闭连接,完成一次socket通信的会话过程,其程序设计流程图如下图所示:
图4.13 Socket通信程序流程图
Fig 4.13 Program flow diagram of socket communication
程序中socket通信的前面配置部分是固定模式语句,只要按照操作步骤调取相应方法即可,因此本文不做具体介绍。建立起Socket通讯后便可通过read()方法获取到上传来的数据,程序需要对其进行解析以还原本身的传感器数据,这才是本程序的重点。因为在主办发送数据环节将数据打包时按照高位在前,低位在后的顺序排列,并且小数向前进一位相当于扩大十倍,所以解析时高位*256+低位,带小数位除10还原原始数据,最后关闭socket通信,具体的数据解析代码如下:
//配置本机IP地址和端口号
$ip = '192.168.1.106';
$port = 8087;
//发送到客户端
$buf = socket_read($msgsock,100);
$talkback = "$buf";
$data=str_split(bin2hex($talkback));
$str=sizeof($data);
for($i=0;$i<$str/2;$i++){
$data1[$i]=hexdec($data[$i*2].$data[$i*2+1]);
}
$data2[0]=$data1[2]*256+$data1[3]; $data2[1]=($data1[6]*256+$data1[7])+($data1[8]*256+$data1[9])/10; $data2[2]=($data1[11]*256+$data1[12])+($data1[13]*256+$data1[14])/10;
$data2[3]=$data1[15]/10;
$data2[4]=$data1[16];
print_r($data2);
socket_close($msgsock);
4.6.2 增删改查程序设计
数据库建立后,由服务器程序来完成对数据库各表的增删改查操作,这部分的软件开发工作是基于php语言,thinkPHP框架编写。在使用时,首先配置好框架需要的数据库基本信息配置,包括数据库类型,数据库名称密码等,配置好使用参数后,即可测试使用,具体配置文件config.php内容如下:
<?php
return array(
//'配置项'=>'配置值'
//mysql全局定义
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'bui', // 数据库名
'DB_USER' => 'multisensor', // 用户名
'DB_PWD' => '123456', // 密码
'DB_PORT' => '3306', // 端口
'DB_PREFIX' => '', // 数据库表前缀
// 'SHOW_PAGE_TRACE' => true,
);
增删改查的服务器程序设计如下图所示:
图4.14 服务器程序流程图
Fig 4.14 Program flow diagram of server module
1、新增数据表信息
初始建立数据库系统时,要录入主板标签、传感器等表格的名称、编号等基本信息。程序首先获取用户输入的数据,然后组成目标数组,使得数据表字段与数据内容一一对应,再调用thinkPHP框架中add()或addAll()方法即可完成对数据库中各数据表的增加信息操作,也可以使用SQL语句在数据库端直接添加数据,具体的SQL语句举例:
在sensor表中新增一条传感器数据的值为(‘温度传感器’,’100’):
INSERT INTO sensor VALUES(‘温度传感器’,’100’)
PHP程序添加传感器数据add_sensor_data()程序如下:
if (IS_POST) {
$data = array(
'sensor_id' => $_POST['sensor_id'],
'sensor_name' => $_POST['sensor_name'],
'sensor_range' => $_POST[sensor_range'],
);
$user = M('sensor');
$flag = $user->add($data);
if(!$flag){
$this->ajaxReturn(0);
$this->error("新建传感器信息失败!");
}else{
$this->ajaxReturn(1);
echo "新建传感器信息成功,ID = $flag";
}
}
2、删除数据表信息
当数据表中的数据不再需要时,要对垃圾信息进行删除操作,保留仍具有价值的数据,清除不必要占用空间的数据,这里调用thinkPHP框架中where()->delete()方法即可完成对数据表中信息的删除操作,也可以使用SQL语句在数据库端直接更新数据,具体的SQL语句举例:
在sensor表中删除传感器id为1的数据:
DELETE FROM sensor WHERE sensor_id = ‘1’;
PHP程序删除传感器数据delete_sensor_data()程序如下:
if (IS_POST) {
$ids=$_POST['ids'];
$user = M('sensor');
// 按获取的传感器id删除整条传感器数据记录
$flag = $user->where("sensor_id=$ids")->dele