0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

服務(wù)器端模式下的TCP通信

單片機(jī)愛好者 ? 2019-12-30 09:15 ? 次閱讀

上一節(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)手嘗試!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    qt tcp程序在服務(wù)器端發(fā)送數(shù)據(jù)之前能接收客戶發(fā)送的數(shù)據(jù)嗎?

    寫了一個(gè)tcp的客戶服務(wù)器端,是服務(wù)器端給客戶發(fā)送文件,但是我想在服務(wù)器端發(fā)送之前先讓客戶
    發(fā)表于 04-22 20:06

    PC訪問服務(wù)器 并讀取服務(wù)器端的數(shù)據(jù) 怎么寫???

    PC訪問服務(wù)器并讀取服務(wù)器端的數(shù)據(jù) 怎么寫?。?需要訪問數(shù)據(jù)庫嗎?聽說還要服務(wù)器那邊的用戶名和密碼才能訪問數(shù)據(jù)庫不需要兩臺pc機(jī)的通信的程
    發(fā)表于 07-27 09:00

    labview和 讀碼的以太網(wǎng)通信 (沒有服務(wù)器端的程序)

    :192.168.100.10)用讀碼自帶的設(shè)置軟件在電腦上可以發(fā)現(xiàn)并設(shè)置兩臺讀碼, 問題來了:說明書上寫可以用TCP,SOCKET通信,但是只有電腦上有客戶端接收數(shù)據(jù)的程序,而讀
    發(fā)表于 08-14 17:31

    請問gprs與服務(wù)器通信,服務(wù)器端的程序怎么寫?

    大家好,最近在做sim808芯片的gprs與服務(wù)器通信,用的是阿里云的服務(wù)器,請問一服務(wù)器端的程序改怎么寫?用VB嗎?有沒有相關(guān)的教程可以
    發(fā)表于 04-17 23:22

    請問ESP8266設(shè)為AP的tcp服務(wù)器端如何一對多通信?

    我用WiFi模塊的AP模式當(dāng)做TCP服務(wù)器來使用,然后用手機(jī)的網(wǎng)絡(luò)助手創(chuàng)建了兩個(gè)連接。然后在單片機(jī)上查詢到的IP結(jié)果是一個(gè)為IPD0,一個(gè)為IPD1,對他們進(jìn)行
    發(fā)表于 04-23 01:53

    為什么LWIP的TCP客戶服務(wù)器端斷開后繼續(xù)發(fā)送數(shù)據(jù)就無法檢測到連接狀態(tài)?

    發(fā)現(xiàn)LWIP的TCP客戶有個(gè)BUG,當(dāng)服務(wù)器端開之后,如果還繼續(xù)發(fā)送數(shù)據(jù),那就不能檢測到連接狀態(tài)。求助求助
    發(fā)表于 10-29 20:26

    LabVIEW編寫作為服務(wù)器端TCP工具

    ` 本帖最后由 yk74110 于 2021-1-18 16:47 編輯 LabVIEW編寫作為服務(wù)器端TCP工具;可以實(shí)現(xiàn)在同一臺電腦或者同在一個(gè)局域網(wǎng)的不同2臺電腦之間點(diǎn)對點(diǎn)雙向即時(shí)通信
    發(fā)表于 01-18 16:44

    用freertos和LWIP開發(fā)一個(gè)服務(wù)器端TCP/IP服務(wù)

    我在工作中需要在STM32F2系列,用freertos和LWIP開發(fā)一個(gè)服務(wù)器端TCP/IP服務(wù)。由于內(nèi)存有限并且freertos不便于利用fork函數(shù)新建線程,因此采用了sele
    發(fā)表于 08-24 07:30

    TCP服務(wù)器模式配置流程是什么

    TCP服務(wù)器模式配置流程是什么?如何去實(shí)現(xiàn)TCP服務(wù)器通信呢?
    發(fā)表于 01-14 06:02

    esp32C3用TCP連接問題,無法識別服務(wù)器端主動(dòng)斷開怎么解決?

    服務(wù)器端主動(dòng)斷開連接esp32C3用TCP的send函數(shù)仍能發(fā)送成功返回字節(jié)數(shù),但服務(wù)器端已經(jīng)無法收到數(shù)據(jù)。為何還能發(fā)送成功?這里如何判斷服務(wù)器已斷開從而進(jìn)行斷線重連?
    發(fā)表于 03-14 06:06

    服務(wù)器端腳本與動(dòng)態(tài)網(wǎng)頁設(shè)計(jì),下載

    服務(wù)器端腳本與動(dòng)態(tài)網(wǎng)頁設(shè)計(jì) 1. 了解服務(wù)器端腳本和動(dòng)態(tài)網(wǎng)頁的有關(guān)概念 ; 2. 了解ASP、PHP的基本語法和基本功能 ; 3. 熟練掌握J(rèn)SP的基本語法和基本
    發(fā)表于 04-28 16:44 ?0次下載

    JAVA教程之TCP服務(wù)器端

    JAVA教程之TCP服務(wù)器端,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?10次下載

    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶TCP服務(wù)器端應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶TCP服務(wù)器端應(yīng)用程序免費(fèi)下載。
    發(fā)表于 08-30 08:00 ?16次下載
    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP <b class='flag-5'>TCP</b>客戶<b class='flag-5'>端</b>和<b class='flag-5'>TCP</b><b class='flag-5'>服務(wù)器端</b>應(yīng)用程序免費(fèi)下載

    TCP通信服務(wù)器端和客戶同機(jī)互傳的簡單示例程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是TCP通信服務(wù)器端和客戶同機(jī)互傳的簡單示例程序免費(fèi)下載初學(xué)者學(xué)習(xí)。本例子是本計(jì)算機(jī)labview程序之間的通信,如果要想實(shí)現(xiàn)計(jì)算機(jī)與計(jì)算機(jī)之間的
    發(fā)表于 10-25 08:00 ?9次下載
    <b class='flag-5'>TCP</b><b class='flag-5'>通信服務(wù)器端</b>和客戶<b class='flag-5'>端</b>同機(jī)互傳的簡單示例程序免費(fèi)下載

    LinuxTCP網(wǎng)絡(luò)編程-創(chuàng)建服務(wù)器與客戶

    這篇文章介紹在Linux的socket編程,完成TCP服務(wù)器、客戶的創(chuàng)建,實(shí)現(xiàn)數(shù)據(jù)通信。
    的頭像 發(fā)表于 08-14 09:26 ?2398次閱讀
    Linux<b class='flag-5'>下</b><b class='flag-5'>TCP</b>網(wǎng)絡(luò)編程-創(chuàng)建<b class='flag-5'>服務(wù)器</b>與客戶<b class='flag-5'>端</b>