概述:
1.了解NB-IOT
2.掌握NB-IOT模块AT组网指令
3.掌握NB-IOT数据传输方法
4.掌握Flash Programmer使用代码烧写工具
5.上报云平台连接数据
NB-IOT技术简介
NB-IoT窄带物联网的全称(Narrow Band IOT),建在蜂窝网络上,只消耗180左右KHz可直接部署的带宽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对比技术参数
NB-IOT的14个频段
NB-IOT网络体系架构
(1)NB-IoT终端UE(UserEquipment):应用层采用CoAP,通过空口Uu连接到基站。Uu口是终端UE与eNodeB基站之间的接口可支持1.4MHz至20MHz可变带宽。 (2)eNodeB(evolvedNodeB,E-UTRAN基站):主要承担空口接入处理、社区管理等相关功能S1-lite接口与IoT连接核心网络,将非接入层数据转发给高层网元。 (3)EPC核心网(EvolvedPacketCorenetwork):承担与终端非接入层交互的功能,并将IoT转发业务相关数据IoT处理平台。同样,它也可以在这里使用NB独立组网,也可以和LTE共享核心网络。 (4)IoT平台:汇聚各种接人网获得的平台:IoT数据,并根据不同类型转发到相应的业务应用程序进行处理。 (5)应用服务器AP(AppServer):是IoT数据的最终收集点,根据客户的需要进行数据处理。应用程序服务器通过HTTP/HTTPs和平台通信,通过调用平台开放API控制设备。平台将设备报告的数据推送到应用服务器。 终端UE一般用于物联网云平台之间CoAP通信物联网专用应用层协议主要考虑UE硬件资源配置一般很低,不适合使用HTTP/HTTPs等待复杂协议。 物联网云平台和第三方应用服务器AP两者之间,由于性能强,应考虑代管、安全等因素,一般使用HTTP/HTTPs应用层协议。
实验芯片
利尔达NB基于86系列模块HISILICONHi2110的Boudica该模块是世界领先的芯片开发商NB-IoT符合3的无线通信模块GPP标准,支持Band1、Band3、Band5、Band8、Band20、Band不同频段的模块具有体积小、功耗低、传输距离长、抗干扰能力强等特点。
NB86-G模块工作模式及相关技术
1.模块工作时默认模式 (1)连接态(Connected) 在这种状态下,数据可以发送和接收,模块注册到网络后处于这种状态。无数据交互超过这一点 不活动定时器计数时间后会进入Idle时间由核心网络确定,范围为1~30m (2)空闲态(Idle) 在这种状态下,下行数据可以接收,无数据交互将进入一段时间以上PSM模式(Activetimer)T3324控制0~1160s。 (3)节能模式(PSM) 在这种状态下,终端处于休眠模式,几乎关机,功耗很低。PSM在此期间,终端不需要寻呼,但终端仍在网络中注册,但信令无法到达,无法收到下行数据。默认情况下,功率很小m核心网配置时间,TAU(扩展)定时器T3412控制范围最大320h.默认为54m。
NB-IOT AT命令
AT命令用于控制TE(Terminal Equipment,终端设备)和 NB-IOT 模块之间的交互规则。
首先,打开串口助手,选择正确的COM设置波特率9600,数据位8None,停止位1,无流控,无输入"AT"点击发送返回OK说明模块正常.
二、查询IMEI号码(设备识别)AT CIMI
三、查询当前信号质量 AT CSQ
四、查询制造商 AT CGMI、查询模块型号 AT CGMM、查询固件版本 AT CGMR、
开启NB-IOT AT CFUN=1.查询连接状态 AT CSCON=0; 网络注册 AT CEREG=2 ;打开下行数据;通知 AT NNMI=一、连接核心网 AT CGATT=1.目前中国电信运营商NB-IOT云平台只 支持coap接入。
NB-IOT对接流程
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烧写,选择串口和波特率。
模块上电: