本篇目标
一、学习MQTT协议
二、发送温度湿度数据到OneNET
准备材料
感觉麻烦的小伙伴请移步到文末,那里有整个工程的链接。
(关于串口和WiFi部分的内容,可以查看前一篇博文,链接:这个是传送大门)
一、合泰例程
链接:https://leoeinstein.lanzous.com/iEbgskvq6pi
二、OneNET例程
链接:https://leoeinstein.lanzous.com/it2D4kzs1gf
这个是在onenet论坛里面下载的,包含有麒麟座开发板的一些工程,里面几乎包含了所有onenet支持协议的通信例程,有需要的同学可以下载。
MQTT协议
推荐博文
一、IoT – (七)MQTT协议详解
这篇在理论的层面上讲得比较详细的,可以看看看。
这篇主要结束了MQTT协议的数据包结构,我们写程序的时候需要参考到的。
报文格式
查看OneNET平台的V2.6版本的MQTT协议书可知,支持的报文格式有7种。
OneNET官网文档:https://open.iot.10086.cn/doc/multiprotocol/book/develop/mqtt/device/doc-tool.html
Type | 内容 |
---|---|
1 | JSON格式1字符串 |
2 | 二进制数据 |
3 | JSON格式2字符串 |
4 | JSON格式3字符串 |
5 | 自定义分隔符 |
6 | 带时间自定义分隔符 |
7 | 可离散浮点数数据流 |
中文版的MQTT协议文档
链接:https://pan.baidu.com/s/1NY7fDD7cUbTY2J351v45NA
提取码: kefy
代码实现
引脚连接
这次用的是USART0 口,才发现USART1的RX引脚PA5用跳线帽接到了DAP_Tx,如果需要用到的话需要接到RS232_Tx,就可以用了。
ESP8266 | HT32 |
---|---|
RX | PA2 |
TX | PA3 |
3.3V | 3.3V |
GND | GND |
合泰的延时函数
之前下载过一些合泰的工程例程,发现里面的延时函数没有用定时器来实现延时的,而是用软件来延时的。这样的话延时时间不准确,从而可能会导致程序会出现一些未知的错误。
因此在这里贴出定时器/计数器的延时实现。
有时候用用国产芯片还是不错了,现在的stm32很贵![狗头保护]
delay.c
。
#include "delay.h"
#include "usart.h"
/* Private variables ---------------------------------------------------------------------------------------*/
static vu32 DelayTime;
/* Private function prototypes -----------------------------------------------------------------------------*/
void Delay(u32 nTime);
void TimingDelay(void);
void delay_init()
{
/* SYSTICK configuration */
SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK); // Default : CK_AHB/8
SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000); // (CK_AHB/8/1000) = 1ms on chip
SYSTICK_IntConfig(ENABLE); // Enable SYSTICK Interrupt
}
void delay_ms(u32 nTime)
{
/* Enable the SysTick Counter */
SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);
SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE);
DelayTime = nTime;
while(DelayTime != 0);
/* Disable SysTick Counter */
SYSTICK_CounterCmd(SYSTICK_COUNTER_DISABLE);
/* Clear SysTick Counter */
SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);
}
/*********************************************************************************************************//**
* @brief Decrements the TimingDelay variable.
* @retval None
***********************************************************************************************************/
void TimingDelay(void)
{
if(DelayTime != 0)
{
DelayTime--;
}
}
其实这个在合泰官方例程了也有,就在example–>SYSTICK文件里面,经过简单的移植、修改就可以了。
这个的定时中断服务函数在 ht32f5xxxx_01_it.c 里面!
需要例程的同学可以在这里下载:
https://blog.youkuaiyun.com/LiangWF22/article/details/113181696
OneNET部分代码
void OneNet_SendData(void) from onenet.c
。
//==========================================================
// 函数名称: OneNet_SendData
//
// 函数功能: 上传数据到平台
//
// 入口参数: type:发送数据的格式
//
// 返回参数: 无
//
// 说明:
//==========================================================
void OneNet_SendData(void)
{
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
char buf[128];
short body_len = 0, i = 0;
UsartPrintf(USART_DEBUG, "Tips: OneNet_SendData-MQTT\r\n");
memset(buf, 0, sizeof(buf));
body_len = OneNet_FillBuf(buf); //获取当前需要发送的数据流的总长度
if(body_len)
{
if(MQTT_PacketSaveData(DEVID, body_len, NULL, 5, &mqttPacket) == 0) //封包
{
for(; i < body_len; i++)
mqttPacket._data[mqttPacket._len++] = buf[i];
ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传数据到平台
UsartPrintf(USART_DEBUG, "Send %d Bytes\r\n", mqttPacket._len);
MQTT_DeleteBuffer(&mqttPacket); //删包
}
else
UsartPrintf(USART_DEBUG, "WARN: EDP_NewBuffer Failed\r\n");
}
}
实现效果
效果
因为手上的温湿度传感器坏了,这个数据仅仅是测试的,如果用到的话需要自己修改温湿度传感器对应的函数!
OneNET平台数据流显示界面:
串口信息打印输出如下:
存在问题
一、上传图片的时候合泰芯片会卡住,不能执行代码,不清楚是代码的问题还是合泰32的问题,有空再看看。[狗头\sm]
工程链接
链接1:https://download.youkuaiyun.com/download/LiangWF22/14951875
链接2:https://leoeinstein.lanzous.com/iXpNqkzxikb
2021年1月28日