基于Android的智能家居远程控制系统设计
其中GucRcvNew=1表示集中器从UART0接收到来自GSM模块的返回消息,recvfg用来对GSM模块进行初始化,其初值为0。集中器发送命令at到GSM模块,如果接收到GSM模块的“at ok”返回消息,则设置recvfg=1,然后进入switch语句,当recvfg=1时,向GSM模块发送命令at+cmgf =1,如果返回值为“at+cmgf=1 ok”,设置recvfg=2。当recvfg=2时,向GSM模块发送命令“at+cnmi=2,2,,1”,如果返回值为“at+cnmi =2,2,,1 ok”,设置recvfg=3,到此GSM模块初始化结束。如果初始化过程中当集中器发送AT命令后,接收到的不是正确返回值,则设置recvfg=0,重新开始初始化。
根据控制信息类型设置flag子程序和根据flag值进行相应处理的子程序主要是在初始化结束后完成系统功能,程序流程见图4、图5。
?
?
本系统集中器采用UART中断方式和GSM模块通信,当有数据返回集中器时,会触发UART中断,在UART中断处理程序中从U0RBR寄存器读数据到GucRcvBur[Gu1Num]数组中。因为每次通信返回的字节数不相等,本系统在UART中断处理函数中引入定时器中断,在定时器中断处理函数中设置GucRcvNew==1。即每次进入UART中断处理函数时,开启定时器,UART在初始化时设定的中断触发点是1个字节,当所有返回字节都接收完成时,定时器超时会触发定时器中断处理函数,设置GucRcvNew==1,主程序检测到有数据返回。系统中设置定时器的触发时间是0.5 s。
2 Android端设计
本系统采用Android应用程序的用户友好型界面作为与用户的接口,Android终端程序通过控件绑定方式对固定号码进行短信接收与发送,用户只需通过点击控件方式即可传递和接收控制信息,具体根据系统自定义通信协议发送的控制信息则完全被程序屏蔽,对用户完全透明。其中发送短信和接收短息都会对Android系统的SQLite数据库作出改动,需要对数据库中的相关信息进行删除来保证对用户透明。另外对于控件之间消息传递采用Android中的Handler机制。
2.1 发送控制信息
Android中发送消息主要通过SmsManager类来实现,它继承自java.lang.Object类。其主要的方法说明略——编者注。
发送短信程序首先调用SmsManager. getDefault()获取SmsManager对象,然后通过PendingIntent的getActivity方法获得一个Pending Intent对象。根据短信长度Message.length()与短信长度最大值比较来判断是否需要调用smsManager.divideMessage(Message)将短信分割,然后再调用smsManager的sendTextMessage方法发送短信。代码略——编者注。
发送短信模块需要在清单文件AndroidManifest.xml中加入允许发送短信的权限:
2.2 接收返回信息
在Android端接收消息,可以采用两种方式,一种通过BroadcastReceiver广播接收器的方式,另外一种是通过观察数据库变化的内容观察者类ContentObserver来实现。
2.2.1 BroadcastReceiver接收短信
Android中的广播是一种在应用程序之间传递信息的机制,在Android中有多种广播,基于GSM短信的接收会产生一个广播,应用程序可以监听这些广播并根据广播类型作出相应的处理。BroadcastReceiver就是对接收到的广播进行过滤并响应的一类组件。
当应用程序接收到广播发送来的intent对象,BroadcastReceiver类根据其注册的广播地址与接收到的intent对象进行比较,如果匹配则调用BroadcastReceiver的onReceive()方法。
BroadcastReceiver类的注册有两种方式,第一种是静态注册方式,即在AndroidManifest.xml文件中利用intent—filter指明需要过滤的广播地址。静态注册方式会使程序始终监听广播消息,并自动调用程序继承自BroadcastReceiver的类。第二种是动态注册方式,其在activity中调用函数registerReceiver来注册,当应用程序关闭后,就不在进行监听。在动态注册的activity被销毁前,需要调用unregist er Receiver解除注册。
短消息广播是一个有序广播,即每次只被优先级最高的接收者处理,然后由优先级高的接收者传递到优先级低的接收者。优先级高的接收者可以终止这个广播。对于有序广播而言,动态注册的优先级高于静态注册。
系统中定义SmsReceiver类继承自BroadcastReceiver类,采用动态注册的方式,在activity中用于动态注册的代码略——编者注。
接收短信模块需要在清单文件AndroidManifest.xml中加入允许发送短信的权限:。
2.2.2 ContentObserver接收短信
系统实际使用中,对于用BroadcastReceiver接收短信往往效果不好,主要因为用户在Android终端安装的第三方软件,比如接收短信软件、安全软件等,这类软件从底层获取系统权限,优先级始终高于应
- Android开发技巧:软硬件的巧妙整合(01-16)
- 基于Android的VoIP系统的设计与实现(03-28)
- 基于Android系统的影音播放器开发(03-25)
- Android的阿喀琉斯之踵(07-08)
- Android开发之“hello World”的实现 (07-23)
- 基于Android平台的即时通信系统客户端设计(09-24)