智能家居物联网监测系统.docx
《智能家居物联网监测系统.docx》由会员分享,可在线阅读,更多相关《智能家居物联网监测系统.docx(19页珍藏版)》请在冰豆网上搜索。
智能家居物联网监测系统
智能家居物联网交互系统
DomesticIntelligentMonitoring SystemBasedonIOT
摘要
基于物联网技术实现家庭环境参数及图像远程监视,并可对家用电器等实现远程控制。
系统由家庭终端、服务器、用户终端三部分构成,家庭终端采用CC3200单片无线MCU通过各种传感器完成图像以及其他环境参数的采集并上传服务器,服务器采用开放物联网平台Yeelink完成数据的存储及管理,用户终端可通过网络访问服务器获得需要的数据或者对可控制家用电器实现控制。
关键字:
物联网,CC3200,Yeelink
Abstrcact
Thesystems,basedontheInternetofthingstechnology,achievehomeenvironmentparametersandimageremotemonitoring,andcanbeusedtoremotecontrolofhouseholdappliances.Systemconsistsofthreeparts.Thehometerminal,usingcc3200Single-ChipWirelessMCUthroughavarietyofsensors,acquiretheimageandotherenvironmentalparametersanduploadthemtoserver.Theserver,openplatformfortheInternetofthingsyeelink,areusedtodatastorageandmanagement.Userscanaccessserverthroughthenetworktomonitordataortocontrolhouseholdappliance.
Keywords:
internetofthing,CC3200,Yeelink
目录
1作品难点与创新5
2方案论证与设计6
2.1家庭终端6
2.2服务器6
2.3用户终端7
3原理分析与硬件电路图7
3.1原理分析7
3.2硬件设计8
3.2.1摄像头模块9
3.2.2音频9
3.2.3红外10
3.2.4其他传感器10
4软件设计与流程10
4.1程序流程10
4.2核心函数11
4.2.1yeelink_post函数11
4.2.2yeelink_post_pic函数11
4.2.3yeelink_get函数11
4.3关键代码12
4.3.1yeelink_post12
4.3.2yeelink_post_pic15
4.3.3yeelink_get19
5系统测试与误差分析23
5.1温度曲线23
5.2图像监视23
6总结24
参考文献25
1作品难点与创新
物联网技术是当今国家大力发展的一项技术,也是当今国内外研究的重点。
目前基于物联网的各种应用层出不穷,人们也都迫切的希望物联网技术能像计算机技术、互联网技术那样带来一种全新的体验。
物联网应用于家居智能化更是当前经济和社会发展的一个亮点。
本文选取了当前人们比较关心的基于物联网技术的家庭智能监测系统进行研究,探索开发物联网技术在家庭智能监控系统领域的具体应用。
本论文以“基于物联网家庭智能监控系统”为题,从于基于物联网的家居监控系统架构设计入手,着眼于研究家庭用户通过电脑、手机等对家庭的图像监控和家电控制的通用技术,并实现一个基于物联网的家居监控系统。
论文研究对于促进测控学科的发展及实际应用、推广物联网技术、发展物联网学科、改善家居智能化具有重要意义。
本文给出了系统的整体设计方案,对系统的软硬件方面进行了详细设计。
经实物系统的软硬联调测试表明:
系统能实现环境监测和图像监视并对危险情况进行报警,远程用户可以利用移动终端设备或PC机进行远程图像监视,系统智能化、数字化程度高,用户交互性好。
2方案论证与设计
本系统由家庭终端、服务器、用户终端三部分构成
2.1家庭终端
家庭终端完成各环境参数和摄像头的数据采集,并将数据上传至服务器。
所以核心MCU需要具备接口丰富,编程开发环境简单易用,功耗低以及具备网络通信能力等特性。
有以下两种方案可供选择。
方案一:
MSP430MCU扩展有线网络控制器芯片或 Wi-Fi控制器芯片
方案二:
CC3200单片无线MCU
方案比较:
方案一低功耗控制灵活,首先在功耗上有优势,其次MSP430为TI经典产品,多年前就在市场上应用广泛,开发资源丰富。
如果采用有线网络传输数据,对终端设备的安装要求比较高,需要布线,安装位置受一定限时,安装成本也比较高。
无论采用那种扩展芯片,均会造成硬件电路设计复杂,调试困难,如果大批量生产,硬件成品率低。
方案二采用是TI无线连接SimpleLinkWi-Fi和物联网(IoT)解决方案最新推出的一款单片无线MCUCC3200,是业界第一个具有内置Wi-Fi的MCU,是针对物联网应用、集成高性能ARMCortex-M4的无线MCU。
CC3200包括应用MCU、Wi-Fi网络处理器和电源管理3大部分。
除开发资源较少外,CC3200非常于适合本设计使用。
综合整体需求,本系统采用方案二。
2.2服务器
服务器主要完成接收家庭终端采集来的数据,对数据进行存储和管理,以及接收来在监控用户终端的命令,完成相应数据的转发。
方案一:
自建服务器
方案二:
使用开放式物联网服务器平台
方案比较:
自建服务器功能灵活,可根据自己的特殊需要开发需要的功能,但存在技术门槛高,开发难度大,开发工作量大等问题。
Yeelink平台是一个开放的通用物联网平台,主要提供传感器数据的接入,存储和展现服务,为所有的开源软硬件爱好者、制造型企业,提供一个物联网项目的平台,使得硬件和制造业者能够在不关心服务器实现细节和运维的情况下,拥有交付物联网化的电子产品的能力。
结合本系统开发周期短以及Yeelink平台完全能满足现有功能需要的综合考虑,本系统采用Yeelink平台做为服务器。
2.3用户终端
用户终端实现数据的访问和远程控制功能。
方案一:
自己编写用户终端软件。
方案二:
使用平台提供终端软件。
由于技术瓶颈以及服务端采用开放的通用物联网平台Yeelink并且该平台也提供手机应用用户终端软件,本系统采用系统提供的终端软件。
3原理分析与硬件电路图
本章介绍了系统的总体结构并分析了实现原理,同时详细介绍了家庭终端的硬件设计。
3.1原理分析
系统示意图如图3-1所示。
图3-1系统示意图
本系统由家庭终端、服务器、用户终端三部分构成。
家庭终端通过Wi-Fi连接AP,通过AP连接Yeelink服务器80端口,通过TCP连接按照指定格式向Yeelink服务器发送数据报文,从而把本地数据上传到服务器。
发送查询报文,获得服务器返回的控制信息。
3.2硬件设计
本系统核心硬件为TI公司CC3200芯片,该芯片采用QFN封装并具有全集成射频及模拟功能电路,因此允许开发人员通过将器件直接布设在PCB上来创建一种低成本、紧凑的易用型系统。
硬件框图如图,3-2所示:
图3-2硬件框图
3.2.1摄像头模块
摄像头模块采用美光MT9D111200万像素CMOS图像传感器。
MT9D111是一种1/3英寸、200万像素的CMOS图像传感器,它自带有集成的先进相机系统。
此相机系统包含一个复杂的图像流处理器(IFP)、一个实时JPEG编码器、一个集成的微控制器、闪光支持、自动聚焦、光学缩放以及机械快门。
整个系统级芯片(SoC)可以在低照度条件下具备卓越的性能,同时功耗很低。
MT9D111可方便与CC3200的Camera接口连接。
3.2.2音频
音频部分核心器件为TLV320AIC3254,该芯片是德州仪器(TI)推出的高度集成的音频编解码器,可帮助领先消费类电子产品公司满足日益增长的消费需求,实现具有更高音频质量与更长电池使用寿命的功能丰富的低成本产品。
1.8V编解码器采用集成电源管理与双miniDSP音频处理引擎,可帮助设计人员降低整体音频解决方案成本,简化手机、便携式导航以及便携式媒体产品的高级音频特性设计流程。
3.2.3红外
采用PWM驱动红外发射管,发送控制指令,对可用红外遥控器控制的家用电器进行控制。
3.2.4其他传感器
模拟量输出传感器经过适当分压接入ADC接口,数字量传感器经过电平转换通过GPIO接入。
4软件设计与流程
软件开发采用IAR集成开发环境,采用C语言编程。
4.1程序流程
图4-1主程序流程图
主程序流程流程图如图4-1所示。
4.2核心函数
本小节介绍yeelink_post、yeelink_post_pic、yeelink_get三个核心函数。
4.2.1yeelink_post函数
函数原型:
charyeelink_post(constchar*device_id,constchar*sensors_id,floatvalue)
参数:
字符串类型设备ID,字符串类型传感器ID,浮点型数值。
返回值:
0
4.2.2yeelink_post_pic函数
函数原型:
charyeelink_post_pic(constchar*device_id,constchar*sensors_id,unsignedintlen,unsignedintHeaderLen,char*buf1,char*buf2)
参数:
字符串类型设备ID,字符串类型传感器ID,无符号整形图像文件长度,无符号整形图像头文件长度,图像文件数据指针,图像头数据指针。
返回值:
0
4.2.3yeelink_get函数
函数原型:
charyeelink_get(constchar*device_id,constchar*sensors_id,char*value)
参数:
字符串类型设备ID,字符串类型传感器ID,字符串指针类型数值。
返回值:
0
4.3关键代码
3个核心函数源代码如下:
4.3.1yeelink_post
charyeelink_post(constchar*device_id,constchar*sensors_id,floatvalue)
{
charremote_server[]="";
charstr_tmp[128]={0};
SlSockAddrIn_tsAddr;
intiAddrSize;
intiSockID;
intiStatus;
longlRetVal=-1;
//Http内容,表单内容
charhttp_content[32]={0};
sprintf(str_tmp,"/v1.0/device/%s/sensor/%s/datapoints",device_id,sensors_id);
//确定HTTP表单提交内容{"value":
20}
sprintf(http_content,"{\"value\":
%f}",value);
//确定HTTP请求首部
sprintf(http_request,"POST%sHTTP/1.1\r\n",str_tmp);
//增加属性例如Host:
\r\n
sprintf(str_tmp,"Host:
%s\r\n",remote_server);
strcat(http_request,str_tmp);
//增加密码例如APIKey:
d8a605daa5f4c8a3ad086151686dce64
sprintf(str_tmp,"U-ApiKey:
%s\r\n","6917ef67bfcb85fdcba24e2d6ea902bf");strcat(http_request,str_tmp);
//strcat(http_request,"Accept:
*/*\r\n");
//增加提交表单内容的长度例如Content-Length:
12\r\n
sprintf(str_tmp,"Content-Length:
%d\r\n",strlen(http_content));
strcat(http_request,str_tmp);
//增加表单编码格式Content-Type:
application/x-www-form-urlencoded\r\n
strcat(http_request,"Content-Type:
application/x-www-form-urlencoded\r\n");
strcat(http_request,"Connection:
keep-alive\r\n");
//HTTP首部和HTTP内容分隔部分
strcat(http_request,"\r\n");
//HTTP负载内容
strcat(http_request,http_content);
//GetexternalhostIPaddress
lRetVal=sl_NetAppDnsGetHostByName((signedchar*)HOST_NAME,sizeof(HOST_NAME),&g_ulDestinationIp,SL_AF_INET);
ASSERT_ON_ERROR(lRetVal);
//fillingtheTCPserversocketaddress
sAddr.sin_family=SL_AF_INET;
sAddr.sin_port=sl_Htons((unsignedshort)80);
sAddr.sin_addr.s_addr=sl_Htonl((unsignedint)g_ulDestinationIp);
iAddrSize=sizeof(SlSockAddrIn_t);
//creatingaTCPsocket
iSockID=sl_Socket(SL_AF_INET,SL_SOCK_STREAM,0);
if(iSockID<0)
{
ASSERT_ON_ERROR(TCP_CLIENT_FAILED);
}
//connectingtoTCPserver
iStatus=sl_Connect(iSockID,(SlSockAddr_t*)&sAddr,iAddrSize);
if(iStatus<0)
{
//error
ASSERT_ON_ERROR(sl_Close(iSockID));
ASSERT_ON_ERROR(TCP_CLIENT_FAILED);
}
else
{
Report("connectedtoTCPserversuccessfully\n\r");
Report("WirelessserialSTATIONconfiguresuccessfully\n\r");
}
//发送请求
iStatus=sl_Send(iSockID,(unsignedchar*)http_request,strlen(http_request),0);
if(iStatus!
=strlen(http_request))
{
Report("%d:
SocketSendError\r\n",iStatus);
while
(1);
}
//获得响应
iStatus=sl_Recv(iSockID,g_cBsdBuf,BUF_SIZE,0);
if(iStatus<=0)
{
//Report("iStatus=%d\n\r",iStatus);
}
else
{
UART_SEND_BUF((unsignedchar*)g_cBsdBuf,iStatus);
//iStatus=sl_Send(iSockID,g_cBsdBuf,iStatus,0);
}
//判断是否收到HTTPOK
sl_Close(iSockID);
return0;
}
4.3.2yeelink_post_pic
charyeelink_post_pic(constchar*device_id,constchar*sensors_id,unsignedintlen,unsignedintHeaderLen,char*buf1,char*buf2)
{
#defineHOST_NAME""
charremote_server[]="";
charstr_tmp[128]={0};
SlSockAddrIn_tsAddr;
intiAddrSize;
intiSockID;
intiStatus;
longlRetVal=-1;
sprintf(str_tmp,"/v1.1/device/%s/sensor/%s/datapoints",device_id,sensors_id);
//确定HTTP请求首部
sprintf(http_request,"POST%sHTTP/1.1\r\n",str_tmp);
strcat(http_request,"Accept:
application/json\r\n");
//增加表单编码格式
strcat(http_request,"Content-Type:
image/jpeg\r\n");
//增加密码例如APIKey:
d8a605daa5f4c8a3ad086151686dce64
sprintf(str_tmp,"U-ApiKey:
%s\r\n","6917ef67bfcb85fdcba24e2d6ea902bf");strcat(http_request,str_tmp);
//增加属性例如Host:
\r\n
sprintf(str_tmp,"Host:
%s\r\n",remote_server);
strcat(http_request,str_tmp);
//增加提交表单内容的长度例如Content-Length:
12\r\n
sprintf(str_tmp,"Content-Length:
%d\r\n",(len+HeaderLen));
//sprintf(str_tmp,"Content-Length:
%d\r\n",strlen(http_content));
strcat(http_request,str_tmp);
strcat(http_request,"Expect:
100-continue\r\n");
strcat(http_request,"Connection:
keep-alive\r\n");
//HTTP首部和HTTP内容分隔部分
strcat(http_request,"\r\n");
//HTTP负载内容
//strcat(http_request,http_content);
Report("%s",http_request);
//GetexternalhostIPaddress
lRetVal=sl_NetAppDnsGetHostByName((signedchar*)HOST_NAME,sizeof(HOST_NAME),&g_ulDestinationIp,SL_AF_INET);
//ASSERT_ON_ERROR(lRetVal);
//fillingtheTCPserversocketaddress
sAddr.sin_family=SL_AF_INET;
sAddr.sin_port=sl_Htons((unsignedshort)80);
sAddr.sin_addr.s_addr=sl_Htonl((unsignedint)g_ulDestinationIp);
iAddrSize=sizeof(SlSockAddrIn_t);
//creatingaTCPsocket
iSockID=sl_Socket(SL_AF_INET,SL_SOCK_STREAM,0);
if(iSockID<0)
{
ASSERT_ON_ERROR(TCP_CLIENT_FAILED);
}
//connectingtoTCPserver
iStatus=sl_Connect(iSockID,(SlSockAddr_t*)&sAddr,iAddrSize);
if(iStatus<0)
{
ASSERT_ON_ERROR(sl_Close(iSockID));
ASSERT_ON_ERROR(TCP_CLIENT_FAILED);
}
else
{
Report("connectedtoTCPserversuccessfully\n\r");
}
//发送请求
Report("strlen(http_request)=%dbytes\r\n",strlen(http_request));
iStatus=sl_Send(iSockID,(unsignedchar*)http_request,strlen(http_request),0);
if(iStatus!
=strlen(http_request))
{
Report("%d:
SocketSendError\r\n",iStatus);
}
//获得响应
iStatus=sl_Recv(iSockID,g_cBsdBuf,BUF_SIZE,0);
if(iStatus<=0)
else
{
UART_SEND_BUF((unsignedchar*)g_cBsdBuf,iStatus);
}
//循环发送数据
{
inti,loopcnt;
intremain;
loopcnt=len/1460;
remain=len%1460;
Report("len=%dloop=%dremain=%dbytes\r\n",len,loopcnt,remain);
//header
iStatus=sl_Send(iSockID,buf1,