[stm32] SIM808模塊之發短信\GPS\TCP\HTTP研究


 

 

 

SIM8008是四頻模塊,全球可用。含有TTL電平接口等接口,能夠實現發短信、打電話、GPRS傳輸數據、GPS等功能。[正版資料請找beautifulzzzz·博客園]

一些細節:

>>  5V供電1A以上(用USB轉TTL模塊上的電源可以驅動,親試)
>> 上圖黑色的線是VCC,白色線是GND,綠色線是TXD連接單片機或USB轉TTL的RXD引腳,橙色的線類推。
>> 其中GPS的天線一般要放在室外,否則無法收到有效信號。
>> 三個LED指示燈: 一個是RING指示燈,一個是網絡指示燈,一個PPS指示燈。注開機后,等待約2秒,首先RING指示燈常亮,然后網絡指示燈快閃(1秒滅1秒亮),當模塊注冊到網絡后,網絡指示燈慢閃(1秒亮,3秒滅)。當GPS定位后,PPS燈會閃爍(1秒亮1秒滅)。

 

1、獲得GPS的AT指令:

1 AT+CGPSPWR=1
2 AT+CGPSRST=1
3 AT+CGPSINF=32

其中:

>>  AT+CGPSPWR=1表示開啟GPS的POWER
>>  AT+CGPSRST=1表示設置GPS啟動模式(COLD\HOT\WARM),冷啟動是第一次啟動用。
>>  當前兩個命令發送完畢,等表示GPS定位的燈閃爍后發送AT+CGPSINF=32來獲取當前的GPS數據,此處的的32表示2^5為模式5,其收取的數據格式為GPRMC格式:(其中state位為A表示收到的是有效數據)

 

 

2、獲得電量的AT指令: 

1 AT+CBC

返回指令的意義:(中間一個數據為百分比電量,最后一個數據位電壓的mV數)

 

3、發送短信的AT指令:

 

我買的SIM卡是流量卡,所以發送短信的服務是沒有的,因此發送上面的命令會不成功。但是,我將自己手機里的4G小卡插在上面后再執行上述命令是可以的!

 

4、發送HTTP的AT指令:

1 AT+CGATT?
2 AT+SAPBR=3,1,"CONTYPE","GPRS" 
3 AT+SAPBR=3,1,"APN","CMNET"
4 AT+SAPBR=1,1  
5 AT+HTTPINIT
6 AT+HTTPPARA="URL","www.baidu.com/img/baidu_logo.gif"
7 AT+HTTPACTION=0
8 AT+HTTPREAD
9 AT+HTTPTERM

該一組命令實現用GET從百度下載一個圖片:前4個命令是初始化設置,其中當:

AT+HTTPACTION=0            // 執行之后要等一段時間,然后等待返回
OK                                                    // 此時等待以下信息的返回,不要操作其它
+HTTPACTION:0,200,1489                    //  獲取成功
AT+HTTPREAD                                    //  讀取數據
+HTTPREAD:1489

 

5、下面是一個簡單的SIM808的封裝驅動代碼:

  1 #include <stddef.h>
  2 #include <stdlib.h>
  3 
  4 
  5 #include "SIM800L.h"
  6 
  7 
  8 
  9 unsigned char hd[];//
 10 unsigned char id[];//id
 11 unsigned char tp[];//??
 12 unsigned char lat[];//緯度
 13 unsigned char lng[];//經度
 14 unsigned char cbc[];//電量
 15 unsigned char end[];//結尾
 16 unsigned char ip[];//ip
 17 unsigned char pt[];//port
 18 
 19 u8 Ub[500];
 20 
 21 
 22 int Sim_ini(void)
 23 {    
 24     USART2_DMASS("ATE1\r\n",500,100);//將當前的配置信息存儲在非易失的存儲里,當板重新啟動,初始化從上次的開始    
 25     Delay_MS(500);
 26     USART2_DMASS("AT+IFC=0,0\r\n",500,100);    //非流控制
 27     Delay_MS(500);
 28     USART2_DMASS("AT+CSCLK=0\r\n",500,100);//不進入休眠狀態    
 29     Delay_MS(500);
 30     USART2_DMASS("AT+CFUN=1\r\n",500,1000);    //打開全部功能
 31     Delay_MS(500);
 32     USART2_DMASS("AT+CBC\r\n",500,100);//可以充電    
 33     Delay_MS(500);
 34     USART2_DMASS("AT+CPIN?\r\n",500,100);//查詢(有些是否需要密碼)
 35     Delay_MS(500);
 36     USART2_DMASS("AT+CSQ\r\n",500,100);//信號量查詢(RSSI)
 37     Delay_MS(500);
 38     USART2_DMASS("AT+CMGF=1\r\n",500,100);//選擇SMS信息的模式(text模式)
 39     Delay_MS(500);
 40     USART2_DMASS("AT+CFGRI=0\r\n",500,100);//表明RI當啟動URC(關閉)
 41     Delay_MS(500);
 42     USART2_DMASS("AT+CIPRXGET=0\r\n",500,100); //自動從NetWork獲得數據
 43     Delay_MS(500);
 44     
 45     Delay_MS(10000);
 46     USART2_DMASS("AT+CGATT=1\r\n",5000,1000); //連接GPRS服務器
 47     Delay_MS(500);
 48     USART2_DMASS("AT+CGREG?\r\n",5000,100);//查詢
 49     Delay_MS(500);
 50     USART2_DMASS("AT+CGATT?\r\n",5000,100);    //查詢
 51     Delay_MS(500);
 52     USART2_DMASS("AT+CIPSHUT\r\n",1000,2000); //關閉IP連接
 53     Delay_MS(500);
 54     USART2_DMASS("AT+CSTT=\"CMNET\"\r\n",500,100);//設置名字和密碼
 55     Delay_MS(500);
 56     USART2_DMASS("AT+CIICR\r\n",500,1000); //bring up wireless connection with GPRS or CSD
 57     Delay_MS(500);
 58     USART2_DMASS("AT+CIFSR\r\n",500,1000); //get local IP Address
 59     Delay_MS(500);
 60     USART2_DMASS("AT+CIPSTATUS\r\n",500,100);//query current connection status
 61     Delay_MS(500);
 62     USART2_DMASS("AT+CIPQSEND=0\r\n",500,100);//select data transmitting mode(0模式,服務器收到數據返回Send OK)
 63     Delay_MS(500);
 64     USART2_DMASS("AT+CIPSTART=\"TCP\",\"beautifulzzzz.iask.in\",10000\r\n",500,100);//start up TCP or UDP Connection
 65     Delay_MS(500);
 66     USART2_DMASS(NULL,5000,100);//發送一個NULL,用於讀取USART2數據
 67     Delay_MS(500);
 68     //
 69     
 70     return 0;
 71 }
 72 
 73 
 74 void USART2_DMAS(u8* Data)
 75 {
 76     while(*Data)
 77     {
 78         USART2_SendByte(*Data++);
 79     }
 80 }
 81 
 82 int USART2_DMASS(u8* Data,uint16_t BeTime,uint16_t AfTime)
 83 {
 84     int RecLen=0;
 85     u8 Ubyte=0;
 86     u8 i;
 87     
 88     USART2_RX_Buffer_Clear();
 89     if(Data!=NULL){
 90         USART2_DMASendString(Data,strlen((const char *)Data));
 91     }
 92     //等待BeTime    
 93     do{
 94         BeTime=BeTime-1;
 95         Delay_MS(1);
 96     }while(!(LookUSART2_GetBuffCount()) && BeTime>0);
 97     //檢測串口數據    
 98     do{
 99         
100         AfTime=AfTime-1;
101         while(LookUSART2_GetBuffCount()){
102             USART2_GetByte(&Ubyte);
103             Ub[RecLen]=Ubyte;
104             RecLen=RecLen+1;            
105         }
106         
107         Delay_MS(1);
108         
109     }while(LookUSART2_GetBuffCount() || AfTime>0);
110     
111     USART2_RX_Buffer_Clear();
112     
113     //通過串口1顯示
114 
115     DebugPf("################################\r\n");                
116     DebugPf("####SIM800L Back Data=%d\r\n",RecLen);
117     for(i=0;i<RecLen;i++){
118         DebugPf("%c",Ub[i]);
119     }
120     DebugPf("\r\n");
121     DebugPf("####SIM800L Back Data End\r\n");
122     DebugPf("################################\r\n");
123 
124     return RecLen;    
125     
126 }
127 
128 unsigned char GPSVLD(void)
129 {
130     char *gps;    
131     gps=strstr((const char *)Ub,"+CGPSINF:");    
132     gps+=24;    
133     return gps[0];
134 }
135 
136 void GPSDATA(void)
137 {
138     char *gps;
139     unsigned char i;
140     
141     gps=strstr((const char *)Ub,"+CGPSINF:");
142     
143     gps+=26;
144     for(i=0;i<9;i++)
145     {
146         lat[i]=gps[i];
147     }
148     //    DebugPf(lat);
149     
150     gps+=12;
151     for(i=0;i<10;i++)
152     {
153         lng[i]=gps[i];
154     }
155     //    DebugPf(lng);
156     
157     tp[0]='A';
158 }
159 
160 //獲取電量,存入cbc[]
161 void CBCDATA()
162 {
163     char *bc;
164     unsigned char i;
165     
166     bc=strstr((const char *)Ub,"+CBC:");
167     
168     bc+=8;
169     
170     i=0;
171     do{        
172         i++;
173     }while(bc[i]!=',');
174     
175     switch (i){
176     case 3:
177         cbc[0]=bc[0];
178         cbc[1]=bc[1];
179         cbc[2]=bc[2];    
180         break;
181         
182     case 2:
183         cbc[0]=0x30;
184         cbc[1]=bc[0];
185         cbc[2]=bc[1];    
186         break;
187         
188     case 1:
189         cbc[0]=0x30;
190         cbc[1]=0x30;
191         cbc[2]=bc[0];    
192         break;
193         
194     default:
195         break;
196     }
197         
198     //    DebugPf(cbc);    
199 }

當想要獲取GPS數據時,首先啟動GPS:

1 USART2_DMASS("AT+CGPSPWR=1\r\n",500,100);//開GPS啟
2 Delay_MS(2500);
3 USART2_DMASS("AT+CGPSRST=1\r\n",500,100);//GPS啟動模

這里的USART2_DMASS函數是基於STM32上的USART2封裝的函數,專門用來向SIM808發送指令,后兩個參數是控制數據發送和接收數據的時間(因為大多數AT指令發送后直接可以獲取返回,因此該函數包含發送和返回接收)

此外要注意每個命令后面還要加"\r\n".

這樣因為有了該函數,用單片機發送AT指令就比較方便了:同用串口助手發送AT指令獲得GPS數據,當GPS啟動並定位成功后執行下面的語句則可以獲得實時的GPS數據~

1 USART2_DMASS("AT+CGPSINF=32\n",100,100);//查詢GPRMC數據(當前GPS手數據)[應該在GPS定位成功后執行]

 

 

 

資料鏈接: 

 總資料:http://pan.baidu.com/s/1sjTg5q9

比較有用的幾個:

 1、原理圖(打板、連線必備、SIM808最小系統啦):http://pan.baidu.com/s/1kTRWJpd
 2、用戶手冊(注意事項、大致了解):http://pan.baidu.com/s/1nuh1Fi5
 3、AT指令(雖然不是SIM808但是基本通用):http://pan.baidu.com/s/1pJW8uPd

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM