未来智讯 > 智能家居论文 > 基于安卓的智能家居控制系统的设计与实现

基于安卓的智能家居控制系统的设计与实现

发布时间:2017-12-07 09:30:00 文章来源:未来智讯    
    【关键字】安卓,智能家居
    引言
    随着移动互联网的技术逐渐成熟,为人们的生活、工作及学习带来了极大便利的同时,也为物联网的发展带来崭新的机遇。特别是智能手机与移动通信业务的快速发展,为物联网的实现提供了成熟的平台。人们可以利用通用的智能手机在任何时间、任意地点远程控制着家中的任意电器。如果你觉得,晚上站在家门口找电灯开关很费劲,请拿出你的手机打开你的电灯开关。如果你认为烧开水需要花很长时间,而你又不想苦苦等待,请拿出你的手机打开热水器的开关。如果你厌烦了烧饭的话,也请拿出你的手机,让它帮助你解决烦恼。这就是数字化智能家居控制系统为我们带来的福利。另外,如果你是一个孝子,但是却无法陪伴在老人身边,你可以利用手机控制远程视频,让老人看到你。同时智能家居拥有的报警、远程监控等功能,在出现险情时能够第一时间获得消息,从而采取进一步行动。由此可见智能家居是移动互联的产物,是时代发展的必要趋势,是现代化社会进步的标志。
    1控制系统整体设计
    该智能家居控制系统的整体结构如图1-1所示。本系统包括android手机端的智能家居控制系统客户端,中心控制单片机服务器,以及各个电器的WIFI接收终端模块。程序设计包括基于安卓的智能家居系统控制软件,以及通过WIFI传输过程中用户协议的制定。该android客户端程序采用JAVA语言编写,老人通过触摸手机/平板电脑上的按钮进行操作可以控制连接在家庭网关上的电灯、窗帘等设备的开关,老人安全如厕检测的红外设备,智能床的翻转设备。若检测到老人处于危险状态下,可以利用平板电脑中的GSM短信模块为固定的号码发送报警信息,让子女第一时间了解到老人的状态。
    
    2通信协议设计
    2.1通信协议简介
    通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。在系统中的通信协议是指手机客户端与中控服务器间的规则。系统中的协议工作方式如下:用户通过软件客户端的触摸发送相应电器控制命令,经过无线信道(WIFI)的传输,中控服务器接收到控制命令,对命令中的关键字进行识别后将命令发送给对应的的电器控制端,达到控制功能,电器工作完成后,将返回的响应命令传送给服务器,进而传送给软件客户端,把结果显示在UI上。至此完成整个协议的通信过程。
    2.2通信协议总览
    本通信协议是由8Byte的16进制数据构成,该协议是由状态标志字(Sta),数据标志字(Tid),发送标志字(Sed),操作代码位(Opt),电器标志字(ID),数据校验位(Sum)等六部分构成。其格式为: <Sta><Tid><Sed><Opt><ID><Sum>。其字段含义、长度及定义等详细信息如表2-1所示。
    
    2.3通信协议详解
    2.3.1电灯控制协议
    电灯协议实现的功能为控制电灯单开和全开,只需改变操作码中对应的电灯(此处只有3个电灯),每次控制成功与否都将返回响应数据,将电灯的状态显示在软件的UI上,详细协议列表如表2-2所示。
    2.3.2如厕检测协议
    如厕检测协议主要接收红外监控设备发送的协议命令,并对数据进行解析识别,并显示在对应的灯泡上。刚进入厕所会经过红外设备1再经过红外设备2,此时两盏灯泡在手机UI上亮起,并计时,超过指定时间将通过平板电脑发送报警信息。出厕所时会先经过红外设备2再经过设备1,此时计时停止并重置。详细的协议如表2-3所示。
    2.3.3窗帘控制协议
    窗帘控制协议主要控制窗帘上升、下降、停止的功能,利用软件的三个按钮点击可发送相应命令,同时接收返回的数据响应,将状态显示在UI界面上。 详细的协议如表2-4所示。
    
    
    2.3.4智能床控制协议
    智能床控制协议主要控制智能床的翻转功能,主要通过软件的切换模式实现,软件上有两个按钮,分别为普通模式和睡眠模式,在睡眠模式下进行智能床翻转的控制,进入睡眠模式后,软件检测智能床的状态,如果一段时间智能床没有发送响应命令,软件将发送智能床的翻转指令,指令包括:开启睡眠模式、开启普通模式、左右翻身、左右翻身停止、左右放平等。通过智能床的护理功能可以帮助老人在睡觉的时候避免同一姿势保持时间太长导致的疾病。智能床控制协议详细信息如表2-5所示。
    
    3.安卓控制系统设计
    3.1安卓设计流程图
    安卓程序设计流程图如图3-1所示。首先是通过TCP/IP连接中控服务器端,需增加IP及端口的编辑功能,线程的初始化需要对线程进行开发,线程初始化完毕等待用户操作,用户需要交互则需设计UI,用户触摸相应开关按钮,则打包相应的命令,通过已连接的IP传送到服务器对应端口完成控制,之后接收响应命令,对命令进行解析,解析完成再进行软件UI的更新,等待用户的下一次操作。
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

         
    3.2安卓程序客户端设计
    3.2.1客户端设计简介
    安卓客户端采用java语言编写,运行于android 2.2及以上版本。
    该软件针对老人特别对页面进行单页化设计,字体放大设计,方便老人的操作与查看。软件实现了电灯的单开与全开功能,窗帘的上升、下降控制功能,如厕安全检测功能,智能床模式控制、翻转控制功能。软件在设计过程中加入线程机制,每次触摸屏幕发送指令时都将要开辟新的线程,这样保证了程序指令在传输过程的可靠性,网络连接使用TCP协议也是为了提高程序的可靠性。
    3.2.2客户端设计分析
    按照程序的设计流程,我们将对主要模块功能进行设计,其中包括IP及端口的连接、线程开辟与处理、命令的打包与解析、UI界面更新四部分。客户端界面如图3-2所示
    
    
    1、IP及端口连接
    在服务器与客户端之间需要建立一种联系通道,在本系统中需要利用TCP/IP协议,经过无线电磁播传输介质建立连接,此连接非常稳定不易丢失,确保连接稳定性。TCP的连接有一个特点就是在同一时间同一线程不能建立一个以上的连接,因此建立连接之前需要对Socket连接进行判断是否之前有建立,接着将端口和地址转换为系统识别的形式,并尝试连接,同时建立线程,阅读传送的数据。因此实现该主要功能代码片段为:
     if(socket.isClosed()) socket=new Socket();
    SocketAddress remoteAddr=new InetSocketAddress(ip,port);
    socket.connect(remoteAddr, 2000);
    socket=new Socket();
    this.readThread=new ReadThread(hOptMsg, sData,socket);
     readThread.start();
    代码中主要调用的是系统自带Socket类的功能,阅读线程涉及到用户自定义的ReadThread类的功能,该类中涉及到响应过程中数据命令的解析。
    2、线程开辟与处理
    线程是配合主线程,能够在不堵塞UI主线程的情况下,实现数据传送与处理功能的。本系统中开启线程后等待用户选择指令,指令发送完毕后又进行响应数据的接收和处理。实现该主要功能代码片段为:
     ReadThread构造方法:
     public ReadThread(HandleMsg hmsg,byte[] sData,Socket socket) {    hOptMsg=hmsg;
    this.sData=sData;
    this.socket=socket;}
     连接时开启线程:
    this.readThread=new ReadThread(hOptMsg, sData,socket);
     readThread.start();
     线程中的数据处理:
     while(state)
    {rlRead=socket.getInputStream().read(sData);//从输入流中读取数据
    if(rlRead>0)
    {unpackageCmd(sData,rlRead);//解开接收到的数据命令}
    else {   state=false;     hOptMsg.sendEmptyMessage(DataProcess.CLOSETCP);//HandleMassage
    break;  }
     }
    在代码中通过线程的处理可以有效地解决响应的数据的处理,只要连接是处于连接状态,即state=1,则一直读取输入流中的数据,从而实现数据处理。
    3、命令打包与解析
    通过命令的封装,并加入检验机制可以有效地检测传送的数据和接受数据的有效性,增加了数据的可靠性。打包时并非简单的协议罗列而是在用户单击按钮时,对应id控件将自身信息传送给打包命令的方法,执行该方法后可以获得更加有效的指令字符串,每次打包时的头部数据为0x55。解析数据时对数据头部进行识别,为0x22为响应数据,在进行数据解析再进行下一步操作。实现该主要功能代码片段为:
    打包代码:
     byte[] cmd=new byte[]{0x55,0x01,0x01,0,0,0,0,0};
     if(id==9)
    { cmd[2]=0;   }
    else if(id==0)//全开电灯
    { cmd[3]=opt;    cmd[4]=opt;   cmd[5]=opt;   cmd[6]=0x01;   }
    else if(id==4||id==5||id==6)
    {   cmd[6]=0x03;   cmd[id-1]=opt;
    }else if(id==7||id==8)
    { cmd[6]=0x04; cmd[id-4]=opt;
    }else if(id<4&&id>0)
    { cmd[2+id]=opt; cmd[6]=0x01; }
          cmd[7]=(byte)(cmd[0]+cmd[1]+cmd[2]+cmd[3]+cmd[4]+cmd[5]+cmd[6]);
     数据解析代码片段:
    if(cmd[i]==sum)
    { if(hOptMsg==null) return;
    Message msg=new Message();
     msg.what=DataProcess.RELAYSTATE; msg.arg1=cmd[i-1]*1000+cmd[i-2]*100+cmd[i-3]*10+cmd[i-4]; hOptMsg.sendMessage(msg); }
    在代码中打包和解析数据中包含了多种语句,包括循环语句、选择语句等,简单的逻辑可以实现强大的功能,这是算法的重要性。
    4、UI更新
    本系统为UI界面定义了UIProcess类,专门用于UI的更新使用,利用msg.what与msg.arg1实现解析出数据数组的子线程与UIProcess类之间的数据传送。由于msg.arg1传送的数据为整形,则需通过简单计算将数据进行分组。实现该主要功能代码片段为:
     state_l[3]=(byte)(state/1000);
    state_l[2]=(byte)((state%1000)/100);
    state_l[1]=(byte)((state%100)/10);
    state_l[0]=(byte)(state%10);
     setOpt(state_l);
    更新UI代码片段:
     public void setOpt(byte[] state)
    {   byte id=state[3];
    if(id==0x01)//开灯的反馈
    { setRelayOnoff(im1,state[0]);
    setRelayOnoff(im2,state[1]);
     setRelayOnoff(im3,state[2]);
     }
    else if(id==0x02)//如厕的反馈
        {  …….  }
     else if(id==0x03)//窗帘的反馈
        {  …….  }
             …….
     }
    在该段代码中,实现了主要的控制设备的界面更新,特别是如厕控制先进入红外设备1后进入红外设备2开启计时,出来时先进入红外设备2再进入红外设备1取消计时的功能及代码较为复杂,可以完成如厕检测的功能。
    4小结
    经试验证明通过安卓客户端连接中控服务器端,在人机交互的过程中可以很好的传输命令,可以控制电灯单开与多开、窗帘的升降,可以实现如厕计时,智能床的翻转等功能。
    该项目的优点如下:
     (1)软件采用单界面化设计,方便老人的操作。
     (2)软件添加如厕报警装置,有效防止如厕时老人发生危险的几率。
     (3)软件采用 Android 平台,较为通用,具有稳定,高效,快速的特点。
     (4)软件通过 Wifi 为家用电器发送各种指令由单片机接收指令进行控制,节约了成本。
    参考文献:
    [1]林城.Android2.3应用开发实战[J].机械工业出版社,2011:17-321.
    [2]韩超.Android经典应用程序开发[J].人力资源出版社,2011:5-18.
转载请注明来源。原文地址:https://www.7428.cn/page/2017/1207/9441/
 与本篇相关的热门内容: