【开源】从零构建NB-IOT物联网项目开发,代码实现功能:人体红外传感LTE

广/深覆盖。比GPRS覆盖增强20dB+

 低功耗。基于AA电池,使用寿命可超过10年

 

 布局NBIOT的企业

 生态链快速构建,将成为全球主流技术和产业生态

 NB-IOT智能抄表

 智能水表

 

 

 宠物跟踪

 

 其他应用

 b8是联通移动  b5是电信的  uart串口方式

 NB-IOT其实是lte的技术被骂为5g标准实际上是lte的使用 4g 5g其实都是基于lte技术

23dbm 大概是200毫瓦 0.2w 无线电一般都是dbm来表示  12微瓦

 m0

功耗 之前用过m3 f103系列 半导体最早出的f103系列,现在出了这种m0系列的,价格更低,功耗低,f103 功耗高 工作频率高72mhz但性能没有f103性能好,

 低端路线芯片 低功耗  不需要那么昂贵 

 

 

 stm32单片机 nb只是提供串口指令,通过串口指令来通过mcu来发送不同的串口指令来操作我们的nb nb链接我们的物联网 达到我们控制的目的

stm32下载对应芯片的类型,生成一个代码框架,然后通过mdk keil5 ide去写我们的代码编译 通过 stlink下载代码到开发板里面去 在屏幕上显示lc显示界面 通过串口打印电脑上面

Iot云 

工具 图形化配置自动生成代码的框架 

需要注册账号   版本号6.2.0最新

需要装java环境

选择hel库的,

生成什么样的代码 需要这些packgect进行提供 比如说需要生成 f0框架的代码 绿的是安装过的, 点一下 installnow 进行下载安装

创建新的项目, 输入mcu的型号 

cpu引脚图

比如选择pa8 里面对应所有功能 说明pa8定义为输入功能了 在这里添加他的功能,首先配置io口之前,我需要把这个时钟配置一下,因为我们单片机呢,咱们可以看一下这个原理图,

这个是核心板,首先我们开发板分  核心板  底板两部分的 上面是核心板,底下是底板是

核心板包括 nb模块,和mcu  cpu模块 sim卡座 其他的是服务一些键  两个排针

cpu是外部间阵

然后配置时钟, 间阵用的8道的间阵 底下的黑块是间阵 选择时钟的时候需要简单的配置,*1*8*6  这里是48M因为咱们的整个m0  最高使用是48m 时钟配置好了,然后配置串口,串口配置哪一个呢?

串口输入输出 

把其他的去掉,这个时候,我们配置好时钟之后,这两个引脚会变绿

串口可以在这配置 

选择异步的 波特率选115200

工程Project Manager需要你定义项目名字

 

 点 generate code

启动应用👆 

 

keil不仅仅开发arm芯片 还开发805芯片 他被arm收购后,大力的支持arm芯片,arm版本的key还有一个叫MDK-ARM

 keil破解选择以管理员身份运行A

 

 

选择arm 不要选c51 

 打开

 看一下defice里面是否有你导入的型号

 点击编译下载到程序里面去

 打入前文件 mdk arm里面

 nb模块主要是包含了它的引脚, sim卡的引脚多一点 两个串口,对应我们stm32进行通讯的ikr4两个串口进行通讯的  USIM是sim卡的  GND是天线的 因为nb不需要编程,不需要太多的了解,

需要了解的是 stm32

里面包含 ADC key电源 的  BAT ADC  U1串口  LCD液晶屏的

SC的sti总线,n1是通过sti总线传输的  d1 d2是通过直接连到底板上的io的

SWCLK SWDIO ..器,Ul USART1TX串口连接到nb模块的,使用nb的话,联网的话,最起码把这个串口配上,

LED灯2 3 4   A2 ID这是 串口二

 

这是SIM卡的

这两个排针,是核心板和底板之间的一个插脚  

核心底板 主要关注 传感器模块, P1 P2对应板子上 两排针 排母 是插传感器的,这几个引脚和cpu是对应起来的,

 D1 D2 CPU上也有对应的D1 D2  液晶屏上 LCD NRST REST复位  还有LED灯 连接板子LED2 3 4

 

STM32单片机对应的引脚 作用

 RI 是网络模块,NB模块信号输出可以让我们的单片机检测到nb网络模拟量

SWD烧写口 

链接液晶屏的背光  SPI数字信号

每个引脚定义要了解,否则的话,我们无法创建我们的工程,现在就创建我们的工程,打开

 选择cpu型号

 第六个引脚对应adcin 输入

第七个引脚是电池电压的,IO口,

8 9选择串口通讯 

 10个引脚 

 

 11脚没用

12角 A2  13角空的,

14 15 16 GPIO output 

17电源不用配置

18数据输入,

 19 20 USART1 tx rx

21引脚为空

22 NB信号输出

 23  24 烧写口,

25 26 27 28时钟,GPIO的output 

29背光 也是输出

30数字量输入,GPIO的input 

32角 GPIO的input 

 通过映射表把引脚定义好了 不一定把所有的引脚用得上,但是在这个工程后面都可以来使用它定义好的这些引脚,因为这开发板,我们做所有的实验,这些引脚都需要先定义好,后面就不需要去改硬件这一部分了,直接写软件部分就可以了,

晶振设置 

spi总线设置 

定义好gpio下一步的话,

 下一步做时钟配置,时钟对单片机非常重要的,像心脏一样的 

选择rcc外部时钟 

 外部时钟是8 不用改了,如果不是8需要改一下,PLL Source Mux 选择语言选择HSE PLLCLK也选一下,Enable CSS 输出, 我们单片机最高 48M 频率偏低一点,所以需要*PllMul改一下x6

这就达到他这个 最大速度,这样我们程序基本上就配置好了,

 

配置完时钟后,我们就要 配置外设了,gpo配置好了,像spi   串口需要配置他们的模式,这些串口都是黄色的,为什么呢?因为我们还没有配置 

选择全双工的设计模式

 串口1 串口2选择 异步收发模式

配置串口的参数,波特率 开启全局中断

Usart2这节课暂时没有用到 因为我们是通过串口1给我们的nb进行通讯的,

 

 偏行信号👆

 他的速率是1.5mbits/s

 液晶屏驱动做简单移植

 驱动使用的是ST7735S这个芯片,驱动液晶屏,

 

代码要考到最后生成的 工程里面,现在我们把工程生成一下,在考虑这个

 

生成单独的.c/. h文件 然后点击生成

 选择MDK-ARM文件夹 点uvprojx文件 自动生成了adc spi gpio usart 

对adc spi gpio usart 进行了初始化, 可以直接对他进行编译 生成了一个空的工程,但是已经把硬件初始化好了,不需要对硬件进行初始化了,

需要 Printf函数重定向,要不然我们无法进行串口打印,加到 PriVate user code  的USER CODE BEGIN 和END 里面

 

 在使用cromax不至于把代码冲掉

 这样就可以打印串口信息了

灰色,右手先是烧写器,中间是左手的一个板子,线插入到STLINT接口

 

烧写器插到电脑上去 右手蓝线是串口

 首先保证 sim卡和天线插入正确 在插sim卡之前把所有电源都拔掉

烧写器插到电脑上,烧写器是STLINK  串口线也要插入电脑上,

烧写之前配置功能

 

然后选debug 

 点settings

ST_LINK/V2是版本号,

sw devices 是否显示内容 如果是null 没有设备的话,说明你这个ST_LINK下面没有连接我们的开发板,

 

 确定

lod烧写 

还有一个方法通过工具st烧写,

 连接设备 也可以直接点Program 自动连接

选择烧写参数,烧写文件 File path 

 点start

然后复位一下,

友善串口助手

波特率9600 根据你电脑上的串口   usb转串口  到底是哪一个?如果上面没装驱动的话,需要把启动装上去,就是把串口驱动装上去

 因为我们开发板就是用的ch340的芯片,

这个串口一定要看是不是你usb转串口的 点开计算机  找到设备管理器,

 

选择com16点运行  然后按板子的复位键 

设置 忘了设置波特率

 每按一次复位键,串口信息就打印出来了

AT指令是通过串口发送指令的模块

gprs wifi gps 模块, 蓝牙模块,这些模块他 是怎么控制的 ,都是一些串口指令,这些串口指令其实就称之为at指令,

 nb模块和gsm模块很相识,他都是插sim卡,然后连接运营商的网络,at指令也形成了标准,尤其在gsm 移动通信上面,导致 3g 4g 5g都是使用的at指令,

 dte 是数据终端设备 pc机 mcu等 单片机

dce是电路设备,如模块,

他俩怎么通讯的呢?通过串口交叉连接起来

 

 

 

 官方文档 有at指令的说明

3gpp是电信联盟制定的标准,

只要你不管是 gprs模块,3g模块 4g 5g 这些3gpp的指令都要去支持的,电信联盟他规定的指令你需要去支持,另外(Hisi - General)是属于厂商自己的定义的一些指令 换一些模块,指令就不一样了,但是前面这些指令3gpp 所有的模块厂商都会执行这些指令(3GPP aligned to_27.007) (3GPP aligned to 27.005)带3GPP aligned这些都是公共的at指令,主要是这个运营通讯的模块,他都会执行这些at指令的, 

 移动通讯频段

 电信的卡用的是n5频段 第5频段

 模块有个id好,同样sim卡也有一个id号 这两个id号是不一样的,

一般sim卡的id号是460开头的 是中国的国家码

AT+CGDCONT=1,”IP”" ctnet” 定义PDP的内容, 因为我们是要连到网络上面的,是定义他的接入点 相当于每一个网络的接入点

CSQ是查询信号,0-31 数字越大信号越强,

 AT+CGPADDR 如果能收得到ip地址,就说明模块已经拿到ip地址了 这样模块就可以联网了,如果这个模块没拿到的话,这个模块是无法联网的

 USART2串口2   PA2  PA3 这两个角  stm32有两个串口,串口2 连接的是nb模块,串口1 pa9 pa10连接的是usb转串口

连接到ch340这个芯片上了 2和 3  电脑用串口的话,他直接是跟我们的mcu进行通讯的,又跟nb-iot通讯,这个时候我们需要通过一个程序 实现串口透传 也就是说pc机发送的指令 直接透传到nb上面去 同样nb返回的指令透传到pc机上面去 实现这样的功能,这样就可以通过 pc机的at指令来控制nb-iot模块了,

串口2实现我们的中断,因为我们的串口2 是连接到我们的nb模块,使用他的中断的话就可以让我们的单片机,在收到我们nb返回指令的时候产生中断 这个时候生成我们的代码

重新生成完之后,我们原来的代码还在不在? 

这两个变量是串口1和串口2 接收到的数据

串口处理函数,串口1和串口2的中断,都使能了

还需要写中断的处理 在stm32f0xx_it.c

USART1_IRQHandler(中断1的处理函数 

判断一下直接中断,数据使能传输完毕,他的中断标志位

 

 中断的位 寄存器 我们写的是0x40

TC标志  :传输完成

把串口1的中断,接收的数据传过来

等串口2传输完成 然后把串口1送过去

串口2接收的来了,等待 串口1传输完成,然后把串口2的数据送给串口1

串口1数据来了,把串口1数据送给串口2

串口2数据来了,把串口2数据送给串口1

编译完成 把他烧写到开发板中

打开串口工具,打开开发板

发送一个at指令,他会返回一个ok, AT+CSQ

返回的是rssi是信号质量 

 如果是0的话 是-113dBm或者更少

1的话是-111dBm

2...30 指的是-109... -53dBm

如果是31指的是-51dBm or greater 或者更强

如果是99的话 没检测到网络,这边代表的是他的bit错误率

99代表不知道或者没检测到

17表示一般 没有说特别好

 

show ip地址

 已经入网了,他打印ip地址了

 AT+CONI是我们的sim卡信息,emc号

 

 

5段是 电信的模组

👆设备号 nb的mei号 

 

 udp吞吐量比较大,效率比较高

povt 端口 是在tcp协议寻址的一个功能 计算机启了很多应用程序,每一个应用程序都要占用一个通讯端口,我占这个端口的时候 应用程序就可以给我通讯了,相当于电话号码一样,打电话的时候有一个号码 端口号 在tcp 和udp里面都有 每一个应用程序占用不同的端口号,就可以与不同的应用程序通讯,

工具👆 socket调试工具

 

 创建 监听端口60001 这个时候服务器就监听了,端口号就启动了 服务器搭建好了

 为什么设备连不到服务器呢? nbiot连接基站--->基站连接互联网---nb就可以进入互联网 

服务器是搭建到pc上面的,iot不能直接访问到服务器 两个都是内网设备,内网设备是无法进行相互通讯的

 内外网结构👇

其实在公网上面建立服务器 iot 访问公网服务器,然后跳转一下到pc

 注册一个账号

 开通隧道 免费的👇服务器美国的

 frp是支持udp的, ngrok支持tcp http

远程端口是nb模块要访问的端口,nb他是建立一个隧道

pc与ngrok建立一个隧道 打通了,远端端口是10245 端口在远端,本地端口60001

使用AT命令连接服务器

 

 

 

 NB联网命令

 

type类型 protocal 协议, listenport 监听端口

 

 UDP=17  TCP=6  端口号可以随便写,他不是当服务器的

 获取ip地址看是否联网 如果分配ip地址给我们了,这个时候可以联网了,已经入网了

 1是创建socket索引号 记下来,后面要用到这个socket 

连接服务器, scoket=1 remote-addr远程地址,就是远程服务器的ip地址,remote-port 端口,

地址是域名,模块暂时不支持域名操作,所以 通过ping一下得到ip地址 

 nb模块已经跟服务器建立起连接了

 

 socket=1 ;emgth=3个字节的数据,16进制数据,AABBCC

nb通过串口模块发送到我们服务器 数据了,通过串口指令来发送数据到我们自己的服务器,

 

格西烽火

 

 新建直接激励项目

 

点击左上角 打开, 

怎么执行命令?打勾,点激励  👆

获取ip地址之后说明模块已经联网 入网了

创建TCP socket  AT+NSOCR=STREAM,6,1000\r\n

协议 tcp是6  端口 随便写1000

free.idcfengye.com

连接服务器: AT+NSOCO=1,64.69:43.237,10245\r\n  端口号10245 

透传服务器是否连接成功?

 下一步发送数据,AT+NSOSD=1,3,AABBCC\r\n 

socket 1  长度 发送3个数据,然后内容:AABBCC三个字节

最后关闭连接

这是透传过来的,因为他们之间并不是直接的tcp连接,为什么这边关闭了,这边没关闭呢?因为这个socket调试工具这个呢 不是直接连接 如果需要测直接连接,需要自己搭建云服务器,

这两个连接是一直存在的,你只要在线了,这两个连接是一直存在的

 然后你建立好连接之后呢,在socket调试工具 这个建立监听,实际上是相当于监听的是ngrok到pc的发送的数据   设备到ngrok的连接他断开了,他不影响ngrok到pc的这边,这个透传方式有这么一个缺点,如果你直连的话,你这边socket调试工具 直接可以看到是关闭状态,

4_1驱动NB联网代码实现1

复制项目改名

加了串口中断,做了串口的转发操作。

对应单片机的串口2  串口1是跟usb串口芯片相连的,可以连接我们的电脑,主要操作串口2 就可以了,串口1我们可以不用管他,现在对串口2 加一部分代码,

 

总共操作6个命令, 创建nbdriver,这个文件实现对nb的操作,实现nb的串口发送,第二个是串口的接收,在发送的时候会出现什么情况?比如复位nb模块,获取信号强度,需要判断信号强度是否是合适的,再往下走,现在信号强度是31,99     31代表信号强度

代表0-31的数字,如果 信号是0的话,信号太弱了,0  99都是非法的数字,判断的话,需要判断它是1-31的数字才能往下走,如果没信号的话就没必要往下做了,获取ip地址也要做判断,如果获取的ip地址是不存在,说明你没联网 下面创建socket肯定是失败的, 创建socket是成功的才能往下走

所以每发送一次,判断他的nb模块回应到底是什么样的

4_2驱动NB联网代码实现2

单片机  串口  at指令   nb模块,

通过单片机 发送一个串口指令,到nb模块, nb给串口发回应 送回单片机

1.串口发送

2.串口接收

有可能发送错误信息,信号强度不够了,都是需要处理的一些异常信息,

实现接口功能

3.实现状态机 

我们按顺序发送串口指令,然后要在这个状态机里面判断这个指令要不要往下执行,因为按顺序执行的话,是什么情况都ok的情况下才实现的,如果说出现错误的话,比如 信号没找到,ip地址没有得到,或者链接服务器出现问题,这个时候都需要代码做逻辑的处理 需要写一个状态机,为收发数据做一个处理,所以说这个软件主要包含 串口发送 串口接收  状态机的逻辑处理

头文件定义哪些内容?我们发送的是at指令 我们是一条一条的发送at指令,首先定义一个发送at指令的结构体

 

 { “指令” ,“期望字符串”,复位之后等10秒钟,初始化没有结束的状态,重试一次 }

 

 做at指令发送和接收 打开项目把他设置成dma的接收方式

 

然后生成代码 

 

中断函数 

 

 

 

 

 dma接收使用的是串口的中断,中断来了之后来使能dma接收的 串口中断来了之后,需要数据接收  串口中断 要在这里选择一下

选择串口空闲中断  因为我们数据接收完了才使用dma  接收一个就使能 没必要,我们要把所有数据都接收完了,空闲了 这个时候 去接收 这就可以了

 

空闲来了之后,我们去使能 我们这个 来去接收我们的数据  空闲中断 来了之后 第一步,把这个空闲中断标志位 清空串口空闲中断的标志位 因为我们的标志位 选一次就行了 因为他大部分情况下都是空闲的,

第二步,把dma停止一下,处理dma 

下看看接收数据了,接收数据的长度 定义一个长度,长度是通过dma里面的寄存器来读的

 这个里面使用他的变量就可以了,它里面自带

 但是这个值是指的剩余的dma的值 dma数据有多少个? 应该是我们的这个值 减去

 

 dma接收长度  dma接收的函数 

 

 

使能接收 为下一次接收做准备 

 函数引用👆 

 dma处理函数,数据已经放到缓冲区里面去了,只需要做一个标志位就可以了

做一下判断,如果是 串口2的话,把标志位改成1 这样就实现了dma的接收部分

4_3驱动NB串口发送和接收

 

 

 

 

 

 

串口1串口2 都发送数据,这样在 串口1串口2都能看到我们的数据了 

 

 判断一下这个字符串是否存在,在的话,说明是成功的

strstr()函数

接收完数据,记得清空,以免下一次接收不到   

判断信号 和ip地址

地址得不到, 链接失败 创建socket失败就不执行下一步,创建不成socket 我们就没必要去连业务服务器

对于信号,和地址即使返回ok也 不能执行下一步,所以 AT+CSQ期望是ok 一定是成功吗?

代表着没检测到 不是我们需要的值,这个时候再发一次

 

 接收端就完善了👆

4_5驱动NB串口任务框架

串口接收发送  等待回应

最早的空闲状态,发送 接收等待状态 等待回应

 task死循环,判断nb task的状态 如果他是idle什么都不干 如果是发送 应该调用atsend命令 发送at指令  发送索引值 发送完之后 改状态,进行等待nb的回应,假如是等待的话,调用atrec 接收函数

处理完后做判断,如果返回值是success 得到数据返回成功,可以发下一个命令  索引值要+1

不成功的话,重试一下 

可以加一个超时时间,超时的话,暂时没加,现在暂时先写成这样子的 如果命令成功就执行下一个指令,如果没成功 原封不动再重发一次,如果你重发次数到了,这里判断一下

 如果小于这个次数可以发,超过了就别发了,如果是大于直接返回,结束得了

 nb的三个状态, 发送指令,然后等待看是否是期望的值,如果是 index++ 执行下一个指令,变成send 如果不是 判断他重发次数,如果不到就发送,到的话就返回,

成功就清零  保持初始化的值,

4_6驱动NB完整联网

 要么重发 要么发下一个没做延时处理 要每次发送的时候每次停一下,每次等待一会 再去发下一个 做延时处理,延时处理 需要添加一个变量  发送的时间

发送的时候 时间赋值  当前的时间 

 发送完之后在wait要判断一下 时间是否是超时的 然后再去决定下一步发不发

如果大于超时时间就执行下一步,如果没大于就等一会 不要让他马上去发

 有可能 模块 反应慢  要等他一会 不会那么频繁的发送了,

代码 任务放到main里面,这样nb task就会一直的去运行了

 用之前 要对nb简单的初始化  几个状态,nb模块 状态  和复位

 nb在第一次 就要执行发送命令, 方法加在main函数里面,状态机就开始运行了,

 代码编译 下载板子上, 已经发送nrb 但是没有回应

 仍然没有输出,要看一下中断是不是错了

使能的中断是这里,使能的是串口1的,230应该用空闲中断 先用空闲中断的标志位清掉

之前的代码👆 

修改后的代码👆

我们时间有点长, 只有等待超时时间之后才打印出来,所以时间设置3秒

 期望返回值是BOOTING 但是没打印出来,

 设置直接返回ok 

第一次返回信号不对,第二次对了 

没有显示ip直接创建socket 这样是不对的,因为a没有初始化,直接是一个大于0的数 a=255

 

获得地址之后, 直接创建socket 发送数据,成功 

通过我们的单片机 写了一个状态机程序发送数据给我们的 at模块给我们的 然后nb模块发送串口指令 直接连我们的互联网,

这就是串口联网的程序,

4_7修改AT指令为灵活字符串

ip地址现在是写死的,发送数据在这里改,这样每次编译发送数据,不符合程序要求,

随着数据变化, 发送的值变化,所以加一个判断 数据发送的时候值不一样 如果index等于链接和发送的时候是一个值,如果是发送的时候是另一个值,

如果是 这两个值,就分情况发送了

先定义一个字符串,

 虽然现在写死,后面可以改成活得,因为这个值 给大家写成一个比较灵活的变通方式 这后面做实验的时候 会变成灵活的数据 发送的数据长度=4 发送长度等于%d 后面是我们发送的数据 senddata

 

 每个at指令都要加\r\n才可以使用,

拼接端口号地址,

 这样拼接的字符串是=1后面是ip+端口号,

如果链接服务器我们就拼这样一组字符串, 如果是发送数据 拼这样一组字符串 其他的话,吧字符串拷贝到sendstr  然后去发送 

少一个分号 报错👆 

【开源】从零构建NB-IOT物联网项目开发,代码实现功能:人体红外传感器,火焰传感器,继电器……

源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值