第三章 系统的软件设计
3.1 RTX 内核
智能家居控制系统所需功能复杂,实时性要求高。多种事件可能同时出现,为了避免事件同时执行的紊乱,需要一个具有实时内核的嵌入式系统,来完成安排任务执行顺序的任务,实现智能家居控制系统的核心功能。 RTX 内核对系统资源的使用和调度非常自由,提供了各种任务之间的通信机制,它是一个实时操作系统。RTX 实时内核系统有两个重要的功能:通信管理和进程间通信。
进程管理:进程管理是对特定的进程的操作。包括进程的创建,进程的运行,进程的阻塞,进程的删除等操作,而且要设置每个队列的进程的优先级,实现进程切换调度。在 RTX 实时内核中使用函数 os_tsk_create(roc,lev)完成对名为 proc 任务的创建,lev 表示任务执行的优先级。在创建进程后,进程通常分为三种状态,也就是就绪状态,执行状态和阻塞状态。在进程调度过程中,每一个等待运行的进程,都位于进程就绪队列中的,当系统资源空闲时,优先级最高的进程将被取出开始执行。可以使用 os_sk_delete_self()函数将不再需要执行的进程删除。
进程间通信:进程间的通信主要有进程的同步,对共享资源的管理,以及进程之间消息的传递。RTX 具备信号量、互斥量、事件标志、信箱等机制,可以满足进程间的通信要求。
3.2 系统软件设计
对于开发智能家居控制系统来说,使用实时内核的嵌入式系统是非常必要的。由于多个事件发生时,必须运行多个任务进行支持。并且任务和任务之间切换时,需要实时内核来进行处理。智能家居控制系统的功能根据需求划分为基于 RS-485 总线的物联网通讯模块,以太网远程控制模块,基于 GPRS 的报警控制模块和人机交互模块共四个模块。
1. 基于 RS-485 总线的物联网通信模块
RS-485 总线通信模块负责 RS-485 总线接入设备和 ARM 处理器之间的通讯任务。
ARM 处理器通过检测电路,以确定所述接入设备的生命周期中。同时有序的轮询总线上家用电器的运行状态,通过发送一个查询或控制命令来监视或控制设备的运行。并接收任何一台家用设备的反馈信息。主要的任务分类包括:接入设备检测任务,接受任务总线,总线发送任务。
2. 以太网远程控制模块
以太网远程控制模块负责接收用户从互联网发送的控制命令,用户实现对智能家居远程控制。在使用时,我们必须首先验证用户是否有权限来控制家居系统,如果系统收到了正确的用户控制指令,ARM 处理器将通过 RS-485 总线直接向相应的智能家电发送控制命令进行控制。主要的任务包括以太网数据传输的发送任务和以太网数据接收任务。
3. 基于 GPRS 的报警和控制模块
GPRS 的报警和控制模块负责接收智能家居中安防报警系统的各种报警信息并发送故障报告到用户的手机。此外,用户可以远程查询和控制家居设备的运行状态。其远程控制功能和以太网控制功能相同,当系统接收到用户控制短消息后,ARM 处理器将通过 RS-485 总线直接向相应的智能家电发送控制命令进行控制。主要的任务包括短消息发送任务和短消息接收任务。
4. 人机交互模块
控制系统要查账与用户之间进行数据通信,必须经过人机交互模块做为桥梁才能完成。用户可以设置系统参数,包括工作模式的设置,报警号码的权限设置等等。主要的任务包括液晶屏菜单显示任务、按键处理任务和语音提示任务。
3.3 通信控制协议的设计
3.3.1 RS-485 通信控制协议
1. 家居设备的即插即用通信协议
按照统一设备编号UDS对智能家电进行编码,UDS长度3个字节,不同智能家电具有不同的电气设备号。系统家庭网络设备地址分为2个字节,即网络设备ID。第一个字节代表一级地址,其中的2个位用于区分设备的种类;第二字节代表二级地址。为了方便访问控制终端能够对每个设备进行查询和控制,将每个电器和控制终端连接。控制终端为每台设备以自动方式或者手动方式分配物联网的ID,从而使每一个家居设备都有一个唯一的编号,实现远程访问该设备的目的。编码方法是:当一个新的装置连接的智能控制终端,为保留的家庭网络设备地址分配统一的设备序列号,这样就可以实现物联网设备ID与设备序列号UDS的转换。考虑到家庭网络的一级地址保留位是bit2到bit7,可以将二级地址用来表示家用电器的编号,通过一级地址编码可以区分设备类型。UDS结构定义:bit0-bit7表示设备编号, bit8-bit20表示厂商号, bit21-bit23表示版本号。
2. RS-485总线主从机通信协议
总线中主从机通信的数据帧格式是这样定义的,数据帧组成包括帧头、设备地址、命令(功能)、数据长度、数据、校验和帧尾等字段。其格式为帧头占 1 个字节、设备地址占 1 个字节、命令(功能)占 1 个字节、数据长度占 1 个字节、数据占 N 个字节、校验和帧尾各占 1 个字节。
系统采用可靠的连接方式。主机每一次询问从机时,都要使用“握手”机制。主机先向从机发送握手信号,如果从机在线,则从机向主机回发应答信号。从而在主机和从机之间建立起可靠的连接,然后就可以安全地交换数据。交换数据结束后,再依次询问下一个从机。只有当主机询问某从机时,该从机才给予应答。这种机制可以避免没有次序的数据通信对整个总线网络数据传输的扰乱主机发送给从机的数据帧的帧格式如下:
由主机发送给从机的数据帧,根据用途主要分为以下两种类型:
查询类型:主机通过发送此类型的数据帧,检测从机是否在线。从机如果在线,主机就能够获取到从机目前的运行参数。
控制类型:主机通过发送此类型的数据帧,可以家用电器进行档位的设定,控制该家用电器的开关。如表3.1所示主机发送给从机的数据帧中,包括查询型数据帧和控制型数据帧。与此同时,当主机向从机发送命令帧时,从机如果在线,从机需要给出应答。
如表3.2所示从机回复给主机的数据帧的内容。
3.3.2 GPRS 报警和控制协议设计
在 GPRS 报警和控制任务的设计中用到了 GPRS 的短消息服务功能,进行文本和数字信息的传送。设计的关键是在嵌入式系统中如何实现短消息的发送和接收,关于短消息的编辑过程详细表述如下。
根据短消息的内容,将短消息分为基于 PDU 格式的中文短消息和非中文短消息。
基于 PDU 格式的中文短消息其内容包含汉字。对于没有汉字内容的非中文短消息,需要使用纯英文短消息的编码。 GPRS 模块集成了 AT 命令集,通过控制 AT 命令集实现模块参数设置,实现了 ARM 处理器和无线模块之间的通信。在嵌入式系统中使用短消息功能,需要了解的消息的格式。
(1)ARM 处理器与 GPRS 模块的通信协议
1、ARM 处理器与GPRS 模块的通信协议
发送短消息的字符串格式包括:SCA、PDUType、MR、DA、PID、DCS、VP、UDL 和UD。短消息接收的字符串格式包括:SCA、PDUType、OA、PID、DCS、SCTS、UDL 和UD。SCA是一个短消息服务中心地址,包括短消息服务中心地址字节长度为len,类型1字节的短消息中心,和11的短消息服务中心地址字节地址。长度是短消息服务中心地址(91)+(683108200505f0)的长度,甚至位数的电话号码的短缺在回填土的“F”,然后翻转奇偶校验位的数目;在短消息中心地址的类型,91是最用的,在号码前加上“+”符号。pdutype是PDU的类型,占一个字节。他是信息参考,在正常情况下是00。DA是收件人的地址,Oa发件人地址,它们的格式与短消息服务中心地址SCA相同。对短消息的标准的情况下,PID签署协议,简单的PID 00。DCS是一个短消息内容的数据编码方案。
分为7位编码,8位编码和USC2编码的短消息内容编码。半在英语(非中文短消息)短信息7bit编码,和中文短消息内容需要USC2编码。VP是有效的信息。交易时间戳服务中心,占地七多组。UDL用户数据的长度,数量通常表示的短消息内容进行编码后的字符串。
基于PDU模式的中文短消息发送与接收。在USC2 编码标准中,中文汉字的编码占用2 个字节,因此在中英文混合的短消息的编码时,需要使用基于PDU 模式的短消息编码方式。下面具体说明短消息的中文编码过程。
发送短消息的内容由用户定义,例如内容为“ 智能家居”, 短消息中心地址号码是事先在系统中设置的,假设是 8613843155031,对方号码假设是 8613543421121。
具体的编码过程如表 3.3 所示。
因此,消息的编码后的内容,并结合 PDU 串应该是:08 00 08 66 7A 80 FD 5B B65C 45 08 91 68 31 08 11 00 0D 91 68 5129 22 50 20 02 05 F0 92 F2 00。按照PDU 编码的规定,UCS2 编码采用的是 16 个字节的编码。在本文中的嵌入式系统没有UCS2 编码的 API 函数,它只能通过查表法获得。将要发送的短消息的内容预先编码,将编辑好的编码串存放在系统内存中。
对于短消息的接收和短消息发送与短消息内容的编码类似。
以下是常用的 AT 命令:
AT+CMGF 设置短消息息的格式,0 设置为 PDU 格式,1 设置为 TEXT 格式。
AT+CSCA 设置短消息息的服务中心号码
AT+CNMI 将新短消息息显示到 TE 终端
AT+CMGL 查询模块中的短消息
AT+CMGR 读取指定编号的的短消息
AT+CMGD 删除指定编号的短消息
AT+CMGS 发送短消息
AT+CSQ 获取信号强度
(2)智能家居控制系统和用户的通信协议
智能家居控制系统和用户的通信需要有相应有通信协议才能实现彼此通信,因此需求在用户和系统之间制定相应的短消息通信协议。
本文中制定的短消息通信协议根据短消息内容分为三类短消息:报警类短消息、查询类短消息和控制类短消息。
报警类短消息是由智能家居控制终端发向特定用户的短消息,该用户的手机号码需要事先授权,保存在系统的外部存储器中。当智能家居控制系统检测到某个家居设备出现故障或者家庭出现险情,会立刻向用户发送具体的报警信息。报警类短消息的格式如表3.4所示。
查询类短消息是由已授权的用户直接向智能家居控制终端发送的,用来查询智能家居中特定电器运行状态是否正常,并能够获取该电器的运行参数。查询类短消息的格式如表3.5所示。
控制类短消息是实现用户对智能设备的远程控制,包括设置特定智能电器的运行档位和控制该电器的运行状态。控制类短消息的格式如表3.6所示。
需要注意的是,系统收到用户信息,首先要判断该用户号码是否已经授权,如果用户号码没有权限,则系统将该信息删除,以防止垃圾信息的骚扰。
3.4 主要模块的程序设计
3.4.1 RS-485 总线程序设计
主机(嵌入式微处理器)轮询 RS-485 总线上接入的每个智能设备是否都在正常运转,检测电路确定哪个设备 ID 是处于联机状态,然后得到一个访问智能设备缓冲区Address[255] ,如果地址线 3 为智能设备,则该缓冲器的地址[3]设定为 1 ,设备地址所有值为 0 的表示智能设备被移除。主机始终处于轮询从机,实时检测各从机的工作状态。当系统接收用户的查询或控制命令时,主机建立与从机握手机制,然后发送一个查询或控制命令给从机并进行处理。主机发送给从机的命令,不会会循环等从机的答复。如果连续三次得不到从的的答复,则系统认为该设备已被移除,同时修改该设备的缓冲器中的对应值。如果总线通讯被禁用,则主机停止轮询工作。主机轮询从机的工作流程如图 3.1 所示。
从机(每个接入的智能家电)始终处于数据接收状态,当接收到主机命令帧,首先确定命令帧是否数据正确,正确则与主机建立握手机制。同时分析该帧是控制命令还是查询命令。如果是控制指令,那么从机将反馈指令执行后的信息。如果查询指令,从机发送在线答复。从机应答的工作流程如图 3.2 所示。
3.4.2 以太网远程监控程序设计
该系统采用以太网的智能家居网络监控设备,以太网模块与 ARM 处理器相连,处理器做以太网服务器。为了实现智能家居控制终端可自动将查询结果和控制结果反馈给用户,接收用户远程的查询请求和控制命令,需要对以太网模块进行程序设计,主要包括以太网控制器的初始化,发送和接收数据的操作。
1. 初始化 dp83848i 以太网模块
主要工作是初始化以太网模块复位,PHY 和 MAC 的初始化、数据的发送和接收。
2. 微处理器通过以太网模块接收用户数据
嵌入式 ARM 微处理器通过 I/O 端口 4,以及以太网通信模块实现对数据的交换。接收微处理器数据自动存储在接收缓冲器中 rx_databuffer,程序分析读入缓冲区中的数据,了解用户指令的类型,然后做出相应的处理。
3. 通过以太网模块微处器将答复数据发送给用户
向用户发送数据,和接收用户数据类似,以太网模块将数据帧打包成数据包的形式存储在发送缓冲区 TX_DataBuffer,然后使用命令寄存器发送数据包。发送成功后,通过检测状态寄存器状态的相应位来判断数据包是否是准确。如果该数据包传输失败,系统应该重新发送数据包。与此同时,系统应该能够检测到传输信道是否被禁用,使用命令寄存器中的TxEnable位置设启用传输通道。DP83848I接收数据的流程如图3.3所示。
DP83848I 发送数据时,首先检测是否发送描述符数组已满,如果不满,将等发数据写入 到发送 描述 符指向的发送缓冲区并设置传输描述符的控制字更新RxProduceIndex,通过设置控制寄存器中 TxEnable 位启动 DMA 开始发送数据包。I 当数据发送完毕,触发中断;如果数据传输失败,则程序执行重发操作。如果数据连续三次发送仍然在未能发送,数据包被丢弃通并知系统发送失败,并要求系统复位以太网模块。 DP83848I 发送数据的流程如图 3.4 所示。
3.4.3 GPRS 短消息程序设计
GPRS 模块集成了 AT 命令集,通过控制 AT 命令集来实现模块参数设置,实现了 ARM处理器和无线模块之间的通信。在 GPRS 远程数据通信的过程中,主要是通过串口通信,使用 UART1 串口间接实现用户短消息和智能家居控制系统处理中心的通信。达到对智能家居设备 “直接”控制的目的。在嵌入式系统中,短消息发送过程是:通过 AT 命令 AT+CMGF= 0 设置无线通信模块为 PDU 模式下的工作模式,用 CMGS 命令发送短消息指令到 GPRS 无线通信模块,需要将结合串总字节数卸载 CMGS 命令后的,等待 GPRS模块相应的信息“>”表示无线模块正在等待用户发送用户组合串(用户内容经过编码后的数据串),短消息最后发送终结的命令是使用十六进制的“0x1A”,来通知无线通信模块将短消息发送出去。
短消息的接收过程:通过UART1中断来完成接收短消息,只要嵌入式微处理器串口检测到接收字符串信息,可以进入串口中断。通过字符串“+CMTI: "SM",N”的匹配来确定一个新的消息的到达。其中N代表新短消息到达的编号。 通过指令CMGR读取指定编号短消息,如果SIM卡上有这条短消息, GPRS模块将返回此短消息的详细息到串行端口。由于GPRS无线模块信号缘故或数据通信忙,也可能收到很多短消息。此时,可以通过CMGL指令列出未读短消息,让智能家居控制系统处理这些短消息。但GPRS无线模块的信箱毕竟有限,需要定期删除短消息。因此,读取并处理完这条短消息后,可以使用CMGD指令删除这条短消息。GPRS 报警控制模块的短消息任务工作流程如图3.5所示。
3.4.4 外部中断
智能家居控制系统的外部中断是嵌入式系统外部设备发出的中断请求,系统中主要是按键中断。用户通过外部中断处理,实现对系统参数设置和环境模式的设置。本文中的控制系统是先去除按键的抖动,再检测 I/O 管脚电平的高低变化来判断的。当检测到外部按键中断信号时,智能家居控制系统就执行外部中断服务程序,响应用户的按键处理[6]。并通知 LcdRsk 任务和 RS-485 任务来分别进行改变菜单和控制智能设备。
3.5 本章小结
本章主要实现了系统软件部分的设计。在设计的过程中,对 RS-485 和 GPRS 的通信协议进行了详细的设计和表述。同时就系统主要功能的工作流程做了说明。