一、概述
目前這個NB-IoT在國内還是比較火的,最近剛好使用了一款NB-IoT子產品。将驅動程式貢獻給大家。希望能對用到的朋友有點幫助。
二、NB-IoT子產品介紹
本次采用的是有人物聯網公司的WHNB75子產品。(支援電信網絡)WH-NB75 是基于 WH-NB73 子產品開發出來的 DIP 封裝的子產品産品,該産品能夠更友善的嵌入到客戶産品中。WH-NB75 是我們 NB75 子產品系列的一個總稱,針對不同營運商網絡有不同的子產品型号對應。請在選購子產品時注意選擇支援當地營運商的子產品。穩恒正在基于海思 Hi2115 晶片打造支援全頻段的 NB 模組 WH-NB71,到時候可以一款子產品支援多家營運商的網絡。下表為不同型号産品對應的營運商。
詳細NB-IoT介紹可以看一下我寫的這邊介紹:初識NB-IoT(NB-IoT背景,簡介,标準化過程,技術優勢,與其他無線技術對比)
三、基于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");
}