国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

RT-Thread 軟件包-軟件包分類-IoT-WebTerminal①

這篇具有很好參考價值的文章主要介紹了RT-Thread 軟件包-軟件包分類-IoT-WebTerminal①。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

RT-Thread 軟件包-軟件包分類-IoT-WebTerminal①

RT-Thread 軟件包-軟件包分類-IoT-WebTerminal①,Linux,Python,ARM?MCU,linux,stm32,java,arm開發(fā),運維,物聯(lián)網

Web Terminal 讓你的終端在瀏覽器上跑起來

1、Web Terminal 是什么

Web Terminal 是一款針對 RT-Thread RTOS 的庫。啟動后,可以通過網頁訪問設備的控制臺(命令行)系統(tǒng),實現(xiàn)設備的 遠程/移動化 操控。

2、依賴信息

  • RT-Thread 組件
    • LWIP
    • LWIP/app/tftp
    • Finsh/MSH
    • DFS
  • RT-Thread 包
    • Mongoose

3、如何使用

3.1 初始化

在 mongoose 初始化完成后,執(zhí)行 web_terminal_init()

3.2 啟動

在 Web Terminal 初始化成功后,執(zhí)行 web_terminal_start()

PS:初始化、啟動及停止功能都已經集成到了 RT-Thread 的 Finsh/MSH 命令中,也可以手動命令啟動,命令格式如下:

web_term <init|start|stop>
3.3 傳送資源文件

在根目錄下新建并進入 web_root 文件夾

msh />mkdir web_root
msh />cd web_root

啟動 TFTP 服務器

msh /web_root>tftp_server

安裝并打開 /tools/Tftpd64-4.60-setup.exe 這款 TFTP 工具,然后選擇 Tftp Client 功能,如下圖。(PS:如果電腦上有多個網卡,務必記得網卡也要選擇)

tftp_client

然后選擇庫源碼中 web_root 下的 web_finsh.html 進行上傳。(PS:如果固件開啟了 DFS_USING_WORKDIR ,所以當前 Finsh/MSH 在哪個文件目錄位置, TFTP 就會把文件保存在那里。TFTP 時請注意切換目錄)

3.4 使用 Web Finsh

如果啟用了 DFS_USING_WORKDIR ,要保證 Finsh/MSH 控制臺當前的目錄位于根目錄。然后在瀏覽器中打開 http://put.ip.here/web_finsh.html 即可看到 Web Finsh 真容。

打開網頁后的效果如下,現(xiàn)在即可暢快地在網頁中輸入各種命令,自動補全也支持的。(PS:手機上也一樣可以打開 Web Finsh,現(xiàn)在 Finsh/MSH 已被你隨時隨地的掌控了)

web_finsh

最后,需要注意,當 Web Finsh 網頁打開后, 串口的 Finsh/MSH 就不可使用了。如果想要繼續(xù)使用,則關閉 Web Finsh 網頁即可。

示例代碼

…\ src/wn_utils.c文章來源地址http://www.zghlxwxcb.cn/news/detail-832092.html

/*
 * File      : wn_utils.c
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
 *
 * This software is dual-licensed: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation. For the terms of this
 * license, see <http://www.gnu.org/licenses/>.
 *
 * You are free to use this software under the terms of the GNU General
 * Public License, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * Alternatively for commercial application, you can contact us
 * by email <business@rt-thread.com> for commercial license.
 *
 * Change Logs:
 * Date           Author       Notes
 * 2011-08-02     Bernard      the first version
 */

#include <ctype.h>
#include <rtthread.h>

#include <webnet.h>
#include <wn_utils.h>

rt_inline int tohex(char c)
{
    if (c >= '0' && c <= '9')
        return c - '0';
    if (c >= 'a' && c <= 'f')
        return c - 'a' + 10;
    if (c >= 'A' && c <= 'F')
        return c - 'A' + 10;
    return -1;
}

int str_path_with(const char *s, const char *t)
{
    if ((strncasecmp(s, t, strlen(t)) == 0
            && (strlen(s) == strlen(t) || *(s + strlen(t)) == '/'))
        ||(strlen(t) == 1 && t[0] == '/')) return 1;

    return 0;
}

int str_begin_with(const char *s, const char *t)
{
    if (strncasecmp(s, t, strlen(t)) == 0) return 1;

    return 0;
}

int str_end_with(const char* s, const char* t)
{
    const char* se;
    register int s_len, t_len;

    s_len = strlen(s);
    t_len = strlen(t);

    if (s_len < t_len) return 0;

    se = s + s_len - t_len;
    if (strncasecmp(se, t, t_len) == 0) return 1;

    return 0;
}

char *str_decode_path(char *path)
{
    int x1;
    int x2;
    char *src = path;
    char *dst = path;
    char last = *path;

    if (last != '/')
        return RT_NULL;

    while (*++src)
    {
        if (*src == '%' &&
                (x1 = tohex(*(src + 1))) >= 0 &&
                (x2 = tohex(*(src + 2))) >= 0)
        {
            src += 2;
            if ((*src = x1 * 16 + x2) == 0) break;
        }

        if (*src == '\\') *src = '/';
        if ((last != '.' && last != '/') || (*src != '.' && *src != '/'))
            *dst++ = last = *src;
    }

    *dst = 0;

    return path;
}

static const unsigned char base64_table[65] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char *str_base64_encode(const char* src)
{
    unsigned char *out, *pos;
    const unsigned char *end, *in;
    size_t olen;
    int len;

    len = strlen(src);
    olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */
    olen += olen / 72; /* line feeds */
    olen++; /* nul termination */

    out = (unsigned char*)wn_malloc(olen);
    if (out == RT_NULL) return RT_NULL;

    end = (const unsigned char*)src + len;
    in = (const unsigned char*)src;
    pos = out;
    while (end - in >= 3)
    {
        *pos++ = base64_table[in[0] >> 2];
        *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
        *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
        *pos++ = base64_table[in[2] & 0x3f];
        in += 3;
    }

    if (end - in)
    {
        *pos++ = base64_table[in[0] >> 2];

        if (end - in == 1)
        {
            *pos++ = base64_table[(in[0] & 0x03) << 4];
            *pos++ = '=';
        }
        else
        {
            *pos++ = base64_table[((in[0] & 0x03) << 4) |
                                  (in[1] >> 4)];
            *pos++ = base64_table[(in[1] & 0x0f) << 2];
        }
        *pos++ = '=';
    }

    *pos = '\0';
    return (char*)out;
}

char* str_normalize_path(char* fullpath)
{
    char *dst0, *dst, *src;

    src = fullpath;
    dst = fullpath;

    dst0 = dst;
    while (1)
    {
        char c = *src;

        if (c == '.')
        {
            if (!src[1]) src ++; /* '.' and ends */
            else if (src[1] == '/')
            {
                /* './' case */
                src += 2;

                while ((*src == '/') && (*src != '\0')) src ++;
                continue;
            }
            else if (src[1] == '.')
            {
                if (!src[2])
                {
                    /* '..' and ends case */
                    src += 2;
                    goto up_one;
                }
                else if (src[2] == '/')
                {
                    /* '../' case */
                    src += 3;

                    while ((*src == '/') && (*src != '\0')) src ++;
                    goto up_one;
                }
            }
        }

        /* copy up the next '/' and erase all '/' */
        while ((c = *src++) != '\0' && c != '/') *dst ++ = c;

        if (c == '/')
        {
            *dst ++ = '/';
            while (c == '/') c = *src++;

            src --;
        }
        else if (!c) break;

        continue;

up_one:
        dst --;
        if (dst < dst0) return RT_NULL;
        while (dst0 < dst && dst[-1] != '/') dst --;
    }

    *dst = '\0';

    /* remove '/' in the end of path if exist */
    dst --;
    if ((dst != fullpath) && (*dst == '/')) *dst = '\0';

    return fullpath;
}

char * urlencode(const char *str, int len, int *new_length)
{
    const char hexchars[] = "0123456789ABCDEF";

    const char *from, *end;
    const char *start;

    char *to;
    int c;

    from = str;
    end = str + len;
    start = to = (char *) wn_malloc(3 * len + 1);
    if(start == RT_NULL)
    {
        return RT_NULL;
    }

    while (from < end)
    {
        c = *from++;

        if ( (c < '0' && c != '-' && c != '.')
                 || (c == ' ')
                 || (c < 'A' && c > '9')
                 || (c > 'Z' && c < 'a' && c != '_')
                 || (c > 'z') )
        {
            to[0] = '%';
            to[1] = hexchars[c >> 4];
            to[2] = hexchars[c & 15];
            to += 3;
        }
        else
        {
            *to++ = c;
        }
    }

    *to = 0;
    if (new_length)
    {
        *new_length = to - start;
    }

    return (char *) start;
}

int urldecode(char *str, int len)
{
    char *dest = str;
    char *data = str;

    int value;
    int c;

    while (len--)
    {
        if (*data == '+')
        {
            *dest = ' ';
        }
        else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
                 && isxdigit((int) *(data + 2)))
        {
            c = ((unsigned char *)(data+1))[0];
            if (isupper(c))
                c = tolower(c);
            value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;

            c = ((unsigned char *)(data+1))[1];
            if (isupper(c))
                c = tolower(c);
            value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;

            *dest = (char)value ;
            data += 2;
            len -= 2;
        }
        else
        {
            *dest = *data;
        }
        data++;
        dest++;
    }
    *dest = '\0';

    return dest - str;
}
#ifdef _WIN32
int  strncasecmp ( const char* s1, const char* s2, size_t len )
{
    register unsigned int  x2;
    register unsigned int  x1;
    register const char*   end = s1 + len;

    while (1)
    {
        if ((s1 >= end) )
            return 0;

        x2 = *s2 - 'A'; if ((x2 < 26u)) x2 += 32;
        x1 = *s1 - 'A'; if ((x1 < 26u)) x1 += 32;
        s1++; s2++;

        if ((x2 != x1))
            break;

        if ((x1 == (unsigned int)-'A'))
            break;
    }

    return x1 - x2;
}
#endif


維護人:

  • 華為奮斗者精神, 郵箱:1992152446@qq.com

到了這里,關于RT-Thread 軟件包-軟件包分類-IoT-WebTerminal①的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • RT-Thread 軟件包-物聯(lián)網-網絡工具集NetUtils使用指南①

    RT-Thread 軟件包-物聯(lián)網-網絡工具集NetUtils使用指南①

    本文介紹 RT-Thread NetUtils 的使用方法,幫助開發(fā)者更好地使用 RT-Thread NetUtils 組件來解決網絡開發(fā)過程中遇到的問題。 簡介 在進行網絡相關的產品開發(fā)和調試時,一些好用的小工具往往能取到事半功倍的效果。 RT-Thread NetUtils 組件基于此應用場景,開發(fā)和封裝了一系列簡潔好

    2024年02月20日
    瀏覽(25)
  • RT-Thread 軟件包-PikaScript用戶手冊-STM32模塊API文檔①

    RT-Thread 軟件包-PikaScript用戶手冊-STM32模塊API文檔①

    RT-Thread軟件包中的PikaScript用戶手冊針對STM32模塊提供了API文檔。STM32模塊是一個為基于STM32微控制器的RT-Thread系統(tǒng)提供支持的功能模塊,它提供了對STM32硬件資源的訪問和控制。 在PikaScript用戶手冊中,針對STM32模塊的API文檔主要包括以下幾個部分: GPIO控制:STM32模塊提供了一

    2024年02月02日
    瀏覽(34)
  • RT-Thread 1. GD32移植RT-Thread Nano

    RT-Thread 1. GD32移植RT-Thread Nano

    1. RT-Thread Nano?下載 RT-Thread Nano 是一個極簡版的硬實時內核,它是由 C 語言開發(fā),采用面向對象的編程思維,具有良好的代碼風格,是一款可裁剪的、搶占式實時多任務的 RTOS。其內存資源占用極小,功能包括任務處理、軟件定時器、信號量、郵箱和實時調度等相對完整的實

    2024年02月05日
    瀏覽(28)
  • RT-Thread 9. VS2012下仿真RT-Thread 和LVGL

    RT-Thread 9. VS2012下仿真RT-Thread 和LVGL

    1. 在ENV中添加組件 2. 下載組件 3. 生成代碼 4. 打開代碼 雙擊project.vcxproj 編譯 5. 運行

    2024年02月06日
    瀏覽(24)
  • RT-Thread 7. RT-Thread Studio ENV修改MCU型號

    RT-Thread 7. RT-Thread Studio ENV修改MCU型號

    1. 修改MCU型號 2.在ENV界面輸入 3. dist下為更新后完整源代碼 4.導入RT-Thread Studio 發(fā)現(xiàn)GD32F330已經生效了。 5. 自己編寫startup_gd32f3x0.S,準確性待驗證

    2024年02月06日
    瀏覽(27)
  • 【STM32&RT-Thread零基礎入門】 2. 新建RT-Thread項目

    【STM32&RT-Thread零基礎入門】 2. 新建RT-Thread項目

    硬件:STM32F103ZET6、ST-LINK、usb轉串口工具 RT-Thread的全稱是Real Time Thread,顧名思義,它是一個嵌入式實時多線程操作系統(tǒng)。相較于 Linux 操作系統(tǒng),RT-Thread 體積小,成本低,功耗低、啟動快速,除此之外 RT-Thread 還具有實時性高、占用資源小等特點,非常適用于各種資源受限(

    2024年02月13日
    瀏覽(24)
  • 使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread項目

    使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread項目

    STM32CubeMX下載 RT-Thread Studio下載 安裝好RT-Thread Studio后,先打開RT-Thread SDK管理器確認有沒有自己MCU需要的SDK包,直接安裝好之后里面是有STM32F1系列的SDK包,其他的需要自己安裝。 之后點擊文件→新建→RT-Thread項目,根據自己需要配置好后點擊完成就會生成RT-Thread項目。 新建項

    2024年02月11日
    瀏覽(20)
  • 【STM32&RT-Thread零基礎入門】8. 基于 CubeMX 移植 RT-Thread Nano

    【STM32&RT-Thread零基礎入門】8. 基于 CubeMX 移植 RT-Thread Nano

    硬件:STM32F103ZET6、ST-LINK、usb轉串口工具、4個LED燈、1個蜂鳴器、4個1k電阻、2個按鍵、面包板、杜邦線 利用RT_Thread操作系統(tǒng)實現(xiàn)三種不同的LED等閃爍 提示:以下是本篇文章正文內容,下面案例可供參考 cubemx配置參考教程: 基于 CubeMX 移植 RT-Thread Nano 后面程序所需的引腳 RT

    2024年02月09日
    瀏覽(30)
  • 【RT-Thread】使用RT-Thread Studio 配置BootLoader及App實現(xiàn)OTA功能

    【RT-Thread】使用RT-Thread Studio 配置BootLoader及App實現(xiàn)OTA功能

    由于項目需要實現(xiàn)OTA功能學習了一下具體實現(xiàn)方法,以備后期查看,有問題的地方隨時指正修改 1.什么是OTA OTA是“over-the-air”的縮寫,是一種無線技術,用于在不需要接觸設備的情況下向移動設備或物聯(lián)網設備提供更新、補丁或新版本的軟件。OTA更新通常通過無線網絡(如

    2024年02月09日
    瀏覽(25)
  • NUCLEO-F411RE RT-Thread 體驗 (1) - GCC環(huán)境 RT-Thread 的移植

    NUCLEO-F411RE RT-Thread 體驗 (1) - GCC環(huán)境 RT-Thread 的移植

    a、用stm32cubemx新建一個工程。 時鐘配置 st-link提供8M的mco輸出,所以配置hse 8m,sysclk最高100M,設置如下: 配置LED 連接pa5,設置pa5為輸出模式。 配置串口 st-link可以做虛擬串口用,這樣可以省下一個usb轉串口的模塊。st-link連接f411的PA2 PA3,也就是uasrt2。 配置SWD 生成Makefile工程

    2024年02月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包