基于STM32和Android的智能家居系统(论文+PPT+源码)

详情介绍

资料目录

——/基于STM32和Android的智能家居系统/├──?android?代码| ├──app-debug-unaligned.apk 1.33M| └──TestSocket1.zip 7.84M├──STM32代码| └──钮毕设.rar 9.04M├──毕业论文文档| └──毕业论文| | ├──0:文档清单.doc 39.00kb| | ├──10:评阅人评价表.doc 20.50kb| | ├──11:答辩评分表.doc 20.50kb| | ├──12:成绩计算表.doc 17.00kb| | ├──13:学生意见反馈表.doc 17.00kb| | ├──1:课题申报、审核表.doc 35.50kb| | ├──2:任务书.doc 37.50kb| | ├──3:开题报告.doc 52.50kb| | ├──4:指导教师指导记录表.doc 57.50kb| | ├──5:指导教师中期检查表.doc 22.00kb| | ├──6:毕业论文.doc 942.00kb| | ├──6:毕业论文.pdf 1.48M| | ├──7:答辩申请表.doc 32.50kb| | ├──8:答辩记录表.doc 15.00kb| | └──9:指导教师评价表.doc 22.00kb├──开发工具| └──android-studio-ide-143.2821654-windows.exe 270.66M└──毕业答辩 .pptx 75.52M

本科毕业论文

基于STM32和Android的智能家居系统

The Smart Home System Based on STM32 and Android


毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得安阳工学院及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作 者 签 名:        日  期:     

指导教师签名:        日  期:       

使用授权说明

本人完全了解安阳工学院关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:        日  期:     

目 录

摘要II

AbstractII

引 言11

第1章 绪 论22

1.1 系统开发背景22

1.2 系统开发的目的及意义33

1.3 主要研究内容33

1.4 论文组织结构44

第2章 系统总体设计66

2.1 系统功能设计66

2.1.1 微处理器系统功能设计66

2.1.2 客户端的登录功能设计66

2.1.3 客户端的控制功能设计77

2.2 系统所需技术分析88

2.3 系统运行环境1010

2.4 系统可行性分析1010

2.5 本章小结1111

第3章 系统硬件功能实现1212

3.1 微处理器系统硬件的实现1212

3.2 网络模块的实现1313

3.3 网络地址交换技术的实现1414

3.4 本章小结1414

第4章 系统软件功能实现1515

4.1 下位机软件设计1515

4.1.1 协议栈的移植1515

4.1.2 客户端请求的接收1818

4.1.3 外围设备的控制1919

4.2 Android客户端软件设计2020

4.2.1 Android客户端UI的实现2020

4.2.2 客户端登录功能的实现2121

4.2.3 客户端控制系统的实现2424

4.3 本章小结2626

第5章 系统测试2727

5.1 系统测试概述2727

5.2 测试环境简介2727

5.3系统功能测试2727

5.3.1 LWIP协议栈测试2828

5.3.2 花生棒测试2828

5.3.3 Android主控测试2929

5.4 本章小结3030

结 论3131

致 谢3232

参考文献3333

基于STM32和Android的智能家居系统

摘要:随着移动互联网的高速发展,智能家居,这个曾经很遥远的梦想渐渐的成为了现实。本课题就是通过常见的Android手机操作系统结合廉价的芯片STM32F103VET6,通过对微处理器移植TCP/IP协议栈,然后通过网络地址交换技术,实现Android手机在任何因特网环境下都可以对微处理器机的控制。

该系统的主要功能是,只要手机和微处理器系统都连入互联网中,就能通过手机在任何地方,任何地点控制微处理器系统的LED(模拟电灯),继电器(模拟空调等设备),步进电机(模拟门窗设备)。几乎可以全方位实现对家里各种设备的控制,实现真正意义上的智能家居。

该课题上位机使用Android操作系统,使用XML开发UI,使用Android SDK实现Android控制端的业务逻辑,使用网络地址转换技术做Android系统和微处理器系统透明传输的保障,使用Socket技术作为Android客户端和STM32微处理器系统服务器的网络传输协议。

微处理器系统使用STM32F103VET6芯片,网络驱动芯片使用ENC28J60,通过移植LWIP协议栈,使微处理器系统具有了连接网络的功能。微处理器系统作为Socket服务器,可以监听到客户端发送的Socket请求,然后根据Socket请求的种类,控制不同的外围设备,间接的实现了Android客户端对微处理器系统外围设备的控制。

关键词:智能家居;网络地址转换;协议栈;套接字

The Smart Home System Based on STM32 and Android

Abstract:With the high-speeddevelopmentof mobile Internet, smart home, the once very distant dream gradually become a reality. This topic is through the common mobile phone operating system Android combined with cheap microcontroller chip STM32F103, TCP/IP protocol stack based on single chip microcomputer transplantation, and then through the port mapping technology, realize the Android mobile phone in any network environment can control of the microcontroller.

The system’s main function is that as long as mobile phones and single chip microcomputer system is connected to the Internet, we can through the phone in any place, any location control of single chip microcomputer system of LED (simulated electric lamp), relay (simulated air conditioning equipment), step motor (simulated doors and Windows equipment), steering gear (simulated curtain). Can almost all realize the control of home and all sorts of equipment, realize intelligent household in the true sense.

The subject PC using the Android operating system, the use of XML development UI, use the Android SDK implement Android business logic control end, use network address translation technique to do Android system of single chip microcomputer system transparent transmission security, use Socket technology to realize the client of the SCM server network transport protocol.

Use the microcontroller system, network driver chip using ENC28J60, LWIP the transplant, make SCM has the function of connection network. MCU system as a socket server, can listen to the socket of the client request, and then according to the socket request, control different peripherals, indirectly, to achieve the control of the MCU peripheral Android client.

Keywords:smart home; NAT; protocol stack; socket

引 言

随着改革开发的深入发展,国家的经济发生了翻天覆地的变化,中国人民真的富裕起来了。随着经济的发展,国民生活水平有了显著的提高,人们不仅在吃穿方面有了极大的改善,在文化娱乐和生活方式方面也都有了翻天覆地的变化。在当今社会,由于Android手机的廉价,几乎每个人都能用上Android系统的智能手机了。因此各种基于Android智能手机的应用层出不穷。该项目就是利用Android智能手机,通过安装一个自己开发的手机APP,就能通过网络实现对微处理器设备的控制,可以实现控制微处理器的LED,电机,继电器等外围设备。如果应用于实际的生活中,可以实现对家里面各种电器设备,门窗等的控制。

在习近平总书记带领全国人们构建“中国梦”的宏伟蓝图的时候指出,要想提高人们的生活水平,必须以互联网为基础,并提出了“互联网+”的概念。所谓“互联网+”就是在传统互联网的基础上,还要大力发展“移动互联网”和“物联网”技术。因此智能家居事业在中国拥有很大的前景。

目前国内外很多大型公司都投入到了智能家居的大军。小米的智能家庭套装,海尔的U-Home系统等。通过物联网实现的智能家居,不仅可以真正意义上改变人们的生活方式,还能带动国家经济进一步的大发展。随着社会的进步和互联网行业的蓬勃发展,智能家居行业也必将得到蓬勃的发展。

第1章 绪 论

随着移动互联网的快速发展和物联网概念的出现,“智能家居”渐渐的进入了人们的视线。早在互联网之前,便已经有智能楼宇、智能安防、智能建筑。

世界第一座智能建筑可以追溯到1984年的美国。智能家居也已广泛应用多年,包括中国。那个时候因为网络还没有普及,所谓智能是指在电气特性上实现智能家居。如各种传感器可以感知外界和室内的环境,然后根据环境,可以自动的去设置各种电气设备,大大的解放了人的双手。也提高了人们的生活水平和生活乐趣。

物联网的出现是分水岭。借助移动通信技术,设备可以通过移动网络或通过WIFI、蓝牙,与互联网进行连接。物体与物体之间连接让更多应用成为可能。爱立信曾预测到2020年,将有500亿台设备在线连接,是智能手机存量的数十倍。其中很大一部分来自与家相关的设备,例如水表、电表、气表、家电、电灯、供暖等等。因此智能家居系统在未来几年,必将会有很大的市场。

本章主要从“智能家居”的开发背景及意义、应用现状、主要工作和论文结构安排这四个方面进行描述分析。

1.1 系统开发背景

随着移动互联网和物联网的发展,“智能家居”走进了寻常百姓家。基于移动设备的智能家居系统不仅提高了人们的生活水平,也提高了住宅的安全,更可以实现国家经济结构的转变。

在中国,“智能家居”虽然起步较晚,但是国家对“智能家居”却是十分的重视。2015年3月5日上午十二届全国人大三次会议上,李克强总理在政府工作报告中首次提出“互联网+”行动计划。李克强总理所提的“互联网+”与较早相关互联网企业讨论聚焦的“互联网改造传统产业”基础上已经有了进一步的深入和发展。李克强总理在政府工作报告中首次提出的“互联网+”实际上是创新2.0下互联网发展新形态、新业态,是知识社会创新2.0推动下的互联网形态演进。其后,习近平总书记和李克强总理多次强调,中国要大力发展“智能家居”。只有这样,才能显著的提高人们的生活水平,才能实现国家的持续和稳定发展。

一些国内的大型互联网公司也开始大力发展智能家居。 前些时间,小米与亚明、阳光、鸿雁、欧普、飞利浦、木林森、科瑞、锐高、莹辉、柏年、鼎晖、顿格等13家照明企业签订了《共建智能照明联合声明》,小米将与这些照明企业联合,共同推进智能照明在家庭的落地。据悉,小米智能硬件团队可以1-2天内把普通家电产品通过小米智能模块实现智能化。安装小米的无线模块后,传统的电子产品即可接入小米的智能家居生态系 统,实现与小米生态链上的硬件互联互通。

在此背景下,本人利用自己所学的专业知识,开发出了基于Android和STM32的智能家居系统,可以通过Android操作系统的智能手机,在任何地方,任何地点就能通过各种网络实现手机对家里各种电器设备的控制。

1.2 系统开发的目的及意义

“智能家居”是利国利民是事业。通过“智能家居”可以提高人们的生活水平,给人们的生活带来很大的便利。在未来几年内,“智能家居”的需求会持续增长。通过发展“智能家居”事业,不仅可以带来可观的经济效益,还可以加速我国经济结构的转型。

目前,智能家居在国内还是不是特别发达。其主要原因就是缺乏统一的标准和权威,目前一些大的互联网公司开始试图去统一规范,如物联网协议“IOC”,智能摄像头协议“IOCamera”。并且随着“4G”网络的普及和遍地的“Wi-Fi”以及移动互联网的普及,智能家居在近几年必将得到井喷的发展。

随着网络的发展,未来是属于物联网的时代,物联网智能家居将大有可为。所谓物联网,在广义上来说就是“包括指车、人、家相关智能设备的互相连接和统一控制” 如智能可穿戴设备、车联网等。它以“连接家中的一切”作为基础,使用统一的平台来控制和管理。通过物联网,可以使家居智能效果最大化,科学、和谐、安全、健康和舒适等。

1.3 主要研究内容

本课题的研究涵盖以下几个方面:

1、Android应用程序的开发;

2、网络地址交换技术;

3、STM32微处理器协议栈移植;

4、STM32微处理器Socket服务器的开发。

在该系统完成后,通过使用一个具备网络功能的微处理器系统作为主控系统。通过对微处理器所对应的网络芯片移植协议栈,再经过相关配置,使之具备连接到互联网的功能。然后通过Android客户端,可以对该微处理器设备通过发送Socket请求,微处理器收到请求后,去操作相应的IO,就能实现对微处理器外围设备的控制。最终实现Android间接的控制了微处理器设备。

整个系统中最关键的一步就是“网络地址交换技术”。NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT技术。

这种方法需要在路由器或者交换机上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

要安装NAT软件,需要购买专门的路由器,并开启相关的运营商服务。为了降低成本和更加方便的使用NAT服务,可以使用了一种硬件,名字叫做“花生棒”。使用的时候,只需要将“花生棒”通过网线连接到路由器的LAN口中,然后登陆花生棒的管理后台,将局域网中的某个IP地址和端口进行内网映射,花生棒后台就会分配给我们一个主机名和一个端口。通过该主机名和端口,就能实现外网对内网中微处理器的通信。

在该系统中,微处理器系统需要移植LWIP协议栈,在经过相关配置,使之可以具备联网的功能,然后成为互联网中的一个节点。在整个系统中作为Socket服务器使用。他通过循环监听外部设备的Socket请求,根本不同的请求操作不同的IO,并且将操作结果返回给客户端。

Android应用软件在整个系统中作为客户端使用。要想使用该系统,首先需要登录。登录需要使用花生棒后台分配的主机名和端口号。点击登录后,会首先将主机名转化为IP地址,如果转化成功的话,就会尝试连接Socket服务器(微处理器系统),如果也连接成功的话,就会进入控制页面。在控制页,可以实现对微处理器系统上的LED,步进电机,继电器的控制。

1.4 论文组织结构

本论文共分为五章。第一章绪论、第二章系统总体设计、第三章系统硬件设计、第四章系统软件设计、第五章系统测试分析。

第1章绪论主要讲述了“智能家居”的背景及意义、应用现状、主要工作和论文结构安排。

第2章系统设计主要对该系统所需要完成的功能进行了分析,对智能家居系统所需用到的一些技术进行阐述分析,对该系统所需的运行环境提出了要求分析,并进行了各个方面可行性分析,完成该系统的总体框架设计,明确设计的总体思路。

第3章系统硬件设计主要介绍系统使用的硬件原理图和实现原理。根据原理图对系统使用的各个模块进行了分析。

第4章系统软件设计主要通过具体的代码和描述来介绍本系统的具体实现过程,主要包括微处理器协议栈的移植,Android 应用软件开发。

第5章系统测试分析主要是阐述了系统的测试环境和测试目的,并进行了相关测试,将测试的结果通过图片的方式展示在论文中。

第2章 系统总体设计

2.1 系统功能设计

基于STM32和Android的智能家居系统的用途主要是为了在日常的生活中,给人们带来便利。可以让用户在有网络的地方就能实现对家中电灯,门窗,电器设备,门窗等的控制。因此该系统主要应该有以下几个功能:登录到管理系统,控制电灯,控制电器设备,控制门窗。

2.1.1 微处理器系统功能设计

在该项目中,微处理器系统主要作为服务器端使用。它主要的作用就是获取客户端的请求,然后识别客户端的请求类型,根据不同的请求类型,执行不同的IO操作,最终实现Android对微处理器系统的控制。其设计的流程图如图2-1所示。

【毕设】基于STM32和Android的智能家居系统(论文+PPT+源码)[/caption] 【毕设】基于STM32和Android的智能家居系统(论文+PPT+源码)[/caption]

基于STM32和Android的智能家居系统[/caption]

添加图片注释,不超过 140 字(可选)

图2-1 微处理器系统流程图

2.1.2 客户端的登录功能设计

Android客户端和微处理器系统是通过Socket建立连接的。而Socket要求提供一个IP地址和一个端口号。因此要想实现两者之间的控制,首先需要用户提供一个IP地址和一个端口后,然后通过去校验是否可以连接成功。

登录需要用到花生棒后台提供的主机名和端口号。点击登录后,首先会验证填写的主机名是否可以解析成一个IP地址,如果可以解析成IP地址,会用Socket的方法和微处理器系统建立Socket连接。这样,就和微处理器系统建立了一个沟通的管道,可以实现Android客户端和微处理系统的数据交换。登录的流程图如2-2所示。

?

添加图片注释,不超过 140 字(可选)

图2-2 登录流程图

登录到主控页面后,就能根据相应的按钮去执行相应的操作,可以实现LED的开关,电器门窗的开关等。

2.1.3 客户端的控制功能设计

客户端的控制主要分为电灯的控制,电器设备的控制,门窗的控制。

控制电灯主要分为开灯和关灯。在该系统中共设置了3组LED,每个LED都有开或者关的状态,如果用户已经开了灯,那么给用户的提醒就是点击关灯。用户点击后,就会关闭相应的LED,反之,就会打开相应的LED。

在家里,通常有很多的电器设备需要控制,比如空调,电视机等。在该系统中通过对继电器的控制来模拟对电器设备的控制。如果当前电器设备的状态是关闭的,点击打开电器,系统就会给继电器送入一个高电平。反之,点击按钮的提示文字变成了点击关闭电器设备,点击后,就会关闭相应的电器设备。

对门窗的控制使用了一个步进电机,进行正转或者反转来控制。正转的话,电机就可以带动门窗进行关门窗,反转的话,就能带动门窗进行开门。如果当前的门窗是开的话,门窗的控制的提示文字会变成点击关闭门窗,点击后,电机正转,会关闭门窗。反之,提示会变成点击打开门窗,点击后,会反转打开门窗。

2.2 系统所需技术分析

该智能家居系统主要用到了STM32F103VET6芯片,ENC28J60网络驱动芯片,LWIP协议栈,NAT技术,Android应用开发,Socket通信。

1、STM32微处理器

STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。STM32F103是其“增强型”系列。它的时钟达到72MHz,是同类产品中性能最高的产品。基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。时钟频率72MHz时,从闪存中执行代码,STM32功耗仅为36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。

此外STM32开发,可以使用库开发,将很多对IO的操作都封装成了函数调用,大大提高了编程的效率。再加上STM32还可以移植LWIP等TCP/IP协议栈实现网络连接的功能,因此在这里STM32是比较合适的选择。

2、LWIP协议栈

LWIP是一种嵌入式TCP/IP协议,有无操作系统的支持都可以运行。LWIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM 和40K左右的ROM就可以运行,这使LWIP协议栈适合在低端的嵌入式系统中使用。

LWIP协议栈主要的是怎么样减少内存的使用和代码的大小,这样就可以让LWIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,LWIP对API进行了裁减,可以不需要复制一些数据。它主要具备以下特性:

(1)可以支持多网络接口下的IP转发;

(2)包括实验性扩展的UDP(用户数据报协议);

(3)包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议);

(4)支持DHCP协议,动态分配IP地址。

在校园网中,直接连入交换机是没有网络的,必须先登录校园网账号。为了在校园网中能够使用。利用了一个无线路由器连入一台PC,然用PC来登录校园网认证,这样,连入路由器中的设备都可以联网了,但是路由器智能动态的分配IP,得益于LWIP具有的DHCP功能,使微处理器可以成功的连入路由器网络中。因此在这里使用LWIP是比较合适的TCP/IP协议。

3、NAT技术

NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT的方式。

这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

另外,这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。

国内提供NAT服务的厂商比较有名气的是花生壳,花生壳还生产一种硬件设备叫做花生棒。只需要把花生棒连入到路由器的LAN口之一,登录后,就能对路由器下的某个IP的某个端口进行映射。映射成功后,花生壳后台会提供一个外网的网址和一个端口号。通过这个主机名和这个端口,就能在网络中,找到内网中被映射的设备。因此使用NAT服务是整个系统成功的关键。经过测试,使用花生棒做端口映射后,在外网中可以实现对微控制器的访问。

4、Android应用开发

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑。目前全世界采用Android系统的设备数量已经达到20亿台。

在Android开发中,使用Android Studio或者ADT作为IDE,可以大大的提高开发的效率。它使用XML编写UI布局,使用Java语言为编程语言的Android SDK编写业务逻辑。本人目前的工作就是Android开发工程师,有丰富的Android开发经验,因此在这里选用Android开发很合适。

5、Socket通信

Socket通信又叫套接字通信,它是指网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket。

在Java中,Socket和ServerSocket类库位于Java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

Socket要求必须有一个设备作为服务器,其他设备可以作为客户端。一个服务器可以连接多个客户端。在该系统中,我们选用微处理器系统作为Socket的服务器,Android设备作为客户端。Socket需要服务器提供自己的IP地址和监听的端口。客户端在连接的时候,只需要通过IP地址和端口,就能连接到Socket服务器并和服务器做数据交换。

2.3 系统运行环境

在该系统设计中,需要具备以下环境:

计算机上安装有JDK1.6及其以上版本且环境变量配置成功;

计算机上应安装有Android SDK和Android Studio开发工具;

计算机上应安装有Keil5 开发工具;

需要无线路由器一台;

需要花生棒一个;

需要STM32微处理器系统一套。

2.4 系统可行性分析

可行性分析是在全面调查基础上,针对新系统的开发是否具有必要性和可行性而进行分析的一种方法。可行性研究的目的就是使用最小的代价在最短的时间内确定问题是否能够得到解决。可行性分析主要从以下三个方面进行研究。社会可行性、技术可行性、经济可行性。

1、社会可行性

随着移动互联网和物联网的发展,整个社会对“智能家居”越来越重视。尤其是“互联网+”战略思想提出后,党和国家更是把移动互联网和物联网的发展作为国家战略层面的长久计划。国内各种大型公司都纷纷向智能家居行业进军。小米的智能家庭,乐视的智能生态系统等。这些都体现了在未来的几年时间里,智能家居必将作为一个新兴的行业并且会得到井喷的发展。

在整个社会都对智能家居充满的前提下,基于STM32和Android的智能家居系统完全具备社会可行性。

2、技术可行性

本设计最困难的技术点就是如何实现在外网中访问内网微处理器设备。但是通过网络地 址交换技术,完全可以解决这一问题。在以前,只能对PC设备就行端口映射,本人当时的方案是在内网中架设一台HTTP服务器,然后将该台设备进行端口映射。然后就能通过HTTP请求请求到内网中的PC。内网中的PC获取HTTP请求后,利用Socket通信实现外网和内网的通信。得益于花生壳公司生产的硬件花生棒,可以直接在交换机和路由器中进行端口映射,因此可以直接实现内网和外网的通信,大大降低了通信的成本。

对于微处理器系统,开发过程中有充足的资料可以参考,并且STM32使用库开发,不仅提高了开发的效率,也减小了开发难度。

对于Android开发,本人做Android开发已经将近两年。有着丰富的Android开发经验。因此开发这样的系统对我来说没有技术难度。

3、经济可行性

该系统使用的Android手机作为客户端,使用STM32微处理器系统作为服务器。Android手机使用常用的手机就能实现。至于微处理器系统,STM32芯片价格便宜且功耗很低,因此软硬件的成本都很低。在经济方面,该系统完全具有可行性。

2.5 本章小结

本章主要对该智能家居系统所需的功能进行了分析,明确了各个功能模块的作用,并对平台的功能各方面做出了较全面的定义。分析了系统开发需要用到的技术以及各项技术的优势,使用相对较为安全的开发技术可以让系统更加健壮。同时还提出了系统的运行环境,对其进行可行性分析,主要从社会、技术、经济三方面进行可行性讨论,以此来避免项目失败。通过本章的分析使开发的方向更为明确,为保证系统的顺利完成打下基础。

第3章 系统硬件功能实现

该项目中,使用的硬件环境是STM32微处理器,网络模块使用ENC28J60作为网卡驱动,通过在路由器中添加花生棒模块,可以使路由器成为NAT路由器使用。

3.1 微处理器系统硬件的实现

微处理器系统的主控芯片使用STM32F103VET6,该芯片可以使用J-LINK,串口两种方式进行烧写,具备文件系统,PS/2接口。在该项目中,使用了STM32的SPI接口,通过接入一个网络模块,然后通过代码配置,就能让微处理器系统具备驱动网络模块的能力。微处理器的最小系统如图3-1所示。

?

添加图片注释,不超过 140 字(可选)

图3-1微处理器最小系统

它包括了供电系统,串口下载系统等,并且通过插针,将USART,SPI等接口都引出。该系统使用3.3V 和5V两种方式供电,电路图如图3-2所示。

?

添加图片注释,不超过 140 字(可选)

图3-2 供电系统原理图

为了方便和笔记本电脑连接,将RS232通过PL2303转为了USB接口,实现了通过USB就能使用串口通信。其原理图如图3-3所示。

?

添加图片注释,不超过 140 字(可选)

图3-3 USB转串口原理图

3.2 网络模块的实现

在STM32微处理器系统中,没有集成网络模块。但是在该系统中,把各个引脚都已经接出,因此,可以自己设计一个网络模块,通过使用插针的方式和微处理器的SPI接口连接,使之具备连接网络的功能。该网络模块使用ENC28J60作为驱动芯片,然后根据相关的引脚配置移植LWIP到该系统中,使之具备连接网络的功能。其原理图如图3-4所示。

【毕设】基于STM32和Android的智能家居系统(论文+PPT+源码)[/caption] 【毕设】基于STM32和Android的智能家居系统(论文+PPT+源码)[/caption]

基于STM32和Android的智能家居系统[/caption]

添加图片注释,不超过 140 字(可选)

图3-4 ENC28J60原理图

3.3 网络地址交换技术的实现

为了实现网络地址交换,需要使用一种硬件设备叫做花生棒。只需要把花生棒连入到路由器的LAN口之一,使用花生棒唯一的UUID作为账号登录到花生棒的后台管理系统后,就可以在后台中对路由器下的某个IP的某个端口进行内网映射。映射成功后,花生壳后台会提供一个外网的主机名和一个端口号。通过这个主机名和这个端口,就能在网络中找到内网中被映射的设备。

3.4 本章小结

本章详细的介绍了该系统所使用的硬件平台。并且通过相关的原理图,直观的显示了各个模块的原理。此外,还介绍了如何利用花生壳提供的相关软件和硬件服务实现内网映射,可以实现在外网中访问到微处理器系统。在整个系统中,硬件平台是作为服务器来使用的,只有保证硬件平台的稳定运行,才能保证整个系统的稳定运行。

第4章 系统软件功能实现

本章主要介绍项目的软件设计。系统的软件设计主要分为下位机软件设计和上位机 软件设计。下位机软件使用Keil作为开发工具,使用C语言作为开发语言,在下位机软件设计中,主要的操作就是LWIP协议栈的移植,数据包的接收,IO的操作。下位机软件设计完成后,微处理器系统就作为一个网络中的结点,可以接收客户端发来的Socket请求,在整个项目中作为Socket服务器使用。

上位机软件在整个项目中是作为客户端使用的,其主要的作用是通过因特网发送网 络请求到微处理器系统,供微处理器系统去执行相关的IO操作。Android开发使用 Android Studio作为开发工具,使用XML作为开发UI的语言,使用Java语言去开发相关业务逻辑。

4.1 下位机软件设计

在微处理器系统中,使用的网卡是ENC28J60。为了实现微处理器系统联网,需要给微处理器系统移植LWIP协议栈。要想移植协议栈,首先需要去LWIP的官方网站上将相应的资源文件下载,然后复制到自己的项目中。再结合网卡具体功能,修改相关的文件。

4.1.1 协议栈的移植

1、Ethernetif.c配置

Low_Level_Init方法主要做的就是对ENC28J60的一些相关的初始化。通过修改该文件,可以设置ENC28J60网卡的硬件地址,MTU,转换模式等。具体的配置如以下代码所示。

static void low_level_init(struct netif *netif)

{

struct ethernetif *ethernetif = netif->state; //定义一个存储ENC28J60配置的结构体

netif->hwaddr_len = ETHARP_HWADDR_LEN; //设置ENC28J60的硬件地址

netif->hwaddr[0] = A’;netif->hwaddr[1] = ‘Y’; netif->hwaddr[2] = ‘I’;

netif->hwaddr[3] = ‘T’;netif->hwaddr[4] = ‘Q’;netif->hwaddr[5] = ‘R’;

netif->mtu = 1500; //设置ENC28J60的MTU,并设置为1500

netif->flags=NETIF_FLAG_BROADCAST|NETIF_FLAG_ETHARP|NETIF_FLAG_LINK_UP;

ENC28J60_init(netif->hwaddr); // low_level_init中指定了ENC28J60中的网卡地址

}

Low_Level_Output方法主要实现的是通过网络将缓冲区里面的数据发送给其他的终端。ENC28J60_init_send(p->tot_len) 的主要的作用是为了初始化发送缓冲区大小。 Pbuf结构为一个链表,第一个Pbuf结构体中的Tot_len字段代表整个以太网数据包的大小。ENC28J60_writebuf(q->payload, q->len)的主要作用是通过遍历链表把内容填入到ENC28J60的缓冲区中。ENC28J60_start_send()的作用是为了启动网卡发送。因此要想实现发送数据到其他的终端,之需要调用该方法,并且传入一个Struct Pbuf类型的数据即可。代码如下所示

static err_t

low_level_output(struct netif *netif, struct pbuf *p)

{

struct ethernetif *ethernetif = netif->state; //定义一个结构体保存网卡的配置信息

struct pbuf *q; //定义一个pbuf类型的结构体

ENC28J60_init_send(p->tot_len); //发送pbuf结构体中的数据

for(q = p; q != NULL; q = q->next) {//通过循环遍历,将数据依次发给其他的终端。

ENC28J60_writebuf( q->payload, q->len );

}

ENC28J60_start_send(); //开始发送数据

LINK_STATS_INC(link.xmit);

return ERR_OK;//返回操作的标示

}

Low_Level_Input主要的作用就是获取其他终端发来的信息。主要需要调用以下几个核心的步骤。具体的代码如下图所示。

static struct pbuf *//定义一个结构体,用来临时保存接收的数据

low_level_input(struct netif *netif){

struct ethernetif *ethernetif = netif->state;

struct pbuf *p, *q; //定义两个结构体指针,做缓存使用

u16_t len; //定义一个无符号整形,用来保存数据包的长度

len = ENC28J60_packet_getlen();//获取网卡中数据包的长度

p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);//在内存中去申请空间

if (p != NULL) {

for(q = p; q != NULL; q = q->next) {

ENC28J60_readbuf (q->payload, q->len ); //通过循环遍历,依次获取读取到内容。 }

ENC28J60_finish_receive();//完成了接收的过程

return p;}

LWIP网卡硬件初始化调用Ethernetif_init即可,该函数中调用了Low_Level_Init,并指定了网卡输出函数Low_Level_Output。

一旦网卡有数据进入,应立即使用中断方法或查询方法调用Ethernetif_input函数。然后将获取的数组转化为字符串,然后根据字符串的内容去操作相应的GPIO,实现通过Android客户端对GPIO的间接控制。

2、LWIPopt.h配置

LWIPopt主要是对LWIP协议栈的一些定义。如是否使用操作系统。是否开启DHCP等。

未使用操作系统,所有NO_SYS定义为1,LWIP_NETCONN定义为0(表示不使用),LWIP_SOCKET定义为0(表示不使用)。

LWIP_DHCP被定义为0,关闭了DHCP功能以简化代码。

在该项目中,去除了校验相关配置。STM32官方案例中使用了代码EMAC功能的MCU,该系列MCU中包括硬件校验功能,但是ENC28J60并没有此功能,所以只能开启LWIP中的软件校验功能。

#define PBUF_POOL_SIZE 10 //表示共有10个缓冲区

#define PBUF_POOL_BUFSIZE 1500 //表示缓冲区的大小是1500个字节

#define LWIP_TCP 1 //表示使用的是TCP协议

#define TCP_TTL 255 //表示TTL被设置为255

#define LWIP_EMAC 1 //表示开启校验功能

#define LWIP_DHCP 0 //表示不使用DHCP

#define LWIP_UDP 1 //表示启用UDP

#define UDP_TTL 255 //标示UDP的TTL也是255

#endif

3、LWIP的相关初始化

对LWIP进行配置后,就能根据项目的实际需要进行LWIP的相关初始化。如设置设备的IP地址,子网掩码,网关等,具体的实现如下。

void LWIP_Config (void){

struct ip_addr ipaddr;

struct ip_addr netmask;

struct ip_addr gw;

LWIP_init(); // 调用LWIP初始化函数

IP4_ADDR(&ipaddr, 192, 168, 1, 16); // 设置网络接口的ip地址

IP4_ADDR(&netmask, 255, 255, 255, 0); // 子网掩码

IP4_ADDR(&gw, 192, 168, 1, 1); // 网关

netif_add(&ENC28J60, &ipaddr, &netmask, &gw, NULL, ?ernetif_init, ?ernet_input);

netif_set_default(&ENC28J60); // 把ENC28J60设置为默认网卡

netif_set_up(&ENC28J60); //设置配置信息

4.2.3 客户端控制系统的实现

客户端和服务器端的连接建立后,客户端和微控制器系统就能进行双工通信。客户端首先将需要发送的字符串发送给服务器,然后去监听服务器的反馈。根据服务器的反馈给用户相应的提示,并去更新UI。该过程也是个耗时操作,需要在子线程中去操作,并且等执行完后,通过Handler发送一个消息去通知主线程刷新。

pw.println(str);//发送到缓冲区中

pw.flush();//刷新到服务器中

以上两个操作主要是通过Socket的输入对象,将要发送给微处理器系统的内容保存在缓冲区中,然后从缓存区中发送到服务器端。

new ReceivedThread(str).start();//开启接收服务器返回结果的线程

这段代码的意思是启动接收微处理器系统的线程去接收服务器返回的信息。这个操作也是耗时的,因此是一个子线程中操作的。

下面的代码主要重写了在Android的页面中对点击事件的处理。在UI中,已经给每个按钮都设置了ID,在这里就能根据被点击按钮的ID来获取是哪个按钮被点击的,然后根据不同的按钮,发送不同的数据到微处理器系统。发送完后,启动另外一个线程去获取微处理器系统返回的信息。

switch (view.getId()) {

case R.id.bt_led1://如果按下的按钮是id为bt_led1的

String str = “LED1_OPEN”;//要发送的字符串

if (pw != null) {

pw.println(str);//发送字符串到服务器

pw.flush();//刷新

new ReceivedThread(str).start();//开启线程去接收数据

} else {

Toast.makeText(MainActivity.this, “socket 链接失败”, Toast.LENGTH_LONG).show();//给用户弹出提醒

}

break; }

向服务器发送的数据发送成功后,服务器也会反馈给Android客户端相应的数据,Android客户端可以根据这个返回的结果判定操作是否成功。这个操作也同样是耗时操作,因此也需要使用Android的消息机制,将成功后的消息,发给主线程。

while ((str = br.readLine()) != null) {

final String s = str;

bundle.clear();//先清空bundle对象

Message message = new Message();//创建一个Message的实例

bundle.putString(“text”, text);//把text放入到bundle中

bundle.putString(“receive”, s);//把s也放入到bundle中

message.what = 1;//设置what的属性是1

message.obj = bundle;把obj设置为bundle

Handler.sendMessage(message);//发送消息

}

这段代码是Android客户端读取微处理器系统返回数据的业务,通过Str = Br.readLine()可以获取到微处理器系统返回数据的字符串。但是这个数据是在子线程中获取的,Android的UI页面是不能直接使用这个字符串的,因此,就需要使用Android的消息机制,将数据发到主线程上。首先需要New 出一个Message对象。然后将子线程中的数据放到这个消息里面。封装好这个消息后,就能发送这个消息到主线程去处理。

private Handler Handler = new Handler() {

@Override

public void handleMessage(Message msg) {

//创建一个消息处理的Handler对象

super.handleMessage(msg);

}

}

上面的代码展示了如下创建一个可以处理Message的Handler对象。要想让Message对象得到处理,需要在Activity中创建一个Handler对象,然后要重写HandleMessage方法。这样的话,每一个使用Handler发送的消息,在这里都是可以收到的。

然后要根据Msg.what的值判断是哪一个消息。最后根据不同的消息,获取消息里的内容,在主线程中做进一步的使用。具体的代码如下所示。

private Handler Handler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if (msg.what == 1) {//如果message的what类型是1

Bundle receiveBundle = (Bundle) msg.obj;//获取message的obj对象

String s = receiveBundle.getString(“receive”, “”);//获取对象中的receive数据

//如果服务器发送内部故障的话,返回的内容会是空

if (TextUtils.isEmpty(s)) {//给用户弹出提示

Toast.makeText(MainActivity.this, “设备未响应”, Toast.LENGTH_LONG).show();

}//获取message中的text的值

String text = receiveBundle.getString(“text”, “”);

}

};

上面的代码就是在主线程上运行的。他主要是为了接收各个线程发来的消息。他可以根据Message 的What属性判断是哪个消息发来的。然后通过Message的Obj对象获取消息里包含的内容。最后,在根据不同的消息,去执行不同的UI操作。

4.3 本章小结

本章主要通过具体的设计来介绍本系统的具体实现过程,详细分析了微处理器系统中LWIP协议栈的移植,NAT硬件花生棒的使用,Android客户端的具体实现,并通过相关的代码,在代码层面上进行了分析。通过这些详细的设计,使系统关键功能的实现完整的展现出来。

第5章 系统测试

一个软件开发完成后,必须经过必要的测试才能交付,软件的测试是对软件规格说明,设计和编码的最后一次复审。软件开发的目的是开发出实现用户需求的高质量,高性能的软件产品,软件测试以检查软件产品的内容和功能特性为核心,是软件质量保证的关键步骤,也是成功实现软件开发目标的重要保障。在编码中,我们只考虑某一模块的功能,对于整个项目的把握还是有所缺失的。因此,在软件生命周期的每个阶段都不可避免地会产生错误,为了排除这些错误,保证软件质量就必须认真地进行软件测试。

5.1 系统测试概述

系统测试首先是测试每一个单独的模块,确保每个模块可以稳定的运行。最后将每一个模块组合成一个完整的系统来测试。对整个系统的测试是为了保证系统可以按照预设的需求实现每一个功能。

在该系统中,主要使用了黑盒测试的方法。就是对某一个单独的功能进行单独的测试,等到所有的模块都测试完成后,再进行整个系统的完成测试。如果发现有问题出现,就记录,最后再统一解决出现的问题,重复上述步骤,直到整个系统可以稳定健壮的运行。

5.2 测试环境简介

软件测试需要在一定的系统环境下进行,表5-1列出了测试的系统环境。

软件环境(相关软件、操作系统等)

智能家居系统APP

硬件环境(网络、设备等)

花生棒

STM32微处理系统

无线路由器一台

网线两根

表5-1 测试的系统环境

5.3系统功能测试

软件功能是一个系统最基本的要素,需要在各个层次保证功能执行的正确性。功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。

5.3.1 LWIP协议栈测试

在LWIP的相关初始化中,进行下列的配置:

IP4_ADDR(&ipaddr, 192, 168, 1, 16); //设置网络接口的IP地址

IP4_ADDR(&netmask, 255, 255, 255, 0) //子网掩码

IP4_ADDR(&gw, 192, 168, 1, 1); //网关

将网卡的静态IP地址为192.168.1.16,通过Ping指令发送16个数据包

ping 192.168.1.16 -n 16

测试结果如图5-1所示

?

切换为居中

添加图片注释,不超过 140 字(可选)

图5-1 LWIP ping测试

5.3.2 花生棒测试

把花生棒插入到路由器中,等待数秒后,在浏览器中打开花生棒后台管理软件,利用花生棒后台提供的UUID进行登录。登录成功后选择内网映射,把192.168.1.16进行映射,会得到花生棒后台管理软件提供的一个主机名,Ping这个主机名测试映射是否成功。测试结果如图5-2所示。

?

切换为居中

添加图片注释,不超过 140 字(可选)

图5-2 ping花生壳映射的主机名

如果出现以上的情况,就代表映射成功。

5.3.3 Android主控测试

将花生棒后台分配的主机名和端口号,在Android应用的登录页面中输入后点击登录按钮,进入主控页面。点击打开LED1按钮,微处理器系统中的LED1会被打开,主控页面的LED1的状态变为打开状态,效果图如图5-3所示。

?

添加图片注释,不超过 140 字(可选)

5-3 打开LED1效果图

5.4 本章小结

本章首先对测试的目的和环境进行了详细描述,接着对界面和主要功能模块进行了测试分析,利用软件测试的方法对所做程序里的相关界面进行了相应的验证操作。

只有经过不断地测试,才能检验出自己的成果,才能更好的完成自己的设计。每次做完一个小功能,都要进行详细的测试,确保无误。当多个小功能做完,组合成一个大功能时,再进行测试。直到整个系统实现后,再进行系统的测试,以确保完成预定功能。

结 论

本课题基本完成了基于STM32和Android的智能家居系统。通过使用Android手机在任何有互联网的地方都可以控制微处理器系统中的LED(模拟电灯),继电器(模拟电器设备),步进电机(模拟门窗)。如果应用于生活中,可以大大的提高人们的生活水平和生活乐趣。并且该系统Android客户端操作直观,让对智能设备不熟悉的用户也可以很容易的上手操作。

在该项目中,通过了NAT技术,实现了外网对内网中的微处理器的控制。并且使用了硬件花生棒,大大降低了NAT映射的成功,实现了只要有路由器和交换机就能实现端口映射。

Android客户端和微处理器系统的通信使用了Socket技术。微处理器系统作为服务器端,可以接收客户端发来的请求,根据请求去执行相应的IO操作,然后将操作结果反馈给Android客户端。Android再根据微处理器的返回,展现不同的交互效果。

但是由于各种原因,该系统还有一些功能没有实现。如自动报警系统,智能监控系统。在以后自己能力可以达到的情况下,一定可会实现以上功能。

致 谢

经过三、四个月的学习和实践,毕业设计已接近尾声。由于个人能力和精力的有限,再加上经验的匮乏,不可避免的存在着一些考虑不周全的地方,如果没有常老师的指导和实验室同学的帮助与支持,想顺利完成本毕业设计是很困难的。

在系统功能设计与实现阶段,得到了同学的热心帮助和常老师的悉心指导,在多名同学和老师的帮助下才得以顺利完成基于STM32和Android的智能家居系统的源程序代码设计。再次向那些帮助过自己的同学们以及指导教师表示真诚的感谢。

在论文写作过程中,常国权老师及时的检验督促和耐心指导下论文才能够按时完成。再次向常国权老师致以最诚挚的谢意。

最后还要感谢安阳工学院计算机科学与信息工程学院全体老师和母校四年来对我的教育和培养。

参考文献

谭浩强.C程序设计教程[M].北京:清华大学出版社,2010.

刘火良. STM32库开发实战指南[M].北京:机械工业出版社,2013.

刘军.例说STM32[M].北京:北京航空航天大学出版社,2011.

邵超.嵌入式系统实验平台设计与实现[M].广州:华南师范大学,2006.

蒙博宇.STM32自学笔记[M].北京:北京航空航天大学出版社,2012.

谢希仁.计算机网络(第六版)[M].北京:电子工业出版社,2013.

兰少华.TCP/IP网络与协议[M].北京:清华大学出版社,2006.

宋岩.ARM Cortex-M3权威指南[M].北京:北京航空航天大学出版社,2009.

马志强.基于Android平台即时通信系统的设计与实现[D].北京交通大学,2009.

熊刚.基于Android的智能手机的设计与实现[D].武汉理工大学,2010 .

靳岩.姚尚朗.Android 开发入门与实践[D].人民邮电出版补,2009 .

杨丰盛.Android应用开发揭秘[D].机械工业出社,2010.

陈最.基于 Android 平台移动终端透明加密系统的研究与实现[D].重庆理工大学,2012.

柯元旦.Android 内核剖析[M].北京:电子工业出版社,2011.

李.刚.疯狂 Android 讲义[M].北京:电子工业出版社,2013.

马越.Android 的架构与应用[D].北京:中国地质大学,2008.

姚昱旻,刘卫国.Android 的架构与应用开发研究[J].计算机系统应用,2008.

高巍. Android 操作系统软件自动化测试方案的设计与实施[D].北京:北京邮电大学,2012.

孙剑. Android 系统上应用程序按需加载机制的设计与实现[M].北京大学,2011.

卢娜.基于 Android 平台的手机桌面资讯系统的设计与实现[M].西安电子科技大学,2011.

闹里有钱,静处安身。

基于STM32和Android的智能家居系统(论文+PPT+源码)

相关文章:

你感兴趣的文章:

标签云: