[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

时间:2023-01-25 07:08:22

SIM8008是四频模块,全球可用。含有TTL电平接口等接口,能够实现发短信、打电话、GPRS传输数据、GPS等功能。[正版资料请找beautifulzzzz·博客园]

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

一些细节:

>>  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指令:

 AT+CGPSPWR=
AT+CGPSRST=
AT+CGPSINF=

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

其中:

>>  AT+CGPSPWR=1表示开启GPS的POWER
>>  AT+CGPSRST=1表示设置GPS启动模式(COLD\HOT\WARM),冷启动是第一次启动用。

>>  当前两个命令发送完毕,等表示GPS定位的灯闪烁后发送AT+CGPSINF=32来获取当前的GPS数据,此处的的32表示2^5为模式5,其收取的数据格式为GPRMC格式:(其中state位为A表示收到的是有效数据)

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

2、获得电量的AT指令:

 AT+CBC

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

返回指令的意义:(中间一个数据为百分比电量,最后一个数据位电压的mV数)

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

3、发送短信的AT指令:

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

我买的SIM卡是流量卡,所以发送短信的服务是没有的,因此发送上面的命令会不成功。但是,我将自己手机里的4G小卡插在上面后再执行上述命令是可以的!

4、发送HTTP的AT指令:

 AT+CGATT?
AT+SAPBR=,,"CONTYPE","GPRS"
AT+SAPBR=,,"APN","CMNET"
AT+SAPBR=,
AT+HTTPINIT
AT+HTTPPARA="URL","www.baidu.com/img/baidu_logo.gif"
AT+HTTPACTION=
AT+HTTPREAD
AT+HTTPTERM

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

该一组命令实现用GET从百度下载一个图片:前4个命令是初始化设置,其中当:

AT+HTTPACTION=0            // 执行之后要等一段时间,然后等待返回
OK                                                    // 此时等待以下信息的返回,不要操作其它

+HTTPACTION:0,200,1489                    //  获取成功

AT+HTTPREAD                                    //  读取数据

+HTTPREAD:1489

5、下面是一个简单的SIM808的封装驱动代码:

 #include <stddef.h>
#include <stdlib.h> #include "SIM800L.h" unsigned char hd[];//头
unsigned char id[];//id
unsigned char tp[];//??
unsigned char lat[];//纬度
unsigned char lng[];//经度
unsigned char cbc[];//电量
unsigned char end[];//结尾
unsigned char ip[];//ip
unsigned char pt[];//port u8 Ub[]; int Sim_ini(void)
{
USART2_DMASS("ATE1\r\n",,);//将当前的配置信息存储在非易失的存储里,当板重新启动,初始化从上次的开始
Delay_MS();
USART2_DMASS("AT+IFC=0,0\r\n",,); //非流控制
Delay_MS();
USART2_DMASS("AT+CSCLK=0\r\n",,);//不进入休眠状态
Delay_MS();
USART2_DMASS("AT+CFUN=1\r\n",,); //打开全部功能
Delay_MS();
USART2_DMASS("AT+CBC\r\n",,);//可以充电
Delay_MS();
USART2_DMASS("AT+CPIN?\r\n",,);//查询(有些是否需要密码)
Delay_MS();
USART2_DMASS("AT+CSQ\r\n",,);//信号量查询(RSSI)
Delay_MS();
USART2_DMASS("AT+CMGF=1\r\n",,);//选择SMS信息的模式(text模式)
Delay_MS();
USART2_DMASS("AT+CFGRI=0\r\n",,);//表明RI当启动URC(关闭)
Delay_MS();
USART2_DMASS("AT+CIPRXGET=0\r\n",,); //自动从NetWork获得数据
Delay_MS(); Delay_MS();
USART2_DMASS("AT+CGATT=1\r\n",,); //连接GPRS服务器
Delay_MS();
USART2_DMASS("AT+CGREG?\r\n",,);//查询
Delay_MS();
USART2_DMASS("AT+CGATT?\r\n",,); //查询
Delay_MS();
USART2_DMASS("AT+CIPSHUT\r\n",,); //关闭IP连接
Delay_MS();
USART2_DMASS("AT+CSTT=\"CMNET\"\r\n",,);//设置名字和密码
Delay_MS();
USART2_DMASS("AT+CIICR\r\n",,); //bring up wireless connection with GPRS or CSD
Delay_MS();
USART2_DMASS("AT+CIFSR\r\n",,); //get local IP Address
Delay_MS();
USART2_DMASS("AT+CIPSTATUS\r\n",,);//query current connection status
Delay_MS();
USART2_DMASS("AT+CIPQSEND=0\r\n",,);//select data transmitting mode(0模式,服务器收到数据返回Send OK)
Delay_MS();
USART2_DMASS("AT+CIPSTART=\"TCP\",\"beautifulzzzz.iask.in\",10000\r\n",,);//start up TCP or UDP Connection
Delay_MS();
USART2_DMASS(NULL,,);//发送一个NULL,用于读取USART2数据
Delay_MS();
// return ;
} void USART2_DMAS(u8* Data)
{
while(*Data)
{
USART2_SendByte(*Data++);
}
} int USART2_DMASS(u8* Data,uint16_t BeTime,uint16_t AfTime)
{
int RecLen=;
u8 Ubyte=;
u8 i; USART2_RX_Buffer_Clear();
if(Data!=NULL){
USART2_DMASendString(Data,strlen((const char *)Data));
}
//等待BeTime
do{
BeTime=BeTime-;
Delay_MS();
}while(!(LookUSART2_GetBuffCount()) && BeTime>);
//检测串口数据
do{ AfTime=AfTime-;
while(LookUSART2_GetBuffCount()){
USART2_GetByte(&Ubyte);
Ub[RecLen]=Ubyte;
RecLen=RecLen+;
} Delay_MS(); }while(LookUSART2_GetBuffCount() || AfTime>); USART2_RX_Buffer_Clear(); //通过串口1显示 DebugPf("################################\r\n");
DebugPf("####SIM800L Back Data=%d\r\n",RecLen);
for(i=;i<RecLen;i++){
DebugPf("%c",Ub[i]);
}
DebugPf("\r\n");
DebugPf("####SIM800L Back Data End\r\n");
DebugPf("################################\r\n"); return RecLen; } unsigned char GPSVLD(void)
{
char *gps;
gps=strstr((const char *)Ub,"+CGPSINF:");
gps+=;
return gps[];
} void GPSDATA(void)
{
char *gps;
unsigned char i; gps=strstr((const char *)Ub,"+CGPSINF:"); gps+=;
for(i=;i<;i++)
{
lat[i]=gps[i];
}
// DebugPf(lat); gps+=;
for(i=;i<;i++)
{
lng[i]=gps[i];
}
// DebugPf(lng); tp[]='A';
} //获取电量,存入cbc[]
void CBCDATA()
{
char *bc;
unsigned char i; bc=strstr((const char *)Ub,"+CBC:"); bc+=; i=;
do{
i++;
}while(bc[i]!=','); switch (i){
case :
cbc[]=bc[];
cbc[]=bc[];
cbc[]=bc[];
break; case :
cbc[]=0x30;
cbc[]=bc[];
cbc[]=bc[];
break; case :
cbc[]=0x30;
cbc[]=0x30;
cbc[]=bc[];
break; default:
break;
} // DebugPf(cbc);
}

当想要获取GPS数据时,首先启动GPS:

 USART2_DMASS("AT+CGPSPWR=1\r\n",,);//开GPS启
Delay_MS();
USART2_DMASS("AT+CGPSRST=1\r\n",,);//GPS启动模

这里的USART2_DMASS函数是基于STM32上的USART2封装的函数,专门用来向SIM808发送指令,后两个参数是控制数据发送和接收数据的时间(因为大多数AT指令发送后直接可以获取返回,因此该函数包含发送和返回接收)

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

这样因为有了该函数,用单片机发送AT指令就比较方便了:同用串口助手发送AT指令获得GPS数据,当GPS启动并定位成功后执行下面的语句则可以获得实时的GPS数据~

 USART2_DMASS("AT+CGPSINF=32\n",,);//查询GPRMC数据(当前GPS手数据)[应该在GPS定位成功后执行]

资料链接: 

总资料:http://pan.baidu.com/s/1sjTg5q9

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究

比较有用的几个:

1、原理图(打板、连线必备、SIM808最小系统啦):http://pan.baidu.com/s/1kTRWJpd
 2、用户手册(注意事项、大致了解):http://pan.baidu.com/s/1nuh1Fi5
 3、AT指令(虽然不是SIM808但是基本通用):http://pan.baidu.com/s/1pJW8uPd