1.了解NB-IOT
2.掌握NB-IOT模块AT组网指令
3.掌握NB-IOT数据传输方法
4.掌握Flash Programmer代码烧写工具使用
5.云平台连接数据上报
NB-IoT全称窄带物联网(Narrow Band IOT),构建于蜂窝网络,只消耗大约180KHz的带宽,可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。
NB-IoT是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接。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个频段
(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不同频段的模块,具有体积小、功耗低、传输距离远、抗干扰能力强等特点。
1.模块工作时的默认模式
(1)连接态(Connected)
此状态下可以发送和接收数据,模块注册入网后即处于该状态。无数据交互超这一
间,不活动定时器计数时间到后会进入Idle模式,时间是由核心网确定的,范围为1~30m
(2)空闲态(Idle)
此状态下可接收下行数据,无数据交互超过一段时间会进入PSM模式。时间由核置,由激活定时器(Active timer)T3324来控制,范围为0~11160s。
(3)节能模式(PSM)
此状态下终端处于休眠模式,近乎关机状态,功耗非常低。在PSM期间,终端不用寻呼,但终端还是注册在网络中,但信令不可达,无法收到下行数据,功率很小默认为5m的时间由核心网配置,TAU(扩展)定时器T3412来控制,范围最大320h.默认为54m。
AT命令是用来控制TE(Terminal Equipment,终端设备)和 NB-IOT 模块之间交互的规则。
一、打开串口助手,选择正确的COM口,设置波特率9600,数据位8,校验位None,停止位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=1;连接核心网 AT+CGATT=1;目前中国电信运营商NB-IOT云平台只 支持coap接入。
任务要求:将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烧写,选择串口和波特率。