zoukankan      html  css  js  c++  java
  • [stm32] SIM808模块之发短信GPSTCPHTTP研究

    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启动模式(COLDHOTWARM),冷启动是第一次启动用。
    >>  当前两个命令发送完毕,等表示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
    ",500,100);//将当前的配置信息存储在非易失的存储里,当板重新启动,初始化从上次的开始    
     25     Delay_MS(500);
     26     USART2_DMASS("AT+IFC=0,0
    ",500,100);    //非流控制
     27     Delay_MS(500);
     28     USART2_DMASS("AT+CSCLK=0
    ",500,100);//不进入休眠状态    
     29     Delay_MS(500);
     30     USART2_DMASS("AT+CFUN=1
    ",500,1000);    //打开全部功能
     31     Delay_MS(500);
     32     USART2_DMASS("AT+CBC
    ",500,100);//可以充电    
     33     Delay_MS(500);
     34     USART2_DMASS("AT+CPIN?
    ",500,100);//查询(有些是否需要密码)
     35     Delay_MS(500);
     36     USART2_DMASS("AT+CSQ
    ",500,100);//信号量查询(RSSI)
     37     Delay_MS(500);
     38     USART2_DMASS("AT+CMGF=1
    ",500,100);//选择SMS信息的模式(text模式)
     39     Delay_MS(500);
     40     USART2_DMASS("AT+CFGRI=0
    ",500,100);//表明RI当启动URC(关闭)
     41     Delay_MS(500);
     42     USART2_DMASS("AT+CIPRXGET=0
    ",500,100); //自动从NetWork获得数据
     43     Delay_MS(500);
     44     
     45     Delay_MS(10000);
     46     USART2_DMASS("AT+CGATT=1
    ",5000,1000); //连接GPRS服务器
     47     Delay_MS(500);
     48     USART2_DMASS("AT+CGREG?
    ",5000,100);//查询
     49     Delay_MS(500);
     50     USART2_DMASS("AT+CGATT?
    ",5000,100);    //查询
     51     Delay_MS(500);
     52     USART2_DMASS("AT+CIPSHUT
    ",1000,2000); //关闭IP连接
     53     Delay_MS(500);
     54     USART2_DMASS("AT+CSTT="CMNET"
    ",500,100);//设置名字和密码
     55     Delay_MS(500);
     56     USART2_DMASS("AT+CIICR
    ",500,1000); //bring up wireless connection with GPRS or CSD
     57     Delay_MS(500);
     58     USART2_DMASS("AT+CIFSR
    ",500,1000); //get local IP Address
     59     Delay_MS(500);
     60     USART2_DMASS("AT+CIPSTATUS
    ",500,100);//query current connection status
     61     Delay_MS(500);
     62     USART2_DMASS("AT+CIPQSEND=0
    ",500,100);//select data transmitting mode(0模式,服务器收到数据返回Send OK)
     63     Delay_MS(500);
     64     USART2_DMASS("AT+CIPSTART="TCP","beautifulzzzz.iask.in",10000
    ",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("################################
    ");                
    116     DebugPf("####SIM800L Back Data=%d
    ",RecLen);
    117     for(i=0;i<RecLen;i++){
    118         DebugPf("%c",Ub[i]);
    119     }
    120     DebugPf("
    ");
    121     DebugPf("####SIM800L Back Data End
    ");
    122     DebugPf("################################
    ");
    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
    ",500,100);//开GPS启
    2 Delay_MS(2500);
    3 USART2_DMASS("AT+CGPSRST=1
    ",500,100);//GPS启动模

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

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

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

    1 USART2_DMASS("AT+CGPSINF=32
    ",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

     

     

     

     

     

     

  • 相关阅读:
    Linux中应用程序如何使用系统调用syscall
    Spring Service、Dao进行Junit单元测试
    spring service层单元测试
    java-随机生成用户名(中文版及英文版)
    Java获取随机数
    JUnit单元测试框架的使用
    Mock以及Mockito的使用
    Spring Boot 各Starter介绍
    编写自己的SpringBoot-starter
    Spring Boot使用单元测试
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/4682600.html
Copyright © 2011-2022 走看看