[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/1pJ7l9KB

比较有用的几个:

1、原理图(打板、连线必备、SIM808最小系统啦):http://pan.baidu.com/s/1jGrgLW6
 2、用户手册(注意事项、大致了解):http://pan.baidu.com/s/1ntuy1r7

3、AT指令(虽然不是SIM808但是基本通用):http://pan.baidu.com/s/1hq5xZYO

时间: 2024-10-16 09:43:26

[stm32] SIM808模块之发短信\GPS\TCP\HTTP研究的相关文章

linux下利用GPRS模块发短信、打电话

一.开发环境 内核版本:linux-3.0    开发板:FL2440(nandflash:K9F1G08 128M)    GPRS模块:SIM900 二.与发短信和拨号相关的 AT 指令 AT+CMGC   Send an SMS command(发出一条短消息命令) AT+CMGD   Delete SMS message(删除 SIM 卡内存的短消息) AT+CMGF   Select SMS message formate (选择短消息信息收发格式: 0-PDU;1-文本) AT+CM

调用系统的打电话,发短信,邮件,蓝牙

在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的系统应用.常用的协议如下: 打电话:tel:或者tel://.telprompt:或telprompt://(拨打电话前有提示) 发短信:sms:或者sms:// 发送邮件:mailto:或者mailto:// 启动浏览器:http:或者http:// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

实现在手机浏览器上面打 电话发 短信 定位的 功能

如果需要在移动浏览器中实现拨打电话,调用sms,发送email等功能,移动手机WEB页面(HTML5)Javascript提供的接口是一个好办法. 采用url链接的方式,实现在Safari ios,Android 浏览器,webos浏览器,塞班浏览器,IE,Operamini等主流浏览器,进行拨打电话功能. 1. 打电话 在电话号码前面可以加上 + (加号)表示国际号码.如: 最常用WEB页面JS实现一键拨号的电话拨打功能 例子: 1 <a href="tel:10086">

zabbix通过脚本发短信

zabbix通过脚本发短信 原理 和zabbix发邮件是一样的,都是在action里面配置,发短信的方式是通过调用短信公司的api来完成,当然网上有不少利用139邮箱来发的,这个其实算调用email的一种,这里复述的是调用script的方法. step 编写发短信的脚本.加上可执行权限. administration-> medis types 里面create ,类型选script,填上你的脚本名称. 在server的配置文件里面指定AlertScriptsPath .注意这个目录能被zabb

html页面通过特殊链接:打电话,发短信,发邮件详细教程

采用url href链接的方式,实现在Safari  ios,Android 浏览器,webos浏览器,塞班浏览器,IE,Operamini等主流浏览器,进行拨打电话功能. 1. 拨打电话 在电话号码前面可以加上 + (加号)表示国际号码.如: 最常用WEB页面JS实现一键拨号的电话拨打功能 例子: <a href="tel:10086">10086</a> 使用wtai协议进行拨打电话 <a href="wtai://wp/mc;10086&q

西门子S7200 PLC发短信应用方案

西门子PLC发短信方案概述 为了实现无人值守,在设备发生故障时,通过短信或者拨号的方式,通知值班人员,在PLC控制系统中获得了广泛的应用.传统的实现方式一般采取通过PLC的通讯口外接短信猫的方式,通过PLC的自由通讯协议,控制PLC发出短信.此类方案缺陷在于: 1.程序复杂,需要熟悉PLC自由协议编程,AT指令集,如果需要发出中文短信,还需要UNICODE编码,非常麻烦,因此,使用短信猫的方式,一般只实现简单的报警. 2.可靠性差,普通短信猫很多并非为恶劣的工业环境设计,多采用国产模块或拆机TC

手机端点击 拔打电话,发短信,发邮件,地图定位

移动设备手机网页html5 如果需要在移动浏览器中实现拨打电话,调用sms发短信,发送email等功能,移动手机WEB页面(HTML5)Javascript提供的接口是一个好办法. 采用url href链接的方式,实现在Safari  ios,Android 浏览器,webos浏览器,塞班浏览器,IE,Operamini等主流浏览器,进行拨打电话功能. 1. 拨打电话 在电话号码前面可以加上 + (加号)表示国际号码.如: 最常用WEB页面JS实现一键拨号的电话拨打功能 例子: <a href=

手持移动端特殊链接:打电话,发短信,发邮件

如果需要在移动浏览器中实现拨打电话,调用sms,发送email等功能,移动手机WEB页面(HTML5)Javascript提供的接口是一个好办法. 采用url链接的方式,实现在Safari ios,Android 浏览器,webos浏览器,塞班浏览器,IE,Operamini等主流浏览器,进行拨打电话功能. 1. 打电话 在电话号码前面可以加上 + (加号)表示国际号码.如: 最常用WEB页面JS实现一键拨号的电话拨打功能 例子: 1 <a href="tel:10086">

向android模拟器打电话发短信的简单方法

在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这里介绍一种简单的向android模拟器打电话发短信的方法. 该方法利用了eclipse ADT的DDMS来实现,首先点击打开DDMS,在eclipse界面的右上角,如图: 如果找不到,就点左边的图标,再点击others就会看到. 打开之后,在界面的左边中部会看见有一个Emulator Control