隨著社會經濟的發展,家庭火災在火災中的比例明顯增大,火災損失越來越大,家庭火災造成的人員傷亡已成為各國政府非常重視的工作之一。公安部最近也向全國各消防部隊下發了關于推廣家庭固定滅火系統的通知。為此,筆者通過大量的調研發現,家庭固定滅火系統在功能上需增加短信芯片。 目前,短信芯片技術已經相對成熟,而且價格低廉,對固定滅火系統的成本增加幅度不大。此外,短信芯片體積較小,不會加大固定滅火系統的體積和重量,同時在實際設計中,也可把系統設計成組合分離式,讓用戶和廠商可以選擇是否需要短信芯片。由于短信芯片只需要脈沖啟動信號線和電源線,故在制定家庭固定滅火系統標準的時候,可以設計定義預留好短信通知模塊的接口標注。 由于家庭滅火系統既能滿足安全需要,也能滿足家庭隱私需要,它可給使用家庭帶來很大的方便,而且該技術成功后,其它適合短信通知的報警系統也可以使用,因此,市場應用較廣。 1 系統設計 1.1系統設計目標 本系統設計的總體目標是在火災發生后能及時通知業主和物業,另外,物業也可以根據戶主授權,來通過短消息報警系統引爆其它滅火設備。本系統的主要性能指標如下: ◇可在火災發生后4秒內通知業主和物業; ◇物業管理可通過計算機,同時引爆255個點的家用滅火系統; ◇可提供家用滅火系統級聯網絡功能,其最大網絡具有255個節點。 1.2短消息模塊的設計 GSM 規范對通過該接口進行短消息的傳輸功能定義了三種控制協議,即文本模式、塊模式和PDU模式。其中塊模式現在已基本不用;文本模式適合西文的傳輸;而如果短消息中既有西文也有中文,則適合用PDU模式。由于PDU模式是各大手機生產商都實現了的短消息方式,十分具有通用性,所以,本設計實現的短信發送和接收都使用通用的PDU模式來完成。在發送短信時,其主要工作是把報警內容組裝成短消息的格式,即短消息編碼:而在接收短消息時,其主要工作是把短消息字符串還原成文本格式。 短消息模塊的硬件組成可由家用滅火系統報警接口、RS232串口線、SIM100-E GSM/GPRS和SIM卡組成。其系統終端組成框圖如圖1所示。程序利用串口通信控件并通過串口與SIM100-E終端通信,最終經終端將短消息發送出去。SIM100-E GSM模塊與處理器之間的通信協議為AT指令,處理器則通過寫RS232串口來發送AT指令給SIM100-E,再由SIM100-E將響應傳回到串口,最后由處理器通過讀取串口數據來完成短消息的收發功能。 2系統軟件設計 2.1短消息模塊的初始化 在使用短消息的收發功能之前,必須先對短消息模塊進行初始化,以完成串口通信設置、GSM信號的檢測、短信中心號碼設置等。首先應將端口參數設置為:速率為 9600、無奇偶校驗位、數據位為8位、1位停止位、無流量控制。這樣。在檢測信號時,就可以通過向串口發送AT指令來進行測試。如果收到“OK”,則表明開發板和SIM100-E模塊連接良好(即有信號)。其短消息模塊的初始化流程如圖2所示。 本系統的短消息模塊可通過串口來進行讀寫操作,這樣就一定要用到讀寫串口命令,下面是讀寫串口的兩個函數。 其中讀串口可將buff中長度為len的內容寫到串口中,代碼如下: int read_comm(char*buff,int len); 而寫串口則可從串口中取得長度為len的內容,并將其放到緩沖區buff中,其代碼如下: int write_comm(char*buff,int len); 上述兩個函數如果執行成功返回0,否則返回-1。之后便可設置串口數據位databits、停止位stopbits和效驗位parity。本系統設置databits為8位,stopbits為1位,parity位N。其代碼如下: int set_Parity(int fd,int databits,int stopbits,int parity) write_comm(“AT ”,3) ∥判斷和無線網卡是否連接上了 read_comm(ans,128); write_comm(“AT+CMGF=? ”,10);∥判斷是否為PDU模式 read_comm (an8,128); 如果不是PDU模式,則應將其設置為PDU模式,其設置代碼如下: write_comm(“AT+CMGF=0\r”,10);∥設置短消息為PDU模式 模塊初始化結束后,則可進入待機狀態,這時,微處理器便可以通過串口向modem發出指令,并接收modem執行指令返回的結果。 2.2 短消息的發送 短消息的發送是在后臺進行的。當發送短消息的條件滿足時,系統將調用短信發送進程,并把對應數據緩沖區的報警數據打包成PDU格式的短信發送出去。短消息數據格式如下: typedef struct{ char SCA[16];∥短消息服務中心號碼(SMSC地址) charTPA[16];∥目標號碼或回復號碼(TP-DA或TP-RA) char TP_PID;∥用戶信息協議標識(TP-PID) char TP_DCS;∥用戶信息編碼方式(TP-DCS) char TP_SCTS[16];∥服務時間戳字符串(TP_SCTS),接收時用到 charTP_UD[161]; ∥原始用戶信息(編碼前或解碼后的TP-UD) char index;∥短消息序號,在讀取時用到 }SMS; 上述程序所實現的函數是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 結束語 在實際設計中,可以將本系統設計成組合分離式,以使用戶和廠商可以選擇是否需要短信芯片。短信芯片只需要脈沖啟動信號線和電源線。即可在制定家庭固定滅火系統標準時設計定義預留好的短信通知模塊接口標注,從而實現火災短信報警功能。 |