日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

esp8266 php 接口,ESP8266_SDK基础(5)智能插座_完整项目代码

發(fā)布時間:2024/1/23 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 esp8266 php 接口,ESP8266_SDK基础(5)智能插座_完整项目代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

環(huán)境及工具與第一章相同,這里就不在重復(fù)!

這個項目用了幾天的時間才搞定,期間遇到了很多問題,也調(diào)整了很多代碼,在這里免費分享給大家,希望同行可以借鑒!版權(quán)所有,請勿轉(zhuǎn)載!!!

代碼說明:

GPIO02用于指示wifi聯(lián)網(wǎng)狀態(tài);

GPIO12用于指示開關(guān)動作;

GPIO14用于讀取按鍵,按下后設(shè)備重啟進(jìn)入配網(wǎng)狀態(tài);

wifi模塊重啟時20秒用于airkiss和esptouch配網(wǎng);

聯(lián)網(wǎng)后會以3秒一次向服務(wù)器發(fā)送請求數(shù)據(jù),反饋回來的數(shù)據(jù)讀取后進(jìn)行控制;

user_main.c全部代碼如下:

#include "ets_sys.h"

#include "osapi.h"

#include "user_interface.h"

#include "smartconfig.h"//配網(wǎng)

#include "espconn.h"//連接

#include "mem.h"

#include "gpio.h"//io口

#include "user_devicefind.h"

#include "user_webserver.h"

#if ESP_PLATFORM

#include "user_esp_platform.h"

#endif

void user_rf_pre_init(void){}

/*******************************************************************************

* 結(jié)構(gòu)體聲明

*******************************************************************************/

LOCAL struct espconn user_conn;//網(wǎng)絡(luò)連接結(jié)構(gòu)體

LOCAL os_timer_t os_timer;//定時器結(jié)構(gòu)體

/*******************************************************************************

* 全局變量聲明

*******************************************************************************/

LOCAL uint8 order=0;//運行順序標(biāo)記,1完成路由器連接,2完成TCP連接,3TCP連接斷開

LOCAL uint32 send=0;//發(fā)送標(biāo)記

LOCAL const uint8 remote_ip[4]={192,168,1,1};//遠(yuǎn)程服務(wù)器ip地址

LOCAL const uint8 remote_port=8080;//遠(yuǎn)程服務(wù)器端口號

LOCAL char headbuf[110]="GET /switch_gear.php?token=abcd&id=";//待發(fā)送的字符開頭

LOCAL char *id="0000000000";//設(shè)備id

LOCAL char *endbuf="&series=WP&version=01 HTTP/1.1\nHost: www.abcd.com\n\n";//待發(fā)送的字符結(jié)尾

LOCAL char *pbuf=&headbuf[0];

/*******************************************************************************

* 快連模式回調(diào)函數(shù)||init_done_cb()內(nèi)調(diào)用

*******************************************************************************/

LOCAL void ICACHE_FLASH_ATTR

smartconfig_done(sc_status status, void *pdata){

switch(status){

case SC_STATUS_WAIT://連接未開始,請勿在此階段開始連接

os_printf("SC_STATUS_WAIT\n");

break;

case SC_STATUS_FIND_CHANNEL://在此階段進(jìn)行配對連接

os_printf("SC_STATUS_FIND_CHANNEL\n");

break;

case SC_STATUS_GETTING_SSID_PSWD://得到wifi名字和密碼

os_printf("SC_STATUS_GETTING_SSID_PSWD\n");

break;

case SC_STATUS_LINK://正在連接路由器

os_printf("SC_STATUS_LINK\n");

struct station_config *sta_conf=pdata;

wifi_station_set_config(sta_conf);//設(shè)置WiFi station接口的配置參數(shù),并保存到flash

wifi_station_disconnect();//WiFi station接口從AP斷開連接

wifi_station_connect();//WiFi station接口連接AP

break;

case SC_STATUS_LINK_OVER://獲取到ip,連接路由完成

os_printf("SC_STATUS_LINK_OVER\n");

if(pdata!=NULL){

uint8 phone_ip[4]={0};

os_memcpy(phone_ip,(uint8*)pdata, 4);

os_printf("Phone ip: %d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]);//打印發(fā)廣播過來的設(shè)備IP地址

}

smartconfig_stop();//停止配置

break;

default:break;

}

}

/*******************************************************************************

* 顯示函數(shù)||定時器回調(diào)函數(shù)內(nèi)調(diào)用

*******************************************************************************/

LOCAL void ICACHE_FLASH_ATTR

display(){

LOCAL bool io=false;//io引腳標(biāo)記

LOCAL uint8 lag=0;//延遲標(biāo)記

if(lag<200){lag++;}

switch(order){

case 0:

if(io==true){

io=false;

GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);//GPIO12輸出低電平

}else{

io=true;

GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);//GPIO12輸出高電平

}

break;

case 1:

if(lag>10){

lag=0;

if(io==true){

io=false;

GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);//點亮

}else{

io=true;

GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);//熄滅

}

}

break;

case 2:

GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);//點亮

break;

case 3:

GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);//熄滅

break;

default:

GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);//熄滅

break;

}

}

/*******************************************************************************

* TCP_client連接

*******************************************************************************/

LOCAL void ICACHE_FLASH_ATTR//數(shù)據(jù)發(fā)送成功

user_sent_cb(void *arg){

send=0;

order=2;

os_printf("Data transmission completion!\n");

}

LOCAL void ICACHE_FLASH_ATTR//連接正常斷開

user_discon_cb(void *arg){

order=3;

os_printf("Normal disconnection!\n");

}

LOCAL void ICACHE_FLASH_ATTR//接收到數(shù)據(jù)

user_recv_cb(void *arg,char *pdata,unsigned short len){

uint32 i=0;

os_printf("Receive data:%s\r\n",pdata);//打印接收到的數(shù)據(jù)

for(i=0;i

if(*(pdata+i)=='&'&&*(pdata+i+1)=='{'){

if(*(pdata+i+2)=='1'){

os_printf("Output low level\n");//輸出低電平

GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);

}else{

os_printf("Output high level\n");//輸出高電平

GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);

}

}

}

os_free(pdata);//釋放接收內(nèi)存

}

LOCAL void ICACHE_FLASH_ATTR//TCP連接建立成功

user_connect_cb(void *arg){

struct espconn *pespconn=arg;

espconn_regist_recvcb(pespconn,user_recv_cb);//數(shù)據(jù)接收

espconn_regist_sentcb(pespconn,user_sent_cb);//數(shù)據(jù)發(fā)送完成

espconn_regist_disconcb(pespconn,user_discon_cb);//連接正常斷開

espconn_send(pespconn, pbuf, os_strlen(pbuf));//發(fā)送數(shù)據(jù)

}

LOCAL void ICACHE_FLASH_ATTR//TCP連接發(fā)生異常而斷開

user_recon_cb(void *arg, sint8 err){

order=3;

os_printf("Abnormal disconnection, error code for%d\r\n",err);

}

LOCAL void ICACHE_FLASH_ATTR

user_connect(struct ip_addr *remote_ip,struct ip_addr *local_ip,int remote_port){

/*espconn參數(shù)配置*/

user_conn.type=ESPCONN_TCP;

user_conn.state=ESPCONN_NONE;

user_conn.proto.tcp=(esp_tcp *)os_zalloc(sizeof(esp_tcp));

os_memcpy(user_conn.proto.tcp->local_ip,local_ip,4);

os_memcpy(user_conn.proto.tcp->remote_ip,remote_ip,4);

user_conn.proto.tcp->local_port=espconn_port();

user_conn.proto.tcp->remote_port=remote_port;

/*注冊連接回調(diào)函數(shù)和重連回調(diào)函數(shù)*/

espconn_regist_connectcb(&user_conn,user_connect_cb);//注冊tcp連接成功后的回調(diào)函數(shù)

espconn_regist_reconcb(&user_conn,user_recon_cb);//注冊tcp連接發(fā)生異常時的回調(diào)函數(shù)

/*啟用連接*/

espconn_connect(&user_conn);

}

/*******************************************************************************

* 定時器回調(diào)函數(shù)||init_done_cb()內(nèi)調(diào)用

*******************************************************************************/

LOCAL void ICACHE_FLASH_ATTR

os_timer_cb(void){

LOCAL uint32 lag[2]={0,0};

LOCAL bool boot=false;//使用一次標(biāo)記

LOCAL struct ip_info info; //用于獲取IP地址的信息

if(lag[0]<500){lag[0]++;}

if(lag[1]<500){lag[1]++;}

if(lag[0]>200){//開機(jī)上電20秒用于快連模式

wifi_get_ip_info(STATION_IF,&info);//獲取接口ip地址

if(wifi_station_get_connect_status()==STATION_GOT_IP&&info.ip.addr!=0){//獲取到IP

if(lag[1]>30){//每3秒處理一次數(shù)據(jù)

lag[1]=0;

switch(order){

case 0:

order=1;//標(biāo)記已完成路由器連接

os_printf("got ip\n");//打印獲取到ip

break;

case 1:

user_connect((struct ip_addr *)remote_ip,&info.ip,remote_port);//建立tcp連接

os_printf("connect to TCP\n");//連接到tcp

break;

case 2:

espconn_send(&user_conn, pbuf, os_strlen(pbuf));//發(fā)送數(shù)據(jù)

break;

case 3:

espconn_connect(&user_conn);//嘗試重新建立連接

os_printf("reconnect to TCP\n");//連接到tcp

break;

default:break;

}

}

}else{

if(!boot){//未進(jìn)行快連配置,則嘗試連接原AP

boot=true;

smartconfig_stop();//停止配置

wifi_station_disconnect();//WiFi station接口從AP斷開連接

wifi_station_connect();//WiFi station接口連接AP

os_printf("connect to AP\n");//打印連接AP

}

}

/*復(fù)位按鍵掃描*/

if(!GPIO_INPUT_GET(14)){

system_restart();//系統(tǒng)重啟

}

/*自制看門狗,約10分鐘無響應(yīng),則重啟*/

if(send<6500){send++;}

if(send>6000){

send=0;

system_restart();//系統(tǒng)重啟

}

}

/*調(diào)用顯示處理函數(shù)*/

display();

}

/*******************************************************************************

* 系統(tǒng)初始化完成回調(diào)函數(shù)||user_init()內(nèi)調(diào)用

*******************************************************************************/

LOCAL void ICACHE_FLASH_ATTR

init_done_cb(void){

uint32 id_cache=system_get_chip_id();//獲取設(shè)備id

os_sprintf(id, "%d", id_cache);//將設(shè)備id轉(zhuǎn)換為數(shù)組

os_printf("id:%s\r\n", id);

os_free(id_cache);//釋放內(nèi)存

strcat(pbuf,id);strcat(pbuf,endbuf);//拼接字符串

/*配置SmartConfig模式*/

smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);//設(shè)置快連模式的協(xié)議類型(esptouch與airkiss)

smartconfig_start(smartconfig_done);//開啟快連模式

/*配置軟件定時器 */

os_timer_disarm(&os_timer);//關(guān)閉定時器

os_timer_setfn(&os_timer,(ETSTimerFunc *) (os_timer_cb), NULL);//配置回調(diào)函數(shù)

os_timer_arm(&os_timer,100,true);//啟動定時器

}

/******************************************************************************

* FunctionName : user_init

* Description : entry of user application, init user function here

* Parameters : none

* Returns : none

*******************************************************************************/

void user_init(void)

{

/*設(shè)置串口波特率*/

uart_init(115200,9600);

/*配置GPIO2和GPIO12*/

PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U ,FUNC_GPIO2);//用于指示連接狀態(tài)

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//用于輸出動作

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//用于按鍵輸入

wifi_set_opmode(STATION_MODE);//配置為客戶端模式,并保存到flash

/*打印版本信息*/

os_printf("\r\n");

os_printf("SDK version:%s\r\n", system_get_sdk_version());

/*系統(tǒng)初始化*/

system_init_done_cb(init_done_cb);//系統(tǒng)初始化完成的回調(diào)函數(shù)

}

總結(jié)

以上是生活随笔為你收集整理的esp8266 php 接口,ESP8266_SDK基础(5)智能插座_完整项目代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。