#include "mqtt.h"
//发送缓存区
u8 Send_Packet[MAX_SEND_LENGTH]={0};
//连接阿里iot字符串
u8 connect_iot_buf[MAX_SEND_LENGTH]={0};
//u8 connect_iot_buf[]={0x00,0x34,0x31,0x32,0x33,0x34,0x35,0x7C,0x73,0x65,0x63,0x75,0x72,
// 0x65,0x6D,0x6F,0x64,0x65,0x3D,0x33,0x2C,0x73,0x69,0x67,0x6E,0x6D,
// 0x65,0x74,0x68,0x6F,0x64,0x3D,0x68,0x6D,0x61,0x63,0x73,0x68,0x61,
// 0x31,0x2C,0x74,0x69,0x6D,0x65,0x73,0x74,0x61,0x6D,0x70,0x3D,0x31,
// 0x30,0x7C,0x00,0x1A,0x74,0x65,0x73,0x74,0x64,0x69,0x76,0x69,0x63,
// 0x65,0x5F,0x30,0x30,0x31,0x26,0x61,0x31,0x35,0x42,0x63,0x76,0x67,
// 0x57,0x6E,0x51,0x6A,0x00,0x28,0x65,0x34,0x65,0x37,0x63,0x32,0x32,
// 0x34,0x39,0x30,0x39,0x63,0x66,0x64,0x65,0x39,0x64,0x66,0x35,0x64,
// 0x32,0x38,0x39,0x39,0x64,0x66,0x61,0x36,0x66,0x62,0x38,0x64,0x35,
// 0x65,0x38,0x62,0x33,0x63,0x39,0x65};
u16 Send_length=0;//数据包长度
u16 len=0;
char MQTTClientId_Buf[100];
char MQTTUsername_Buf[50];
char Passward_Buf[50];
char VALUE_POST_TOPIC_Buf[100];
char VALUE_REPLY_TOPIC_Buf[100];
u16 test_index=0;
//获取土壤水分和温度数据
void Get_Humi_Temp_Data(u16 *Humi,u16 *Temp)
{
u16 data_crc=0;
u16 humi=0,temp=0;
data_crc=CRC16_Modbus(recv_sensor_data,7);
if(data_crc==(u16)recv_sensor_data[7]<<8|recv_sensor_data[8])
{
humi=(u16)recv_sensor_data[3]<<8|recv_sensor_data[4];
temp=(u16)recv_sensor_data[5]<<8|recv_sensor_data[6];
*Humi=(humi/10)<<8|(humi%10);//水分,整数在前,小数在后
if(temp&0x80)//负数
{
temp&=0x7F;
temp=~(temp-1);//补码转回原码
*Temp=(temp/10)<<8|(temp%10);//温度,整数在前,小数在后
*Temp|=0x80;//负数标志
}
else
*Temp=(temp/10)<<8|(temp%10);//温度,整数在前,小数在后
}
}
//数据打包成JSON格式
int Send_JsonPackage(u8 *Buf)
{
int p=0;
static int Data_ID=0;
u16 Humi=0,Temp=0;
int Temperature=0;
Get_Humi_Temp_Data(&Humi,&Temp);
if(Temp&0x80)
{
Temp&=0x7F;
Temperature=0-(int)Temp;
}
else
{
Temperature=(int)Temp;
}
Data_ID++;
//模拟数据Humi和Temp
Humi=0x3005;//48.5%
Temp=0x1A03;//26.3℃
p=sprintf((char*)Buf,"%s%d%s%s%d%s%d%s%d%s%d%s",
"{\"id\":",Data_ID,
",\"version\":\"1.0\",",
"\"params\":{\"humi\":",(Humi&0xFF00)>>8,".",Humi&0x00FF,
",\"temp\":",(Temp&0xFF00)>>8,".",Temp&0x00FF,
"},\"method\":\"thing.event.property.post\"}");
return p;
}
//获得MQTT连接TOPIC
u16 Get_MQTT_Connect_Topic(u8 *Buf)
{
u16 clientid_len=0;
u16 username_len=0;
u16 passward_len=0;
u16 index=0;
u8 i=0;
clientid_len=strlen(MQTTClientId_Buf);
username_len=strlen(MQTTUsername_Buf);
passward_len=strlen(Passward_Buf);
Buf[index++]=(clientid_len&0xFF00)>>8;
Buf[index++]=clientid_len&0x00FF;
for(i=0;i<clientid_len;i++)
{
Buf[index++]=*(MQTTClientId_Buf+i);
}
Buf[index++]=(username_len&0xFF00)>>8;
Buf[index++]=username_len&0x00FF;
for(i=0;i<username_len;i++)
{
Buf[index++]=*(MQTTUsername_Buf+i);
}
Buf[index++]=(passward_len&0xFF00)>>8;
Buf[index++]=passward_len&0x00FF;
for(i=0;i<passward_len;i++)
{
Buf[index++]=*(Passward_Buf+i);
}
return index;
}
//连接
u16 MQTT_Connect(u8 *Buf)
{
u16 index=0,data_len=0;
u8 temp[10]={0x00,0x04,'M','Q','T','T',MQTT_VERSION,0xC2,0x00,MQTT_KEEPALIVE};
u8 i=0;
data_len=Get_MQTT_Connect_Topic(connect_iot_buf);
len=data_len+10;
Buf[index++]=MQTTCONNECT;
if(len>=0x80)
{
Buf[index++]=len;
Buf[index++]=0x01;
}
else
{
Buf[index++]=len;
}
for(i=0;i<10;i++)
{
Buf[index++]=temp[i];
}
for(i=0;i<data_len;i++)
{
Buf[index++]=connect_iot_buf[i];
}
return index;
}
//订阅
int MQTT_Subscribe(u8 *Buf,u8 *Topic)
{
int index=0,len=0;
static u16 MQTT_ID=0;//报文标识符
u16 topic_len=0;
u8 i=0;
topic_len=sizeof(VALUE_REPLY_TOPIC_Buf)-1;
len=topic_len+5;
Buf[index++]=MQTTSUBSCRIBE;
if(len>=0x80)
{
Buf[index++]=len;
Buf[index++]=0x01;
}
else
{
Buf[index++]=len;
}
MQTT_ID++;
Buf[index++]=(MQTT_ID&0xFF00)>>8;
Buf[index++]=MQTT_ID&0x00FF;
Buf[index++]=(topic_len&0xFF00)>>8;
Buf[index++]=topic_len&0x00FF;
for(i=0;i<topic_len;i++)
{
Buf[index++]=*(Topic+i);
}
Buf[index++]=0x01;
return index;
}
//发布
int MQTT_Publish(u8 *Buf,u8 *Topic)
{
int index=0,len=0;
static u16 MQTT_ID=0;//报文标识符
u16 topic_len=0,package_len=0;
u8 temp[MAX_SEND_LENGTH]={0};
u8 i=0;
topic_len=sizeof(VALUE_POST_TOPIC_Buf)-1;
package_len=Send_JsonPackage(temp);//打包成json格式数据
len=package_len+topic_len+4;
Buf[index++]=MQTTPUBLISH;
if(len>0x80)
{
Buf[index++]=len;
Buf[index++]=0x01;
}
else
{
Buf[index++]=len;
}
Buf[index++]=(topic_len&0xFF00)>>8;
Buf[index++]=topic_len&0x00FF;
for(i=0;i<topic_len;i++)
{
Buf[index++]=*(Topic+i);
}
MQTT_ID++;
Buf[index++]=(MQTT_ID&0xFF00)>>8;
Buf[index++]=MQTT_ID&0x00FF;
for(i=0;i<package_len;i++)
{
Buf[index++]=temp[i];
}
return index;
}
//心跳
int MQTT_Pingreq(u8 *Buf)
{
int index=0;
Buf[index++]=MQTTPINGREQ;
Buf[index++]=0;
return index;
}
u8 MQTT_Send(u16 state, u8 *topic)
{
u16 MQTT_State=0;//MQTT控制报文类型
MQTT_State=state;
switch(MQTT_State)
{
case STATE_MQTT_CONNECT://连接
{
Send_length=MQTT_Connect(Send_Packet);
break;
}
case STATE_MQTT_PUBLISH://发布
{
Send_length=MQTT_Publish(Send_Packet,topic);
break;
}
case STATE_MQTT_SUBSCRIBE://订阅
{
Send_length=MQTT_Subscribe(Send_Packet,topic);
break;
}
case STATE_MQTT_PINGREQ://心跳
{
Send_length=MQTT_Pingreq(Send_Packet);
break;
}
default:break;
}
wifi_send(Send_Packet,Send_length);
return 0;
}
//初始化
void MQTT_Init(void)
{
u8 i=0;
clear_buf_uart2();
Write_MQTTClientId;
Write_MQTTUsername;
Write_Passward;
Write_VALUE_POST_TOPIC;
Write_VALUE_REPLY_TOPIC;
MQTT_Send(STATE_MQTT_CONNECT,"");//连接iot平台
MQTT_Send(STATE_MQTT_SUBSCRIBE,(u8*)VALUE_REPLY_TOPIC_Buf);//订阅属性值回复topic
delay_ms(2000);
PUT("---mqtt connnect feedback\r\n");
send_string_uart1(buf_uart2.buf);
PUT("\r\n");
for(i=0;i<buf_uart2.index;i++)
{
send_char_to_hex_string_uart1(buf_uart2.buf[i]);
}
PUT("\r\n");
}
//MQTT发布消息或发送心跳包
void MQTT_Handle(void)
{
u8 i = 0;
clear_buf_uart2();
MQTT_Send(STATE_MQTT_PUBLISH,(u8*)VALUE_POST_TOPIC_Buf);
delay_ms(2000);
PUT("---mqtt data send feedback\r\n");
send_string_uart1(buf_uart2.buf);
PUT("\r\n");
for(i=0;i<buf_uart2.index;i++)
{
// send_char_to_hex_string_uart1(buf_uart2.buf[i]);
send_data_uart1(buf_uart2.buf[i]);
}
PUT("\r\n");
}
评论0