MicroPython+北鬥+GPS+GPRS:TPYBoardv702短信功能使用說明
轉載請以鏈接形式註明文章來源(MicroPythonQQ技術交流群:157816561,公眾號:MicroPython玩家匯)
TPYBoardv702是目前市面上唯一支持通信定位功能的MicroPython開發板:支持Python3.0及以上版本直接運行。支持GPS+北鬥雙模定位、GPRS通信、短信功能、電話功能;板載溫濕度、光敏、三軸加速度傳感器、蜂鳴器、LCD5110顯示屏。免費提供定位測試服務平臺。
TPYBord_V7.0.2開發板上板載的通信器件是由深圳合方圓公司研發發的GU620通信定位模塊,此模塊功能強大,同時支持GPS,GPRS,GSM,藍牙等功能,這次就來具體的說一下發送短信的功能的使用。
能實現短信功能後還能依托著短信的功能實現溫濕度的實時獲取,經緯度的實時獲取(可能比較費短信費哦),
1.初識短信發送原理
手機的信號頻率很高,一般在900Mhz左右,靠電離層反射傳播,打電話的手機信
號傳到最近的基站,也就是移動或者連通的信號塔,再由基站把高頻信號頻率降低,由
基站和基站之間通信,這個信號是直線傳播,遇到高的建築物會被擋住,所以那些塔都
豎的很高,傳到接電話的手機附近的基站,再轉成高頻信號發給手機。
短消息業務(SMS-ShortMessageService)的實現原理很簡單,:
第一是存儲轉發機制。SMS傳送數據包的工作由移動網絡中的短消息中心而不是終端用戶來完成,如果用戶不在服務區內,短消息就被存儲在短消息中心,等用戶出現之後,再轉發給他,這是GPRS等業務所不具備的。第二是傳遞確認機制。在電路交換數據環境中,連接是端到端的,所以用戶能夠知道連接是否完成,以及數據傳遞的情況.
通俗點說:
基站永遠是在發射信號的,其中很重要的一部分就是廣播消息,廣播消息中的一類是尋呼消息(含電話號碼),每個手機都在時刻監聽尋呼消息,當它發現一個尋呼消息是給它的話(即有人正打它電話),它就會和基站建立連接,通過基站和打你電話的人聯系。
2.了解GU620的短信發送流程
通過上面的描述,我們了解到了短信發送的基本原理和流程,下面我來了解一下GU620模塊在應對這些流程時需要怎麽做。
首先的我們需要把模塊設置到短信發送的模式,這個通過AT指令AT+CMGF=1,來設置,這條指令是設置模塊為打開短信發送格式,且以文本的格式發送。
上面一條我們說了,把短信以文本的模式發送,但是文本有很多種格式,這裏我們再執行一條指令,把文本的格式設置成我們手機能穩定且正確識別的文本格式,AT+CSCS=“GB2312”,這條指令是把短信收發的文本格式設置為簡體中文。
上面兩條介紹了設置發送短信的模式和文本格式,這裏說一個意外事件(在想要執行的流程之外發生的事件)發生的處理方法,要是在你正要發短信的時候,有一條新的短信進來了,那這個怎麽辦?要是新的短信一接收到,馬上顯示出來,顯然不是很合理,會打斷我們的流程,在這裏我們使用AT+CNMI=2,1指令把接收到的新消息存儲到SIM卡中,然後再給出提示,在我們想讀的時候再讀出來,這樣比較符合常理。
在我們設置好以上的這些基本的設置步驟後,我們需要把發短信的一個重要因素,接收方的手機號碼寫進模塊去,我們使用指令AT+CMGS=“手機號碼”,這條指令是告訴模塊想要通信的目的號碼。
在發送了正確的指令和手機號後模塊會有提示正確的返回值,當得到這個返回值的時候,我們就可以把我們想要發送的內容(不支持漢字)編輯進去,這樣模塊就會把編輯的短信內容發送給前面輸入的手機號碼上去。
當發送成功後,會返回發送的內容,以及相應的提示內容。
3.設置程序流程
根據以上的介紹,我們大致了解了短信發送的基本流程,那麽我們疾苦依據這個基本流程來設置一下程序的流程。
1.開發板上電,紅色電源指示燈會亮起;
2.首先定義串口4,波特率設置為115200,通信模塊和32芯片是依靠串口通信的;
3.之後我們設置兩個變量Message,number來存儲短信內容和接收方的手機號碼;
4.在程序的頂端,總循環的外面,使用程序把引腳Y6拉低兩秒以上,Y6是連接通信模塊的開關機引腳的;
5.之後拉高Y6,延時10秒,這樣是為了確保通信模塊正常開機;
6.之後我們發送AT+CMGF=1\r\n,設置模塊為短信發送模式;
7.如果模塊返回正確的提示內容,我們發送AT+CSCS="GB2312"\r\n,設置文本的格式;
8.模塊返回正確提示內容後,發送AT+CNMI=2,1\r\n,設置新短息的模式;
9.設置成後,發送AT+CMGS="‘+number+‘"\r\n,把手機號碼發送進去;
10.當模塊返回手機號碼正確的提示後,發送Message+‘\r\n‘,把設置好的內容發送給模塊;
11.模塊返回發送的文本內容及相應的發送成功的提示後,結束程序。
4.源代碼
下面是我寫的簡單的一個代碼,提供給大家參考。
import pyb import upcd8544 from machine import SPI,Pin from pyb import UART from ubinascii import hexlify from ubinascii import * leds = [pyb.LED(i) for i in range(1,5)] P,L,SHUCHU=0,0,0 SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK #DIN =>SPI(1).MOSI ‘X8‘ data flow (Master out, Slave in) #CLK =>SPI(1).SCK ‘X6‘ SPI clock RST = pyb.Pin(‘X20‘) CE = pyb.Pin(‘X19‘) DC = pyb.Pin(‘X18‘) LIGHT = pyb.Pin(‘X17‘) lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT) count_=0 N2 = Pin(‘Y3‘, Pin.OUT_PP) N1 = Pin(‘Y6‘, Pin.OUT_PP) N1.low() pyb.delay(2000) N1.high() pyb.delay(10000) u2 = UART(4, 115200) Message=‘TPYBoard_GPS00000000000001‘#輸入你想要發送的短信的內容; number=‘目的號碼‘#輸入想要發送的手機號 w=0 r=0 while r<1: u2.write(‘AT+CMGF=1\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘1:‘,_dataRead) lcd_5110.lcd_write_string(‘Message:‘,0,0) lcd_5110.lcd_write_string(str(Message),0,2) if(_dataRead==b‘AT+CMGF=1\r\n\r\nOK\r\n‘): u2.write(‘AT+CSCS="GB2312"\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘2:‘,_dataRead) if(_dataRead==b‘AT+CSCS="GB2312"\r\n\r\nOK\r\n‘): u2.write(‘AT+CNMI=2,1\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘3:‘,_dataRead) if(_dataRead==b‘AT+CNMI=2,1\r\n\r\nOK\r\n‘): u2.write(‘AT+CMGS="‘+number+‘"\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘4:‘,_dataRead)#b‘AT+CMGF=1\r\n\r\nOK\r\n‘ if(_dataRead== b‘AT+CMGS="‘+number+‘"\r\n\r\n> ‘): u2.write(Message+‘\r\n‘)#短信內容 pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘5:‘,_dataRead) print(len(_dataRead)) w=len(_dataRead) _dataRead=str(_dataRead)[2:w] print(‘6:‘,_dataRead) if(_dataRead==Message): print(‘7:ok‘) lcd_5110.lcd_write_string(‘Has been sent‘,0,5) r=10
5.短信群發機制作:
1.短信群發機是建立在上面的程序代碼的基礎上的;
2.在上面的代碼中,我們是建立了一個字符變量來存儲電話號碼,這裏我們建立一個數組來存放電話號碼;
3.在電話號碼全部錄入後;
4.我們來查詢一下這個數組裏面有幾個電話號碼(也就是告訴芯片你要給幾個手機發短信);
5.然後我們對這個數組裏面的數據進行依次調用;
6.並對這個數據執行發送短信的流程;
7.並獲取到這是數組中的第幾個數據;
8.如果數組中的數據全部調用了一次後,結束程序的發送;
6.短信群發機例程
下面是我做的短信群發機的例程,給出來參考一下。
import pyb import upcd8544 from machine import SPI,Pin from pyb import UART from ubinascii import hexlify from ubinascii import * leds = [pyb.LED(i) for i in range(1,5)] P,L,SHUCHU=0,0,0 SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK #DIN =>SPI(1).MOSI ‘X8‘ data flow (Master out, Slave in) #CLK =>SPI(1).SCK ‘X6‘ SPI clock RST = pyb.Pin(‘X20‘) CE = pyb.Pin(‘X19‘) DC = pyb.Pin(‘X18‘) LIGHT = pyb.Pin(‘X17‘) lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT) count_=0 N2 = Pin(‘Y3‘, Pin.OUT_PP) N1 = Pin(‘Y6‘, Pin.OUT_PP) N1.low() pyb.delay(2000) N1.high() pyb.delay(10000) u2 = UART(4, 115200) Message=‘TPYBoard_GPS‘#輸入你想要發送的短信的內容; number=[‘目的號碼1‘,‘目的號碼2‘,‘目的號碼3‘]#輸入想要發送的手機號 w=0 r=0 E=0 Q=0 while r<1: Q=len(number) print(Q) while E<Q: print(number[E]) u2.write(‘AT+CMGF=1\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘1:‘,_dataRead) lcd_5110.lcd_write_string(‘Message:‘,0,0) lcd_5110.lcd_write_string(str(Message),0,2) if(_dataRead==b‘AT+CMGF=1\r\n\r\nOK\r\n‘): u2.write(‘AT+CSCS="GB2312"\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘2:‘,_dataRead) if(_dataRead==b‘AT+CSCS="GB2312"\r\n\r\nOK\r\n‘): u2.write(‘AT+CNMI=2,1\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘3:‘,_dataRead) if(_dataRead==b‘AT+CNMI=2,1\r\n\r\nOK\r\n‘): u2.write(‘AT+CMGS="‘+number[E]+‘"\r\n‘) pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘4:‘,_dataRead)#b‘AT+CMGF=1\r\n\r\nOK\r\n‘ if(_dataRead== b‘AT+CMGS="‘+number[E]+‘"\r\n\r\n> ‘): u2.write(Message+‘\r\n‘)#短信內容 pyb.delay(50) if(u2.any()>0): _dataRead=u2.readall() print(‘5:‘,_dataRead) print(len(_dataRead)) w=len(_dataRead) _dataRead=str(_dataRead)[2:w] print(‘6:‘,_dataRead) if(_dataRead==Message): print(‘7:ok‘) E=E+1 lcd_5110.lcd_write_string(‘OK IS:‘+str(E),0,5) pyb.delay(24000) r=10 E=0
MicroPython+北鬥+GPS+GPRS:TPYBoardv702短信功能使用說明