女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

基于rt-thread的socket通信設(shè)計(jì)

冬至子 ? 來源:Zzxy ? 作者:Zzxy ? 2023-10-13 15:02 ? 次閱讀

最近再研究 rt-thread通信 ,想設(shè)計(jì)出 eps8266(多個(gè))<-> rt-thread(作為中控) <-> 服務(wù)器的通信框架,使用的開發(fā)板是 潘多拉
首先我們需要 確保使用的開發(fā)板可以聯(lián)網(wǎng),其次 我們需要在rt-setting 中打開套接字抽象層
如圖

1.jpg

下載樣例后,把IoT_Boardrt-threadexamplesnetwork 下的tcpserver.c 和 tcpclient.c拿出來放到我們的工程中。

這兩個(gè)文件提供了tcp連接指令給我們
具體使用方法如圖。

1.jpg

在進(jìn)行下一步前最好測試一下這兩個(gè)指令是否生效。

為了接下來能看懂,我這邊簡單介紹一些 esp8266的邏輯 ,
連接wifi -> 連接終端(即rt-thread)->首次連接發(fā)送設(shè)備id-> 循環(huán)查看是否接受到數(shù)據(jù),如果接收到即對指令進(jìn)行處理,否則發(fā)送當(dāng)前設(shè)備的狀態(tài)
接下來看一下終端這邊的邏輯,終端首先要連接wifi ,之后提供 tcpserver 等待 esp8266連接,在esp8266連接上后,創(chuàng)建一個(gè)線程,線程名為設(shè)備id,再將線程socket資源放到一個(gè)全局結(jié)構(gòu)體中,用于之后的維護(hù)。

Tcpserver.c 中沒有多少修改的,我只粘貼修改的部分
在tcpserv函數(shù)中,在receive 后修改如下

bytes_received = recv(connected, str, BUFSZ, 0);
if (bytes_received < 0)
{
    LOG_E("Received error, close the connect.");
    closesocket(connected);
    connected = -1;
    break;
}
else
{
    /* 在控制終端顯示收到的數(shù)據(jù) */
    rt_thread_t tid;
    LOG_D("Received threadName = %s n", str,str);
    tid = rt_thread_create(str,
        tcpserver_to_client, (void *)connected,
        1024, RT_THREAD_PRIORITY_MAX/3, 20);
    if (tid != RT_NULL)
    {
        sockets.tids[sockets.len]=tid;
        sockets.connects[sockets.len]=connected;
        sockets.len++;
        rt_thread_startup(tid);
    }
}

即和上面的邏輯一樣,創(chuàng)建通信的線程,將線程資源和socket資源放到全局結(jié)構(gòu)體中維護(hù),結(jié)構(gòu)體的定義如下

1.jpg

接下來看通信線程,代碼如下

static void tcpserver_to_client(void conn){
int running=1;
int bytes_received,connected;
char str[20];
connected = (int)conn;
/
客戶端連接的處理 /
while (running)
{
/
從connected socket中接收數(shù)據(jù),接收buffer是1024大小,但并不一定能夠收到1024大小的數(shù)據(jù) /
bytes_received = recv(connected, str, BUFSZ, 0);
if (bytes_received < 0)
{
LOG_E("Received error, close the connect.");
closesocket(connected);
connected = -1;
return ;
}
else
{
/
在控制終端顯示收到的數(shù)據(jù) */
rt_mb_send(&mb, (rt_uint32_t)&str);
}
}
}

在這個(gè)線程中,通過傳遞的socket資源,接受數(shù)據(jù),注意這邊的recv是阻塞的,如果接受到數(shù)據(jù),就將數(shù)據(jù)發(fā)送到郵箱中,這邊為什么要使用郵箱呢,以為后續(xù)我們需要和tcpclient線程進(jìn)行通信,在esp8266發(fā)送消息給我們后,我們需要將消息轉(zhuǎn)發(fā)給服務(wù)器。

在繼續(xù)講解rt-thread邏輯前我們來看一下服務(wù)器的邏輯,服務(wù)器邏輯比較簡單,就是提供sever服務(wù),接受tcpclient的數(shù)據(jù),并且給tcpclient發(fā)送消息,注意服務(wù)器端的recv是非阻塞的

接下來看tcpclient的邏輯,在tcpclient中,我們既需要將esp8266的數(shù)據(jù)轉(zhuǎn)發(fā)給服務(wù)器,也需要接受服務(wù)器傳的數(shù)據(jù),所以我們在這邊的recv不能是阻塞的,那怎么將esp8266的消息轉(zhuǎn)發(fā)呢,就是用之前的郵箱來通信啦,代碼如下

while (is_running)
{
/* 從sock連接中接收最大BUFSZ - 1字節(jié)數(shù)據(jù) /
bytes_received = recv(sock, recv_data, BUFSZ - 1, MSG_DONTWAIT);
if (bytes_received > 0)
{
char threadName[10]={0};
rt_strncpy(threadName, recv_data, 4);
/
有接收到數(shù)據(jù),把末端清零 /
recv_data[bytes_received] = '?';
/
在控制終端顯示收到的數(shù)據(jù) /
rt_kprintf("Received data = %sn", recv_data);
send_client(threadName,recv_data);
}
if(get_mailbox()==RT_TRUE){
/
發(fā)送數(shù)據(jù)到sock連接 /
ret = send(sock, str, rt_strlen(str), 0);
if (ret < 0)
{
/
接收失敗,關(guān)閉這個(gè)連接 /
rt_kprintf("send error, close the socket.");
goto __exit;
}
else if (ret == 0)
{
/
打印send函數(shù)返回值為0的警告信息 */
rt_kprintf("Send warning, send function return 0.");
}
}
rt_thread_mdelay(3000);
}

在這段代碼中,recv 的flag 改成了MSG_DONTWAIT 這是revc非阻塞的標(biāo)志,
比較關(guān)鍵的是recv后面的內(nèi)容,在接受數(shù)據(jù)后,會(huì)取出數(shù)據(jù)的前四位(前四位為設(shè)備id),并且通過send_client 來判斷,如果前四位和之前創(chuàng)建的線程名一樣,就把數(shù)據(jù)發(fā)送給對應(yīng)的設(shè)備send_client函數(shù)如下

void send_client(char threadName[],char recvData[]){
int i,ret;
for(i=0;i {
if(rt_strcmp(threadName, (sockets.tids[i])->name)==0){
rt_kprintf("find order to %sn",threadName);
ret = send(sockets.connects[i], recvData, rt_strlen(recvData), 0);
if (ret < 0)
{
/* 接收失敗,關(guān)閉這個(gè)連接 /
rt_kprintf("send error n");
}
else if (ret == 0)
{
/
打印send函數(shù)返回值為0的警告信息 */
rt_kprintf("Send warning, send function return 0.n");
}
}
}
}

get_mailbox()函數(shù)是判斷郵箱中是否有東西,有的話就放到str中,并且發(fā)送給服務(wù)器get_mailbox 函數(shù)代碼如下

static int get_mailbox(){
if (rt_mb_recv(&mb, (rt_ubase_t *)&str, RT_WAITING_NO) == RT_EOK)
{
rt_kprintf("thread1: get a mail from mailbox, the content:%d, str1= %sn",str,str);
return RT_TRUE;
}
return RT_FALSE;
}

以上就是實(shí)現(xiàn)的流程了,其實(shí)還是比較簡單的。

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

    關(guān)注

    114

    文章

    16959

    瀏覽量

    182870
  • Socket
    +關(guān)注

    關(guān)注

    1

    文章

    212

    瀏覽量

    35545
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1368

    瀏覽量

    41501
  • ESP8266
    +關(guān)注

    關(guān)注

    51

    文章

    965

    瀏覽量

    46867
  • TCP通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    4461
收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程)

    在前面我們RT-Thread Studio工程基礎(chǔ)之上講一講RT-Thread內(nèi)核啟動(dòng)流程.
    的頭像 發(fā)表于 06-20 00:30 ?5476次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(二、<b class='flag-5'>RT-Thread</b>內(nèi)核啟動(dòng)流程)

    求一種基于RT-Threadsocket通信方案

    最近再研究 rt-thread通信 ,想設(shè)計(jì)出 eps8266(多個(gè))<-> rt-thread(作為中控) <-> 服務(wù)器的通信框架
    發(fā)表于 02-07 11:13

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread用戶手冊

    RT-Thread用戶手冊——本書是RT-Thread的編程手冊,用于指導(dǎo)在RT-Thread實(shí)時(shí)操作系統(tǒng)環(huán)境下如何進(jìn)行編 程。
    發(fā)表于 11-26 16:16 ?0次下載

    RT-Thread全球技術(shù)大會(huì):螢石研發(fā)團(tuán)隊(duì)使用RT-Thread的技術(shù)挑戰(zhàn)

    RT-Thread全球技術(shù)大會(huì):研發(fā)團(tuán)隊(duì)使用RT-Thread的技術(shù)挑戰(zhàn) ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 11:36 ?1476次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石研發(fā)團(tuán)隊(duì)使用<b class='flag-5'>RT-Thread</b>的技術(shù)挑戰(zhàn)

    RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制

    RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:49 ?1752次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):Kconfig在<b class='flag-5'>RT-Thread</b>中的工作機(jī)制

    RT-Thread全球技術(shù)大會(huì):在RT-Thread上編寫測試用例

    RT-Thread全球技術(shù)大會(huì):在RT-Thread上編寫測試用例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:28 ?1673次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):在<b class='flag-5'>RT-Thread</b>上編寫測試用例

    RT-Thread全球技術(shù)大會(huì):RT-Thread測試用例集合案例

    RT-Thread全球技術(shù)大會(huì):RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:34 ?2298次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b>測試用例集合案例

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡介 作為一名 RTOS 的初學(xué)者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?4898次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發(fā)表于 02-22 18:23 ?10次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_線程間通信

    RT-Thread文檔_線程間通信
    發(fā)表于 02-22 18:29 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_線程間<b class='flag-5'>通信</b>

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個(gè)賬號(hào)登陸,開啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?5001次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    rt-thread源碼分析之socket抽象層和網(wǎng)卡注冊

    如圖所示,rt-thread的網(wǎng)絡(luò)分為應(yīng)用層、sal_socket、netdev、協(xié)議簇(at、lwip、wiznet)、網(wǎng)卡驅(qū)動(dòng)五層。
    的頭像 發(fā)表于 11-13 12:43 ?1248次閱讀