家庭灭火系统中的短消息报警模块设计
上述程序所实现的函数是sendsms(dst_mb,sins_content),dst_mb表示短消息要发送到的目标手机号码,sms_content是短信的内容,如果发送成功,则返回0,否则返回-1。
操作时,先向串口发送AT+CMGS=,等待无线modem返回ASCII字符">",如果返回">",则可输入PDU数据,并以+作为结束符,表明短消息发送成功,此后模块返回OK。
发送短信模块的主要工作是对要发送的短消息的数据格式进行组装并对短信内容进行编码。如要发送到手机号码是13856965015,短信中心号码是8613800551500,短信内容是"Hello!",则其数据格式编码如表1所列。
下面详细说明一下短消息发送流程。当运动检测程序检测到有运动目标出现后,系统便会调用短消息发送模块。这时,程序先获取要发送的短消息内容和要发送到的手机号码,然后设置短消息模式为PDU模式,如果是英文短信则用英文的7-bit编码方式,如果是中文或者是中、英混合短信,则用中文的UCS2编码。然后将短消息发送出去。其发送流程代码如下:
∥dst_mb表示短消息要发送到的目标手机号码
∥sms_content是短信的内容
∥如果发送成功则返回0,否则返回-1。
sendsms (char*dst_mb,char*sms_content);
write_comm("AT+CMGF=0 ",10);∥设置短消息为PDU模式
strcpy(sms->SCA,smsc);∥将短消息中心地址放到结构体sms中
strcpy(sms->TPA,dst_mb);∥设置目标号码
sms->TP_PID=0;∥GSM类型设置为点到点方式
sms->TP_DCS=0; ∥7-bit编码
strcpy(sms->TP_UD,sms_content);
encode_pdu(src,pdu);∥将源src编码为pdu
/*将字节转换为字符串,如(0xC8,0x32,0x9B,0xFD,0x0E,0x01)"转换成"C8329BFDOE01*/bytestostr (src,dst,len);
/*正常顺序的字符串转换为量量颠倒的字符串,如果长度为奇数,补’F’凑成偶数,如:"8613851872468"-->"683158812764F8"*/invert(src,dst,len);
encode7bit(src,dst,len);/*pdu模式的7-bit编码
encode8bit(src,dst,len);/*pdu模式的8-bit编码*/
encodeUCS2(src,dst,len);/*pdu模式的UCS2编码*/
这里值得一提的是中文短消息的编码和解码。GSM短消息中使用的是UTF-8编码,而实际的计算机上使用的是GB-2312码,因而存在一个转换问题。而由于UTF-8和GB-2312编码之间不存在一一对应的线性关系,因此,只能采用查表的方式进行转换。
事实上,以上的中文发送程序也能发送英文或者中英文混发。只是这样发送英文时,英文字符象中文字符一样要用两个字符表示,所以,它和发送中文一样,只能发送70个字符。
2.3 短消息的接收
通过短信接收进程可定时查询SIM卡,如果有新的短信,则将新的短信读入、解码,然后删除,这样可以防止由于SIM卡中的短消息满,而接收不到新的短消息。短信的接收是短信的发送的逆过程,其数据格式和发送短消息时相同。
接收短信时,系统首先判断是否要接收短消息。当得知需要接收短消息后,可用AT+CNMI=?来判断是否有新的短消息,如果有,则用AT+CMGL=1来读取短消息,并对读取的每条短消息进行解码。当读取一条短信后,即可用AT+CMGD=index,来直接删除,然后再读取下一条短消息。直到不再需要读取短消息。其代码为:
receivesms(SMS*temp);∥读取短信到缓存中
下面是这个函数里面的部分内容:
3 结束语
在实际设计中,可以将本系统设计成组合分离式,以使用户和厂商可以选择是否需要短信芯片。短信芯片只需要脉冲启动信号线和电源线。即可在制定家庭固定灭火系统标准时设计定义预留好的短信通知模块接口标注,从而实现火灾短信报警功能。
发布者:吕勇