首先說明,本人非原創(chuàng)。
程式是上網(wǎng)找到的,
不能設定MQTT帳號密碼,
本人僅稍微修改後,
可以設定MQTT帳號密碼。
-------------------------
測試方法,
ESP01 接USART2
TXD --- PA3/USART2_RX
RXD --- PA2/USART2_TX
RST --- PA0
EN --- PA1
VCC --- 3.3V
GND --- GND
--------------------------
USART1 外接Realterm 或任何能調試com之軟件
TXD --- PA9/USART2_RX
RXD --- PA10/USART2_TX
MQTT.png (66.59 KB, 下載次數(shù): 64)
下載附件
2019-9-2 21:20 上傳
--------------------------
從USART1串口調試 發(fā)送help 可以看一些輸入方式
例如加入AP 請發(fā)送ssid=xxxx&pwd=xxxx
--------------------------
broker 伺服器需設定
ESP_StartMux(TCP,(char *)"192.xxx.xxx.xxx",1883,300)
MQTT帳號密碼在此設定
mqtt_connect_message(mqtt_msg,"123456","username","password")
MQTT連接成功後
手機下載MQTT免費appㄧ可測式
(我就是用MQTT Terminal測式)
appadvice點com/game/app/mqtt-terminal/1404331673
MQTT Terminal.png (184.35 KB, 下載次數(shù): 62)
下載附件
2019-9-2 21:25 上傳
----main.c----------------
- #include "bsp.h"
- #include "timer.h"
- #include "usart.h"
- #include "led.h"
- #include "esp8266.h"
- #include "connect.h"
- #include "md5.h"
- #include "MQTTPacket.h"
- u8 mqtt_msg[200]={0};
- u16 len;
- u8 *my_strstr(const u8 *s1,u16 n1,const u8 *s2,u16 n2);
-
- void USART1_RecvData(void);
- unsigned char GetDataFixedHead(unsigned char MesType,unsigned char DupFlag,unsigned char QosLevel,unsigned char Retain)
- {
- unsigned char dat = 0;
- dat = (MesType & 0x0f) << 4;
- dat |= (DupFlag & 0x01) << 3;
- dat |= (QosLevel & 0x03) << 1;
- dat |= (Retain & 0x01);
- return dat;
- }
- u16 mqtt_connect_message(u8 *mqtt_message,char *client_id,char *username,char *password)
- {
- u16 client_id_length = strlen(client_id);
- u16 username_length = strlen(username);
- u16 password_length = strlen(password);
- u16 packetLen;
- u16 i,baseIndex;
-
- packetLen = 12 + 2 + client_id_length;
- if(username_length > 0)
- packetLen = packetLen + 2 + username_length;
- if(password_length > 0)
- packetLen = packetLen+ 2 + password_length;
-
- mqtt_message[0] = GetDataFixedHead(1,0,0,0); //MQTT Message Type CONNECT
- mqtt_message[1] = packetLen - 2;
- baseIndex = 2;
- if(packetLen > 127)
- {
- mqtt_message[2] = 1; //packetLen/127;
- baseIndex = 3;
- }
- mqtt_message[baseIndex++] = 0; // Protocol Name Length MSB
- mqtt_message[baseIndex++] = 4; // Protocol Name Length LSB
- mqtt_message[baseIndex++] = 77; // ASCII Code for M
- mqtt_message[baseIndex++] = 81; // ASCII Code for Q
- mqtt_message[baseIndex++] = 84; // ASCII Code for T
- mqtt_message[baseIndex++] = 84; // ASCII Code for T
- mqtt_message[baseIndex++] = 4; // MQTT Protocol version = 4
- mqtt_message[baseIndex++] = 0 | (0 << 1) | (0 << 1) | (0 << 3) | (0 << 5) | (1 << 6) |(1 << 7); // conn flags
- mqtt_message[baseIndex++] = 0; // Keep-alive Time Length MSB
- mqtt_message[baseIndex++] = 60; // Keep-alive Time Length LSB
- mqtt_message[baseIndex++] = (0xff00&client_id_length)>>8;// Client ID length MSB
- mqtt_message[baseIndex++] = 0xff&client_id_length; // Client ID length LSB
-
- // Client ID
- for(i = 0; i < client_id_length; i++)
- {
- mqtt_message[baseIndex + i] = client_id[i];
- }
- baseIndex = baseIndex+client_id_length;
-
- if(username_length > 0)
- {
- //username
- mqtt_message[baseIndex++] = (0xff00&username_length)>>8;//username length MSB
- mqtt_message[baseIndex++] = 0xff&username_length; //username length LSB
- for(i = 0; i < username_length ; i++)
- {
- mqtt_message[baseIndex + i] = username[i];
- }
- baseIndex = baseIndex + username_length;
- }
-
- if(password_length > 0)
- {
- //password
- mqtt_message[baseIndex++] = (0xff00&password_length)>>8;//password length MSB
- mqtt_message[baseIndex++] = 0xff&password_length; //password length LSB
- for(i = 0; i < password_length ; i++)
- {
- mqtt_message[baseIndex + i] = password[i];
- }
- baseIndex += password_length;
- }
-
- return baseIndex;
- }
- //MQTT Publish
- u16 mqtt_publish_message(u8 *mqtt_message, char * topic, char * message, u8 qos)
- {
- u16 topic_length = strlen(topic);
- u16 message_length = strlen(message);
- u16 i,index=0;
- static u16 id=0;
-
- mqtt_message[index++] = 48; //0x30 // MQTT Message Type PUBLISH
- if(qos)
- mqtt_message[index++] = 2 + topic_length + 2 + message_length;
- else
- mqtt_message[index++] = 2 + topic_length + message_length; // Remaining length
- mqtt_message[index++] = (0xff00&topic_length)>>8;
- mqtt_message[index++] = 0xff&topic_length;
-
- // Topic
- for(i = 0; i < topic_length; i++)
- {
- mqtt_message[index + i] = topic[i];
- }
- index += topic_length;
-
- if(qos)
- {
- mqtt_message[index++] = (0xff00&id)>>8;
- mqtt_message[index++] = 0xff&id;
- id++;
- }
-
- // Message
- for(i = 0; i < message_length; i++)
- {
- mqtt_message[index + i] = message[i];
- }
- index += message_length;
-
- return index;
-
-
- }
- u8 mqtt_puback_message(u8 *mqtt_message)
- {
- static u16 id=0;
-
- mqtt_message[0] = 64; //0x40 //PUBACK
- mqtt_message[1] = 2;
- mqtt_message[2] = (0xff00&id)>>8;
- mqtt_message[3] = 0xff&id;
- id++;
-
- return 4;
- }
- u16 mqtt_subscribe_message(u8 *mqtt_message,char *topic,u8 qos,u8 whether)
- {
- u16 topic_len = strlen(topic);
- u16 i,index = 0;
- static u16 id=0;
-
- id++;
- if(whether)
- {mqtt_message[index++] = 0x82;} //0x82 SUBSCRIBE
- else
- {mqtt_message[index++] = 162; } //0xA2
- mqtt_message[index++] = topic_len + 5;
- mqtt_message[index++] = (0xff00&id)>>8;
- mqtt_message[index++] = 0xff&id;
- mqtt_message[index++] = (0xff00&topic_len)>>8;
- mqtt_message[index++] = 0xff&topic_len;
-
- for (i = 0;i < topic_len; i++)
- {
- mqtt_message[index + i] = topic[i];
- }
- index += topic_len;
-
- if(whether)
- {
- mqtt_message[index] = qos;//QoS
- index++;
- }
-
- return index;
-
- }
- //MQTT PING
- u8 mqtt_ping_message(u8 *mqtt_message)
- {
- mqtt_message[0] = 192; //0xC0 PING
- mqtt_message[1] = 0;
-
- return 2;
- }
- u8 mqtt_disconnect_message(u8 *mqtt_message)
- {
- mqtt_message[0] = 224; //0xE0 DISCONNECT
- mqtt_message[1] = 0;
-
- return 2;
- }
- int main(void)
- {
- u16 len;
- u8 state=0,link=0;
- BspInit();
- printf("\r\ninitialize finish\r\n\r\n");
- while(1)
- {
- if(esp8266.state==254)//ESP8266
- {
- switch(state)
- {
- case 0:
- if(ESP_StartMux(TCP,(char *)"xxx.xxx.xxx.xxx",1883,300))
- {
- link=1;
- Delay10Ms(100);//1000ms
- //MQTT Connect
- len=mqtt_connect_message(mqtt_msg,"123456","","");//id=123456,username,password
- //for(i=0;i<len;i++)
- //{
- // printf("%02X ",mqtt_msg[i]);
- //}
- if(ESP_SendTcpUdp(mqtt_msg,len,200))
- {
-
- printf("\r\nMQTT_Connect ...\r\n");
- Delay10Ms(100);//1000ms
- //MQTT subscribe
- len=mqtt_subscribe_message(mqtt_msg,"test",1,1);//SUB Topic Qos1 1:ó†é†
- //PrintHex(mqtt_msg,len);
- if(ESP_SendTcpUdp(mqtt_msg,len,200))
- {
- state=1;
- printf("\r\nMQTT_Subscribe ...\r\n");
- }
- }
-
- }
- Delay10Ms(500);//5000ms
- break;
- case 1:
- if(IS_TIMEOUT_10MS(eTim4, 6000))//60000ms
- {
- if(link)
- {
- u8 ping[2];
- ping[0]=0xc0;
- ping[1]=0x00;
- if(ESP_SendTcpUdp(ping,2,200))//PINGREQ
- {
- printf("\r\nMQTT_Ping ...\r\n");
- }
-
- else
- {
- link=0;
- state=0;
- printf("\r\nMQTT_Ping Fail\r\n");
- }
- }
- }
- break;
- }
- if(ESP_Recv_Len>0)
- {
- char* position=NULL;
- u8 data_len;
-
- printf("ESP_Recv=%s\r\n",ESP_Recv_Buff);
- //PrintHex(ESP_Recv_Buff,ESP_Recv_Len);
- ESP_Recv_Len=0;
- if(strstr((char *)ESP_Recv_Buff,"CLOSED"))
- {
- link=0;
- state=0;
- }
-
- position=strstr((char *)ESP_Recv_Buff,"+IPD");
- data_len=GetValue(position,",");
- if(data_len>0)
- {
- printf("Recv_Data_Len=%d\r\n",data_len);
- position=strstr((char *)ESP_Recv_Buff,":");
- if(position!=0)
- {
- memcpy(mqtt_msg,position+1,data_len);
- }
- //PrintHex(mqtt_msg,data_len);
- if(mqtt_msg[0]==50||mqtt_msg[0]==58)
- {
- /*
- if(strstr((char *)mqtt_msg,"ON"))
- {
- CONTROL_LED=1;
- printf("CONTROL_LED=ON\r\n");
- }
- */
- if(my_strstr(mqtt_msg,data_len,(u8 *)"ON",2))
- {
- CONTROL_LED=1;
- printf("CONTROL_LED=ON\r\n");
- }
- else
- {
- printf("Not Found ON\r\n");
- }
- if(my_strstr(mqtt_msg,data_len,(u8 *)"OFF",3))
- {
- CONTROL_LED=0;
- printf("CONTROL_LED=OFF\r\n");
- }
- else
- {
- printf("Not Found OFF\r\n");
- }
- len=mqtt_puback_message(mqtt_msg);
- //PrintHex(mqtt_msg,len);
- if(ESP_SendTcpUdp(mqtt_msg,len,200))
- {
- printf("\r\nMQTT_PUBACK ...\r\n");
- }
- }
- //PrintHex(mqtt_msg,data_len);
- }
-
- }
- }
- //ESP_RecvData();
- ESP_Connect();
- Idle();
- }
- }
- void USART1_RecvData(void)
- {
- if(USART1_Recv_Flag)
- {
- u16 value;
- u8 buf[PAYLOAD_DATA_LEN]={0};
-
- USART1_Recv_Flag=0;
- value=GetValue((char *)USART1_Recv_Buff," ");
- CopyString((char *)buf,(char *)USART1_Recv_Buff," ");
- printf("buffer=%s value=%d\r\n",buf,value);
- if(strstr((char *)buf,"help"))
- {
- printf("\r\n========== Help Menu ==========\r\n\r\n");
- printf("var? (variable)\r\n");
- printf("rst-h (esp8266 hard reset)\r\n");
- printf("rst-s (esp8266 soft reset)\r\n");
- printf("state val (esp8266 state)\r\n");
- printf("ssid=xxx&pwd=xxx (set ssid or pwd)\r\n");
- printf("\r\n===============================\r\n");
- }
- else if(strstr((char *)USART1_Recv_Buff,"BubbleSort"))
- {
- u8 arr[5] = { 1,2,3,4,5 };
- u8 i;
- printf("\r\nFirst:\r\n");
- for(i = 0; i < 5; i++)
- {
- printf("%d",arr[i]);
- }
- BubbleSort(arr, 5);//
- printf("\r\nBubble:\r\n");
- for(i = 0; i < 5; i++)
- {
- printf("%d",arr[i]);
- }
- }
- else if(strstr((char *)USART1_Recv_Buff,"MY-STRSTR"))
- {
- u8 *p=my_strstr(buf,strlen((char *)buf),(u8 *)"ON",2);
- if(p)
- {
- printf("my_strstr=%s\r\n",p);
- }
- else
- {
- printf("Not Found ON\r\n");
- }
- }
- else if(strstr((char *)USART1_Recv_Buff,"LINK"))
- {
- ESP_StartMux(TCP,(char *)"xxx.xxx.xxx.xxx",1883,300);
- }
- else if(strstr((char *)USART1_Recv_Buff,"COMM"))
- {
- len=mqtt_connect_message(mqtt_msg,"123456","","");
- PrintHex(mqtt_msg,len);
- if(ESP_SendTcpUdp(mqtt_msg,len,200))
- {
- printf("\r\nMQTT_Connect ...\r\n");
- }
- }
- else if(strstr((char *)USART1_Recv_Buff,"PING"))
- {
- u8 ping[2];
-
- ping[0]=0xc0;
- ping[1]=0x00;
- if(ESP_SendTcpUdp(ping,2,200))
- {
- printf("\r\nMQTT_Ping ...\r\n");
- }
- }
- else if(strstr((char *)USART1_Recv_Buff,"PUB"))
- {
- MQTTString topicString = MQTTString_initializer;
-
- topicString.cstring = "test1";
- len = MQTTSerialize_publish(mqtt_msg, 200, 0, 0, 0, 0, topicString, (u8 *)"123456", 6); /* 2 */
- //len=mqtt_publish_message(mqtt_msg, "TEST", "OFF");
- PrintHex(mqtt_msg,len);
- if(ESP_SendTcpUdp(mqtt_msg,len,200))
- {
- printf("\r\nMQTT_Publish ...\r\n");
- }
- }
- else if(strstr((char *)USART1_Recv_Buff,"SUB"))
- {
- len=mqtt_subscribe_message(mqtt_msg,"$DATETIME/",0,1);
- PrintHex(mqtt_msg,len);
- if(ESP_SendTcpUdp(mqtt_msg,len,200))
- {
- printf("\r\nMQTT_Subscribe ...\r\n");
- }
- }
- else if(strstr((char *)USART1_Recv_Buff,"MD5-TEST"))
- {
- unsigned char dst[16];
- MD5_String(dst,(char *)buf);
- PrintHex((u8 *)dst,sizeof(dst));
- }
- else if(strstr((char *)USART1_Recv_Buff,"ssid"))
- {
- char *srcstr=USART1_Recv_Buff;
- char *ssid=(char *)Store_Data.ssid;
- char *pwd=(char *)Store_Data.pwd;
- u8 ssid_len=0,pwd_len=0;
- printf("ssid_len=%d\r\n",sizeof(Store_Data.ssid));
- printf("pwd_len=%d\r\n",sizeof(Store_Data.pwd));
- while(1)
- {
- if(*srcstr=='=')
- {
- break;
- }
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n')
- {
- printf("ERROR\r\n");
- return;
- }
- srcstr++;
- }
- srcstr++;
- while(1)
- {
- if(*srcstr=='&')
- {
- *ssid='\0';
- break;
- }
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n'||ssid_len>=sizeof(Store_Data.ssid))
- {
- printf("ERROR\r\n");
- return;
- }
- *ssid=*srcstr;
- srcstr++;
- ssid++;
- ssid_len++;
- }
- while(1)
- {
- if(*srcstr=='=')
- {
- break;
- }
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n')
- {
- printf("ERROR\r\n");
- return;
- }
- srcstr++;
- }
- srcstr++;
- MemSet((BYTE *)&Store_Data.pwd,0,sizeof(Store_Data.pwd));
- while(1)
- {
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n'||pwd_len>=sizeof(Store_Data.pwd))
- {
- *pwd='\0';
- break;
- }
- *pwd=*srcstr;
- srcstr++;
- pwd++;
- pwd_len++;
- }
- if(pwd_len<8)
- {
- u8 i;
-
- for(i=pwd_len;i<8;i++)
- {
- *pwd='*';
- pwd++;
- }
- }
- printf("ssid=%s\r\npwd=%s\r\n",Store_Data.ssid,Store_Data.pwd);
- }
- else if(strstr((char *)USART1_Recv_Buff,"apiKey"))
- {
- char *srcstr=USART1_Recv_Buff;
- char *apiKey=(char *)Store_Data.apiKey;
- u8 key_len=0;
- while(1)
- {
- if(*srcstr=='=')
- {
- break;
- }
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n')
- {
- printf("ERROR\r\n");
- return;
- }
- srcstr++;
- }
- srcstr++;
- while(1)
- {
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n'||key_len>=16)
- {
- *apiKey='\0';
- break;
- }
- *apiKey=*srcstr;
- srcstr++;
- apiKey++;
- key_len++;
- }
- if(key_len<16)
- {
- u8 i;
-
- for(i=key_len;i<16;i++)
- {
- *apiKey='*';
- apiKey++;
- }
- }
- printf("apiKey=%s\r\n",Store_Data.apiKey);
- }
- else if(strstr((char *)USART1_Recv_Buff,"server"))
- {
- char *srcstr=USART1_Recv_Buff;
- char *server=(char *)Store_Data.server;
- u8 server_len=0;
- while(1)
- {
- if(*srcstr=='=')
- {
- break;
- }
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n')
- {
- printf("ERROR\r\n");
- return;
- }
- srcstr++;
- }
- srcstr++;
- while(1)
- {
- if(*srcstr=='\0'||*srcstr=='\r'||*srcstr=='\n'||server_len>=sizeof(Store_Data.server))
- {
- *server='\0';
- break;
- }
- *server=*srcstr;
- srcstr++;
- server++;
- server_len++;
- }
- printf("server=%s\r\n",Store_Data.server);
- }
- else if(strstr((char *)buf,"rst-h"))
- {
- ESP_HardReset();
- }
- else if(strstr((char *)buf,"rst-s"))
- {
- ESP_SoftReset();
- }
- else if(strstr((char *)buf,"state"))
- {
- esp8266.state=GetValue(USART1_Recv_Buff," ");
- }
- else if(strstr((char *)buf,"port"))
- {
- esp8266.port=GetValue(USART1_Recv_Buff," ");
- }
- else if(strstr((char *)buf,"mode"))
- {
- esp8266.mode=GetValue(USART1_Recv_Buff," ");
- if(esp8266.mode)
- {
- if(ESP_StartServer(esp8266.port))
- {
- esp8266.login=FALSE;
- esp8266.connect=FALSE;
- esp8266.bind=FALSE;
- esp8266.state=SERVER;
- esp8266.ser_time=Get_RunTime();
- SetLed(0xff,100,100);
- }
- }
- if(!esp8266.mode)
- {
- if(ESP_CloseServer())
- {
- esp8266.mode=ESP_CLIENT;
- if(!esp8266.login)
- esp8266.state=WAIT_LOGIN;
- else if(!esp8266.connect||!esp8266.bind)
- esp8266.state=SATRT_CONNECT;
- else
- {
- esp8266.state=LIVE;
- SetLed(0xff,10,500);
- }
- }
- }
- }
- else if(strstr((char *)buf,"add_routr_table"))
- {
- Payload tmp;
- u8 i,k,n;
-
- n=value;
- for(k=0; k<10; k++)//
- {
- value=n;
- MemSet((BYTE *)&tmp,0,sizeof(Payload));
- tmp.header.the_addr=value+k;
- tmp.header.hop_addr=(value+20)+k;
- for(i=0; i<k; i++)
- {
- tmp.buf[i]=(value+10)+i;
- }
- }
- }
- else if(strstr((char *)buf,"var?"))
- {
- printf("\r\n=========variable=========\r\n\r\n");
- printf("apiKey=%s\r\nserver=%s\r\n",Store_Data.apiKey,Store_Data.server);
- printf("ssid=%s\r\npwd=%s\r\n",Store_Data.ssid,Store_Data.pwd);
- printf("esp8266_state=%d\r\n",esp8266.state);
- printf("esp8266_mode=%d\r\n",esp8266.mode);
- printf("connect_port=%d\r\n",esp8266.port);
- printf("Run Day:%d Time:%02d:%02d:%02d\r\n",
- run_time.date,run_time.hour,run_time.min,run_time.sec);
- printf("\r\n==========================\r\n");
- }
- else
- {
- ESP_SendString((u8 *)USART1_Recv_Buff,USART1_ReceDatalen);
- }
- }
- }
- u8 *my_strstr(const u8 *s1,u16 n1,const u8 *s2,u16 n2)
- {
- int n,x=0,y=0;
- if (*s2)
- {
- while(1)
- {
- if(*s1==*s2)
- {
- for (n=0;n<n2;n++)
- {
- if (*(s1+n)==*(s2+n))
- {
- y++;
- if (y>=n2)
- //if (!*(s2+n+1))
- {
- return (u8 *)s1;
- }
- if (x+n>=n1-1)
- {
- return NULL;
- }
- if (*(s1+n+1)!=*(s2+n+1))
- {
- break;
- }
- }
- else
- {
- break;
- }
- }
- }
- s1++;
- x++;
- if(x>=n1)
- {
- break;
- }
- }
- return NULL;
- }
- else
- {
- return (u8*)s1;
- }
- }
復制代碼
----------------------------
以下程式碼壓縮後打包上傳。
全部資料51hei下載地址:
stm32_mqtt_test.7z
(252.57 KB, 下載次數(shù): 122)
2019-9-2 21:51 上傳
點擊文件名下載附件
code 下載積分: 黑幣 -5
|