今年的中央一号文件提出,“持续实施数字乡村发展行动,发展智慧农业”。近年来,物联网、大数据、人工智能等技术在农业领域深入应用,促进农业生产更便捷、管理更高效,智能农业监控系统。基于STM32H7S7智慧工农业控制台通过STM32H7S7嵌入式系统结合各种传感器、执行器和通信模块,实现对农田环境的实时监测、自动控制和数据传输。所需要的器件:
4G模块:移远EC800 WiFi:EWM3080
土壤传感器可以同时测量土壤温度、土壤体积含水量和土壤电导率三项参数,通过RS485 modbus 与STM32H7S7进行通信。
首先基于STM32H7S78-DK强大的GUI显示能力, 作为看板和控制台,实时监测农业各种参数,控规按键进行远程遥控。基于Freertos和touchGFX搭建物联网边缘控制台,通过4G或者WiFi读取传感器参数,实时显示。TouchGFX生态链工具支持全系列STM32 MCU,能够最大化发挥STM32H7RS内置的硬件图形优化器性能,并且通过“所见即所得”的开发界面,自动生成代码,让用户使用起来非常的简单且高效。TouchGFX Core提供了性能测量信号,通过与STM32CubeMX配置的GPIO同步,可以实现对渲染时间等指标的可视化。在生成器中,GPIO类的函数被用于响应这些信号。
STM32H7S78的LTDC+DMA2D性能,100Hz以上无压力,刷800*480图片和色块仅需2ms一张,实现了更多的动画效果以及性能优化,把CPU从图形任务中释放出来,低功耗,少存储,具有更高的GUI性能,可实现平滑而丰富的图形效果。
物接入(IoT Hub)是面向物联网领域开发者的全托管云服务,通过主流的物联网协议(如 MQTT)通讯,可以在智能设备与云端之间建立安全的双向连接,快速实现物联网项目。物接入分为设备型(原物管理)和数据型两种项目类型。设备型适用于基于设备的物联网场景;数据型适用于基于数据流的物联网场景。利用物接入来作为搭建物联网应用的第一步,支持亿级并发连接和消息数,支持海量设备与云端安全可靠的双向连接,无缝对接阿里云,华为云,或者百度天工平台和百度智能云。
框架:
物模型:物模型由一个或多个属性构成,可以用他来表示一类(或同一型号的一批)设备。基于物模型可以创建物影子。
MQTT(Message Queuing Telemetry Transport)是一个基于二进制消息的客户端服务端架构的发布/订阅(Publish/Subscribe)模式的消息传输协议,最早由
IBM 提出的,如今已经业界通行规范,更符合机器与机器的通信(M2M)以及物联网环境(IoT)。
MQTT 关键代码:
#include "mqtt.h"
#include "stdlib.h"
#include "string.h"
_MQTT_INFO mqtt_info;
/*******************************************************************************
* Function Name : Mqtt_Init
* Description : MQTT3?ê??ˉ
* Input : keep_time ±£??ê±??
Data_Send ·¢?í??μ÷
Data_Recv ?óê???μ÷
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void Mqtt_Init(uint16_t keep_time,void (*Data_Send)(u8 *databuff, u16 len),void (*Data_Recv)(u8 *databuff, u16 len))
{
mqtt_info.keep_live_time = keep_time;
mqtt_info.mqtt_Data_Send = Data_Send;
mqtt_info.mqtt_Data_Recv = Data_Recv;
}
/*******************************************************************************
* Function Name : Mqtt_Connect
* Description : MQTTá??ó±¨??
* Input : client_id ?í?§??ID
usr_name ó??§??
passward ?ü??
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void Mqtt_Connect(char *client_id, char *usr_name, char *passward)
{
int temp,Remaining_len;
u16 Fixed_len,Variable_len,Payload_len;
u16 client_id_len,usr_name_len,passward_len;
uint8_t *buff;
//êy?Y?o3???????
buff = mqtt_info.TX_Buff;
client_id_len = strlen(client_id);
usr_name_len = strlen(usr_name);
passward_len = strlen(passward);
Fixed_len = 1; //á??ó±¨???D£?1ì?¨±¨í·3¤?è?Yê±?è=1
Variable_len = 10; //á??ó±¨???D£??é±?±¨í·3¤?è=10
Payload_len = 2 + client_id_len + 2 + usr_name_len + 2 + passward_len; //á??ó±¨???D£??o??3¤?è
Remaining_len = Variable_len + Payload_len; //ê£óà3¤?è=?é±?±¨í·3¤?è+?o??3¤?è
*buff++ = MSG_MQTT_CONN; //1ì?¨±¨í·μú1??×??ú £o1ì?¨0x10
do{ //?-?·′|àí1ì?¨±¨í·?Dμ?ê£óà3¤?è×??ú£?×??úá??ù?Yê£óà×??úμ???êμ3¤?è±??ˉ
temp = Remaining_len%128; //ê£óà3¤?èè?óà128
Remaining_len = Remaining_len/128; //ê£óà3¤?èè???128
if(Remaining_len>0)
temp |= 0x80; //°′D-òéòa?ó??7????
*buff++ = temp; //ê£óà3¤?è×??ú????ò???êy?Y
Fixed_len++; //1ì?¨±¨í·×ü3¤?è+1
}while(Remaining_len>0); //è?1?Remaining_len>0μ??°£??ù′???è??-?·
*buff++ = 0x00; //?é±?±¨í·μú1??×??ú £o1ì?¨0x00
*buff++ = 0x04; //?é±?±¨í·μú2??×??ú £o1ì?¨0x04
*buff++ = 0x4D; //?é±?±¨í·μú3??×??ú £o1ì?¨0x4D--M
*buff++ = 0x51; //?é±?±¨í·μú4??×??ú £o1ì?¨0x51--Q
*buff++ = 0x54; //?é±?±¨í·μú5??×??ú £o1ì?¨0x54--T
*buff++ = 0x54; //?é±?±¨í·μú6??×??ú £o1ì?¨0x54--T
*buff++ = 0x04; //?é±?±¨í·μú7??×??ú £o1ì?¨0x04,D-òé??±e
*buff++ = 0xC2; //?é±?±¨í·μú8??×??ú £oê1?üó??§??oí?ü??D£?é£?2?ê1ó?ò???£?2?±£á??á?°
*buff++ = mqtt_info.keep_live_time/256; //?é±?±¨í·μú9??×??ú £o±£??ê±????×??ú
*buff++ = mqtt_info.keep_live_time%256; //?é±?±¨í·μú10??×??ú£o±£??ê±????×??ú
//?í?§??ID
*buff++ = client_id_len/256; //?í?§??ID3¤?è??×??ú
*buff++ = client_id_len%256; //?í?§??ID3¤?èμí×??ú
memcpy(buff,client_id,client_id_len); //?′???í?§??ID
buff += client_id_len;
//ó??§??
*buff++ = usr_name_len/256; //ó??§??3¤?è??×??ú
*buff++ = usr_name_len%256; //ó??§??3¤?èμí×??ú
memcpy(buff,usr_name,usr_name_len); //?′??ó??§??
buff += usr_name_len;
//?ü??
*buff++ = passward_len/256; //?ü??3¤?è??×??ú
*buff++ = passward_len%256; //?ü??3¤?èμí×??ú
memcpy(buff,passward,passward_len); //?′??1yà′?ü??×?′?
buff += passward_len;
//·¢?íêy?Y
if(mqtt_info.mqtt_Data_Send != NULL)
mqtt_info.mqtt_Data_Send(mqtt_info.TX_Buff,Fixed_len + Variable_len + Payload_len);
}
/*******************************************************************************
* Function Name : Mqtt_DisConnect
* Description : MQTT???aá??ó
* Input : None
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void Mqtt_DisConnect(void)
{
uint8_t *buff;
//êy?Y?o3???????
buff = mqtt_info.TX_Buff;
*buff++ = MSG_MQTT_DISCONN; //1|?ü??
*buff++ = 0x00;
//·¢?íêy?Y
if(mqtt_info.mqtt_Data_Send != NULL)
mqtt_info.mqtt_Data_Send(mqtt_info.TX_Buff,2);
}
/*******************************************************************************
* Function Name : Mqtt_Ping
* Description : MQTTD?ì?
* Input : None
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void Mqtt_Ping(void)
{
uint8_t *buff;
//êy?Y?o3???????
buff = mqtt_info.TX_Buff;
*buff++ = MSG_MQTT_PING; //1|?ü??
*buff++ = 0x00;
//·¢?íêy?Y
if(mqtt_info.mqtt_Data_Send != NULL)
mqtt_info.mqtt_Data_Send(mqtt_info.TX_Buff,2);
}
/*******************************************************************************
* Function Name : Mqtt_PingAck
* Description : MQTTD?ì?ó|′e,·t????μ÷ó?
* Input : None
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void Mqtt_PingAck(void)
{
uint8_t *buff;
//êy?Y?o3???????
buff = mqtt_info.TX_Buff;
*buff++ = MSG_MQTT_PING_ACK; //1|?ü??
*buff++ = 0x00;
//·¢?íêy?Y
if(mqtt_info.mqtt_Data_Send != NULL)
mqtt_info.mqtt_Data_Send(mqtt_info.TX_Buff,2);
}
/*******************************************************************************
* Function Name : Mqtt_Subscribe
* Description : SUBSCRIBE????topic±¨??
* Input : topic_name£o????topic±¨????3? PackID ±¨??±êê?·?(°üo?)
QoS£o????μè??
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void Mqtt_Subscribe(char *topic_name, uint16_t PackID, uint8_t QoS)
{
int temp,Remaining_len;
u16 topic_len,pack_len,Variable_len,Payload_len;
uint8_t *buff;
//êy?Y?o3???????
buff = mqtt_info.TX_Buff;
//?÷ìa3¤?è
topic_len = strlen(topic_name);
Variable_len = 2; //SUBSCRIBE±¨???D,±¨??±êê?·?3¤?è,1ì?¨?a2
Payload_len = 2 + strlen(topic_name) + 1; //????óDD§?ooé3¤?è = 2×??ú(topic_name3¤?è)+ topic_name×?·?′?μ?3¤?è + 1×??ú·t??μè??
Remaining_len = Variable_len + Payload_len; //ê£óà3¤?è
*buff++ = MSG_MQTT_SUBSCRIBE; //μú1??×??ú £o1ì?¨0x82
do{ //?-?·′|àí1ì?¨±¨í·?Dμ?ê£óà3¤?è×??ú£?×??úá??ù?Yê£óà×??úμ???êμ3¤?è±??ˉ
temp = Remaining_len%128; //ê£óà3¤?èè?óà128
Remaining_len = Remaining_len/128; //ê£óà3¤?èè???128
if(Remaining_len>0)
temp |= 0x80; //°′D-òéòa?ó??7????
*buff++ = temp; //ê£óà3¤?è×??ú????ò???êy?Y
}while(Remaining_len>0); //è?1?Remaining_len>0μ??°£??ù′???è??-?·
*buff++ = PackID/256; //±¨??±êê?·???×??ú,°üo?
*buff++ = PackID%256; //±¨??±êê?·?μí×??ú,°üo?
*buff++ = topic_len/256; //topic_name3¤?è??×??ú
*buff++ = topic_len%256; //topic_name3¤?èμí×??ú
memcpy(buff,topic_name,topic_len); //?′??topic_name
buff += topic_len;
*buff++ = QoS; //×?oó1??×??ú£o????μè??
pack_len = buff - mqtt_info.TX_Buff;
//·¢?íêy?Y
if(mqtt_info.mqtt_Data_Send != NULL)
mqtt_info.mqtt_Data_Send(mqtt_info.TX_Buff,pack_len);
}
/*******************************************************************************
* Function Name : Mqtt_UnSubscribe
* Description : è???????topic±¨??
* Input : topic_name£o????topic±¨????3? PackID ±¨??±êê?·?(°üo?)
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void Mqtt_UnSubscribe(char *topic_name, uint16_t PackID)
{
int temp,Remaining_len;
u16 topic_len,pack_len,Variable_len,Payload_len;
uint8_t *buff;
//êy?Y?o3???????
buff = mqtt_info.TX_Buff;
//?÷ìa3¤?è
topic_len = strlen(topic_name);
Variable_len = 2; //SUBSCRIBE±¨???D,±¨??±êê?·?3¤?è,1ì?¨?a2
Payload_len = 2 + strlen(topic_name); //????óDD§?ooé3¤?è = 2×??ú(topic_name3¤?è)+ topic_name×?·?′?μ?3¤?è
Remaining_len = Variable_len + Payload_len; //ê£óà3¤?è
*buff++ = MSG_MQTT_UNSUBSCRIBE; //μú1??×??ú £o1ì?¨0xA2
do{ //?-?·′|àí1ì?¨±¨í·?Dμ?ê£óà3¤?è×??ú£?×??úá??ù?Yê£óà×??úμ???êμ3¤?è±??ˉ
temp = Remaining_len%128; //ê£óà3¤?èè?óà128
Remaining_len = Remaining_len/128; //ê£óà3¤?èè???128
if(Remaining_len>0)
temp |= 0x80; //°′D-òéòa?ó??7????
*buff++ = temp; //ê£óà3¤?è×??ú????ò???êy?Y
}while(Remaining_len>0); //è?1?Remaining_len>0μ??°£??ù′???è??-?·
*buff++ = PackID/256; //±¨??±êê?·???×??ú,°üo?
*buff++ = PackID%256; //±¨??±êê?·?μí×??ú,°üo?
*buff++ = topic_len/256; //topic_name3¤?è??×??ú
*buff++ = topic_len%256; //topic_name3¤?èμí×??ú
memcpy(buff,topic_name,topic_len); //?′??topic_name
buff += topic_len;
pack_len = buff - mqtt_info.TX_Buff;
//·¢?íêy?Y
if(mqtt_info.mqtt_Data_Send != NULL)
mqtt_info.mqtt_Data_Send(mqtt_info.TX_Buff,pack_len);
}
/*******************************************************************************
* Function Name : Mqtt_Publish
* Description : ?òtopic·¢2?±¨??
* Input : topic_name£o????topic±¨????3? PackID ±¨??±êê?·?(°üo?)
QoS£oμè?? data óDD§êy?Y data_len óDD§êy?Y3¤?è
* Output : None
* Return : None
* Note : PackID??óDμ±QoS?a1?ò2ê±óDD§
*******************************************************************************/
void Mqtt_Publish(char *topic_name, uint16_t PackID, uint8_t QoS, uint8_t *data, uint16_t data_len)
{
int temp,Remaining_len;
u16 topic_len,pack_len,Payload_len;
uint8_t *buff;
//êy?Y?o3???????
buff = mqtt_info.TX_Buff;
//?÷ìa3¤?è
topic_len = strlen(topic_name);
Payload_len = 2 + strlen(topic_name) + data_len; //????óDD§?ooé3¤?è = 2×??ú(topic_name3¤?è)+ topic_name×?·?′?μ?3¤?è + êy?Y3¤?è
Remaining_len = Payload_len; //ê£óà3¤?è
if(QoS == 0)
{
*buff++ = MSG_MQTT_PUBLISH_QS0; //μú1??×??ú £o1ì?¨0x30
}
else if(QoS == 1)
{
Remaining_len += 2; //ê£óà3¤?è,2?a±¨??±êê?·?3¤?è
*buff++ = MSG_MQTT_PUBLISH_QS1; //μú1??×??ú £o1ì?¨0x32
}
else if(QoS == 2)
{
Remaining_len += 2; //ê£óà3¤?è,2?a±¨??±êê?·?3¤?è
*buff++ = MSG_MQTT_PUBLISH_QS2; //μú1??×??ú £o1ì?¨0x34
}
do{ //?-?·′|àí1ì?¨±¨í·?Dμ?ê£óà3¤?è×??ú£?×??úá??ù?Yê£óà×??úμ???êμ3¤?è±??ˉ
temp = Remaining_len%128; //ê£óà3¤?èè?óà128
Remaining_len = Remaining_len/128; //ê£óà3¤?èè???128
if(Remaining_len>0)
temp |= 0x80; //°′D-òéòa?ó??7????
*buff++ = temp; //ê£óà3¤?è×??ú????ò???êy?Y
}while(Remaining_len>0); //è?1?Remaining_len>0μ??°£??ù′???è??-?·
*buff++ = topic_len/256; //topic_name3¤?è??×??ú
*buff++ = topic_len%256; //topic_name3¤?èμí×??ú
memcpy(buff,topic_name,topic_len); //?′??topic_name
buff += topic_len;
if(QoS != 0)
{
*buff++ = PackID/256; //±¨??±êê?·???×??ú,°üo?
*buff++ = PackID%256; //±¨??±êê?·?μí×??ú,°üo?
}
//?′??ó??§êy?Y
memcpy(buff,data,data_len);
buff += data_len;
pack_len = buff - mqtt_info.TX_Buff;
//·¢?íêy?Y
if(mqtt_info.mqtt_Data_Send != NULL)
mqtt_info.mqtt_Data_Send(mqtt_info.TX_Buff,pack_len);
}
/*******************************************************************************
* Function Name : Mqtt_RecvHandle
* Description : MQTT?óê?êy?Y?a??
* Input : buff êy?Y?o3???
* Output : None
* Return : None
* Note : 0 3é1|,???ü ê§°ü
*******************************************************************************/
uint8_t Mqtt_RecvHandle(uint8_t *buff)
{
uint8_t *p;
uint8_t encodeByte = 0;
uint32_t multiplier = 1, Remaining_len = 0;
uint8_t QS_level = 0;
p = buff;
//?a???óê?êy?Y
if((*p != 0x30)&&(*p != 0x32)&&(*p != 0x34)) //2?ê?·¢2?±¨??í·
return 1;
if(*p != 0x30) QS_level = 1; //±ê??qsμè??2??a0
p++;
//ìáè?ê£óàêy?Y3¤?è
do{
encodeByte = *p++;
Remaining_len += (encodeByte & 0x7F) * multiplier;
multiplier *= 128;
if(multiplier > 128*128*128) //3?3?ê£óà3¤?è×?′ó4??×??úμ?òa?ó,′í?ó
return 2;
}while((encodeByte & 0x80) != 0);
//ìáè??÷ìaêy?Y3¤?è
mqtt_info.rx_topic_len = *p++;
mqtt_info.rx_topic_len = mqtt_info.rx_topic_len * 256 + *p++;
//ìáè??÷ìa
memcpy(mqtt_info.RX_Topic,p,mqtt_info.rx_topic_len);
p += mqtt_info.rx_topic_len;
if(QS_level != 0) //ì?1y±¨??±êê?·?
p += 2;
//ìáè?ó??§?êêy?Y
if(mqtt_info.mqtt_Data_Recv != NULL)
mqtt_info.mqtt_Data_Recv(p,Remaining_len - mqtt_info.rx_topic_len - 2);
return 0;
}
后台对接阿里云
|
|