久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
arduino對接esp8266的mqtt協議實現代碼
[打印本頁]
作者:
點擊小子
時間:
2019-7-27 10:23
標題:
arduino對接esp8266的mqtt協議實現代碼
感謝眾大網友的無私奉獻,在mqtt協議的編碼本分采集了網友們的mqtt協議解碼分享。程序主要實現在arduino上的整合部分,寫程序的時候水平有限,請大家多多原諒!
單片機源程序如下:
/*************************************************
*程序描述:esp8285透傳串口處理系統
**************************************************/
#include "esp.h"
#include "mqtt.h"
//#include <SoftwareSerial.h>
//信息緩沖區大小
#define read_num 64
#define send_num 50
//信息緩沖區
unsigned char buff[send_num];
unsigned char read_buff[read_num];
unsigned char msgas[50];
int lenstr=0;
//定時器0的時間定義
unsigned long time_ding=0;
unsigned long time_ms=0;
int ding=0;
//定時器1的時間定義
unsigned long time_ding1=0;
unsigned long time_ms1=0;
int ding1=0;
//定時器2的時間定義
unsigned long time_ding2=0;
unsigned long time_ms2=0;
int ding2=0;
//mqtt服務器的定時器時間定義
unsigned long timeoutt=0;
unsigned long timeoutr=0;
//設備標志定義
bool wf=0; //wifi連接標志位
bool tcps=0; //tcp發送標志位
bool tcpc=0; //tcp連接標志位
int led=0;
int error=0; //異常代碼
//mqtt服務器定義
bool mqttc=0; //mqtt服務器連接標志
//SoftwareSerial woshi(2, 3);
void setup()
{
Serial.begin(115200);
// woshi.begin(9600);
pinMode(13,OUTPUT);
pinMode(2,OUTPUT);
// digitalWrite(2,HIGH);
}
void loop()
{
while(1)
{
net();
bendi_loop();
}
}
/*
* 函數:void bendi_loop()
* 功能:管理本地事物
*/
void bendi_loop() //處理本地事務
{
if(ding1>0)
{
if((millis()-time_ding1)>time_ms1) //如果定時器到時間了就執行,否則就跳出
{
switch(ding1) //選自跳轉的位置
{
case 1:
ding1=0;
break;
default:
break;
}
}
else //定時器沒有到時間就跳出
return ;
}
}
void net()
{
int msgnum;
if(error>0) //錯誤代碼處理
{
error_chuli(error);
}
if(ding>0)
{
if((millis()-time_ding)>time_ms) //如果定時器到時間了就執行,否則就跳出
{
switch(ding) //選自跳轉的位置
{
case 1:
ding=0;
goto one;
break;
case 2:
ding=0;
goto two;
break;
case 3:
ding=0;
goto three;
break;
default:
break;
}
}
else //定時器沒有到時間就跳出
return ;
}
if(wf) //判斷wifi是否連接
{
if(tcpc) //判斷tcp是否連接
{
if(tcps) //判斷是否在透傳中
{
mqtt_loop();
}
else //進入透傳模式
{
three:if(tcp_begin_send())
{
tcps=1;
}
else
{
delay_ms(500,3);
error=3;
}
}
}
else //tcp連接
{
two:if(tcp_client())
{
tcpc=1;
}
else
{
delay_ms(1000,2);
}
}
}
else //wifi檢測
{
one:if(ap_can())
{
wf=1;
}
else
{
delay_ms(3000,1);
}
}
}
bool mqtt_subscribe(const char *da,unsigned int Nu,unsigned char RequestedQo)
{
int num;
qing_buff();
num=GetDataSUBSCRIBE(buff,da,Nu,RequestedQo);
Serial.write(buff,num);
qing_buff();
delay(500);
if(serial_can()==2)
{
qing_read();
return 1;
}
else
{
qing_read();
return 0;
}
}
void mqtt_publish(unsigned char du, unsigned char qo,unsigned char retai,const char *topi ,const char *ms)
{
int num;
qing_buff();
num=GetDataPUBLISH(buff,du,qo,retai,topi,ms);
Serial.write(buff,num);
qing_buff();
}
void msg_chuli()
{
int len=0,i;
if((msgas[23]=='o')&&(msgas[24]=='n'))
{
digitalWrite(2,HIGH);
mqtt_publish(0,0,0,MQTT_Topic,"on");
}
if((msgas[23]=='o')&&(msgas[24]=='f'))
{
digitalWrite(2,LOW);
mqtt_publish(0,0,0,MQTT_Topic,"off");
}
for(i=0;i<50;i++)msgas[i]='\0';
// mqtt_publish(0,0,0,MQTT_Topic,msg);
// len=strlen(msg);
// if((msg[0]=='o')&&(msg[1]=='n'))
// {
// digitalWrite(13,HIGH);
// mqtt_publish(0,0,0,MQTT_Topic,"on");
//
// }
// else if((msg[0]=='o')&&(msg[1]=='f'))
// {
// digitalWrite(13,LOW);
// mqtt_publish(0,0,0,MQTT_Topic,"off");
// }
}
void mqtt_loop()
{
char *msgg=NULL;
int num;
if(ding2>0)
{
if((millis()-time_ding2)>time_ms2) //如果定時器到時間了就執行,否則就跳出
{
switch(ding2) //選自跳轉的位置
{
case 1:
ding2=0;
goto one;
break;
default:
break;
}
}
else //定時器沒有到時間就跳出
return ;
}
if(mqttc==0) //判斷服務器是否連接上
{
one:if(mqtt_client())
{
mqttc=1;
timeoutr=millis();
timeoutt=millis();
mqtt_subscribe(mqtt_Stopic,0,0);
delay(1000);
mqtt_publish(0,0,0,MQTT_Topic,"wo");
}
else
{
delay_ms2(5000,1);
}
}
else
{
if((millis()-timeoutt)>5000)
{
mqtt_ping();
timeoutt=millis();
}
if((millis()-timeoutr)>30000)
{
mqttc=0;
}
}
if(Serial.available())
{
delay(300);
num=serial_can();
switch(num)
{
case 3:
timeoutr=millis();
timeoutt=millis();
break;
case 4:
msg_chuli();
break;
default:
esp_cpu(num);
break;
}
}
}
void mqtt_ping()
{
int len;
len=GetDataPINGREQ(buff);
Serial.write(buff,len);
qing_buff();
}
bool mqtt_client() //服務器連接
{
int num;
int i;
qing_buff();
num=GetDataConnet(buff);
Serial.write(buff,num);
qing_buff();
delay(1000);
if(Serial.available())
{
if(serial_can()==1)
{
qing_read();
return 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
/**********************************************************
函數名稱:serial_can()
函數功能:判斷串口數據類型
返回值:
0 沒有匹配到任何值
1 mqtt連接成功
2 mqtt訂閱回應包
3 mqtt心跳包
4 mqtt消息包
6 wifi斷開連接
**********************************************************/
int serial_can() //判斷返回值
{
int i;
int num;
qing_read();
num=Serial.available();
for(i=0;Serial.available()>0;i++)read_buff[i]=Serial.read();
if((read_buff[0]==0x20)&&(read_buff[1]==0x02))
{
return 1;
}
if(read_buff[0]==0x90)
{
return 2;
}
if((read_buff[0]==0xd0)&&(read_buff[1]==0x00))
{
return 3;
}
// if(strstr(read_buff,mqtt_Stopic)!=NULL)
if(read_buff[0]==0x30)
{
lenstr=num;
for(i=0;i<num;i++)msgas[i]=read_buff[i];
return 4;
}
if(strstr(read_buff,"disconnect from ssid")!=NULL)
{
return 6;
}
qing_read();
return 0;
}
void esp_cpu(int num) //設備處理
{
switch(num)
{
case 6: //wifi斷開連接處理
error_chuli(1);
break;
default:
break;
}
}
/*************************************************
函數名稱:void error_chuli(int k)
函數功能:錯誤處理
輸入參數:
1 //錯誤代碼1 WiFi斷開連接
3 //錯誤代碼3 透傳模式失敗
*************************************************/
void error_chuli(int k)
{
switch(k)
{
case 1: //錯誤代碼1 wifi斷開連接
esp_res();
break;
case 3: //錯誤代碼3 透傳模式開啟失敗
error=0;
break;
default:
break;
}
}
void esp_res()
{
wf=0;
tcpc=0;
mqttc=0;
tcps=0;
tcp_stop_send();
Serial.println(at_esp_ret);
delay(3000);
qing_buff();
qing_read();
while(Serial.read() >= 0);
}
bool tcp_begin_send() //開始透傳
{
int i;
while(Serial.read() >= 0);
Serial.println(at_tcp_mode);
delay(300);
while(Serial.read() >= 0);
Serial.println(at_tcp_send);
delay(300);
if(Serial.available())
{
for(i=0;Serial.available()>0;i++)read_buff[i]=Serial.read();
if(strstr(read_buff,"OK")!=NULL)
{
qing_read();
tcps=1;
return 1;
}
else
{
qing_read();
return 0;
}
}
else
{
return 0;
}
}
void tcp_stop_send() //退出透傳模式
{
if(tcps==1)
{
Serial.print(at_tcp_ssend);
tcps=0;
}
}
bool tcp_client()
{
int i;
while(Serial.read() >= 0);
Serial.println(at_tcp_client);
delay(4000);
if(Serial.available())
{
qing_read();
for(i=0;Serial.available()>0;i++)read_buff[i]=Serial.read();
if(strstr(read_buff,"CONNECT")!=NULL)
{
qing_read();
return 1;
}
else if(strstr(read_buff,"ALREADY CONNECTED")!=NULL)
{
qing_read();
return 1;
}
else
{
qing_read();
return 0;
}
}
else
{
qing_read();
return 0;
}
}
bool ap_can()
{
int i;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png
(5.78 KB, 下載次數: 97)
下載附件
2019-7-27 22:46 上傳
所有資料51hei提供下載:
arduino對接esp8266版本4.0.zip
(8.99 KB, 下載次數: 77)
2019-7-27 10:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
jjyytt111
時間:
2019-10-5 19:20
謝謝分享謝謝分享
作者:
609763691
時間:
2019-12-14 17:01
樓主你好,我下載了打不開,報錯誤了。看見了希望回復我一下,需要你的幫助
作者:
cyllife
時間:
2020-3-30 19:25
謝謝分享謝謝分享
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
av网站在线看
|
久久精品小视频
|
成人影院午夜
|
日本三级电影免费
|
欧美在线一区二区三区四区
|
欧美专区在线观看
|
伊人精品在线视频
|
国产精品一区二区三
|
日韩国产中文字幕
|
九九免费视频
|
在线观看国产精品一区二区
|
欧美a区
|
日韩在线不卡视频
|
天堂一区二区三区四区
|
精品一区二区三
|
欧美国产精品一区二区
|
亚洲黄色片免费观看
|
天天干天天谢
|
天色综合网
|
九九激情视频
|
一区二区三区免费
|
精品一二区
|
亚洲精品综合
|
在线色网
|
国产日韩一区二区三区
|
国产东北一级毛片
|
国产一区二区三区在线
|
亚洲福利网站
|
精品一区国产
|
亚洲精品一区在线观看
|
欧美激情在线精品一区二区三区
|
亚洲国产精品一区二区第一页
|
97精品国产
|
欧美激情久久久
|
成人在线视频一区二区三区
|
国产91在线观看
|
久久久久国
|
999久久久国产精品 欧美成人h版在线观看
|
午夜在线精品偷拍
|
日日日视频
|
全免费a级毛片免费看视频免费下
|