基于STM32的NB-IoT模块驱动

1、概述

        目前这个NB-IoT在国内仍是比较火的,最近恰好使用了一款NB-IoT模块。将驱动程序贡献给你们。但愿能对用到的朋友有点帮助。web

2、NB-IoT模块介绍

        本次采用的是有人物联网公司的WHNB75模块。(支持电信网络)WH-NB75 是基于 WH-NB73 模块开发出来的 DIP 封装的模块产品,该产品可以更方便的嵌入到客户产品中。WH-NB75 是咱们 NB75 模块系列的一个总称,针对不一样运营商网络有不一样的模块型号对应。请在选购模块时注意选择支持当地运营商的模块。稳恒正在基于海思 Hi2115 芯片打造支持全频段的 NB 模组 WH-NB71,到时候能够一款模块支持多家运营商的网络。下表为不一样型号产品对应的运营商。
        详细NB-IoT介绍能够看一下我写的这边介绍:初识NB-IoT(NB-IoT背景,简介,标准化过程,技术优点,与其余无线技术对比)数组

3、基于STM32的驱动程序

        相对来讲经过AT命令控制仍是比较简单的。网络

#include"nbiot.h"
/***************************************************************************************
函数名:send_NB_IoT
功  能:发送数据到NB模块
参  数:cmd 要发送的数据或者命令
返回值:
例  子:
说  明: 
做  者:贺远
日  期:2019.05.04
****************************************************************************************/
void send_NB_IoT(u8 *cmd)
{
	
	while(*cmd!='\0')
	{
	  USART_SendData(USART2,*cmd++);
	  while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==Bit_RESET);	//发送数据结束
	}
}

/***************************************************************************************
函数名:NB_IoT_ack_chack
功  能://检查NB模块应答是否符合预期   
参  数:
返回值:
例  子:
说  明:  memset(a, 0, sizeof a);  //清空数组  
做  者:贺远
日  期:2019.05.04
****************************************************************************************/
u8 NB_IoT_ack_chack(u8 *str)
{
	  delay_ms(10);
		if(USART2_RX_STA!=0)
		{
			 USART2_RX_STA=0;
			   
			 if(strstr((const char*)USART2_RX_BUF,(const char*)str))//符合预期
       { 
			     memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);    
  				 return 0;
			 }
			 else //不符合预期  
       { 
			     memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);    
			     return 1;
			 }                             	
		} 
		else 
		{ 
			  memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF);  //清空数组  		 
		    return  1;
		}
}
u8 NB_IotConect()
{
	u8 x=1;
	cmd1:send_NB_IoT("AT\r\n");//  指令测试
	    if(!NB_IoT_ack_chack("OK"))  x=0;
	    else   goto cmd1;
	return x;
}
/***************************************************************************************
函数名:NB_IoT_ZDFW
功  能:自动附着网络
参  数:
返回值:
例  子:
说  明:
做  者:贺远
日  期:2019.05.04
****************************************************************************************/
u8 NB_IoT_ZDFW()
{
	    u8  x=0;
cmd1: send_NB_IoT("AT+NCONFIG=AUTOCONNECT,TRUE\r\n") ;  
			if(!NB_IoT_ack_chack("OK"))  x++ ;
	    else   goto cmd1;
cmd2: send_NB_IoT("AT+CFUN=1\r\n") ;     
			if(!NB_IoT_ack_chack("OK"))  x++ ;
	    else   goto cmd2;		
cmd3: send_NB_IoT("AT+NRB\r\n") ; 
	    if(!NB_IoT_ack_chack("REBOOTING"))  x++ ;
	    else   goto cmd3;	
		//确认自动附网
cmd4:	send_NB_IoT("AT+NBAND?\r\n");  
			if(!NB_IoT_ack_chack("+NBAND:5"))  x++ ;
			else   goto cmd4;		
cmd5: send_NB_IoT("AT+CFUN?\r\n"); 
			if(!NB_IoT_ack_chack("+CFUN:1"))   x++ ;
			else   goto cmd5;		
cmd6: send_NB_IoT("AT+CIMI\r\n");
			if(!NB_IoT_ack_chack("460113007651563")) x++ ;
			else   goto cmd6;		
cmd7:send_NB_IoT("AT+CSQ\r\n");  //确认信号质量第一个参数应该 1-30 之间
			delay_ms(10);
			if(USART2_RX_BUF[7]>'0'&&USART2_RX_BUF[7]<'3')
			{
				memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF); 
				USART2_RX_STA=0;
				
  			x++ ;
		  }
			else 
			{
				memset(USART2_RX_BUF,0, sizeof USART2_RX_BUF); 
				USART2_RX_STA=0;
				goto cmd7;
		  }	
cmd8: send_NB_IoT("AT+CGATT?\r\n");
			if(!NB_IoT_ack_chack("+CGATT:1")) x++ ;
			else   goto cmd8;
cmd9:send_NB_IoT("AT+CEREG?\r\n");
			if(!NB_IoT_ack_chack("+CEREG:0,1")) x++ ;
			else   goto cmd9;
cmd10:send_NB_IoT("AT+CSCON?\r\n");
		  if(!NB_IoT_ack_chack("+CSCON:0")) x++ ;
		  else   goto cmd10;  		 
cmd11:send_NB_IoT("AT+CGPADDR\r\n"); 
      if(!NB_IoT_ack_chack("+CGPADDR:0,10.")) x++ ;
	 	  else   goto cmd11; 
	    if(x==11)  return 0;//自动附着网络成功
	    else       return 1;//自动附网失败
	
}
/***************************************************************************************
函数名:NB_IoT_conect_COAP
功  能:COAP链接
参  数:
返回值:
例  子:
说  明:
做  者:贺远
日  期:2019.05.04
****************************************************************************************/
u8 NB_IoT_conect_COAP()
{
	    u8  x=0;
cmd1: send_NB_IoT("AT+CGSN=1\r\n") ;  
			if(!NB_IoT_ack_chack("+CGSN:356566078248721"))  x++ ;
	    else   goto cmd1;
cmd2: send_NB_IoT("AT+NCDP=180.101.147.115,5683\r\n") ;     
			if(!NB_IoT_ack_chack("OK"))  x++ ;
	    else   goto cmd2;	
cmd3: send_NB_IoT("AT+NRB\r\n") ; 
	    if(!NB_IoT_ack_chack("REBOOTING"))  x++ ;
	    else   goto cmd3;	
cmd4:	send_NB_IoT("AT+NCDP?\r\n");  
			if(!NB_IoT_ack_chack("+NCDP:180.101.147.115,5683"))  x++ ;
			else   goto cmd4;			
cmd5: send_NB_IoT("AT+NSMI=1\r\n"); 
			if(!NB_IoT_ack_chack("OK"))   x++ ;
			else   goto cmd5;		
cmd6: send_NB_IoT("AT+NNMI=2\r\n");
			if(!NB_IoT_ack_chack("OK")) x++ ;
			else   goto cmd6;
cmd7:			send_NB_IoT("AT+NMGS=3,000102\r\n");  
      if(!NB_IoT_ack_chack("OK")) x++ ;
			else   goto cmd7;
	    if(x==7)  return 0;//COAP链接成功
	    else      return 1; //COAP链接失败
}
/***************************************************************************************
函数名:NBIoTInit
功  能:NBIoT初始化
参  数:
返回值:
例  子:
说  明:
做  者:贺远
日  期:2019.05.04
****************************************************************************************/
void	NBIoTInit()
	
	{
		      NB_IotConect();
		      NB_IoT_ZDFW();
		      NB_IoT_conect_COAP();
//		      send_NB_IoT("AT+NMGS=10,53544d33325f4e423735\r\n"); //发送设备名字:STM32_NB75
//		    POINT_COLOR=BLUE;	//设置字体为蓝色 
//				LCD_ShowString(50,80 ,250,16,16,"NBIoT conecting...");
//				if (!NB_IotConect())           LCD_ShowString(50,80 ,250,16,16,"NB_IotConect success!");
//				else                          LCD_ShowString(50,80 ,250,16,16,"NB_IotConect error!!");
//				LCD_ShowString(50,100 ,250,16,16,"NBIoT Net conecting...");
//				if(!NB_IoT_ZDFW())     		    LCD_ShowString(50,100,250,16,16,"NBIoT ZDFW success!                  ");					 //自动附着网络
//				else                          LCD_ShowString(50,100,250,16,16,"NBIoT ZDFW error!                     "); 
//				LCD_ShowString(50,120 ,250,16,16,"NBIoT COAP conecting...");
//				if(!NB_IoT_conect_COAP())			LCD_ShowString(50,120,250,16,16,"NBIoT COAP success!        ");//COAP链接
//				else                          LCD_ShowString(50,120,250,16,16,"NBIoT COAP error!         ");
//		     send_NB_IoT("AT+NMGS=2,0005\r\n");  
	}