智能家居系统设计与实现66

上传人:痛*** 文档编号:128567543 上传时间:2022-08-01 格式:DOCX 页数:66 大小:820.70KB
返回 下载 相关 举报
智能家居系统设计与实现66_第1页
第1页 / 共66页
智能家居系统设计与实现66_第2页
第2页 / 共66页
智能家居系统设计与实现66_第3页
第3页 / 共66页
点击查看更多>>
资源描述
论文关键词:智能家居嵌入式系统Windows CEVisual C+Delphi论文摘要:本文讨论了基于Windows CE.net 5.0嵌入式操作系统,以使用Intel XScale270为CPU的ARM10嵌入式实验箱为硬件基础,以Visual Studio 2005和Delphi为软件开发平台的智能家居系统的设计与实现。通过详细的系统设计过程,开发了相应的软件程序,包括嵌入式操作系统Windows CE 5.0的定制、应用程序的界面设计、程序开发和单片机系统的底层编程。本设计融合了嵌入式系统、通讯、单片机、软件开发等学科的知识。系统测试结果表明,该系统设计基本满足要求,并有一定的功能扩展空间。1 绪论目前,科学技术发展迅速,借助飞速发展的网络和信息技术,人们可以足不出户地纵览全球。为了适应信息化的需求,科研机构将智能化的理念引入小区管理,并进一步引入家庭,从而产生了智能家居的概念。将手机通信和以太网通信技术引入智能家居的设计,恰好利用了现有的良好的通信条件,使在外的业主能及时了解家中的安全,提高业主的安全感,而且通过手机实时控制家电,提高了业主生活的舒适度。本文提出了基于嵌入式系统ARM10的智能控制平台的设计,功能包括了短信控制家电,传感器探测非正常环境并且通过手机短信告知业主,以及以太网实时视频监控等功能。2 系统设计方案2.1 硬件总体设计框图根据上文的功能需要,设计出由ARM10为控制核心,单片机控制的家电控制模块和传感器报警模块,并且包含GSM通信模块的智能家居系统,硬件结构框图如图2-1所示。SHAPE * MERGEFORMAT图2-1 硬件设计框图2.2 控制核心选择智能家居控制系统采用如图2-2所示的XSBase270作为开发平台,该平台基于Intel高性能的PXA270处理器,支持Windows CE和Linux等嵌入式操作系统,是针对教学和实验的多功能实验平台。PXA270处理器的最高主频可达520MHz,且该处理器被加入了Wireless MXX技术,大大的提高了多媒体处理能力,而且加入了Intel SpeedStep动态电源管理技术,在保证CPU性能的前提下,最大限度的降低设备功耗1。XSBase270配置32M FLASH ROM,64M SDRAM,并配备了触摸屏、以太网、USB、串口、CF/MMC、PCMCIA等接口。满足了智能家居系统控制中心的硬件要求。图2-2XSBase270实验箱展开图2.3家电控制板家电控制板采用AT89C51为控制核心。扩展板的元件布局如图2-3所示,其上有四盏LED分别模拟四种家电,三个按钮模拟三种传感器。其中四盏LED分别连接单片机的P1.0、P1.1、P1.2、P1.3;三个按钮分别连接P2.0、P2.1、P2.2。图2-3家电控制模块2.3.1 串行端口电路家电控制板采用串口与XSBase270实验箱进行通信,其采用了经典的兼容RS-232标准的MAX232芯片作为串口的电平转换芯片。电路的连接如图2-4所示:图2-4家电控制板串行接口电路如上图所示,家电扩展板采用的是常用的DB9头作为串口接口,其针脚定义图如图2-5所示:图2-5RS-232 DB9头针脚定义图其中2脚RxD为接收引脚,3脚TxD为发送引脚,GND为信号地引脚。一般情况下普通串口只接这几个引脚;特殊的串口,如蓝牙串口除接上述的三个脚之外,还接了DSR引脚和CTS引脚,是因为蓝牙串口的数据流输出采用这两个脚的信号控制;而其他引脚是跟MODEM相关的。在智能家居系统中,家电控制板接普通串口,GSM模块接蓝牙串口。RS-232信号相对于信号地而言,在正负电平之间摆动。发送数据时,发送端输出的正电平在+5V到+15V之间,负电平在-5V和-15V之间。无数据传输时,线上为TTL电平。接收器典型的工作电平在+3V+12V与-3V-12V。由于发送电平和接收电平的差仅为23V左右,所以其共模抑制能力差,加上双绞线的分布电容,信号传输距离最大为15m,最高速率为20kb/s2。MAX232包含2个驱动器、2个接收器和一个电压发生器电路,提供TIA/EIA-232-F电平。该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5V TTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。图2-6MAX232引脚图2.3.2 家电控制电路图2-7 模拟家电控制电路家用电器控制的接口电路如图2-7 所示,K1K4 为继电器,分别控制四路家电的闭合和断开,Q1Q4 为继电器线圈电流驱动,电路由单片机的P1口进行控制,DD1DD4 发光二极管用于显示某路控制电路的工作情况,主要为了调试电路而设置。2.3.3 传感器接口电路图2-8 传感器接口电路图烟雾、煤气泄漏、红外等这些传感器的报警信号通过光电耦合接入单片机的P2 口,如图2-8 所示,在传感器没有报警信号时,光电耦合芯片处于截止状态,与之相接的单片机端口为低电平;当传感器有报警,传感器输出高电平,此时光电耦合芯片导通,与之相接的单片机端口为高电平,由单片机对报警信号进行采集并做出相应处理。2.4 GSM通信模块GSM通信部分采用如图2-9所示的西门子MC35 GSM/GPRS无线模块作为通信工具。它支持EGSM900和GSM1800双频,支持数字、语音、短消息和传真,使用AT指令控制发送短消息。它采用9V直流电源供电,通过RS-232串行端口与XSBase270试验箱连接进行通信。图2-9 西门子MC352.5 视频监控模块视频采集模块采用使用中星微(Vimicro)公司的ZC0301P芯片的摄像头, ZC0301P芯片可支持USB 1.1接口,硬件最高支持VGA分辨率(640480)。在VGA模式下可达到15帧/秒速率,在CIF(352288)和 SIF(320240)模式下可达到30帧/秒速率。它通过USB接口连接到XSBase270试验箱。图2-10301P摄像头2.6总体软件设计方案根据智能家居的硬件设计方案,设计出软件的总体设计方案如图2-11所示:图2-11 软件设计框图其中:、(1)家电控制系统和GSM网络通信各自独占一个RS-232串口。家电控制系统接XSBase270的红外串口,GSM模块接蓝牙串口。如图2-12所示。(2)实时视频监控通过USB摄像头捕捉图像,图像数据通过以太网发送到PC客户端进行图像还原。(3)以太网通信基于TCP/IP协议,测试环境为局域网,若投入到因特网的应用,则需要在服务端、客户端所在的局域网连接到因特网的网关即路由器上,要进行端口映射,才可以进行网络的连接。图2-12 红外串口与蓝牙串口智能家居系统的软件基于Windows CE 5.0嵌入式操作系统。Windows CE被设计成一种分层结构,从下而上一共分为了硬件层、OEM层、操作系统层和应用层共四个层3。这种层次的结构将硬件和软件,操作系统和应用软件隔离开,以便于实现系统的移植。智能家居的软件设计主要是集中在应用层。3 操作系统的定制Windows CE 5.0嵌入式操作系统的定制依靠Platform Builder5.0完成。Platform Builder是微软公司设计的用于嵌入式操作平台定制与驱动程序的开发的工具。推出它的目的之一就是让用户可以更好的将嵌入式操作系统移植到特定的目标平台上。3.1 BSP的安装为了让Windows CE 5.0能在实验箱上运行起来,还必须安装XSBase270的板级支持包(BSP)。板级支持包是介于主板和操作系统中驱动程序之间的一层,一般认为它属于操作系统的一部分,主要是对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包。在PC上安装好Windows CE.net5.0和Platform Builder5.0后,打开实验箱附带光盘中的BSP文件夹,运行XSBase270_V.msi文件,安装XSBase270的BSP。如图3-1所示。图3-1 BSP安装程序文件安装好BSP后,进入Platform Builder5.0中定制基于“EMDOOR SYSTEMS XSBASE270:ARMV4I”的因特网应用类型的系统镜像设计4。如图3-2所示。图3-2 定制系统时选择BSP种类3.2 添加平台特征和配置平台为了使系统在定制后能够满足基本的应用,并保证对某些设备的支持,就要向所设计的平台中添加必要的特征。(1)添加USB Active Sync(File Sync)组件。只有添加此组件,才能使用PC的USB接口与Windows CE进行文件同步。这也是在应用软件调试过程中所必须的条件。(Catalog-Core OS-Windows CE devices-Applications-End User-ActiveSync-File Sync)(2)添加ChineseSimplified Font。安装中文简体字体后,才能正常显示中文。(Catalog-Core OS-Windows CE devices-International-Locale Specific Support-ChineseSimpified-Fonts)(3)添加文件系统支持。(Catalog - Core OS - Windows CE devices - File Systems and Data Store - Storage Manager - FAT File System)(4)添加分区管理(Catalog - Core OS - Windows CE devices - File Systems and Data Store - Storage Manager -Partition Driver)(5)添加控制面板中的存储器管理组件(Catalog - Core OS - Windows CE devices - File Systems and Data Store - Storage Manager - Storage Manager Control Panel Applet)(6)添加基于软件的输入系统(软键盘等)(Catalog - Core OS - Windows CE devices - Shell and User Interface - User Interface - Software Input Panel - Software-based Input Panel (SIP) (Choose 1 or more) - SIP for Large Screens)(7)添加平台管理器(Platform Manager)(Catalog - Platform Manager - Platform Manager)(8)添加Usb ActiveSync(USB Function)(Catalog - Third Party - BSPs - Emdoor Systems XSBase270: ARMV4I - Device Drivers - USB Function-USB Function Bus Drivers -PXA27x USB Function)完成特性的添加后,设置平台的属性。在“Platform”菜单下单击“Setting”,在Configuration下拉菜单中选择“Emdoor Systems XSBase270:ARMV4I Release”项,选择Locale选项卡,进行系统地理位置和环境语言支持的设置。Locales列表中,为最下端的“中文(中国)”项打勾。在Default Language下拉菜单里选择“中文(中国)”为系统的默认语言。如图3-3所示。图3-3 选择操作系统默认语言在Build Option列表中,只选择Enable Eboot Space in Memory(IMGEBOOT=1)和Write Run-time Image to Flash Memory(IMGFLASH=1)两项。如图3-4所示。图3-4 程序组建选项设置单击“Build OS”菜单下的“Sysgen”开始组建操作系统。如图3-5所示:图3-5 生成操作系统镜像3.3 红外串口与蓝牙串口的打开经测试,在默认配置下生成的系统镜像,只打开了位于XSBase270模块板上的全功能调试串口,而位于接口扩展板上的红外串口和蓝牙串口并没有被打开。为了能够与家电控制板和GSM模块连接,实现完整的智能家居系统的功能,必须将它们打开。(1)查找中断号中断号的定义是在试验箱所提供的板级支持包中被配置的。打开C:WINCE500PlatformXSBase270Srcincbsp_cfg.h文件。可以看到调试串口和通信串口的中断号的定义,如图3-6所示。图3-6 BSP中的串口中断定义可以看到调试串口BFUART的中断号是28,转化为16进制为0x1c;通信串口SFUART中断号27,转换为16进制是0x1b。(2)修改注册表打开以下文件夹,其中“F:platform270”是在新建操作系统平台时所存储它的磁盘位置。F:Platform270RelDirXSBase270_ARMV4I_Release打开platform.reg注册表文件,在此文件中包含了对一些硬件的初始化的代码。在“IF BSP_NOSERIAL!”与“END BSP_NOSERIAL!”两句代码之间,可以看到蓝牙串口的注册表初始化代码,下面只需要添加初始化红外串口的代码:;Open the IR Serial PortHKEY_LOCAL_MACHINEDriversBuiltInSerialIR Irq=dword:14 ; 20 IRQ_STUART SysIntr=dword:1b ; 27 SYSINTR_SFUART MemBase=dword: ; STUART Register MemLen=dword:40 DeviceArrayIndex=dword:82 ; STUART object Prefix=COM Index=dword:3 Order=dword:1 IClass=CC5195AC-BA49-48a0-BE17-DF6D1B0173DD ; Dll=ms2_serial.dllHKEY_LOCAL_MACHINEDriversBuiltInSerialIRUnimodem Tsp=Unimodem.dll DeviceType=dword:0 FriendlyName=IRSerial Cable on COM3: DevConfig=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00修改好注册表代码以后,保存platform.reg文件。打开刚才建立的操作系统设计工程,选择Build OS菜单下的Make Run-Time Image命令,生成新的内核文件NK.bin。3.4 操作系统的生成与下载定制并组建Windows CE后,将会生成BootLoaderEBOOT.nb0文件和NK内核nk.bin,将它们烧写进入XSBase270实验箱。4 应用软件设计4.1 应用程序编写环境开发环境:Microsoft Visual Studio 2005开发语言:Microsoft Visual C+ 2005软件开发包:XSBase270 SDK智能家居系统的应用程序采用Visual Studio 2005进行开发。Visual Studio是微软公司开发的Windows平台上的应用程序开发环境。Visual Studio可以创建Windows 下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件5。Visual Studio 2005面向.net框架(2.0版本),同时可以开发跨平台的应用程序。图4-1 Visual Studio 20054.2 智能家居人机接口设计打开Visual Studio 2005,创建一个基于MFC Smart Device Application的VC+程序。如图4-2所示:图4-2 新建智能家居的应用程序到选择平台步骤时选择XSBase270平台,删除默认的Pocket PC 2003平台。如图4-3所示。图4-3 选择软件开发包支持单击“Next”按钮进入选择应用程序类型和资源语言程序界面上采用的语言的画面。如图4-4所示,选择“Dialog based”(基于对话框)类型,资源语言选择“中文(中国)”。其他项目保留默认的选项。图4-4 选择应用程序种类保持默认的设置,一直到完成新建项目向导。进入IDE环境。集成环境的窗口分布如图4-5所示:图4-5 Visual Studio 2005集成环境将对话框设计成如图4-6所示:图4-6 智能家居操作界面设计表4-1 智能家居应用软件界面控件配置控件类型控件名称功能按钮控件初始化GSM初始化GSM模块开始摄像打开摄像头,开始视频捕捉停止摄像停止摄像头视频捕捉开始监听打开ARM的9000号端口,打开网络通信停止监听关闭端口,停止TCP通信冰箱打开家中的冰箱设备灯光打开家中的灯光设备微波炉打开家中的微波炉设备空调打开家中的空调设备关于我们查看软件作者版权声明信息退出程序关闭未关闭的线程,退出程序列表控件消息窗口用来显示用户发回的短信记录图片控件煤气煤气传感器报警信号,报警时红色,常态时绿色烟雾烟雾传感器报警信号,报警时红色,常态时绿色红外红外传感器报警信号,报警时红色,常态时绿色编辑框信息框实时显示系统运行情况4.3串口通信功能设计4.3.1 串口通信协议串口通信协议采用CCESeries类实现,通过对此类的成员函数的调用,完成对串口的初始化、读写操作等,在不用串口的情况下,还可以关闭串口。4.3.2 软件的实现在Visual Studio的解决方案视图里添加类CCESeries,如图4-7所示。CCESeries类的成员函数如表4-2所示。图4-7 在VS2005中建立CCESeries类表4-2 串口操作类CCESeries的成员函数函数作用函数名称打开串口BOOL OpenPort(HWND pPortOwner, UINT portNo = 1, UINT baud= 9600,UINT parity= NOPARITY, UINT databits= 8,UINT stopbits= 0 );关闭串口Void ClosePort();设置串口超时BOOL SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts);读串口线程Static DWORD WINAPI ReadThreadFunc(LPVOID lparam);写串口BOOL WritePort(LPCTSTR lpString);BOOL WritePort(char *buf,int nSize);BOOL WritePort(char *buf);关闭读线程Void CloseReadThread();表4-3 串口操作类CCESeries的成员变量变量类型变量名称作用HANDLEm_hComm已打开的串口句柄HWNDm_hWnd此串口类所属的窗口句柄HANDLEm_hReadThread读串口线程句柄HANDLEm_hWriteThread写串口线程句柄DWORDm_dwReadThreadID读串口线程IDDWORDm_dwWriteThreadID写串口线程IDHANDLEm_hReadCloseEvent读串口线程退出事件HANDLEm_hWriteCloseEvent写串口线程退出事件4.2.2.1 打开串口与配置串口在Windows CE中,驱动程序分为本地设备驱动和流设备驱动两种6。本地设备如键盘、触摸屏等,一般在设备生产后是不会再更换的,相应的驱动这些设备的驱动程序也是必需的。而流接口设备驱动程序可以由第三方提供,支持另外添加到系统中的设备。而串口就属于流接口设备之一。流设备驱动在系统中是以三位字符串后跟一位数字表示的,对于串口而言,这三位字符是“COM”(不包括引号)。当引用一个流接口驱动程序时,除了三位字符后跟一位数字以外,还要紧跟一个冒号“:”(英文半角冒号),冒号是必需的,是为了区别桌面Windows的设备驱动程序的命名规则。该函数的流程图如图4-8所示:图4-8 OpenPort函数流程图(1)串口的打开所有的流驱动程序都将采用CreateFile函数打开串口设备。在Windows CE下,系统不支持设备的重叠I/O,所以不能在参数dwFlagsAndAttributes中传递FILE_FLAG_OVERLAPPED标志,返回的句柄要么是已打开的串口端口的句柄,或者是INVAILID_HANDLE_VALUE。CreateFile与大多数Windows函数不一样,打开失败时,不返回0。CreateFile函数的原型如下:HANDLE CreateFile(LPCTSTR lpFileName, / 对象路径名DWORD dwDesiredAccess, /控制模式DWORD dwShareMode, / 共享模式LPSECURITY_ATTRIBUTES lpSecurityAttributes, /安全属性(也即销毁方式)DWORD dwCreationDisposition, / 创建的方式DWORD dwFlagsAndAttributes, / 对象属性HANDLE hTemplateFile / 一个文件模板句柄);在CCESeries类中, HANDLE类型全局变量m_hComm存储CreateFile函数打开串口成功时的返回值,凭借此句柄可以控制打开的串口对象;以读写的方式打开串口。(2)串口的设置打开串口后,还必须对端口配置好正确的波特率、字符长度、停止位等等。在OpenPort函数中,使用两个函数GetCommState和SetCommState来配置串口。函数原型如下:BOOL SetCommState(HANDLE hRle, LPDCB lpDCB);BOOL GetCommState(HANDLE hFile, LPDCB lpDCB);这两个函数都包含了同样的参数,即已打开的串口的句柄和指向DCB结构的指针。DCB结构的设置如表4-4所示。表4-4 OpenPort函数中的串口DCB配置DCB定义项目设置值备注BaudRateBaud设置波特率为传入型参baud的值fBinaryTRUE二进制模式有效fParityTRUE支持奇偶校验ByteSizeDatabits设置数据位为传入型参databits,范围48ParityNOPARITY校验模式有效StopBitsStopbits设置停止位为传入型参stopbitsfOutxCtsFlowTRUE串口输出由端口的CTS线控制fOutxDsrFlowTRUE串口输出由端口的DSR线控制fDtrSensitivityDTR_CONTROL_ENABLE续表4-4 OpenPort函数中的串口DCB配置DCB定义项目设置值备注fDsrSensitivityFALSEfTXContinueOnXoffTRUE串口接收缓冲区已满时,且驱动程序已传送了XOFF字符,则驱动程序停止传送字符fOutXFALSEXON/XOFF控制不用于控制串行输出fInXFALSEXON/XOFF控制不为输入串行流使用fErrorCharFALSEfNullFALSE串行驱动不忽略接收到的空字节fRtsControlRTS_CONTROL_ENABLEfAbortOnErrorFALSE串口发生错误时,并不终止串口读写(3)串口超时设置设置好串口驱动操作的配置后,一个必要的步骤是,设置端口的超时值。所谓超时,是指Windows CE.net在读串口和写串口的自动返回前等待读或写操作的时间长度。在程序中,用以下两个函数控制串行超时。BOOL GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);这两个函数都包含了对应的串行设备的句柄和COMMTIMEOUTS结构的指针,COMMTIMEOUTS结构定义为:typedef struct _COMMTIMEOUTSDWORD ReadIntervalTimeout;DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutConstant;DWROD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutConstant;COMMTIMEOUTS;(4)其他的函数设置串口的输入输出缓冲区。原型如下BOOL SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue);设置串口检测的事件集。SetCommMask(HANDLE hFile,DWORD dwEvtMask);通过这个函数,可以使线程等待如表4-5中的常见的串口驱动程序事件。表4-5 串口驱动程序事件事件标志表达意义EV_BREAK检测到中断EV_CTSCTS更改状态EV_DSRData Set Ready信号更改状态EV_ERR串行驱动程序检测到错误EV_RKSDReceive Line Signal Detect 行更改状态EV_RXCHAR接收到一个字符EV_RXFLAG接收到一个事件字符EV_TXEMPTY传输缓冲区为空4.2.2.2关闭串口调用CloseHandle可以关闭一个串行端口,用关闭在打开串口时创建的那个句柄即可关闭串口了。方法如下CloseHandle(m_hComm);关闭线程函数:BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);其中,hThread为要关闭的线程的句柄。dwExitCode一般为0。若成功关闭,则返回一个非零值。关闭串口函数的工作流程如图4-9所示。SHAPE * MERGEFORMAT图4-9 ClosePort函数流程图4.2.2.3 串口读线程读串口ReadFile函数原形:BOOL ReadFile(HANDLE hFile, /文件的句柄LPVOID lpBuffer, /用于保存读入数据的一个缓冲区DWORD nNumberOfBytesToRead, /要读入的字符数LPDWORD lpNumberOfBytesRead, /从文件中实际读入的字符数LPOVERLAPPED lpOverlapped /异步读取描述,在Windows CE中为NULL);在该线程中,若串口读完一条信息,则发送一个系统消息到系统窗体,该消息的名称为WM_RXCHAR_ALL,是一个用户自定义消息。发送给系统窗体的附带消息包含收到的消息的内容和消息的长度。发送系统消息的API函数SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);图4-10 串口读线程流程图4.2.2.4 写串口在CCESeries类中,一共编写了三个写串口的函数,为的是方便不同情况下的调用。如要向写已知长度的字符串,可以采用WritePort(char *buf,int nSize)函数。写未知长度字符串时,采用WritePort(char *buf)函数,字符串的长度将在函数内部进行计算。前者提高了写串口的时间效率。这三个函数中,采用了一个共同的API函数WriteFile(),它的函数原型如下:BOOL WriteFile(HANDLE hFile, / 文件句柄LPCVOID lpBuffer, / 数据缓存区指针DWORD nNumberOfBytesToWrite, / 要写的字节数LPDWORD lpNumberOfBytesWritten, / 用于保存实际写入字节数的存储区域的指针LPOVERLAPPED lpOverlapped / OVERLAPPED结构体指针,CE里设为NULL);4.2.2.5 串口类的调用在主程序中,必须调用此CCESeries类,以达到操作串口的目的。在定义智能家居的窗口行为的CSmartHomeDlg类的头文件CSmartHomeDlg.h文件中,添加CCESeries.h头文件。并且新建一个public公共型变量m_BTSerial(蓝牙串口)和m_IRSeries进行对CCESeries类的实例化。CCESeries m_BTSerial;CCESeries m_IRSerial;在用于CSmartHomeDlg类成员函数的定义的文件CSmartHomeDlg.cpp文件中,采用形如m_BTSerial.OpenPort(this-m_hWnd,1,9600)的方式进行串口类成员函数的调用。4.2.2.6 串口的监听在读串口线程中,读完串口的一条信息后发送名为WM_RXCHAR_ALL的系统消息给系统窗体。在窗体程序中,必须对其进行响应。在CSmartHomeDlg.cpp文件中,添加一条消息响应的声明:ON_MESSAGE(WM_RXCHAR_ALL,OnComRecvMsg)其中OnComRecvMsg为对其消息响应的函数,函数的声明如下:afx_msg long OnComRecvMsg(WPARAM wParam, LPARAM lParam);其中“afx_msg”说明该函数是一消息响应函数。4.4 GSM通信模块 智能家居以GSM网络作为数据的无线传输网络,利用基于GSM网络上的短信息服务,完成智能家居的远程安全监控和无线报警的功能。4.4.1 设计基本原理4.4.1.1 PDU编码规则自短信息技术被开发到现在,对短信息的控制方式包含了Block Mode、基于AT的Text Mode基于AT指令的PDU Mode。使用Block模式需要厂家驱动的支持,随着技术的发展,后两种模式将其取代。Text模式比较简单,但不能发送中文短信息。在智能家居的软件设计中,采用的是基于PDU模式,该模式支持各个国家语言,当然也包括中文。在智能家居中,采用中文报警和中文指令。PDU数据包格式,是手机发送短信的一个数据单位7。其中的发送源手机号码、短消息服务中心号码(SMSC)、时间戳等都是用压缩BCD码表示,低位在前,高位在后。在PDU模式中,可采用Bit7、Bit8和UCS2编码方式对短消息发送内容进行编码。这三种编码方式可以发送的最大字符数分别为160,140和70。其中Bit7编码发送普通ASCII字符,从0x00到0x7f,共可以表示128个字符。而短消息的报文是以8位字节传输的,所以就必须把8位码压缩成7位码。实现方法是: 将第二个字符的最后一位, 补充到第一个字符的前面第一位, 第三个字符的后两位, 补充到第二个字符的前两位, 依次类推, 就可得到相应的字符串。最后转换成十六进制。Bit8编码通常用于发送任何二进制数据。UCS2编码用于发送Unicode字符。它固定使用16位共两个字节来表示一个字符,共可以表示65535个字符。图4-11和图4-12分别是接收和发送短信的报文格式。图4-11 接收短信的报文格式图4-12 发送短消息的报文格式实例一、发送短信时的PDU码:08 91 68 31 08 20 01 05 F0 11 00 0B 91 31 58 81 27 64 F8 00 00 00 06 C8 32 9B FD 0E 01表4-6 发送PDU包解析分段含义说明08SMSC地址信息的长度共8个八位字节(包括91)91SMSC地址格式(TON/NPI)用国际格式号码(在前面加+)68 31 08 20 01 05 F0SMSC地址00,补F凑成偶数个11基本参数(TP-MTI/VFP)发送,TP-VF用相对格式00消息基准值(TP-MR)00B目标地址数字个数共11位,不包括补足的F91目标地址格式(TON/NPI)用国际格式号码(在前面加+)68 31 18 48 31 46 F9目标地址(TP-DA)49,补F凑成偶数个00协议标识(TP-PID)是普通GSM类型,点到点方式00用户信息编码方式(TP-DCS)7-bit编码00有效期(TP-VP)5分钟06用户信息长度(TP-UDL)实际长度6个字节C8 32 9B FD 0E 01用户信息(TP-UD)“Hello!”结合发送短信的报文格式,知道短消息中心号码是:+00,对方号码是:,消息内容是“Hello!”。实例二、接收短信时的PDU码08 91 68 31 08 20 01 05 F0 84 0D 91 68 31 58 81 27 64 F8 00 08 3030 21 80 63 54 80 06 53 4E 4E 1C 00 21表4-7 接收短消息PDU包解析分段含义说明08SMSC地址信息的长度共8个八位字节(包括91)91SMSC地址格式(TON/NPI)用国际格式号码(在前面加+)68 31 08 20 05 05 F0SMSC地址00,补F凑成偶数位84基本参数(TP-MTI/MMS/RP)接收,无更多消息,有回复地址0B回复地址数字个数共11个十进制数(不包括F)91回复地址格式(TON/NPI)用国际格式号码(在前面加+)68 31 58 81 27 64 F8回复地址(TP-RA)68,补F凑成偶数位00协议标识(TP-PID)是普通GSM类型,点到点方式08用户信息编码方(TP-DCS)UCS2编码30 30 21 80 63 54 80时间戳(TP-SCTS)2003-3-12 08:36:45 +8时区06用户信息长度(TP-UDL)实际长度6个字节53 4E 4E 1C 00 21用户信息(TP-UD)“华东!”短消息中心号码是:+00,对方号码是,消息内容是“华东!”。4.4.1.2 AT指令在智能家居中,控制中心通过串口给MC35模块发送AT指令以达到控制它的目的。表4-8中是一些系统中采用的AT指令。表4-8 系统采用的AT指令AT指令功能AT+CMGF=0选择短消息信息格式,等于0时为PDU格式,等于1时为文本模式,AT+CNMI=1,1,0,0,1设置为短信到达时自动提醒AT+CMGS=?发送短消息,发送成功则返回OK字符串AT+CMGR=?读取短消息,读取成功则返回+CMGR: 0,idcontentAT+CMGD=?删除短消息4.4.2 软件的实现4.4.2.1 PDU编码解码短信的PDU解码和编码的功能由智能家居软件工程中的CEncode类实现。CEncode类的成员函数如表4-9所示:表4-9 CEncode类的方法方法备注Int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)可打印字符串转换为字节数据如:C8329BFD0E01 - 0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)字节数据转换为可打印字符串如:0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01 - C8329BFD0E01int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)7bit编码int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)7bit解码int gsmEncode8bit(const char* pSrc, unsigned char* pDst, int nSrcLength)8bit编码int gsmDecode8bit(const unsigned char* pSrc, char* pDst, int nSrcLength)8bit解码int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)UCS2编码int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)UCS2解码int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补F凑成偶数。如:68 - 4F8int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)两两颠倒的字符串转换为正常顺序的字符串。如:4F8 - 68Int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst)PDU解码,用于接收、阅读短消息int gsmEncodePdu(const SM_PARAM* pSrc, char* pDst)PDU编码,用于编制、发送短消息在该类中,关键的函数为gsmDecodePdu函数与gsmEncodePdu函数,它们将在智能家居中的对话框类CSmartHomeDlg中被调用。调用方法将在下文给予介绍。gsmDecodePdu函数与gsmEncodePdu函数分别用来在发短信时根据PDU规范进行编码,以及对串口收到的PDU编码进行解码。编码与解码根据在头文件中定义的短消息结构体进行取值或填充。以下是定义的关于编码方式的常量和填充短消息的数据结构。这些在接收与发送短信时是共用的。#define GSM_7BIT 0 /7Bit编码方式#define GSM_8BIT 4 /8Bit编码方式#define GSM_UCS2 8 /UCS2编码方式typedef struct char SCA16; / 短消息服务中心号码(SMSC地址) char TPA16; / 目标号码或回复号码(TP-DA或TP-RA) char TP_PID; / 用户信息协议标识(TP-PID) char TP_DCS; / 用户信息编码方式(TP-DCS) char TP_SCTS16; / 服务时间戳字符串(TP_SCTS), 接收时用到 char TP_UD161; / 原始用户信息(编码前或解码后的TP-UD) char index; / 短消息序号,在读取时用到 SM_PARAM;4.4.2.2 CEncode类各成员函数的作用和工作流程:gsmDecodePdu()函数用于接收、阅读短消息。输入源PDU串的指针,目标PDU参数指针,并返回用户信息长度。源PDU串是可打印字符串,如“C8329BFD0E01”,目标PDU参数是字节数据,如“0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01”,在这个函数中,较多的采用了同在一个类中的可打印字符串转换为字节数据的函数gsmString2Bytes;在短消息服务中心(SMSC)和回复号码的字符处理过程中,根据PDU串的编码规范,需要对描述SMSC的字符串段进行两两颠倒,并且去掉经颠倒后的字符串后的最后一个字符“F”,那就采用了同在一个类中的gsmSerializeNumbers函数;经过数据分离,将PDU串中的描述短信编码位TP-DCS跟规定的数值进行对比,如表示7位码的数值为0,8位码为4,UCS2编码为8等。对比完成后,将用户信息进行对应方式的解码如7位解码。它的工作流程如图4-13所示。SHAPE * MERGEFORMAT图4-13 CEncode类gsmDecodePdu函数工作流程gsmEncodePdu()函数用于编制、发送短消息,输入源PDU参数指针,输出目标PDU串指针,并返回目标PDU串长度。源PDU参数是字节信息,如“0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01,目标PDU参数是字节数据,如“C8329BFD0E01”,在这个函数中,较多的采用了同在一个类中的字节数据转换为可打印字符串的函数gsmBytes2String;在短消息服务中心(SMSC)和回复号码的字符处理过程中,根据PDU串的编码规范,需要对描述SMSC号码进行两两颠倒,并且在经颠倒后的字符串后加上一个字符“F”,那就采用了同在一个类中的gsmInvertNumbers函数;根据描述短信编码的TP-DCS跟规定的数值进行对比,如表示7位码的数值为0,8位码为4,UCS2编码为8等。对比完成后,将用户信息进行对应方式的编码如7位编码。它的工作流程如图4-14所示。SHAPE * MERGEFORMAT图4-14 CEncode类gsmEncodePdu函数工作流程gsmString2Bytes函数的作用是将可打印字符串转换为字节数据,如C8329BFD0E01 - 0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01,输入源字符串指针和输出的源字符串长度,输出目标数据指针,返回目标数据的长度。流程图如图4-15所示:SHAPE * MERGEFORMAT图4-15 gsmString2Bytes函数工作流程其中每两个字符串要整合成一个字节数据,如“C8”要转化为“0xC8”,故第一个字符“C”经字符转化为十六进制后要左移四位,使其成为“0xC0”,再与经过转换的低四位进行相或;然后计数器加2,源字符串和目标数据的指针往后移一个单位,继续处理下面的字符,直到计数器值的大小等于要处理的源字符串长度,则将处理好的数据输出。字符转化为十六进制的原理是:数字字符与0字符相减,得到它们的ASCII码之差,这个差就是这个字符所要表达的数字大小,如字符8就转换成了数字类型的8,用二进制表示就是1000。而A、B、C、D、E、F等字符是与A的ASCII码值相减,再加上10,就可以得到其表达的十六进制数值。如F减去A得到5,再加10,得到15,实质上就是十六进制中F所对应的十进制数15。gsmBytes2String函数的功能与gsmString2Bytes函数相反,工作流程如图4-16所示。SHAPE * MERGEFORMAT图4-16 gsmBytes2String函数工作流程其
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!