朱正國
(攀枝花學(xué)院數(shù)學(xué)與計(jì)算機(jī)學(xué)院,攀枝花 617000)
隨著計(jì)算技術(shù)的不斷進(jìn)步,各種智能化的產(chǎn)品逐漸出現(xiàn)在市場(chǎng)上,例如智能監(jiān)控系統(tǒng)和智能家居系統(tǒng)。特別是智能家居系統(tǒng),用戶可以通過手機(jī)短信了解家里的情況并通過手機(jī)發(fā)送命令進(jìn)行遠(yuǎn)程控制,實(shí)現(xiàn)了對(duì)家人及財(cái)產(chǎn)安全進(jìn)行實(shí)時(shí)監(jiān)控。家、芯片、手機(jī)三者通過短信連接在一起,通過手機(jī)短信來實(shí)現(xiàn)對(duì)家庭的監(jiān)控和管理也就應(yīng)運(yùn)而生了。
通過手機(jī)和PC終端能夠讓家居和人緊密的聯(lián)系在一起。短信在家庭中做監(jiān)控使用,能夠很好地了解家庭情況,特別是對(duì)家中老人和孩子而言,非常方便。安防方面的作用,如果有小偷闖入家中,警報(bào)短信就會(huì)被安裝好的監(jiān)控系統(tǒng)發(fā)送到管理者的手機(jī)中,機(jī)主可以通過這些信息及時(shí)了解目前監(jiān)控環(huán)境的狀況。對(duì)我們的家庭很實(shí)用,即使遠(yuǎn)在千里之外的地方上班,我們對(duì)家里的狀況也能了如指掌。
本系統(tǒng)是基于Linux操作系統(tǒng)的小型家居智能化控制系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),本系統(tǒng)采用GTK+源碼實(shí)現(xiàn)的,并且應(yīng)用了Linux下的Glade開發(fā)軟件進(jìn)行開發(fā)。本系統(tǒng)不僅實(shí)現(xiàn)了可以向管理者發(fā)送信息,而且可以針對(duì)不同的用戶,還可以發(fā)送中文信息或者英文信息;管理者還可以向系統(tǒng)發(fā)送命令,例如家里來客人了,如果自己不在家的話,可以給系統(tǒng)發(fā)送一條短信命令打開門,讓客人進(jìn)入家里,以免客人在外面等著主人回來。本系統(tǒng)通過模擬一個(gè)小型芯片能夠?qū)崿F(xiàn)的通信功能和執(zhí)行的相關(guān)功能,具體實(shí)現(xiàn)的流程如圖1所示。

圖1 功能模塊
本系統(tǒng)的界面是使用GTK+和Glade圖形界面工具制作和編寫的,整個(gè)界面就是一個(gè)容器,可以向其中添加選項(xiàng)框。通過鏈接函數(shù),得到操作圖形界面的對(duì)象,在主函數(shù)中調(diào)用對(duì)象,可以直接對(duì)其操作。在整個(gè)界面中,左邊有個(gè)消息顯出處框、時(shí)間顯示框、消息顯示的文本框;在右邊是服務(wù)開啟按鈕、號(hào)碼輸入框、發(fā)送按鈕、消息文本框。制作的界面如圖2所示:

圖2 系統(tǒng)界面
短信發(fā)送界面,主要實(shí)現(xiàn)的是小型家居智能化控制系統(tǒng)中的通信功能,實(shí)現(xiàn)用戶的手機(jī)與家里的芯片進(jìn)行通信,當(dāng)滿足一定的條件的時(shí)候,就會(huì)觸發(fā)短信發(fā)送功能,根據(jù)主人的需要,我們可以設(shè)置發(fā)送的內(nèi)容是中文的信息還是英文的信息。例如家里著火了,溫度會(huì)升高,溫度傳感器就會(huì)觸發(fā)短信發(fā)送功能提醒主人家里著火了。如圖3所示。

圖3 發(fā)送中文界面
本系統(tǒng)還可以實(shí)現(xiàn)發(fā)送中文信息,把信息傳遞給英文用戶。如圖4所示。
如果短信發(fā)送成功后就會(huì)彈出一個(gè)對(duì)話框提示發(fā)送成功。如果短信發(fā)送失敗會(huì)提醒重新發(fā)送,同時(shí)用戶也要檢查自己的電話號(hào)碼以及消息內(nèi)容是否有錯(cuò)誤。如圖5所示:

圖4 發(fā)送英文界面

圖5 發(fā)送失敗界面
本文設(shè)計(jì)了接收函數(shù),實(shí)現(xiàn)了接收主人發(fā)來的一些短信命令,例如主人不在家,家里來客人了,主人可以通過手機(jī)發(fā)送一條短信命令把門打開;如果家里著火了,主人也可以發(fā)送短信,實(shí)現(xiàn)家里的消防系統(tǒng)打開;如果主人有想要看的電視節(jié)目,而自己不在家,主人可以發(fā)送短信打開電視機(jī),錄制電視節(jié)目,回家后可以觀看錄制的節(jié)目。本系統(tǒng)還可以實(shí)現(xiàn)其他家居的智能化控制,下圖展示的是接收“打開電視機(jī)開始錄制節(jié)目”的短信并執(zhí)行操作的界面,如圖6所示:

圖6 接收短信界面
詳細(xì)接收代碼實(shí)現(xiàn):int get_message(int fd){
char rbuf[MAXBUF];
int nread,nwrite;
char cmd_at[MAXBUF];
char cmd_cmgr[]="at+cmgr=1 ";
char cmd_cmgd[]="at+cmgd=1 ";
memset(cmd_at,0,sizeof(cmd_at)); //----at<CR>----
strcpy(cmd_at,"at ");
nwrite=pdu_write(fd,cmd_at,strlen(cmd_at),TINMEOUNT);
printf("nwrite=%d,%s ",nwrite,cmd_at);
memset(rbuf,0,sizeof(rbuf)); sleep(2);
nread=pdu_read(fd,rbuf,TINMEOUNT);
printf("nread=%d,%s ",nread,rbuf);
if(NULL==strstr(rbuf,"OK")){
return 1;}
//讀第一條短信
memset(rbuf,0,MAXBUF);
nwrite=pdu_write(fd,cmd_cmgr,strlen(cmd_cmgr),TINMEOUNT);
nread=pdu_read(fd,rbuf,TINMEOUNT);
printf("nread=%d,%s ",nread,rbuf);
if(NULL==strstr(rbuf,"OK")){
return 1;
}
if((NULL!=strstr(rbuf,"62535F005B8996327CFB7EDF"))||(NULL!=strstr(rbuf,"Open the security system"))){
printf("打開安防系統(tǒng) ");
memset(rbuf,0,MAXBUF);
nwrite=pdu_write(fd,cmd_cmgd,strlen(cmd_cmgd),TINMEOUNT);
nread=pdu_read(fd,rbuf,TINMEOUNT);
printf("nread=%d,%s ",nread,rbuf);
return 2;
}
if((NULL != strstr(rbuf, "62535F00996E6C34673A")) ||(NULL!=strstr(rbuf,"Open the water dispenser"))){
printf("打開飲水機(jī) ");
memset(rbuf,0,MAXBUF);
nwrite=pdu_write(fd,cmd_cmgd,strlen(cmd_cmgd),TINMEOUNT);
nread=pdu_read(fd,rbuf,TINMEOUNT);
printf("nread=%d,%s ",nread,rbuf);
return 3;
}
if((NULL!=strstr(rbuf,"62535F00753589C6673A5F555236828 276EE"))||(NULL!=strstr(rbuf,"Turn on the TV recording programs"))){
printf("打開電視機(jī)錄制節(jié)目 ");
memset(rbuf,0,MAXBUF);
nwrite=pdu_write(fd,cmd_cmgd,strlen(cmd_cmgd),TINMEOUNT);
nread=pdu_read(fd,rbuf,TINMEOUNT);
printf("nread=%d,%s ",nread,rbuf);
return 4;
}
if((NULL!=strstr(rbuf,"62535F00592795E8"))||(NULL!=strstr(rbuf,"Open the door"))){
printf("打開大門 ");
memset(rbuf,0,MAXBUF);
nwrite=pdu_write(fd,cmd_cmgd,strlen(cmd_cmgd),TINMEOUNT);
nread=pdu_read(fd,rbuf,TINMEOUNT);
printf("nread=%d,%s ",nread,rbuf);
return 5;
}
//刪除短信
printf("刪除短信! ");
memset(rbuf,0,MAXBUF);
nwrite=pdu_write(fd,cmd_cmgd,strlen(cmd_cmgd),TINMEOUNT);
nread=pdu_read(fd,rbuf,TINMEOUNT);
printf("nread=%d,%s ",nread,rbuf);
return 0;
}
①短信息操作
短信操作步驟及相關(guān)命令:
設(shè)置短信格式——AT+CMGF
設(shè)置短信存儲(chǔ)載體——AT+CPMS
讀短信——AT+CMGR
發(fā)送短信——AT+CMGS
刪除短信——AT+CMGD
顯示短信——AT+CMGL
②AT+CPMS選擇短信存儲(chǔ)的載體。
測(cè)試結(jié)果:a.AT+CPMS=”SM”
+CPMS:8,15,8,15,1,40
OK
返回OK表示設(shè)置成功,說明當(dāng)前顯示狀態(tài):SIM儲(chǔ)器總?cè)萘繛?5,當(dāng)前存儲(chǔ)量8。
③命令格式:AT+CPMS?主要用于顯示當(dāng)前短信存儲(chǔ)載體設(shè)置。
測(cè)試結(jié)果:a.AT+CPMS?
+CPMS:"SM",8,15,"SM",8,15,"ME",1,40
OK
當(dāng)前短信存儲(chǔ)載體設(shè)置為:mem1為SM,mem2為 SM,mem3為ME;
④命令格式:AT+CPMS=?用于顯示命令支持的相關(guān)參數(shù)
⑤AT+CMGF設(shè)置短信格式,看用戶是發(fā)送英文還是中文,選著為1,發(fā)送英文;選擇0,則是發(fā)送中文。設(shè)置成功后要返回OK。
測(cè)試結(jié)果:AT+CMGF=?顯示可以等于幾。
+CMGF:(0,1)
OK
AT+CMGF=1設(shè)置為發(fā)送英文
OK
AT+CMGF=0設(shè)置為發(fā)送中文
+CMGF:1
OK
⑥AT+CMGS發(fā)送短信內(nèi)容命令,發(fā)送后有一個(gè)<ctrl-z>,用字符代替是x1a。
測(cè)試結(jié)果:a.AT+CMGS=18782966350<CR>
>adc123.123<ctrl-z>
+CMS ERROR:500
ERROR:500表示命令錯(cuò)誤;⑦AT+CMGR讀短信,后面跟讀第幾條短信。測(cè)試結(jié)果:a.AT+CMGR=1
+CMS
OK
短消息被保存在一些緩存中,也可以把消息存放在SIM卡中,MODEM從手機(jī)中接收短消息,具體的是把SIM中的消息讀出來,讀短信要利用AT+CMGR和AT+CMGD兩條指令來完成。與接收短信息一樣,發(fā)送時(shí)也要先建立聯(lián)接,傳送一些初始化指令,然后發(fā)送短消息內(nèi)容。收發(fā)流程圖如下:

圖7 短信發(fā)送流程