上一節(jié)說(shuō)的是TCP客戶(hù)端模式下的通信,這一節(jié)說(shuō)一下服務(wù)器端模式下的通信,總體來(lái)說(shuō),代碼是差不多的,只是關(guān)鍵地方有些調(diào)整。
另外,包括上一節(jié)在內(nèi),這兩節(jié)的代碼里,ESP8266的工作模式設(shè)置為了station+softap模式。但在進(jìn)行TCP通信時(shí),都是以station的身份通信。后面會(huì)說(shuō)一下,如果以softap身份通信有什么注意事項(xiàng)。
還有就是,有的朋友留言問(wèn),如果想快速開(kāi)發(fā)APP,實(shí)現(xiàn)手機(jī)和ESP8266的通信調(diào)試,一般怎么實(shí)現(xiàn)。就我個(gè)人,一般是在物聯(lián)網(wǎng)后臺(tái)上直接看數(shù)據(jù),很少在手機(jī)上操作。有沒(méi)有想過(guò)自己寫(xiě)APP?
有,確實(shí)想過(guò),但還是之前提過(guò)的,我是個(gè)硬件工程師~自己寫(xiě)APP?跨度有點(diǎn)大,我倒是做過(guò)一些工作,研究過(guò)易安卓和安卓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、開(kāi)啟監(jiān)聽(tīng),用函數(shù)listen();
5、接收客戶(hù)端上來(lái)的連接,用函數(shù)accept();
6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接;
8、關(guān)閉監(jiān)聽(tīng);
因?yàn)椴襟E和上一節(jié)相似程度很高,所以我會(huì)做一些簡(jiǎn)化,如果有看不懂的地方,建議對(duì)比上一節(jié)內(nèi)容。另外,學(xué)習(xí)類(lèi)的東西,建議在電腦端打開(kāi),個(gè)人感覺(jué)手機(jī)上看的效果一般,只能看個(gè)大概。深度學(xué)習(xí),個(gè)人還是習(xí)慣在電腦上進(jìn)行。好,演示開(kāi)始。
因?yàn)樽隽撕?jiǎn)化,步驟分為4步。
1 包含頭文件
跟上一節(jié)一樣,所以略過(guò)。
2 設(shè)置工作模式為station+ soft-ap模式,并連接到當(dāng)前環(huán)境下的wifi
跟上一節(jié)一樣,但是這次的代碼加了一句。雖然設(shè)置為了station+ soft-ap模式,設(shè)置了AP名字和密碼,但好像不用輸入密碼就能連接,這是因?yàn)闆](méi)有設(shè)置加密模式:
config.authmode = AUTH_WPA_PSK; //加密模式
增加這一行之后,就可以了。更多信息建議看一下“softap_config”這個(gè)結(jié)構(gòu)體的定義,里面比較詳細(xì)。
3 確定TCP服務(wù)器端的參數(shù),并初始化
我是誰(shuí)——ESP8266,連接家里路由成功之后,會(huì)自動(dòng)獲得一個(gè)IP,這是服務(wù)器端IP
誰(shuí)要和我連接——因?yàn)槭窃谖译娔X上使用網(wǎng)絡(luò)調(diào)試助手模擬TCP客戶(hù)端端,所以客戶(hù)端端的IP是我電腦的IP:192.168.1.103
連接的端口——這里選1025.
struct ip_info info;
const char remote_ip[4]={192,168,1,103}; //TCP客戶(hù)端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;
//注冊(cè)連接成功回調(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)聽(tīng)
espconn_accept(&esp_conn);
}
不一樣的地方,我用加粗和斜線的方式標(biāo)了出來(lái)。先說(shuō):
espconn_accept(&esp_conn);
因?yàn)檫@個(gè)簡(jiǎn)單,上一節(jié)是TCP客戶(hù)端,創(chuàng)建連接,所以用:
espconn_connect(&user_tcp_conn);
而這一節(jié)是服務(wù)器端,是一個(gè)等待別人來(lái)連接我的角色,所以要監(jiān)聽(tīng)別人。
然后是回調(diào)函數(shù)server_listen,它的內(nèi)容也和客戶(hù)端不一樣。具體區(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);
客戶(hù)端的函數(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ù)和斷開(kāi)連接回調(diào)函數(shù)。區(qū)別在于客戶(hù)端連接成功后會(huì)主動(dòng)發(fā)送信息,而服務(wù)器端被動(dòng)一些,收到信息后,才會(huì)根據(jù)需要有所返回。
那幾個(gè)回調(diào)函數(shù),功能大同小異,就不說(shuō)了。所以除了這些,基本上就沒(méi)什么區(qū)別了。感興趣的童鞋,建議把代碼下載下來(lái),依次對(duì)比一下,這樣可以有一個(gè)比較深的理解。
好,到此為止,程序修改完畢。
注:本例程里提到的大部分函數(shù),都參照手冊(cè)2c-esp8266_sdk_api_guide_cn_v1.5.4。
程序修改完成,保存、清理、編譯、下載一條龍,然后重新上電。這里,需要借助串口助手和網(wǎng)絡(luò)調(diào)試助手兩個(gè)工具來(lái)查看效果。效果如下所示:
設(shè)置網(wǎng)絡(luò)調(diào)試助手:
注意事項(xiàng):需要等到ESP8266連接家里wifi成功以后,也就是串口助手打印出:Wifi connect success!之后,網(wǎng)絡(luò)調(diào)試助手才能進(jìn)行連接。
因?yàn)樵诖酥埃琓CP server端還沒(méi)有初始化完成,這時(shí)候TCP客戶(hù)端即便想連接,也找不到對(duì)象。
TCP連接成功之后,串口助手輸出信息:connect success!
這時(shí),手動(dòng)從網(wǎng)絡(luò)調(diào)試助手那里發(fā)送信息:MCU LOVER
可以看到串口助手打印出來(lái),這說(shuō)明ESP8266已經(jīng)收到了。
這時(shí),在網(wǎng)絡(luò)調(diào)試助手這里點(diǎn)擊“斷開(kāi)”,可以看到串口助手打印:TCP cliend disconnected!
說(shuō)明連接斷開(kāi)成功(client 寫(xiě)成了 cliend,不要在意這些細(xì)節(jié))。
最后,有的人可能會(huì)問(wèn),你說(shuō)的這些步驟、工作流程都是怎么來(lái)的?不可能是瞎猜的吧?
確實(shí),這個(gè)問(wèn)題很關(guān)鍵,所有工作都要有一個(gè)明確的工作流程。其實(shí)答案還是在手冊(cè)里:2c-esp8266_sdk_api_guide_cn_v1.5.4,第216頁(yè):
有了手冊(cè),再參考SDK里面的例程,基本就差不多了。還是那句話,多看手冊(cè)。好,這一節(jié)說(shuō)完了,歡迎大家動(dòng)手嘗試!
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9331瀏覽量
86131 -
TCP通信
+關(guān)注
關(guān)注
0文章
146瀏覽量
4295
原文標(biāo)題:ESP8266_13服務(wù)器端模式下的TCP通信
文章出處:【微信號(hào):gh_dae0718828df,微信公眾號(hào):gh_dae0718828df】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
qt tcp程序在服務(wù)器端發(fā)送數(shù)據(jù)之前能接收客戶(hù)端發(fā)送的數(shù)據(jù)嗎?
PC端訪問(wèn)服務(wù)器 并讀取服務(wù)器端的數(shù)據(jù) 怎么寫(xiě)啊?
labview和 讀碼器的以太網(wǎng)通信 (沒(méi)有服務(wù)器端的程序)
請(qǐng)問(wèn)gprs與服務(wù)器通信,服務(wù)器端的程序怎么寫(xiě)?
請(qǐng)問(wèn)ESP8266設(shè)為AP的tcp服務(wù)器端如何一對(duì)多通信?
為什么LWIP的TCP客戶(hù)端服務(wù)器端斷開(kāi)后繼續(xù)發(fā)送數(shù)據(jù)就無(wú)法檢測(cè)到連接狀態(tài)?
LabVIEW編寫(xiě)作為服務(wù)器端的TCP工具
用freertos和LWIP開(kāi)發(fā)一個(gè)服務(wù)器端的TCP/IP服務(wù)
esp32C3用TCP連接問(wèn)題,無(wú)法識(shí)別服務(wù)器端主動(dòng)斷開(kāi)怎么解決?
服務(wù)器端腳本與動(dòng)態(tài)網(wǎng)頁(yè)設(shè)計(jì),下載
網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶(hù)端和TCP服務(wù)器端應(yīng)用程序免費(fèi)下載
![網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP <b class='flag-5'>TCP</b>客戶(hù)<b class='flag-5'>端</b>和<b class='flag-5'>TCP</b><b class='flag-5'>服務(wù)器端</b>應(yīng)用程序免費(fèi)下載](https://file.elecfans.com/web1/M00/62/00/o4YBAFuHWwaANxpWAADMt7Js31c135.png)
TCP通信服務(wù)器端和客戶(hù)端同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載
![<b class='flag-5'>TCP</b><b class='flag-5'>通信服務(wù)器端</b>和客戶(hù)<b class='flag-5'>端</b>同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載](https://file.elecfans.com/web1/M00/AB/04/o4YBAF2yYnOAdxEIAADokxYolA4162.png)
Linux下TCP網(wǎng)絡(luò)編程-創(chuàng)建服務(wù)器與客戶(hù)端
![Linux<b class='flag-5'>下</b><b class='flag-5'>TCP</b>網(wǎng)絡(luò)編程-創(chuàng)建<b class='flag-5'>服務(wù)器</b>與客戶(hù)<b class='flag-5'>端</b>](https://file.elecfans.com//web2/M00/5F/5E/poYBAGL3QWaAJr08AAC3sdn8kvY030.png)
評(píng)論