Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97339
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 194
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-26 22:04
个人简介

大家好,我叫王大锤!

文章分类

全部博文(21)

分类: LINUX

2015-07-13 09:36:49


互联网带给我们了极大的便利和生产力,改变了我们的生活习惯。方案根据生活中的实际需求(智能家居),采用了B/SC/S两种模式,方便了人们的使用。其中包括智能终端、服务器和客户端三大模块,实现了无论何时何地都可以查看家中的温度湿度和空气情况、报警、控制灯光。运用到了GUN CLinux CJavaC#PHPMYSQL等语言,ARM开发、Linux设备驱动程序设计、Linux内核裁剪和移植、Linux网络编程和系统编程、Android中间件开发、网站制作、Androidwindows应用开发等技术。

本设计以实用性和易用性为前提,运用了物联网的技术,设计并实现了一个智能家居的系统。

关键词:嵌入式,物联网,智能家居


ABSTRACT

The Internet has brought us great convenience and productivity, changing our living habits. According to the actual needs of life (smart home), the use of B/S and C/S two models, more consistent with people's habits. Including intelligent terminal, server and client three modules, the realization of the temperature and humidity whenever and wherever you can see the home and air, alarm, control lights. Use of the GNU C, Linux C, Java, C#, PHP and MySQL language, the development of arm and Linux device drive program design, Linux kernel cutting and transplantation, Linux network programming, and system programming, Android middleware development, website production, Android and windows application development technology.

The design is based on the practicality and ease of use, the use of the technology, design and implementation of a smart home system.

Key words: Embedded System, Internet of things, Smart home


目 录

 TOC \o "1-3" \h \z \u 1       . PAGEREF _Toc420951380 \h 1

1.1     项目背景. PAGEREF _Toc420951381 \h 1

1.2     开发目的. PAGEREF _Toc420951382 \h 1

1.3     开发环境简介. PAGEREF _Toc420951383 \h 1

1.3.1       Linux开发环境. PAGEREF _Toc420951384 \h 1

1.3.2       Windows开发环境. PAGEREF _Toc420951385 \h 2

2   可行性分析. PAGEREF _Toc420951386 \h 3

2.1   技术可行性. PAGEREF _Toc420951387 \h 3

2.1.1   ARM架构. PAGEREF _Toc420951388 \h 3

2.1.2   嵌入式系统. PAGEREF _Toc420951389 \h 3

2.1.3   Linux内核. PAGEREF _Toc420951390 \h 4

2.1.4   Android操作系统. PAGEREF _Toc420951391 \h 4

2.1.5   C语言. PAGEREF _Toc420951392 \h 5

2.1.6   Java PAGEREF _Toc420951393 \h 5

2.1.7   JNI PAGEREF _Toc420951394 \h 6

2.1.8   Html5 PAGEREF _Toc420951395 \h 6

2.1.9   JavaScript PAGEREF _Toc420951396 \h 6

2.1.10  jQuery PAGEREF _Toc420951397 \h 7

2.1.11  Ajax PAGEREF _Toc420951398 \h 7

2.1.12  PHP PAGEREF _Toc420951399 \h 7

2.2   经济可行性. PAGEREF _Toc420951400 \h 8

2.3   操作可行性. PAGEREF _Toc420951401 \h 8

3       需求分析. PAGEREF _Toc420951402 \h 9

3.1   功能需求. PAGEREF _Toc420951403 \h 9

3.1.1   系统目标. PAGEREF _Toc420951404 \h 9

3.1.2   功能分析. PAGEREF _Toc420951405 \h 9

3.1.3   系统层次模块图. PAGEREF _Toc420951406 \h 9

3.2   系统性能要求. PAGEREF _Toc420951407 \h 10

3.3   运行环境. PAGEREF _Toc420951408 \h 10

3.4   数据流图. PAGEREF _Toc420951409 \h 11

4       总体设计. PAGEREF _Toc420951410 \h 12

4.1   系统代码架构. PAGEREF _Toc420951411 \h 12

4.2   设计模式. PAGEREF _Toc420951412 \h 12

4.2.1   客户端-服务器模型. PAGEREF _Toc420951413 \h 12

4.2.2   浏览器-服务器模型. PAGEREF _Toc420951414 \h 12

4.3   系统结构设计. PAGEREF _Toc420951415 \h 13

4.4   数据库结构设计. PAGEREF _Toc420951416 \h 14

5       详细设计与实现. PAGEREF _Toc420951417 \h 17

5.1   设备驱动的设计与实现. PAGEREF _Toc420951418 \h 17

5.1.1   温湿度传感器驱动的设计与实现. PAGEREF _Toc420951419 \h 17

5.1.2   步进电机驱动的设计与实现. PAGEREF _Toc420951420 \h 18

5.1.3   继电器驱动的设计与实现. PAGEREF _Toc420951421 \h 18

5.1.4   人体感应模块驱动. PAGEREF _Toc420951422 \h 18

5.2   设备与服务器通信协议的设计. PAGEREF _Toc420951423 \h 19

5.3   设备端程序的设计与实现. PAGEREF _Toc420951424 \h 19

5.3.1   设备服务进程. PAGEREF _Toc420951425 \h 19

5.3.2   安卓中间件. PAGEREF _Toc420951426 \h 20

5.4   服务器端设备服务程序的设计与实现. PAGEREF _Toc420951427 \h 22

5.5   服务器web服务的设计与实现. PAGEREF _Toc420951428 \h 22

6       系统测试以及软件安装. PAGEREF _Toc420951429 \h 26

6.1   软件测试基础理论. PAGEREF _Toc420951430 \h 26

6.1.1   软件测试定义. PAGEREF _Toc420951431 \h 26

6.1.2   软件测试基本概念. PAGEREF _Toc420951432 \h 26

6.2   软件测试目的. PAGEREF _Toc420951433 \h 27

6.3   软件测试方法分类. PAGEREF _Toc420951434 \h 27

6.4   系统测试. PAGEREF _Toc420951435 \h 27

6.4.1   测试用例设计要求. PAGEREF _Toc420951436 \h 27

6.4.2   系统各个模块测试用例. PAGEREF _Toc420951437 \h 27

6.5   测试报告. PAGEREF _Toc420951438 \h 29

6.6   软件安装. PAGEREF _Toc420951439 \h 29

6.6.1   服务器环境搭建. PAGEREF _Toc420951440 \h 29

6.6.2   运行. PAGEREF _Toc420951441 \h 30

参考文献. PAGEREF _Toc420951442 \h 31

致  . PAGEREF _Toc420951443 \h 32

 

 

 TOC \o "1-3" \h \z \u


1        

1.1       项目背景

随着科技发展,人们越来越依赖互联网,网上购物、网上订餐、网上办公等等,希望任何事都可以通过联网来完成。人们的生活习惯不断的被科技改变,许许多多新鲜有趣的科技产品层出不穷。物联网针对巨大的用户群,可以一个服务器对应大量的客户机进行统一的信息采集和控制管理,信息和数据可以存储到数据库里。对于用户而言,管理起来则更为方便,通过查看手机或电脑客户端,就可以快速访问并且控制家中的智能家居设备,为用户提供人性化服务;使得家里与在外面保持信息共享,改变人们的生活方式,可以帮人们有效的处理一些事情,让家居生活更安全,甚至可以节省生活开支。这种智能家居方式更为便利和智能。物联网在近两年得到了迅速发展,更多的目光投到了智能家居,需求也是日益增加。人们更加注重家居生活的的便捷、安全、舒适。

目前也存在一些不可避免的问题:缺乏规范、统一的基准;话费成本不低;功能不实用;缺乏投资者的资金支持;缺乏单位和运营商的合作;用户的个人隐私等问题。所以说物联网的发展任重而道远。

1.2       开发目的

智能家居的出现,已经让我们的生活习惯产生了变化。通过布置智能家居产品,可以把家里的所有电器以及其他设备都连接到互联网中,我们在家里或者任何地方都可以通过手机电脑等终端对家居生活环境进行管理和查看。这种以前电影里才有的应用,其实并不昂贵。

通过智能家居,人们可以更方便的来随时了解家中的情况,并能发出一些命令来控制,让一切尽在掌握之中。

本系统通过web或客户端来远程控制设备,包括信息采集和远程控制,目的是为经过系统分析和设计后提出了一个低成本的解决方案,可以为大家提供成本比较低而且功能强大的智能家居方案。

1.3       开发环境简介

1.3.1  Linux开发环境

操作系统:Red Hat Enterprises Linux

编辑器和代码浏览工具:emacs + etags  

版本管理:Git

编译器:gcc + arm-linux-gcc + eclipse + ndk

其他: Linux内核源码 + 安卓源码

1.3.2  Windows开发环境

       Visual Studio 2015

 

2         可行性分析

2.1       技术可行性

2.1.1  ARM架构

ARM架构是由英国ARM公司开发的精简指令集的计算机处理器(RISC)架构。使用精简指令集降低了成本,减少了发热和更加省电的使用。这样是针对性能要求不高,便携式,电池供电的设备,包括智能电话,笔记本电脑,平板和笔记本计算机和其他嵌入式系统。简单的设计便于更高的频率和更高的核心数,以较低的成本提供更高效的处理器。

ARM公司设计ARM的指令集和体系结构,但不生产芯片;该公司定期发布更新它的核心;ARM目前支持32位地址空间和32位运算;ARM芯片具有32位固定长度指令,但以后的版本的结构也支持,提供包括32位和16位的改进的代码密度宽指令的可变长度指令集;一些核心还可以提供的硬件执行的Java字节代码。

ARM公司把芯片设计和ARM指令集架构授权给第三方,由第三方厂商来设计实现适合自己的产品。 目前广泛使用的ARMCortex核心和过去的经典ARM核心。很多公司实现了ARM架构的芯片,包括苹果,高通,三星,Broadcom,德州仪器,飞思卡尔和意法半导体等。

ARM是最流行的精简指令集体系结构。 ARM处理器因为功耗低,所以使它们流行了起来: 截止到2014年,已经生产出了500亿ARM处理器。ARM架构(32位)是最广泛使用的移动设备体系结构,也是最流行的32位的嵌入式系统。在2005年,约98%的移动电话的售出使用的ARM处理器。ARM公司表示,仅在2010年,基于ARM架构的芯片61亿出货量的基于ARM的处理器,占95%的智能手机,35%的数字电视和机顶盒和10%的移动电脑[1]

2.1.2  嵌入式系统

嵌入式系统通常是具有较大的机械或电气系统内的一个专门的功能,很多时候是具有实时性约束的计算机系统。它通常被嵌入作为硬件和机械中的一部分。嵌入式系统在今天普遍使用在许多的设备。

PC机相比,嵌入式计算机系统通常都具有便携,低功率,低成本,长时间使用等特性。例如,智能技术可以用来管理嵌入式系统的功率消耗。

嵌入式设备很多时候使用微控制器,但使用微处理器的情况也很常见,尤其在一些比较复杂的体系中。多处理器可以从类型划分,从一般用途到专门的在某些功能的计算,甚至定制设计为自定义的应用。一个常见的标准类专用处理器就是数字信号处理器(DSP)。

因为嵌入式系统用于特定的功能和用途,工程师们可把产品的大小减小以降低成本,而且可以改善性能和提高稳定性。嵌入式系统多用于体积比较小的电子设备,比如电子表、手机等,还有一些对稳定性要求高的设备,比如交通信号灯,工控设备等,另外在一些复杂系统中,也有嵌入式的身影,比如航天电子仪器等[2]

2.1.3  Linux内核

Linux内核是一个类Unix的操作系统的内核。Linux内核是一种全世界广泛使用的操作系统内核; Linux操作系统是基于它部署在传统的计算机系统上的系统,通常的形式是Linux发行版。嵌入式设备如路由器。安卓平板电脑和智能手机也是基于Linux内核。

Linux内核最初的构想,是在1991年由Linus Torvalds创建的,当时他还是芬兰计算机专业的一个学生,目的是工作在他的个人电脑,起初并没有跨平台的意图,但现在已经扩展到支持一个巨大的计算机体系结构;Linux迅速从其他自由软件与项目吸引了开发者和用户;Linux内核已经从1200多家公司得到支持,其中包括一些最大的软件和硬件供应商的近12000程序员[3]

2.1.4  Android操作系统

Android是专为便携设备设计的操作系统,它使用了Linux内核。它现在主要用于触摸屏设备如手机和平板等,与电视专门的用户界面(Android电视),汽车内的电子系统,和安卓手表等。此外,它也被用在掌机,相机,PC,和其它非触屏电子产品。截至2015年,Android是拥有最大用户群的通用的操作系统。截至20137月,已经有超过一百万的Android应用公布,以及超过500亿应用下载。20135月调查移动应用开发者发现,他们中的71%开发Android应用; 2015年的另一调查发现,开发人员中40%把Android优先作为目标平台,超过iOS37%)或其他平台[4]

Android是一个热门的,完善的,低成本的,可裁剪的系统。Android的开放性,鼓励开发者和爱好者参与到安卓开发中来。

2.1.5  C语言

C语言是跨平台的,命令式的编程语言。它支持结构化编程,广泛使用在包括操作系统,以及各种应用软件,从巨型计算机到嵌入式系统。

C的最初由丹尼斯·里奇在1969年和1973年之间的AT&T贝尔实验室设计,用于编写Unix操作系统。它已经成为最广泛使用的程序的所有时间的语言之一,C可用于大多数现有的各种计算机体系结构和操作系统。

后来的许多语言都直接或间接地从C中借鉴,包括C++C#,Objective-CJavaJavaScriptPHPPythonUnixC shell。这些语言从中借鉴了它的控制结构和基本功能,通常语法相似于C,有时包括相同的简单的控制结构。C也可以作为其他语言的中间语言,和建立标准库和运行时系统的高级语言,如C-Python[5]

2.1.6  Java

Java的是一个通用的计算机编程语言,是面向对象的,并发的,跨平台的编程语言。它的目的是让编程人员进行一次编译,在各种系统都可以运行,也就是说,编译 Java代码可以在所有支持Java无需重新编译的平台上运行。Java编写的程序一般会被编译成字节码,可以运行在有java虚拟机的操作系统中。截至2015年,Java依然是最热门的计算机编程语言,特别尤其是对于B/S结构的系统。Java语言从?C ++中派生其大部分的语法。

Java的一个设计目标是便携性,通过编译Java语言代码的中间语言表示称为实现Java字节码,而不是直接对特定体系结构的机器代码。Java字节码和机器码很像,但它们的目的是由一个被执行的虚拟机专门为主机硬件写入(VM[6]

使用字节码的一个主要优点是可移植。但是,解释性语言比编译性语言要慢得多。

2.1.7  JNI

Java本地接口(JNI)是一种编程框架,Java运行代码的Java虚拟机(JVM)来调用本地程序(具体到硬件和程序的操作系统平台)和其他语言,如CC++和汇编。

用途及特点

JNI允许有些情况Java语言做不到的事情,可以调用C语言来完成。另一种编程语言是可访问的Java应用程序。

JNI允许一个本地方法调用Java对象,在Java代码中也可以以相同的方式使用这些对象。本地方法可创建Java的对象,然后检测,然后用创建的对象来完成它的功能。本地方法也可检测和调用Java代码所创建的对象。

JNI可以用于与其他语言编写,例如CC ++代码接口。它也可用于时间密集型计算或操作,比如解决复杂的数学公式,因为对于某几类问题的本地代码运行可能比Java虚拟机代码的速度更快[7]

2.1.8  Html5

RIA(Rich Internet Application)的基石是:html5标记+css样式+JavaScript脚本。

HTML5提供了大量的新特性。这些新特性可以很简单地包含和对多媒体进行处理,不再需要安装特定的插件和使用一些接口。还有一些页面结构新元素来丰富内容文档[8]

2.1.9  JavaScript

JavaScript,也被称为的ECMAScript,是一个动态编程语言。这是最常用的实现允许客户端或浏览器脚本来和使用者进行交互,控制浏览器,进行异步通信,然后让浏览器动态显示。

JavaScript是一个面向对象的解释性语言。虽然在命名上,JavaScriptJava的句法和标准库相似,但是它们是没有联系的,拥有不同的意思。JavaScript的语法实际上是从C衍生,而语义和设计是面向对象的编程语言。

JavaScript还用于在没有基于网络的环境中,如PDF格式的文件,特定站点的浏览器,还有桌面小窗口。在客户端,JavaScript历来实现为解释语言,但最近的浏览器开始进行即时编译[9]

2.1.10     jQuery

jQuery是跨平台的Java Script库,主要用来处理HTML脚本。它在今天是在使用中的最流行的JavaScript库。jQuery是免费的,拥有免费许可。

由于jQuery语法的设计,使它更方便的处理元素,先查找DOM的元素,再创建画面,然后处理功能,并编写Ajax部分。该套jQuery核心功能元素的选择,遍历和操纵启用其选择器引擎,创造了一个新的“编程风格”,融合算法和DOM数据结构[10]

2.1.11     Ajax

Ajax是一组互相联系的网站开发上所使用的技术。通过Ajax,网页程序可以在后台请求服务器处理功能,并把信息显示出来,而不需要跳转页面。

Ajax不是单一的技术,是一组技术。HTMLCSS可以组合使用,以标记和样式信息。该DOM访问使用JavaScript动态显示,并允许用户进行交互来提供的信息。JavaScriptXMLHttpRequest对象提供了浏览器与服务器之间的异步数据交换,以避免完整的页面重载的方法[11]

2.1.12     PHP

PHP是一种服务器端脚本语言,旨在用于Web开发,也用作通用编程语言。截至20131月,PHP安装在超过2.4亿网站和210万的Web服务器。

PHP代码可以与简单的HTML代码混合,或它可以用在与各种组合使用模板引擎和web框架。PHP代码通常是由一个PHP处理解释器执行,其通常被实现为一个网络服务器的本机模块或公共网关接口(CGI)的可执行文件。

规范的PHP解释器,搭载了Zend引擎,拥有自由软件PHP发布许可。PHP已经被广泛移植,几乎可以部署在大多数Web服务器的操作系统和平台,并且是免费的。

尽管其受欢迎程度,但是没有书面规范或标准来规范PHP语言,直到2014年,经典的PHP解释器一直作为一个事实上的标准。2014年以来,有关于创建PHP规范的工作正在进行[12]

2.2       经济可行性

智能家居是一个新兴的行业,利用现有的物联网技术,可以实现类似电影中的科技产品,其实这些技术并不昂贵,而且确实能给人们带来巨大的便利。所以,现有的非智能设备会被智能设备慢慢的取代。

与此同时本系统还有开发时间短和高效等特点。所以本系统的研发所花费的成本比较少,该项目在经济上是可行的。

2.3       操作可行性

通过分析,本系统开发在技术上具有相当的可行性。本系统作为一个轻量级的解决方案,无论是智能终端、服务器端,还是客户端,目前的设备都可以轻松运行。Linux内核作为一个开源的项目,给我们带来了极大的便利和生产力,我们可以通过编写内核驱动模块来驱动周边设备,让各种设备接入互联网。

本系统操作方式方便,容易上手。因此还具有良好的易用性。

3         需求分析

3.1       功能需求

3.1.1  系统目标

本系统主要实现了智能设备端的环境信息的采集、设备控制的相关驱动和相关程序,服务器端的用户注册、绑定设备、用户登录等权限相关功能。

作为智能家居系统,主要实现如下目标:

用户登陆、注册、设备绑定等功能。

环境信息的展示、设备远程操作等功能。

操作流程简单、方便,能够提高效率

3.1.2  功能分析

本系统实现了环境信息采集、远程控制智能设备实现开关电灯、窗帘、拍照上传等功能。

主要功能:

查看家中的温度、湿度信息(还有pm2.5、烟雾等)

查看和控制窗帘、灯光,空调等;

查看摄像头,控制摄像头角度,拍照上传到服务器等;

(远程电脑开机,远程下载等)

3.1.3  系统层次模块图

本项目采用了B/S + C/S架构,Server端又与智能终端进行交互,采用这种动态的服务机制,改善了系统的稳定性,简洁性和方便操作性。这种设计模式已经被大多主流的厂商和公司采用。

系统层次模块图如图1所示:

 SHAPE  \* MERGEFORMAT

交互

智能设备

交互

电器等设备

传感器

采集数据

控制设备

数据库服务器

设备服务器

Web服务器

保存信息数据

保存指令

获取指令

获取信息数据

上下箭头: 交互上下箭头: 交互上箭头: 采集数据下箭头: 控制设备上箭头: 保存信息数据上箭头: 保存指令下箭头: 获取指令下箭头: 获取信息数据


1 系统层次模块图

3.2       系统性能要求

安全性:要求保证安全性,保护用户隐私。

稳定性:作为多功能设备要保证长时间稳定运行。

兼容性:保持一定的兼容性,支持升级。

性能: 轻量级,对设备和服务器压力要小

3.3       运行环境

服务器硬件环境:

CPUX86处理器

内存:1G以上

服务器软件环境:

操作系统:Red Hat Enterprises Linux

数据库:MySQL

服务端程序: Server程序

相关环境:PHP环境、Apache环境

智能设备端硬件环境:

CPUARM cortex a9

智能设备端软件环境:

操作系统:Android 4.2

程序: Client程序

驱动:PWM驱动、继电器驱动、ADC驱动

3.4       数据流图

系统数据流图如2图所示:

 SHAPE  \* MERGEFORMAT

设备服务程序

(与智能设备通信)

Html5+JS+PHP

保存信息数据

保存指令

获取指令

获取信息数据

上箭头: 保存信息数据上箭头: 保存指令下箭头: 获取指令下箭头: 获取信息数据


2 数据流图

4         总体设计

4.1       系统代码架构

前面我们已经做完了该系统的需求分析,接下来进入系统设计阶段,设计阶段应该是在这个系统的研发各阶段中最重要的部分。在软件生存周期中,设计的任务一般分2个过程。第一过程是概要设计,它是确立软件的总体结构,以及各组成部分的相互联系。第二过程是详细的设计,它是确定模块内部算法以及数据结构,产生描述各个模块程序过程的设计文档。这里选择了原型法,首先依据需求分析来设计原型,然后在其基础上再修复和改进。在本系统设计过程中采取了模块化设计方法,化繁为简。

该系统的模块主要有服务器web服务模块,服务器设备服务模块,智能设备交互模块,设备驱动程序模块这四个模块。

4.2       设计模式

4.2.1  客户端-服务器模型

通常客户机和服务器是通过通信计算机网络上的单独硬件,但客户端和服务器可以在同一系统中。服务器主机上运行一个或多个它与客户分享他们的资源服务器程序。客户端不会共享任何资源,但是会请求服务器的内容或服务功能。使用客户端-服务器模型的计算机应用程序的实例是电子邮件,网络打印和万维网。

客户端-服务器特性描述了在一个应用程序合作的程序的关系。服务器组件提供了一个功能或服务于一个或多个发起对这种服务的请求的客户端。

一个计算机是否是客户机,或者服务器,是由一个需要服务功能的应用程序的性质决定的。例如,一台计算机可以同时运行Web服务器和文件服务器软件,以不同的数据服务的客户使不同类型的请求。客户端软件也可以用相同的计算机中的服务器软件进行通信。服务器之间的通信,诸如同步数据,有时也被称为跨服务器或服务器到服务器通信

4.2.2  浏览器-服务器模型

浏览器-服务器(Browser/Server)模型,也就是所说的B/S结构,它和常用的C/S结构有所区别,它的客户端不依赖应用软件,只要使用浏览器访问就可以进行交互了,浏览器通过网络服务器对数据库访问和操作,所以不依赖于任何的平台;服务端可以使用性能高的服务器,搭载一些大型的数据库软件;B/S结构化简了浏览器端的任务,这是跟随互联网发展衍生的,是对C/S结构的改善,但是这样的话服务端的任务量就会比较大,服务器要求的配置要高得多[6]

4.3       系统结构设计

主要实现如下结构:

设备采集温度等信息并上传到服务器。

设备接收服务器发送的指令并执行。

服务器接收设备发送的环境信息并保存到数据库。

服务器从数据库中获得指令并发送给设备。

客户端从服务器中获取环境信息。

客户端给服务器发指令。

服务器端的系统结构如图4所示:  SHAPE  \* MERGEFORMAT

 SHAPE  \* MERGEFORMAT

客户端程序

获取数据

发送请求

下箭头: 获取数据上箭头: 发送请求


4 服务器系统结构图

设备端系统结构如图3所示:

 SHAPE  \* MERGEFORMAT

智能设备

本地控制应用(apk)

Jar

So动态库

守护进程(控制设备并和服务器通信)

获取指令和上传数据

系统调用

VFS

继电器驱动

电机驱动

传感器驱动

其他

继电器开关

传感器

步进电机

其他

上下箭头: 获取指令和上传数据


3 设备端系统结构图

 

4.4       数据库结构设计

数据库的架构设计其实是对系统设计制定一个协议,数据库设计必须要全面考虑,并且数据库里面表结构和系统是关联的,一旦数据库设计不合理,系统设计就会比较困难。

系统采用了MySQL数据库,系统数据库名为smarthome,数据库smarthome中包括3个数据表。各个表的逻辑结构和相关信息如下:

1. user(用户信息表)

用户信息表是用来保存用户的一些信息的。用户ID、密码、绑定设备等字段,表user的结构如表1所示:

1 user表的结构

字段名

数据类型

长度

是否主键

描述

Userid

Varchar

30

用户名

Devid

Varchar

30

 

绑定设备

Passwd

Varchar

30

 

登陆密码

 

2. env (环境信息表)

环境信息表(env)主要存储环境数据信息,env表的结构如表2所示。

2  env的结构

字段名

数据类型

长度

是否主键

描述

Major

int

4

 

 

Minor

varchar

50

 

 

Value

varchar

50

 

 

Time

varchar

50

 

 

Devid

varchar

50

 

 

3. cmd(操作命令表)

此表主要用于存储命令相关的信息。表cmd的结构如表3所示。

3  cmd的结构

字段名

数据类型

长度

是否主键

描述

Major

int

4

 

 

Minor

varchar

50

 

 

Value

varchar

50

 

 

Time

varchar

50

 

 

Stat

Int

1

 

 

Devid

varchar

50

 

 

CMDID

int

4

自增

5         详细设计与实现

5.1       设备驱动的设计与实现

5.1.1         温湿度传感器驱动的设计与实现

温湿度传感器传输的是一组含有校验位的数字。

接口:

DATA接口用来设备和传感器进行信息传输,用一根总线来传输信息,每次传输时间大概4ms, 每次数据传输为40,传输的大体流程如下:

数据传输格式:八位湿度整数部分+八位湿度小数部分+八位温度整数部分+八位温度小数部分+八位的校验和

传输无误的话,最后八位等于八位湿度整数部分+八位湿度小数部分+八位温度整数部分+八位温度小数部分。

通过查看DHT11的手册,得知时序图如图5所示:

5 温湿度传感器数据传输时序图

驱动设计如下:

拉高函数adc_up()

拉低函数adb_down()

配置输入adc_in()

配置输出adc_out()

读取函数read_adc()

初始化函数init_adc()

提供操作函数集read(),write(),ioctl()

注册dev结构体,生成/dev/myadc供应用程序操作和读取

5.1.2  步进电机驱动的设计与实现

步进电机机有四根控制信号连接线。

控制信号是一种脉宽调制(PWM)信号。本模块采用了Linux内核提供的timer_list定时器来用软件产生pwm信号。

模块函数:

拉高函数pwm_up()

拉低函数pwm_down()

配置输入pwm_in()

配置输出pwm_out()

读取函数read_pwm()

初始化函数init_pwm()

提供操作函数集read(),write(),ioctl()

注册dev结构体,生成/dev/mypwm供应用程序操作和读取

5.1.3  继电器驱动的设计与实现

继电器比较简单,直接对相应的IO操作就好了;

拉高函数light_up()

拉低函数light_down()

配置成输入light_in()

配置成输出light_out()

读取状态函数read_light()

继电器初始化函数init_light()

提供操作函数集read(),write(),ioctl()

注册dev结构体,生成/dev/mylight供应用程序操作和读取

5.1.4  人体感应模块驱动

这部分也比较简单,就不做赘述,只需要检测中断,然后当产生一个中断的时候执行中断处理函数通知上层守护进程。

5.2       设备与服务器通信协议的设计

设备与服务器间通过传输结构体来实现环境信息和命令的传输。

主要结构体如下:

环境信息结构体,用于传输温度、湿度等  

struct __attribute__ ((__packed__))  env_info {

int dev_id; //设备ID 

int env_id; //ID用于表明传输的信息类型

int value;  //温度、湿度等值 

int time;   //信息产生的时间(

};

命令信息结构体,用于传输命令

struct  __attribute__ ((__packed__)) cmd_ops {

  uint8_t  major; //命令类型 

  uint8_t minor; //设备id

  uint8_t value;  //

  int time;   //时间

  int devid 

  uint8_t stat;          //状态

};

5.3       设备端程序的设计与实现

5.3.1  设备服务进程

       这里主要是使用了Linux系统编程和socket网络编程。 与服务器通信部分主要是实现把采集的数据上传到服务器,并且从服务器获取命令;还有实现一些个性化设计,例如温湿度超额报警,有人报警等;除此之外还有一些函数实现具体的操作功能。

主要函数:

init();//初始化一些配置

recv_cmd();//从服务端获取命令  

send_env_info();//将环境数据发送给服务器

get_env_info();//从设备获得环境数据 

int other_ops(int no, int ops); //other_ops 其他操作,作为日后拓展功能用

int pc_ops(int no, int ops); //pc_ops 远程控制电脑开机  

int pwm_ops(int no, int ops); //pwm_ops控制电机,可以实现开关窗帘等功能

int light_ops(int no, int ops); //light_ops  控制继电器,实现开关灯

5.3.2  安卓中间件

安卓的中间件主要包括Jar包和so动态库两部分。jar包供安卓应用调用,sojar包调用,这样就实现了在任何包和类中都可以调用动态库。

Jar包的设计:

Jar包,主要是为了能让所有程序都能调用所写的so库,主要实现如下:

    灯光操作函数

    static native int ledStatus();

    static native int ledCmd(String cmd); // cmd代表对灯的操作,比如“00”代表第一行第一个灯灭(即第0个灯)

    温度传感器操作函数

    static native int tempRead(int no);// no代表要读哪个温度传感器 比如0代表第一行第一个

    下面这个两函数主要是用来设置灯光的状态(亮灭)

    public static void set_lamp_on_off_status(int no) ;

    public static void clear_lamp_on_off_status(int no) ;

    public static int get_lamp_on_off_status() ;

    在系统中会创建一个线程来监控温度湿度烟雾等参数,必要时候报警

    这个变量是线程的结束条件

    public static boolean getAlarmThreadEnable();

    public static void setAlarmThreadEnable(boolean state);

    温度上下限设置和获取函数

    public static void setTempUp(int up)

    public static void setTempDown(int down);

    public static int getTempUp();

    public static int getTempDown();

    以下是和摄像机有关的函数

    private static boolean isRecording = false;

    public static void setIsRecording(boolean recording);

    public static boolean getIsRecording();

so动态库的设计:

这里主要是实现一个名字叫做 libSmarthomeHal.so 的动态库, 该动态库由com.alz.smarthome包 中的SmarthomeTools 类调用,也就是上面的Jar包。

主要实现的函数有:

操作灯光的函数

JNIEXPORT jint JNICALL

Java_com_alz_Smarthome_SmarthomeTools_ledCmd

(JNIEnv *env, jclass obj, jstring cmd);

从传感器读取数据函数

JNIEXPORT jint JNICALL Java_com_alz_Smarthome_SmarthomeTools_tempRead

(JNIEnv *env, jclass obj, jint no);

打开蜂鸣器

JNIEXPORT jint JNICALL Java_com_alz_Smarthome_SmarthomeTools_buzzerOn

(JNIEnv *env, jclass obj, jint no);

关闭蜂鸣器

JNIEXPORT jint JNICALL Java_com_alz_Smarthome_SmarthomeTools_buzzerOff

  (JNIEnv *env, jclass obj, jint a);

5.4       服务器端设备服务程序的设计与实现

该部分用c语言实现,主要是为了和设备端的程序进行通信,以及读写mysql数据库。大体模块如下:

从网络获得数据函数

int get_info(int sfd, struct env_info *env)

向家庭智能终端发送指令数据包:

int send_cmd_s(int sfd, struct cmd_ops *cmd)

将环境信息数据写入对应的mysql相应的表中

int store_info(struct env_info *env, MYSQL *mysql)

从数据库查询并获取命令

int get_cmd_db(struct cmd_ops *cmd, MYSQL *mysql)

每个终端连接后创建的子进程,每个子进程对应一个家庭智能终端

int job(int sfd)

设备服务器端初始化函数

int init(void)

5.5       服务器web服务的设计与实现

环境信息展示部分要实现的功能包括展示温度、湿度、空调、PM2.5等信息。


展示效果如6所示:

6 温度展示页面

这里用HTML5+css作页面,用JavaScript来发送get请求,PHP处理请求,从数据库中查询信息并返回给JavaScriptJavaScript再把信息展示出来。

JavaScript部分主要实现代码:

主要功能:

连接服务器获取当前设备信息,并显示出来。

AJAX方法连接数据库,获取传感器的最新值 

function getValue() {

  var request = new XMLHttpRequest();

  request.open("GET", url);

  request.onload = function() {

if (request.status == 200) {

updateDisplay(request.responseText);

}

  }

  request.send(null);

}

PHP部分主要实现代码

<?php

include './config.php'; //包含数据库配置信息

$sql="select * from temp01 order by time desc";//准备SQL语句

$res=mysql_query($sql); //发送SQL语句

if($res && mysql_affected_rows()>0){

while($row=mysql_fetch_assoc($res)){

  echo '[{' . '"value"' . ':"' . $row['value'] . '"' . '}]';

break;

}

}

?>

灯光控制和更多操作:

灯光控制展示页面如图7所示:

7 灯光控制页面

更多操作展示页面如图8所示:

8 更多操作页面

主要实现如下:

<input type="checkbox" id="checkbox1" name="checkbox1"  />

<script type="text/javascript" >

$(document).ready(function() {

$("#checkbox1").attr("checked",false);

$("#checkbox1").change(function() {

if (!$("#checkbox1").prop("checked")) {

cmdsql(1,1,0);

}else if($("#checkbox1").prop("checked")){

cmdsql(1,1,1);

}

});

});

</script>

6         系统测试以及软件安装

6.1       软件测试基础理论

6.1.1  软件测试定义

软件的测试是依据系统的结构和系统开发中阶段详细介绍而编写的一些测试用例,然后使用编写的测试用例来测试程序和发现问题。是系统正式发布运行之前,对系统的需求分析、软件设计规格说明和软件编码实现的最终检测,是为了保证系统的安全稳定[13]

6.1.2  软件测试基本概念

1、测试含义

测试就是把系统或组成的部分在特定的条件下执行,通常测试结果将会有两种:找出系统的问题,或者执行结果无误。测试就是单个或许多测试用例的整合。

2、测试步骤

测试的步骤说明了怎样来配置测试用例、执行测试用例、评估测试用例。

软件的生命周期:软件生命周期包括了制定计划、需求分析、设计、编码、测试、运行、维护和停用八个阶段。

软件测试在软件生命周期中跨了两个阶段:

单元测试阶段:

在每个模块编写后的必要测试。

综合测试阶段:

在完成单元测试后进行测试。

3、测试的意义

系统测试是系统研发中一个不可或缺的部分。不管在软件开发中各阶段采用了多么严谨的检测,仍然可能会产生许多问题,如果有严重的问题,系统在测试阶段没有被发现纠正,将来会付出更大的代价。软件测试用时、消耗人力和物力在系统开发中可能会有比较大的比重。根据统计信息显示,开发较大规模系统时,软件测试成本大概会占整体开发成本的一半。在某些特别重要的系统,测试所占成本可能会更大,有可能会比软件开发中其他部分加起来还要多。

6.2       软件测试目的

测试是系统的运行的过程,它的目的就是发现系统中存在的问题;并不能证明程序正确性,除非软件只处理极少的情况。好的测试用例是运行中发现了新的问题;成功的测试是发现了系统中存在问题的测试[14]

6.3       软件测试方法分类

软件测试依据在不同的角度看,有很多分类:黑白盒测试;静态测试、动态测试;单元测试、集成测试、回归测试、系统测试、验证测试以及确认测试[15]

6.4       系统测试

本系统对各部分模块采黑白盒测试。

6.4.1  测试用例设计要求

一个好的测试用例,应该包含以下信息:

1、软件或项目的名称

2、软件或项目的版本

3、功能模块名称

4、测试用例简单描述(目的和方法)

5、测试用例参考信息

6、测试用例与其他测试用例之间依赖关系

7、用例前置条件,也就是执行本用例必要条件

8、用例的编号

9、步骤编号、操作步骤、测试数据的说明

10、预期结果和实际结果

11、开发人员和测试人员

12、测试日期[16]

6.4.2  系统各个模块测试用例

本系统如果没有相应设备。则出现报错界面如图9所示:

 

9 无设备页面

如能检测到正确数据。则出现信息展示界面如图10所示:

10 温度正确显示页面

6.5       测试报告

本系统经过前面的测试,各模块功能基本正常,达到了预期的目的。

根据对系统的一些测试,了解到了测试方法、增加了测试经验。根据这次测试,了解到测试的意义。测试可以使软件更满足用户需求,更稳定、更可靠地运行。

6.6       软件安装

6.6.1  服务器环境搭建

安装Apache

yum install httpd

安装完Apache后,启动Apache

/etc/init.d/httpd start

这时候,浏览器打开localhost,安装无误的话就能看到阿帕奇的页面了

MySQL的安装

yum install mysql mysql-server

完成后,打开MySQL

/etc/init.d/mysqld start

PHP5的安装

yum install php

重启Apache,使能php

/etc/init.d/httpd restart

现在,Apache已经可以执行php脚本了。

安装php包的mysql模块:

yum install php-mysql

再次重启Apache

/etc/init.d/httpd restart

将这些服务添加开机启动:

chkconfig --levels 2345 httpd on

chkconfig --levels 2345 mysqld on

然后将写好的web服务程序全部拷贝到相应目录下:

cp web/* /var/www/html/

 

6.6.2  运行

服务器运行设备服务程序:

./server

adb shell登陆设备

执行以下命令加载驱动程序:

insmod /system/lib/modules/adc.ko 

insmod /system/lib/modules/light.ko 

insmod /system/lib/modules/buzzer.ko 

insmod /system/lib/modules/motor.ko 

运行设备端服务程序:

./client

现在,系统已经运行起来了。打开浏览器,输入192.168.0.123就能进入系统了。

参考文献

[1] 春雷. ARM 体系结构与编程[M]. 清华大学出版社, 2003.

[2] 嵌入式系统设计与实例开发[M]. 清华大学出版社, 2002.

[3] . Linux 内核完全注释[M]. 机械工业出版社, 2004.

[4] 胡伟. Android系统架构及其驱动研究[M]. 广州广播电视大学学报, 2010, 10(4).

[5] 谭浩强. C语言程序设计[M]. 清华大学出版社, 2000.

[6] Eckel B, 埃克尔, 昊鹏, . Java 编程思想[M]. 机械工业出版社, 2002.

[7] 夏天, 樊孝忠, 刘林. 利用 JNI 实现 ICTCLAS 系统的 Java 调用[J]. 计算机应用, 2005, 24(B12): 177-178.

[8] 刘华星, 杨庚. HTML5——下一代Web开发标准研究[J]. 计算机技术与发展, 2011, 21(8):54-58.

[9] David· 弗莱 (), Flanagan D, 张铭泽. JavaScript 权威指南: 第四版[M]. 机械工业出版社, 2003.

[10] 陶国荣. jQuery 权威指南[J]. 中国科技信息, 2013, 24: 062.

[11] Asleson R, Schutta N T. Ajax 基础教程[M]. 人民邮电出版社, 2006.

[12] Welling L, 韦林, Thomson L, et al. PHP MySQL Web 开发[M]. 机械工业出版社, 2005.

[13] Jorgensen P C, 乔根森, 旭涛. 软件测试[M]. 机械工业出版社, 2003.

[14] 朱少民 软件测试方法和技术[M]. 清华大学出版社有限公司, 2005.

[15] 万年红, 李翔. 软件黑盒测试的方法与实践[J]. 计算机工程, 2000, 26(12):91-93.

[16] 徐仁佐, 陈斌, 陈波,. 构造面向对象软件可复用测试用例的模式研究[J]. 武汉大学学报:理学版, 2003, 49(5):592-596.

 

感谢GNU开源软件组织为我们提供了许多优秀的开源软件供我们开发和使用,大大方便了我们的学习和软件的开发。

这篇论文得以完成,我要特别感谢我的指导老师张岩老师!感谢老师给予我莫大的关心与指导。老师给人感觉十分有亲和力,工作认真负责,治学严谨。很高兴能在大学最后的时光里遇到了张岩老师。在老师悉心的督促和细心的指导下,我的毕业设计才得以完成。

感谢学校各级领导对我们的关心,提供了舒适的学习环境,良好的学习氛围。最后,感谢同学们给我的帮助,在和同学们相互探讨中我感觉获益颇深。所以我要衷心地感谢我的老师和我的同学们,感谢你们给我的关心和帮助,十分谢谢你们!

由于时间比较仓促、自身原因等,论文的疏漏和错误之处在所难免,恳请各位老师斧正。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读(2728) | 评论(2) | 转发(0) |
0

上一篇:时钟周期-机器周期-指令周期

下一篇:没有了

给主人留下些什么吧!~~

lsfsqnzv2015-12-20 20:36:19

<a href=\"http://hnjggsoe.bokerb.com/blog.php?do=blog&event=view&uid=255666&ids=662977\" target=\"_blank\">http://hnjggsoe.bokerb.com/blog.php?do=blog&event=view&uid=255666&ids=662977</a>伟殳家居旗舰店,伟殳家居怎么样,伟殳家居官方旗舰店 养生养生<p>搜索 6居网&nbsp; <a href=\"http://www.6ju.com/\" target=\"_blank\">创意家居</a>无处不在。<a href=\"http://www.6ju.com\">www.6ju.com</a></p><p></p><p>9m鑫</p><p>7i业</p><p>2d彧</p><

rnixqhnp2015-10-16 14:24:02

<div id=\"sina_keyword_ad_area2\" class=\"articalContent   newfont_family\">
   <p>  影响家居风水的十大建筑物-医院居首</P>
<p>  一、医院</P>
<p>
  居住在医院附近,在风水上是不好的。原因如下:1、医院有好多病人居住,病菌必多;2、住院之人,运气必滞,如此多的滞气积聚在一起,势必对周边的气场有重大影响;3、医院天天有人要开刀手术,煞气过重;4、医院常会有病人病故,有些人是死不瞑目,其冤气会影响周边气场。</P>
<p>
  化解方法:(1)开当运之屋门或是房门,吸纳旺气;(2)注重卫生,细菌就难以入侵;(3)要有信仰,如信佛等,这利用宗教的高灵能量来增加住宅的气场。</P>
<p>  二、教堂、寺庙</P>
<p>
  在风水学上,神前庙后都是属于孤煞之地,所以住宅附近有寺院、教堂等一些宗教场所都是不好的。因为这些地方都是神灵寄托之