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接口完成指令的下发。其他部分没有详细介绍。你,学会了吗???