文章目录
Hi,大家好,这里是丹成学长,NBIOT是近几年不比较火的远程通信模块,是物联网的重要技术,今天学长向大家详细介绍什么是NBIOT,NBIOT模块能做什么,以及但单片机如何使用NBIOT模块
单片机与NBIOT通信模块
大家可用于 课程设计 或 毕业设计
单片机-嵌入式毕设选题大全及项目分享:
https://blog.csdn.net/m0_71572576/article/details/125409052
基于蜂窝的窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。
NB-IoT是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)。NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接。据说NB-IoT设备电池寿命可以提高至至少10年,同时还能提供非常全面的室内蜂窝数据连接覆盖。
重点:NBIOT是一种通信技术,是用于通信的!单片机通过该模块可以与外接互联网进行数据交互!
这里以市面上常见的NB260模块为例:

NB260是基于移远NB-IOT模块:BC26的小系统板,板载了IPEX射频天线座,5V转3.3V LDO稳压电源,MicroSIM卡座,ESD防护电路,开机电路等,即插即用。
NB260小系统板采用2.54标准间距排针,引出BC26模块的全部可用GPIO口,整板尺寸仅 25mm*33.02mm,便于嵌入到客户产品中。
支持的频段

引脚信号
NB260引脚排列如下图所示。
CON1(P1)右侧一列信号为:GND,VIN,TXD,RXD,PEN,RST,EINT,NRI(NRI电压域1.8V,若用作唤醒MCU,可以简单串联1K电阻然后上拉后与MCU的GPIO口相连。),该列信号还与NB101,NB200兼容,可以相互替换。

SIM卡槽
NB260采用自弹式MicroSIM卡槽,注意SIM卡插入方向为:卡缺口朝外。
工作模式

(以下为学长作品)
stm32 + NBIOT模块构建的家庭烟雾报警系统(智能家居的一部分)


NBIOT指纹签到系统:

#include"nbiot.h"
/***************************************************************************************
函数名:send_NB_IoT
功 能:发送数据到NB模块
参 数:cmd 要发送的数据或者命令
返回值:
例 子:
说 明:
作 者:丹成学长,q746876041
****************************************************************************************/
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); //清空数组
作 者:丹成学长,q746876041
****************************************************************************************/
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
功 能:自动附着网络
参 数:
返回值:
例 子:
说 明:
作 者:丹成学长,q746876041
****************************************************************************************/
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连接
参 数:
返回值:
例 子:
说 明:
作 者:丹成学长,q746876041
****************************************************************************************/
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初始化
参 数:
返回值:
例 子:
说 明:
作 者:丹成学长,q746876041
****************************************************************************************/
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");
}
单片机-嵌入式毕设选题大全及项目分享:
https://blog.csdn.net/m0_71572576/article/details/125409052
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方
有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
在我的代码中,我需要使用各种算法(包括CRC32)对文件进行哈希处理。因为我还在Digest系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。为了记录,我确实找到了digest-crc,一颗完全符合我要求的gem。问题是,Zlib是标准库的一部分,并且有一个我想重用的CRC32工作实现。此外,它是用C编写的,因此它应该提供与digest-crc相关的卓越性能,后者是纯ruby实现。实现Digest::CRC32一开始看起来非常简单:%w(digestzlib).each{|f|requiref}classDigest::CRC32一切正常:
我正在尝试在我的机器上安装win32-apigem,但在构建native扩展时我遇到了一些问题:$geminstallwin32-api--no-ri--rdocTemporarilyenhancingPATHtoincludeDevKit...Buildingnativeextensions.Thiscouldtakeawhile...C:\Programs\dev_kit\bin\make.exe:***Couldn'treservespaceforcygwin'sheap,Win32error0ERROR:Errorinstallingwin32-api:ERROR:Failed