NB-IoT下发指令控制stm32LED灯

   日期:2020-10-01     浏览:345    评论:0    
核心提示:NB-IoTNB-Iot(窄带物联网),

NB-IoT串口通信

  • NB-IoT简单介绍
  • NB-IoT串口通信介绍
  • NB-IoT上报和下发指令方式
  • 实验环境
    • 硬件环境
    • 软件环境
  • 实验步骤
    • 硬件连接,使用CubeMx生成初始化代码
    • 使用KEIL5编写业务代码
      • main.c中添加重定向函数、全局变量:
      • main.c中添加uart2接收中断使能
      • main.c中添加串口接收回调函数
      • 在main.c的main函数的while(1)中添加开灯、关灯代码
    • 使用VS Code 编写python代码,调用API接口
    • 测试
      • 初始化云连接测试
      • 开灯、关灯测试
      • Python调用API测试
  • 总结

NB-IoT简单介绍

NB-Iot(窄带物联网),本次实验用到的型号是stm32F051 + NB86-G。NB-IOT 节点控制模块是有 1.44 寸 LCD 液晶屏、NB-IOT 模块、和传感器节点接口组成。底部有 miniUSB 转串口,方便单独就一个底板进行调试。
下图为 NB-IOT 一键还原+温湿度模块的硬件图片:

NB-IoT串口通信介绍

其他不做介绍,这里只介绍NB串口通信,stm32有两个uart,分别为uart1和uart2,其中uart1用作stm32与串口调试助手通信的,uart2用作stm32与NB86-G进行通信的。所以如果想要在串口调试助手看到uart2 的数据信息,就需要进行数据透传,也就是,从uart2接收的数据发给uart1,uart1接收到的数据再发给uart2,这样就可以在串口调试助手看到数据信息。

NB-IoT上报和下发指令方式

本文章实现的是通过ctwing电信云平台下发指令给开发板,开发板接收到指令之后,分别进行开灯和关灯。
电信云平台提供了python、go、Java等语言的SDK,所以我们除了在平台下发指令界面点击下发指令完成指令的下发,还可以通过平台提供的API接口完成指令的上报和下发功能(当然SDK包提供了多个API接口,根据需求进行使用)。

实验环境

硬件环境

NB-IOT 一键还原板(开发板,包括stm32F051)
ST-Link 下载器
USB 转串口线

软件环境

STM32CubeMX
MDK-Keil5
串口调试助手
电信云平台
VS Code(用python调用API接口)

实验步骤

在实验开始之前,要先搭建好环境,保证开发板启动之后自动上云,云平台产品、设备、应用提前搭建好,本文章不做介绍。

硬件连接,使用CubeMx生成初始化代码

CubeMx配置如下:

把PB1 GPIO口设置为输出模式,用于LED灯,uart1和uart2设为异步通信模式,波特率为9600。
uart1基本参数,改下波特率,其他默认:

uart1使能中断:

uart2基本参数,改下波特率,其他默认:

uart2使能中断:

配置完成之后,点击GENERATE CODE生成初始化代码。

使用KEIL5编写业务代码

main.c中添加重定向函数、全局变量:

int fputc(int c, FILE *stream)
{ 
  unsigned char ch = c;
  HAL_UART_Transmit(&huart1, &ch, 1, HAL_MAX_DELAY);
  return ch;
}
unsigned char uart_recv_char[20];
unsigned char buf[1024];
unsigned int i=0;

这样就可以直接使用printf函数,往串口上发送数据。

main.c中添加uart2接收中断使能

HAL_UART_Receive_IT(&huart2,uart_recv_char,1);//使能接收中断

main.c中添加串口接收回调函数

这里一边把接收到的数据发给uart1串口显示,一边把字符一个一个保存到buf中,大小为1024,如果大于这个了,就清空重新存。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *uartHandle)
{ 
	HAL_UART_Transmit(&huart1,uart_recv_char,1,100);
	if(i>1023)
	{ 
		memset(buf,0,1024);
		i=0;
	}
	buf[i++]=uart_recv_char[0];
	HAL_UART_Receive_IT(&huart2,uart_recv_char,1);
}

在main.c的main函数的while(1)中添加开灯、关灯代码

if(buf[strlen((char *)buf)-3]=='1')
{ 
	HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,0);
}
else if(buf[strlen((char *)buf)-3]=='2')
{ 
	HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
}

这里我用16进制01命令代表开灯,02命令代表关灯,命令是在云连接完成之后下发的,所以,命令始终存在buf的最后几位,接收到的命令格式:’’+NNMI:1,02’’,最后两位就为发送的16进制,这里只需要对最后一位进行判断是1还是2就ok。那么为什么是strlen(buf)-3呢,原因是字符串后自跟了\r\n。
这就完成了指令下发并控制LED灯的功能。

使用VS Code 编写python代码,调用API接口

首先下载python的SDK包,在电信云应用界面可以下载。

def send_cmd(cmd):
    result = aep_device_command.CreateCommand('4ywcD78fdig', 'aFBjbqD2xc', '59d8fa3ce589413cb353204b34f735ba', '{"productId":10095853,"deviceId":"2cd6f0cf603d4efea480592e896264c3","operator":"wyy","content":{"dataType":2,"payload":'+'\"'+cmd+'\"'+'}}')
    print('result='+str(result))

参数:(App Key,App Secret,MasterKey,(产品ID,设备ID,操作者,下发指令的内容)
其中cmd命令通过传参形式进行设置。

测试

初始化云连接测试

开发板上电,编译代码,把代码烧进开发板,复位:

出现此界面即为初始化成功,并且成功连接云。

开灯、关灯测试

现在下发一个01指令用于开灯:

查看串口接收到的指令:+NNMI:1,01

现在下发一个02指令用于关灯:

查看串口接收到的指令:+NNMI:1,02

此时可以看到开发板的LED灯亮灭了,如果云平台显示下发指令成功,而串口助手并没有打印出来命令,可能有延时,这时候复位开发板,就可以看到命令输出到串口了。

Python调用API测试

点击开灯按钮执行下发指令01的函数,点击关灯按钮执行下发指令02的函数,这两个函数为同一个函数,只是传参不同。

现在点击开灯:

可以看到command的值为01,即为下发指令成功,对应灯也会亮,并且可以在云平台查看下发指令日志。
现在点击关灯:

可以看到command的值为02,即为下发指令成功,对应灯也会灭,并且可以在云平台查看下发指令日志。

总结

本文章主要介绍如何使用uart2和uart1进行通信以及如何下发指令,如何使用SDK包调用API接口完成指令的下发。其他部分没有详细介绍。你,学会了吗???

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服