概述:

1.了解NB-IOT

2.掌握NB-IOT模块AT组网指令

3.掌握NB-IOT数据传输方法

4.掌握Flash Programmer代码烧写工具使用

5.云平台连接数据上报

NB-IOT技术简介

        NB-IoT全称窄带物联网(Narrow Band IOT),构建于蜂窝网络,只消耗大约180KHz的带宽,可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。

        NB-IoT是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接。NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接。

LPWAN与NB-IOT

        物联网通信有很多种,从传输距离可以分为两类。

        一类是短距离通信技术,例如zigbee、Wi-FI、Bluetooth、Z-wave等,目前非常成熟应用与各自领域。

        一类是长距离无线通讯技术、宽带广域网,例如,电信CDMA、移动联通3G4G无线蜂窝通信和低功耗广域网即LPWAN

        目前主流LPWAN的技术又可以分为两类:一类是工作在非授权频段的技术,例如:lora、sigfox等,自定义实现。lora技术标准有美国Semtech研发,sigfox技术标准由法国研发,由于授权频段与我国冲突,目前没有在我过取得授权。一类是授权频段,如NB-IOT、eMTC等。

      NB-IOT、eMTC与lora技术参数对比

TIBCO rv 通讯架构 nbiot通讯_arm

NB-IOT的14个频段

 NB-IOT网络体系架构

TIBCO rv 通讯架构 nbiot通讯_TIBCO rv 通讯架构_02

 

(1)NB-IoT终端UE(User Equipment):应用层采用CoAP,通过空口Uu连接到基站。Uu口是终端UE与eNodeB基站之间的接口,可支持1.4MHz至20MHz的可变带宽。
(2)eNodeB(evolved Node B,E-UTRAN基站):主要承担空口接入处理、小区管理等相关功能,并通过S1-lite接口与IoT核心网进行连接,将非接入层数据转发给高层网元处理。
(3)EPC核心网(Evolved Packet Core network):承担与终端非接入层交互的功能,并将IoT业务相关数据转发到IoT平台进行处理。同理,这里可以使用NB独立组网,也可以与LTE共用核心网。
(4)IoT平台:汇聚从各种接人网得到的IoT数据,并根据不同类型转发至相应的业务应用器进行处理。
(5)应用服务器AP(App Server):是IoT数据的最终汇聚点,根据客户的需求进行数据处理等操作。应用服务器通过HTTP/HTTPs和平台通信,通过调用平台的开放API来控制设备。平台把设备上报的数据推送给应用服务器。
终端UE与物联网云平台之间一般使用CoAP等物联网专用的应用层协议进行通信,主要考虑UE的硬件资源配置一般很低,不适合使用HTTP/HTTPs等复杂协议。
物联网云平台与第三方应用服务器AP之间,由于两者的性能都很强大,要考虑代管、安全等因素,因此一般会使用HTTP/HTTPs应用层协议。

实验芯片

        利尔达NB86系列模块是基于HISILICON Hi2110的Boudica芯片开发的,该模块为全球领先的NB-IoT无线通信模块,符合3GPP标准,支持Band1、Band3、Band5、Band8、Band20、Band28不同频段的模块,具有体积小、功耗低、传输距离远、抗干扰能力强等特点。

NB86-G模块工作模式及相关技术

1.模块工作时的默认模式
(1)连接态(Connected)
此状态下可以发送和接收数据,模块注册入网后即处于该状态。无数据交互超这一
间,不活动定时器计数时间到后会进入Idle模式,时间是由核心网确定的,范围为1~30m
(2)空闲态(Idle)
此状态下可接收下行数据,无数据交互超过一段时间会进入PSM模式。时间由核置,由激活定时器(Active timer)T3324来控制,范围为0~11160s。
(3)节能模式(PSM)
此状态下终端处于休眠模式,近乎关机状态,功耗非常低。在PSM期间,终端不用寻呼,但终端还是注册在网络中,但信令不可达,无法收到下行数据,功率很小默认为5m的时间由核心网配置,TAU(扩展)定时器T3412来控制,范围最大320h.默认为54m。

 NB-IOT AT命令

        AT命令是用来控制TE(Terminal Equipment,终端设备)和 NB-IOT 模块之间交互的规则。

TIBCO rv 通讯架构 nbiot通讯_arm_03

 一、打开串口助手,选择正确的COM口,设置波特率9600,数据位8,校验位None,停止位1,流控无,输入"AT"点击发送返回OK说明模块正常.

TIBCO rv 通讯架构 nbiot通讯_stm32_04

查询IMEI号(设备识别)AT+CIMI

TIBCO rv 通讯架构 nbiot通讯_TIBCO rv 通讯架构_05

查询当前信号质量 AT+CSQ

TIBCO rv 通讯架构 nbiot通讯_stm32_06

查询制造商      AT+CGMI、查询模块型号   AT+CGMM、查询固件版本   AT+CGMR、

开启NB-IOT AT+CFUN=1;查询连接状态  AT+CSCON=0; 网络注册 AT+CEREG=2 ;开启下行数据;通知  AT+NNMI=1;连接核心网 AT+CGATT=1;目前中国电信运营商NB-IOT云平台只 支持coap接入。

NB-IOT对接流程

TIBCO rv 通讯架构 nbiot通讯_arm_07

 NB-IOT案例智能路灯系统

         任务要求:将NB-IOT接入云平台,并上传光照传感器数据到云平台

一、main.c 中,已经做好了系统时钟初始化、GPIO 初始化、ADC采集初始化、USART1 和USART2两个串口的初始化并启用了串口中断同时移值了oled 显示屏和按键初始化和事件处理代码,重写了USART1的printf重定向代码,写好了 control_light()方法用于控制灯,automatic_mode()方法用于按照预设好的光照度阀值自动控制灯的开与关。

//用于实现USART1 printf()输出
int fputc(int ch, FILE *f)
{ 
  HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
  return(ch);
}

float get_illumination_value()//获取光照强度数值
{
	float adcValue;
	float illumination_value;

	
	//启动ADC
	HAL_ADC_Start(&hadc);  
	
	//等待采集完成
	HAL_ADC_PollForConversion(&hadc,10); 
	
	//获取ADC采集的数据
	adcValue = HAL_ADC_GetValue(&hadc);

	//将采集到的数据转换为电压值(单位:v)
	adcValue = adcValue * 3.3 / 4096.0;

	//将电压值转换为光照强度
	illumination_value = pow(10,((1.78-log10(33/adcValue -10))/0.6));
	
	//在OLED上显示数据
	oled_display_illumination(illumination_value);
	
	//停止ADC
	HAL_ADC_Stop(&hadc); 
	
	return illumination_value;
}

void control_light(uint8_t status)//控制灯的亮灭
{
	if(status == LIGHT_OPEN)
	{
		HAL_GPIO_WritePin(Light_GPIO_Port, Light_Pin, GPIO_PIN_SET);
		oled_display_light_status(LIGHT_OPEN);
	}
	else
	{
		HAL_GPIO_WritePin(Light_GPIO_Port, Light_Pin, GPIO_PIN_RESET);
		oled_display_light_status(LIGHT_CLOSE);
	}
}

void int main()
{
	//等待NB模块启动
	wait_nbiot_start();

	//NB模块配置
	nbiot_config();

    //连接服务器
	link_server();
    while(1)
    {
		//1.5S采集并发送一次数据
		if(i++ > 14)
		{
			i = 0;
			//获取光照值
			ill_value = (int)get_illumination_value();
			
			//自动模式下,光照强度小于3会自动开灯
			if(mod_flag == 1)
			{
				automatic_mode(ill_value, &lightStatus);
			}
			
			if(link_flag < 2)
			{
				//获取时间
				get_time_from_server();

			}
			else if(link_flag == 2)
			{
				//发送数据到云平台
				send_data_to_cloud( ill_value, lightStatus);
				send_count++;
			}	
		}
    }
}

        NB-IOT相关配置代码

void wait_nbiot_start(void)//等待NB模块启动
{
	int timeOut = 0;
	printf("waite NBIOT Start\r\n");
	while(1)
	{
		HAL_Delay(1000);
		if(wait_answer("OK") == 0)//启动会返回OK 接收到有效字符串
		{
			printf("NBIOT Start\r\n");
			break;
		}
		if(timeOut > 10)//计数值大于10超时
		{
			timeOut = 0;
			nb_reset();//复位
			printf("waite NBIOT Start\r\n");
		}
		timeOut++;//执行计数
	}
	
}

void nbiot_config(void)  //NB模块配置
{  //开启NB-IoT芯片所有功能    
    send_AT_command("AT+CFUN=%d\r\n",1);   
    wait_answer("OK");//注意:每一步AT指令配置要等待配置成功的反馈之后再进行下一步配置!       
    //查询信号连接状态
    send_AT_command("AT+CSCON=%d\r\n", 0);  
    wait_answer("OK");  //注意:每一步AT指令配置要等待配置成功的反馈之后再进行下一步配置!      
    //打开网络注册和位置信息的主动上报结果码 0关闭 1 注册并上报 2 注册并上报位置信息
    send_AT_command("AT+CEREG=%d\r\n", 2);  
    wait_answer("OK");   //注意:每一步AT指令配置要等待配置成功的反馈之后再进行下一步配置!     
    //开启下行数据通知
    send_AT_command("AT+NNMI=%d\r\n", 1);  
    wait_answer("OK");    //注意:每一步AT指令配置要等待配置成功的反馈之后再进行下一步配置!    
    //打开与核心网的连接  1是打开  0是关闭
    send_AT_command("AT+CGATT=%d\r\n", 1);  
    wait_answer("OK");  //注意:每一步AT指令配置要等待配置成功的反馈之后再进行下一步配置!
}

void link_server(void)// NB模块连接服务器
{
	//link sever
 send_AT_command("AT+NCDP=%s,%d\r\n", "117.60.157.137", 5683);  
    wait_answer("OK"); 

	//wait OK

}

void send_data_to_cloud(int illumination,uint8_t light_status)//NB模块发送数据到云平台
{
	uint8_t send_buf[128] = {0};
	
	RTC_TimeTypeDef gTime;
	RTC_DateTypeDef gDate;
	
	//时间校准
	HAL_RTC_GetTime(&hrtc, &gTime, RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc, &gDate, RTC_FORMAT_BIN);
	//time_cal(1, &gDate.Year, &gDate.Month, &gDate.Date, &gTime.Hours);
	
	
	
	sprintf((char *)send_buf, "\
%02X%02X%02X\
%02X%02X%02X\
%02X%02X\
%02X%02X%02X%02X%02X%02X%02X%02X\
",
	0x4a,0x00,0x00,//固定0x4a 固定值 0 没有后续消息 0 
	0x01,(illumination & 0xff00) >> 4, (illumination & 0x00ff),//数据服务 光照度0x01 serviceid 
	0x02, light_status,//0x02 光照度值
	0x04,20, gDate.Year, gDate.Month, gDate.Date, gTime.Hours, gTime.Minutes, gTime.Seconds);
//报告时间 serviceid 0x40 20时间参数  年 月 日 时 分 秒 
	printf("send sensors data:AT+NMGS=%d,%s\r\n", (strlen((char *)send_buf)/2), send_buf);
	send_AT_command("AT+NMGS=%d,%s\r\n", (strlen((char *)send_buf)/2), send_buf);

}

二、使用Flash Programmer烧写工具进行hex烧写,选择串口和波特率。

TIBCO rv 通讯架构 nbiot通讯_单片机_08

 

TIBCO rv 通讯架构 nbiot通讯_arm_09

 

TIBCO rv 通讯架构 nbiot通讯_stm32_10

 模块上电:

TIBCO rv 通讯架构 nbiot通讯_stm32_11