上一節(jié)說的是TCP客戶端模式下的通信,這一節(jié)說一下服務(wù)器端模式下的通信,總體來說,代碼是差不多的,只是關(guān)鍵地方有些調(diào)整。
另外,包括上一節(jié)在內(nèi),這兩節(jié)的代碼里,ESP8266的工作模式設(shè)置為了station+softap模式。但在進(jìn)行TCP通信時(shí),都是以station的身份通信。后面會說一下,如果以softap身份通信有什么注意事項(xiàng)。
還有就是,有的朋友留言問,如果想快速開發(fā)APP,實(shí)現(xiàn)手機(jī)和ESP8266的通信調(diào)試,一般怎么實(shí)現(xiàn)。就我個(gè)人,一般是在物聯(lián)網(wǎng)后臺上直接看數(shù)據(jù),很少在手機(jī)上操作。有沒有想過自己寫APP?
有,確實(shí)想過,但還是之前提過的,我是個(gè)硬件工程師~自己寫APP?跨度有點(diǎn)大,我倒是做過一些工作,研究過易安卓和安卓studio,感興趣的可以試著從這兩方便入手試試,或者有其它的,大家也可以留言。
好,繼續(xù)。這里保留上一節(jié)引用的“TCP編程的服務(wù)器端一般步驟”,作為參考:
TCP編程的服務(wù)器端一般步驟是:
1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
4、開啟監(jiān)聽,用函數(shù)listen();
5、接收客戶端上來的連接,用函數(shù)accept();
6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接;
8、關(guān)閉監(jiān)聽;
因?yàn)椴襟E和上一節(jié)相似程度很高,所以我會做一些簡化,如果有看不懂的地方,建議對比上一節(jié)內(nèi)容。另外,學(xué)習(xí)類的東西,建議在電腦端打開,個(gè)人感覺手機(jī)上看的效果一般,只能看個(gè)大概。深度學(xué)習(xí),個(gè)人還是習(xí)慣在電腦上進(jìn)行。好,演示開始。
因?yàn)樽隽撕喕?,步驟分為4步。
1 包含頭文件
跟上一節(jié)一樣,所以略過。
2 設(shè)置工作模式為station+ soft-ap模式,并連接到當(dāng)前環(huán)境下的wifi
跟上一節(jié)一樣,但是這次的代碼加了一句。雖然設(shè)置為了station+ soft-ap模式,設(shè)置了AP名字和密碼,但好像不用輸入密碼就能連接,這是因?yàn)闆]有設(shè)置加密模式:
config.authmode = AUTH_WPA_PSK; //加密模式
增加這一行之后,就可以了。更多信息建議看一下“softap_config”這個(gè)結(jié)構(gòu)體的定義,里面比較詳細(xì)。
3 確定TCP服務(wù)器端的參數(shù),并初始化
我是誰——ESP8266,連接家里路由成功之后,會自動(dòng)獲得一個(gè)IP,這是服務(wù)器端IP
誰要和我連接——因?yàn)槭窃谖译娔X上使用網(wǎng)絡(luò)調(diào)試助手模擬TCP客戶端端,所以客戶端端的IP是我電腦的IP:192.168.1.103
連接的端口——這里選1025.
struct ip_info info;
const char remote_ip[4]={192,168,1,103}; //TCP客戶端IP
wifi_get_ip_info(STATION_IF,&info); //獲取8266的WIFI信息
server_init((struct ip_addr *)remote_ip,&info.ip,1025);
可以看到,和上一節(jié)相比,函數(shù)名字變了,但其實(shí)內(nèi)容大部分都一樣:
{
LOCAL struct espconn esp_conn;
//初始化espconn參數(shù)
esp_conn.type=ESPCONN_TCP;
esp_conn.state=ESPCONN_NONE;
esp_conn.proto.tcp=(esp_tcp *)os_malloc(sizeof(esp_tcp));
os_memcpy(esp_conn.proto.tcp->local_ip,local_ip,4);
os_memcpy(esp_conn.proto.tcp->remote_ip,remote_ip,4);
esp_conn.proto.tcp->local_port=port;
//注冊連接成功回調(diào)函數(shù)和重新連接回調(diào)函數(shù)
espconn_regist_connectcb(&esp_conn,server_listen);
espconn_regist_reconcb(&esp_conn,server_recon);
//創(chuàng)建TCP server,建立監(jiān)聽
espconn_accept(&esp_conn);
}
不一樣的地方,我用加粗和斜線的方式標(biāo)了出來。先說:
espconn_accept(&esp_conn);
因?yàn)檫@個(gè)簡單,上一節(jié)是TCP客戶端,創(chuàng)建連接,所以用:
espconn_connect(&user_tcp_conn);
而這一節(jié)是服務(wù)器端,是一個(gè)等待別人來連接我的角色,所以要監(jiān)聽別人。
然后是回調(diào)函數(shù)server_listen,它的內(nèi)容也和客戶端不一樣。具體區(qū)別看第4步。
4 定義連接成功的回調(diào)函數(shù)
函數(shù)內(nèi)容如下:
struct espconn *pespconn=arg;
os_printf(" nconnect success! ");
espconn_regist_recvcb(pespconn,server_recv);
espconn_regist_sentcb(pespconn,server_sent);
espconn_regist_disconcb(pespconn,server_discon);
客戶端的函數(shù)代碼如下:
struct espconn *pespconn=arg;
espconn_regist_recvcb(pespconn,user_tcp_recv_cb);
espconn_regist_sentcb(pespconn,user_tcp_sent_cb);
espconn_regist_disconcb(pespconn,user_tcp_discon_cb);
espconn_sent(pespconn,"hello,this is esp8266!",strlen("hello,this is esp8266!"));
不考慮printf的打印信息,創(chuàng)建的這三個(gè)回調(diào)函數(shù),功能大部分基本是一樣的。都是接收完成回調(diào)函數(shù)、發(fā)送完成回調(diào)函數(shù)和斷開連接回調(diào)函數(shù)。區(qū)別在于客戶端連接成功后會主動(dòng)發(fā)送信息,而服務(wù)器端被動(dòng)一些,收到信息后,才會根據(jù)需要有所返回。
那幾個(gè)回調(diào)函數(shù),功能大同小異,就不說了。所以除了這些,基本上就沒什么區(qū)別了。感興趣的童鞋,建議把代碼下載下來,依次對比一下,這樣可以有一個(gè)比較深的理解。
好,到此為止,程序修改完畢。
注:本例程里提到的大部分函數(shù),都參照手冊2c-esp8266_sdk_api_guide_cn_v1.5.4。
程序修改完成,保存、清理、編譯、下載一條龍,然后重新上電。這里,需要借助串口助手和網(wǎng)絡(luò)調(diào)試助手兩個(gè)工具來查看效果。效果如下所示:
設(shè)置網(wǎng)絡(luò)調(diào)試助手:
注意事項(xiàng):需要等到ESP8266連接家里wifi成功以后,也就是串口助手打印出:Wifi connect success!之后,網(wǎng)絡(luò)調(diào)試助手才能進(jìn)行連接。
因?yàn)樵诖酥?,TCP server端還沒有初始化完成,這時(shí)候TCP客戶端即便想連接,也找不到對象。
TCP連接成功之后,串口助手輸出信息:connect success!
這時(shí),手動(dòng)從網(wǎng)絡(luò)調(diào)試助手那里發(fā)送信息:MCU LOVER
可以看到串口助手打印出來,這說明ESP8266已經(jīng)收到了。
這時(shí),在網(wǎng)絡(luò)調(diào)試助手這里點(diǎn)擊“斷開”,可以看到串口助手打?。篢CP cliend disconnected!
說明連接斷開成功(client 寫成了 cliend,不要在意這些細(xì)節(jié))。
最后,有的人可能會問,你說的這些步驟、工作流程都是怎么來的?不可能是瞎猜的吧?
確實(shí),這個(gè)問題很關(guān)鍵,所有工作都要有一個(gè)明確的工作流程。其實(shí)答案還是在手冊里:2c-esp8266_sdk_api_guide_cn_v1.5.4,第216頁:
有了手冊,再參考SDK里面的例程,基本就差不多了。還是那句話,多看手冊。好,這一節(jié)說完了,歡迎大家動(dòng)手嘗試!
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
8957瀏覽量
85080 -
TCP通信
+關(guān)注
關(guān)注
0文章
146瀏覽量
4200
原文標(biāo)題:ESP8266_13服務(wù)器端模式下的TCP通信
文章出處:【微信號:gh_dae0718828df,微信公眾號:gh_dae0718828df】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論