精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

RT-Thread使用webserver(lwip協(xié)議棧自帶httpd )

冬至子 ? 來源:YZRD ? 作者:YZRD ? 2023-10-12 14:47 ? 次閱讀

參考正點原子的 網(wǎng)絡(luò)實驗10 NETCONN_WEBserver實驗和《lwIP開發(fā)指南》。

開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2,rt-thread版本為4.0.3。

以RT-Thread中Lan8720和lwip協(xié)議棧的使用文章創(chuàng)建的工程為基礎(chǔ)。

httpd(The Apache HTTP Server)的官方網(wǎng)址。

rtthread工程中新建文件夾webserver,存放webserver相關(guān)文件。

對工程進(jìn)行編譯,正常通過。

需要修改的代碼,過程如下:

rt-threadcomponentsnetlwip-2.0.2srcincludelwipappshttpd_opts.h 文件中的宏定義

LWIP_HTTPD_CGI 默認(rèn)為0,改為1
LWIP_HTTPD_SSI 默認(rèn)為0,改為1
HTTPD_USE_CUSTOM_FSDATA默認(rèn)為0
LWIP_HTTPD_DYNAMIC_FILE_READ默認(rèn)為0,改為1
將 rt-threadcomponentsnetlwip-2.0.2srcappshttpd文件夾 添加構(gòu)建
httpd文件夾下的fsdata.c 排除構(gòu)建。

在主函數(shù)中增加如下代碼

extern void httpd_init(void);
httpd_init();
while (count++)
{
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(10000);
}

編譯正常,下載到開發(fā)板,效果如圖1:

1.jpg

如何使用自己的網(wǎng)頁呢?修改如下:
將rt-threadcomponentsnetlwip-2.0.2srcappshttpd文件夾下的fsdata.c替換成自己的fsdata.c,(使用makefsdata.exe這個軟件自動生成即可)。

在webserve文件夾下創(chuàng)建httpd_cgi_ssi.c文件(CGI和SSI句柄函數(shù))
參考原子的代碼,修改如下:

#include
#include "lwip/tcp.h"
#include
#include
#include
int LED1=0;
int BEEP=0;
#define NUM_CONFIG_CGI_URIS (sizeof(ppcURLs) / sizeof(tCGI))
#define NUM_CONFIG_SSI_TAGS (sizeof(ppcTAGs) / sizeof(char *))
//extern short Get_Temprate(void);
//extern void RTC_Get_Time(u8 *hour,u8 *min,u8 *sec,u8 *ampm);
//extern void RTC_Get_Date(u8 *year,u8 *month,u8 *date,u8 *week);
//控制LED的CGI handler
const char* LEDS_CGI_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);
const char* BEEP_CGI_Handler(int iIndex,int iNumParams,char *pcParam[],char *pcValue[]);
static const char *ppcTAGs[]= //SSI的Tag
{
"t", //ADC
"w", //溫度值
"h", //時間
"y" //日期
};
static const tCGI ppcURLs[]= //cgi程序
{
{"/leds.cgi",LEDS_CGI_Handler},
{"/beep.cgi",BEEP_CGI_Handler},
};
//當(dāng)web客戶端請求瀏覽器的時候,使用此函數(shù)被CGI handler調(diào)用
static int FindCGIParameter(const char *pcToFind,char *pcParam[],int iNumParams)
{
int iLoop;
for(iLoop = 0;iLoop < iNumParams;iLoop ++ )
{
if(strcmp(pcToFind,pcParam[iLoop]) == 0)
{
return (iLoop); //返回 iLOOP
}
}
return (-1);
}
//SSIHandler?中adc處理函數(shù)
void ADC_Handler(char *pcInsert)
{
char Digit1=0, Digit2=0, Digit3=0, Digit4=0;
static uint32_t ADCVal = 0;
//ADCVal = Get_Adc_Average(5,10);//ADC1_CH5的電壓值
ADCVal+=10;
ADCVal=ADCVal%3000;
//轉(zhuǎn)換為 ADCVval * 0.8mv
ADCVal = (uint32_t)(ADCVal * 0.8);
Digit1= ADCVal/1000;
Digit2= (ADCVal-(Digit1*1000))/100 ;
Digit3= (ADCVal-((Digit1*1000)+(Digit2*100)))/10;
Digit4= ADCVal -((Digit1*1000)+(Digit2*100)+ (Digit3*10));
/* 準(zhǔn)備添加到html中的數(shù)據(jù) */
*pcInsert = (char)(Digit1+0x30);
*(pcInsert + 1) = (char)(Digit2+0x30);
*(pcInsert + 2) = (char)(Digit3+0x30);
*(pcInsert + 3) = (char)(Digit4+0x30);
}
//SSIHandler中需要用到的內(nèi)部處理溫度傳感器
void Temperate_Handler(char *pcInsert)
{
char Digit1=0, Digit2=0, Digit3=0, Digit4=0,Digit5=0;
static short Temperate = 0;
//Temperate = Get_Temprate();
Temperate+=1.3;
Digit1 = Temperate / 10000;
Digit2 = (Temperate % 10000)/1000;
Digit3 = (Temperate % 1000)/100 ;
Digit4 = (Temperate % 100)/10;
Digit5 = Temperate % 10;
/* 準(zhǔn)備添加到html中的數(shù)據(jù) */
*pcInsert = (char)(Digit1+0x30);
*(pcInsert+1) = (char)(Digit2+0x30);
*(pcInsert+2) = (char)(Digit3+0x30);
*(pcInsert+3) = '.';
*(pcInsert+4) = (char)(Digit4+0x30);
*(pcInsert+5) = (char)(Digit5+0x30);
}
//SSIHandler中需要用到的處理RTC日時間的函數(shù)
void RTCTime_Handler(char *pcInsert)
{
static uint8_t hour,min,sec,ampm;
hour++;
min++;
sec++;
ampm++;
//RTC_Get_Time(&hour,&min,&sec,&m);
/* 準(zhǔn)備添加到html中的數(shù)據(jù) */
*pcInsert = (char)((hour/10) + 0x30);
*(pcInsert+1) = (char)((hour%10) + 0x30);
*(pcInsert+2) = ':';
*(pcInsert+3) = (char)((min/10) + 0x30);
*(pcInsert+4) = (char)((min%10) + 0x30);
*(pcInsert+5) = ':';
*(pcInsert+6) = (char)((sec/10) + 0x30);
*(pcInsert+7) = (char)((sec%10) + 0x30);
}
//SSIHandler中需要用到的處理RTC日期的函數(shù)
void RTCdate_Handler(char *pcInsert)
{
static uint8_t year,month,date,week;
//RTC_Get_Date(&year,&month,&date,&week);
year++;
month++;
date++;
week++;
/* 準(zhǔn)備添加到html中的數(shù)據(jù) */
*pcInsert = '2';
*(pcInsert+1) = '0';
*(pcInsert+2) = (char)((year/10) + 0x30);
*(pcInsert+3) = (char)((year%10) + 0x30);
*(pcInsert+4) = '-';
*(pcInsert+5) = (char)((month/10) + 0x30);
*(pcInsert+6) = (char)((month%10) + 0x30);
*(pcInsert+7) = '-';
*(pcInsert+8) = (char)((date/10) + 0x30);
*(pcInsert+9) = (char)((date%10) + 0x30);
*(pcInsert+10) = ' ';
*(pcInsert+11) = 'w';
*(pcInsert+12) = 'e';
*(pcInsert+13) = 'e';
*(pcInsert+14) = 'k';
*(pcInsert+15) = ':';
*(pcInsert+16) = (char)(week + 0x30);
}
//SSI的 Handler 句柄
static u16_t SSIHandler(int iIndex,char *pcInsert,int iInsertLen)
{
switch(iIndex)
{
case 0:
ADC_Handler(pcInsert);
break;
case 1:
Temperate_Handler(pcInsert);
break;
case 2:
RTCTime_Handler(pcInsert);
break;
case 3:
RTCdate_Handler(pcInsert);
break;
}
return strlen(pcInsert);
}
//CGI LED控制句柄
const char* LEDS_CGI_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])
{
uint8_t i=0; //注意根據(jù)自己的GET的參數(shù)的多少來選擇i值范圍
iIndex = FindCGIParameter("LED1",pcParam,iNumParams); //找到LED的索引
//只有一個CGI句柄 iIndex=0
if (iIndex != -1)
{
LED1=1;
for (i=0; i {
if (strcmp(pcParam[i] , "LED1")==0) //檢查參數(shù)"led"
{
if(strcmp(pcValue[i], "LED1ON") ==0)
{
LED1=0;
rt_kprintf("LED1ONn");
}
else if(strcmp(pcValue[i],"LED1OFF") == 0)
{
LED1=1;
rt_kprintf("LED1OFFn");
}
}
}
}
if(LED1 == 0 && BEEP == 0) return "/STM32F407LED_ON_BEEP_OFF.shtml"; //
else if(LED1 == 0 && BEEP == 1) return "/STM32F407LED_ON_BEEP_ON.shtml"; //
else if(LED1 == 1 && BEEP == 1) return "/STM32F407LED_OFF_BEEP_ON.shtml"; //
else return "/STM32F407LED_OFF_BEEP_OFF.shtml"; //
}
//BEEP的CGI控制句柄
const char *BEEP_CGI_Handler(int iIndex,int iNumParams,char *pcParam[],char *pcValue[])
{
uint8_t i=0;
iIndex = FindCGIParameter("BEEP",pcParam,iNumParams); //找到BEEP的索引號
if(iIndex != -1) //找到BEEP的索引號
{
BEEP=0; //
for(i = 0;i < iNumParams;i++)
{
if(strcmp(pcParam[i],"BEEP") == 0) //
{
if(strcmp(pcValue[i],"BEEPON") == 0) //
{
BEEP = 1;
rt_kprintf("BEEPONn");
}
else if(strcmp(pcValue[i],"BEEPOFF") == 0) //
{
BEEP = 0;
rt_kprintf("BEEPOFFn");
}
}
}
}
if(LED1 == 0 && BEEP == 0) return "/STM32F407LED_ON_BEEP_OFF.shtml"; //
else if(LED1 == 0 && BEEP == 1) return "/STM32F407LED_ON_BEEP_ON.shtml"; //
else if(LED1 == 1 && BEEP == 1) return "/STM32F407LED_OFF_BEEP_ON.shtml"; //
else return "/STM32F407LED_OFF_BEEP_OFF.shtml"; //
}
//SSI句柄初始化
void httpd_ssi_init(void)
{
//配置內(nèi)部溫度傳感器的SSI句柄
http_set_ssi_handler(SSIHandler,ppcTAGs,NUM_CONFIG_SSI_TAGS);
}
//CGI句柄初始化
void httpd_cgi_init(void)
{
//配置CGI句柄 LEDs control CGI) */
http_set_cgi_handlers(ppcURLs, NUM_CONFIG_CGI_URIS);
}

主函數(shù)中代碼如下:

extern void httpd_ssi_init(void);
extern void httpd_cgi_init(void);
extern void httpd_init(void);
httpd_cgi_init();
httpd_ssi_init();
httpd_init();

重新編譯,下載到開發(fā)板,在瀏覽器輸入開發(fā)板ip地址,查看效果。效果如圖2:

1.jpg

LWIP HTTP 協(xié)議中默認(rèn)只支持GET方法 但是一般提交表單時都用POST方法 而LWIPPOST方案需要自己實現(xiàn) 不過LWIP已經(jīng)需要實現(xiàn)的函數(shù)申明在httpd.h中了。

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

    關(guān)注

    0

    文章

    19

    瀏覽量

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

    關(guān)注

    31

    文章

    1273

    瀏覽量

    39933
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用RT-Thread Studio添加以太網(wǎng)驅(qū)動和lwIP協(xié)議?

    用戶快速開發(fā)自己的網(wǎng)絡(luò)應(yīng)用。 本文將基于正點原子 stm32f407-atk-explorer 開發(fā)板主要介紹如何使用 RT-Thread Studio 來添加以太網(wǎng)驅(qū)動和 lwIP 協(xié)議
    發(fā)表于 03-29 06:29

    如何去處理RT-Thread/LwIP TCP發(fā)送速度偏低的情況呢

    RT-Thread使用LwIP做為TCP/IP協(xié)議,LwIP包含了非常多的選項,不同的選項進(jìn)行不同功能的剪裁,部分選項
    發(fā)表于 08-10 11:48

    SC0085 AT32在RT-Thread上運行LwIP協(xié)議

    示例目的演示在RT-Thread上運行LwIP協(xié)議,并搭建一個UDP echo server支持型號列表:支持型號AT32F407xxAT32F437xx主要使用外設(shè)列表:主要使用外
    發(fā)表于 08-23 20:40

    基于RT-Thread實現(xiàn)的Agile Modbus協(xié)議

    基于 RT-Thread 實現(xiàn)的支持 Modbus 固件升級的 Bootloader:HPM6750_Boot  特性  支持 rtu 及 tcp 協(xié)議,使用純 C 開發(fā),不涉及任何硬件接口,可在任何形式的硬件上
    發(fā)表于 10-08 15:04

    RT-Thread移植使用webserver的流程

    ,stm32f4的資源包為0.2.2,rt-thread版本為4.0.3。以RT-Thread中Lan8720和lwip協(xié)議的使用文章創(chuàng)建
    發(fā)表于 02-22 15:10

    RT-Thread使用webserver的步驟

    sTM32F407,rt-thead studio版本版本:2.2.6 .3。以RT-Thread中Lan8720和lwip協(xié)議的使用文章
    發(fā)表于 02-24 14:47

    RT-Thread全球技術(shù)大會:在RT-Thread中使用幀來調(diào)試程序

    百問網(wǎng)科技CTO韋東山,在RT-Thread全球技術(shù)大會大會中,以在RT-Thread中使用幀來調(diào)試程序為主題進(jìn)行了介紹。
    的頭像 發(fā)表于 05-28 09:33 ?1805次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會:在<b class='flag-5'>RT-Thread</b>中使用<b class='flag-5'>棧</b>幀來調(diào)試程序

    RT-Thread Studio如何測試Ethernet連網(wǎng)

    RT-Thread 是一款開源實時操作系統(tǒng),包括 RT-Thread 內(nèi)核、FinSH 命令行工具、設(shè)備文件系統(tǒng)、TCP/IP 協(xié)議、RT-Thr
    的頭像 發(fā)表于 05-31 11:17 ?2778次閱讀
    <b class='flag-5'>RT-Thread</b> Studio如何測試Ethernet連網(wǎng)

    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 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移植使用webserver (lwip+httpd)

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2,rt-thread版本為4.0.3。
    的頭像 發(fā)表于 10-12 12:49 ?1278次閱讀
    <b class='flag-5'>RT-Thread</b>移植使用<b class='flag-5'>webserver</b> (<b class='flag-5'>lwip+httpd</b>)

    RT-Thread在Lan8720a和 lwip基礎(chǔ)上移植ntp流程

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2。以RT-Thread中Lan8720和lwip協(xié)議
    的頭像 發(fā)表于 10-12 16:59 ?1795次閱讀
    <b class='flag-5'>RT-Thread</b>在Lan8720a和 <b class='flag-5'>lwip</b>基礎(chǔ)上移植ntp流程

    RT-Thread中Lan8720和lwip協(xié)議的使用

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2,Agile Modbus軟件包版本為v1.1.2。新建選擇芯片工程。
    的頭像 發(fā)表于 10-13 10:19 ?1341次閱讀
    <b class='flag-5'>RT-Thread</b>中Lan8720和<b class='flag-5'>lwip</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>的使用

    RT-Thread中mymqtt軟件包的使用方法

    在上一篇文章 RT-Thread中Lan8720和lwip協(xié)議的使用的工程基礎(chǔ)上添加mymqtt軟件包。 使能mqtt example和mqtt test,保存,等待下載更新軟件包
    的頭像 發(fā)表于 10-13 10:44 ?930次閱讀
    <b class='flag-5'>RT-Thread</b>中mymqtt軟件包的使用方法

    RT-Thread USB協(xié)議-CherryUSB快速上手指南

    的是,CherryUSB已經(jīng)成為RT-Thread的USB標(biāo)準(zhǔn)對接協(xié)議實現(xiàn)。這意味著在RT-Thread系統(tǒng)中,開發(fā)者可以方便地使用CherryUSB來實現(xiàn)USB相關(guān)功能,為項
    的頭像 發(fā)表于 11-22 01:09 ?107次閱讀
    <b class='flag-5'>RT-Thread</b> USB<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>-CherryUSB快速上手指南