gprs数据传输流程

一、最近的项目中用到了GSM模块,总结一下,模块型号是SIM800C,mcu还是stm32rtc6。
1、首先了解一下专业术语
SIM–用户识别码
GPRS–General Packet Radio Service, 通用分组无线电业务。GPRS是一种新的GSM数据业务,它可以给移动用户提供无线分组数据接入服务。GPRS主要是在移动用户和远端的数据网络(如支持TCP/IP、X.25等网络)之间提供一种连接,从而给移动用户提供高速无线IP和无线X.25业务。
GSM–Pan-European digital cellular land mobile telecommunication system ,泛欧数字蜂窝移动通信系统。

*GPRS相关AT指令集
GPRS指令
AT+CGATT=1 //返回OK,附着网络
AT+CGACT=1,1 //激活网络,之后就可以使用tcpip的指令了
AT+CREG?=1 //查询模块是否注册成功
TCP/IP指令
AT+CIPSTART=“TCP”,“121.41.97.28”,60000 //连接TCPIP服务器
AT+CIPSEND=20 //返回>,就可以输入要发送的内容20表示有20个字节
AT+CIPCLOSE //关闭TCPIP连接
+CIPRCV:5,12345 //收到服务器返回的5个字节

多路TCP/IP连接指令
AT+CGDCONT=1,“IP”,“cmnet” //设置PDP参数
AT+CGACT=1,1 //激活PDP
AT+CIPSTATUS? //查询ip连接情况,共有8路,实际最多支持同时开4路tcpip连接
AT+CIPCLOSE //关闭该链路
AT+CIPMUX? //查询是否开启多连接
AT+CIPMUX=1 //开启多链接

AT+CGPADDR //显示PDP地址
ATD99**1# //请求GPRS服务

mcu通过串口发送相关AT指令控制sim模块
例子:
//拨号流程

USART2_Init_Config(115200);  //此模块使用的是串口2
if((UART2_SendString("AT+CREG?"));     //查询模块是否注册成功
UART2_SendString("ATD13017688718;\r\n")//电话号可修改

//接听电话流程

USART2_Init_Config(115200);  //此模块使用的是串口2
if((UART2_SendString("AT+CREG?"));     //查询模块是否注册成功
{
   //注册成功
   while(1)
   {
      if(find("CRING"||find("RING")) //查询串口接收数组中是否有这两个指令
      {
          clear_buf();  //若有先清除串口接收缓存
          UART2_SendString("ATA\r\n");//接听来电指令
      }
      delay_ms(1000);//每秒轮询检查一次
   }
}

//接收发送短信语音等等也是同理,在此不做记录,项目中主要是用到了gprs,即通过ip地址进行数据传输。

首先总结下流程:
首先检查硬件 1、AT //检查串口模块 2、AT+CCID //检测是否插卡
硬件没问题了进行下面步骤(1到6步可以重复发送,直到成功为止 )
1、第一步:AT+CSQ 查询网络信号质量 //返回值越大,信号越好
2、第二步:AT+CREG? 查询网络注册情况//判断返回值的第二个参数,为1或5则注册成功
3、第三步:AT+CGATT? 查询模块是否附着 GPRS 网络
4、第四步:AT+CSTT 设置APN
5、第五步:AT+CIICR 激活移动场景
6、第六步:AT+CIPSTART=“TCP”,“183.235.86.3”,1234 建立TCP/IP连接 // 测试时广东珠海公网动态IP:183.235.86.3 //若是udp直接改下就行AT+CIPSTART=“UDP”,“183.235.86.3”,1234
注意:第六步如果连接不成功,需要关闭连接再发起连接,先发送 AT+CIPCLOSE。如果一直不成功,检查服务器端口是否打开,若打开了,可以选择io口复位。 如果前面的步骤也一直不成功,直接io复位最快
代码:

const char *string = "AT+CIPSTART=\"TCP\",\"14.125.48.205\",9015";//选择的是tcp
USART2_Init_Config(115200);  //此模块使用的是串口2
Second_AT_Command(u8 *cmd,u16 len,u8 *ack,u16 waittime);//这个函数封装了串口2发送指令及检查收到的数据
if((UART2_SendString("AT+CREG?"));     //查询模块是否注册成功
{
   //注册成功,连接服务器
   Connect_Server();
}

void  Connect_Server(void)
{
    UART2_SendString("AT+CIPCLOSE=1"); //关闭连接
  Delay_ms(100);
 Second_AT_Command("AT+CIPSHUT","SHUT OK",2);  //关闭移动场景
 Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//设置GPRS移动台类别为B,支持包交换和数据交换 
 Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//设置PDP上下文,互联网接协议,接入点等信息
 Second_AT_Command("AT+CGATT=1","OK",2);//附着GPRS业务
 Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//设置为GPRS连接模式
 Second_AT_Command("AT+CIPHEAD=1","OK",2);//设置接收数据显示IP头(方便判断数据来源,仅在单路连接有效)
 Second_AT_Command((char*)string,"OK",5);
 Delay_ms(100);
 clear_buf();
}

至此,gprs的驱动代码部分就算完成了,下面进行应用部分,收发函数及解析

u8 SIM800C_GPRS_SEND_DATA(u8 *temp_data,u16 size)
{  
  unsigned char Tx_Buf[32]="AT+CIPSEND=";
  To_STR(size,Tx_Buf+11);//将数字转换为字符串,用于计算发送的字符数
  if(Second_AT_Command(Tx_Buf,sizeof(Tx_Buf),(u8 *)">"))  return 1;//先发送长度帧指令
  if(Second_AT_Command(temp_data,size,(u8 *)"SEND OK")) return 2; //再发送data
  return 0;
}

注意:发送完GPRS长度帧后,返回字符’>’,接着发送数据帧,在模块返回"OK"之前,发送的数据都会被发送到服务器。即长度帧与数据帧要连着发,不能分开处理。

项目中一般发送数据后只要接收到ok状态码即可。在串口中断内还要判断是否有在线升级的指令,有的话还需要对数据包进行处理。此刻收集的传感器的数据包是停止发送的。

之后,在定时器中断内,每隔30秒发送一个数据包给后台。 //这个板作为数据中转用的,不光上传自己板上的数据,也上传其他板上的数据,与其他板间通信是通过cc2500模块实现的,下次总结。

void TIM3_IRQHandler(void)   //TIM3中断函数
{
 static unsigned int times=7200;
 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查中断标志位
 {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //   清除中断标志位
(times%30)==0)
   {
    Second_AT_Command(heart_packet.buf,11);
    if(times >=7200)
    {
     if(SIM800C_CHECK_TCP_LINK())//检查连接
      Soft_Reset;
     printf("TCP check ok!\r\n");
     times = 0;
    }
    }
   if((times%300)==0)
   {
    TimeNow = RTC8563_ReadTime();
    if(TimeNow.day == 0)Soft_Reset;  //
   }
      else
    RTC8563_ADD_NS(&TimeNow,1);
   times++;
   //printf("Time_Now:%.2x %.2x:%.2x:%.2x\r\n",TimeNow.day,TimeNow.hour,TimeNow.min,TimeNow.sec);
 }
}

发布了29 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42542969/article/details/100535263