单片机实现 网页_可以实现stm32单片机和51单片机的串口联系吗 - CSDN
精华内容
参与话题
  • 基于单片机的Web服务器

    热门讨论 2020-07-29 14:18:56
    基于C8051F020单片机开发的C51代码,可实现设备自动搜索功能和Web网页服务器功能。
  • 为了适合需要,现在设备IP可能变化,以dev.fuhome.net域名所... DNS,通俗讲就是将域名比如:www.fuhome.net,转换成服务器的IP地址,单片机也能轻松实现哦,很简单 原理:任何可以发送UDP数据包的设备,采用任何
     
            为了适合需要,现在设备IP可能变化,以dev.fuhome.net域名所指向的IP为准。(其他域名以后仅作浏览网页使用,原IP暂时有效,有兴趣的可以根据本文内容做到再也不需要固定服务器IP了,很简单的哦,不信你看)
      
      DNS,通俗讲就是将域名比如:www.fuhome.net,转换成服务器的IP地址,单片机也能轻松实现哦,很简单


    原理:任何可以发送UDP数据包的设备,采用任何本地端口,向DNS服务器的53端口发送UDP DNS请求包即可收到返回


          DNS服务器的IP很多比如谷歌8.8.8.8,中国的114.114.114.114,成白上千,我们的手机,电脑,路由器会有一个DNS服务器IP设置向,默认是自动获取,那意味着变化。不过也可以用已知很出名的DNS服务器IP。
    本文我做了一个很取巧的方式,把路由器的网关IP作为DNS服务器IP,因为路由器会主动帮我们发到真正的DNS上面,收到信息也会转发给我们:
          下面是我请求的www.fuhome.net的例子(换行是为了让相应字节分开好讲解,收到的数据包是连续的)


    1、DNS请求
    12 34 01 00 00 01 00 00 00 00 00 00 
    03 77 77 77 06 66 75 68 6f 6d 65 03 6e 65 74 (就是这个意思:3  www 6 fuhome 3 net)
    00 00 01 00 01




    2、DNS接收
    12 34 81 80 00 01 00 01 00 00 00 00 
    03 77 77 77 06 66 75 68 6f 6d 65 03 6e 65 74 (就是这个意思:3  www 6 fuhome 3 net)
    00 00 01 00 01 
    c0 0c 00 01 00 01 00 00 01 2c 00 (C0 0C是一个标志,有用信息开始)
    04 73 1c 5d c9 (04长度 后面四个就是服务器IP,自己用调试工具发送试试,看看是不是很神奇,有的网站可能还有别的内容,最后一行一般是04 开头的IP)




    114.114.114.114作为DNS服务器
      


    路由器网关IP:192.168.1.1作为DNS服务器,注意每个人路由器也许设置不一样,那要具体看你路由器的IP了


      
    fu_dns.c,不同的硬件发送方式不用,原理是一样的


    /********************************************************************/
    /* 本程序仅供学习参考,未经作者允许,不得用于任何商业用途           */
    /* 技术论坛:www.fuhome.net/bbs/                                    */
    /* DNS相关                                                         */
    /* 本程序用于硬件设备接入fuhome.net 平台进行远程控制(手机APP/微信/WEB   */ 
    /* 版本:v2.0 2017年3月17日                                         */
    /* 龙剑奋斗                                                         */
    /* 定期更新,敬请关注——开放,交流,深入,进步                       */
    /* Copyright fuhome.net 未来之家 实验室,让科技融入生活             */
    /********************************************************************/


    U8 DNS_Data[32]={0x12 ,0x34,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
    0x03,0x77,0x77,0x77,0x06,0x66,0x75,0x68,0x6f,0x6d,0x65,0x03,0x6e,0x65,0x74,0x00,
    0x00,0x01,0x00,0x01};
    //获取 DNS: dev.fuhome.net


    U8 DNS_OK=0;
    U16        DNS_Time=0;
    U8 DNS_Server[4]={0,0,0,0};


    /*******************************************/
    /* 功能:1、发送查询包                             */
    /* 输入:无                                                               */
    /* 输出:无                                                                           */
    /* 备注:                                  */
    /*******************************************/


    void DNS_Send_Request(void)
    {


            memcpy(Tx_Buffer,DNS_Data,32);//将数据复制到缓冲区
            Write_SOCK_Data_Buffer(0, Tx_Buffer, 32);//端口0发送UDP数据包


    }
    展开全文
  • ESP8266实现网页交互

    千次阅读 2019-09-28 21:28:39
    前言: 物联网LOT(intermet of things)时代,万物互联,wifi芯片是非常重要的,乐鑫的高性价比的ESP8266芯片凭借低功耗低成本高集成度等优势在市场上占有较高的份额,为什么选用这款芯片可以参考之前的调研报告。...

     

    前言:

    物联网LOT(intermet of things)时代,万物互联,wifi芯片是非常重要的,乐鑫的高性价比的ESP8266芯片凭借低功耗低成本高集成度等优势在市场上占有较高的份额,为什么选用这款芯片可以参考之前的调研报告。在之前的资料整理中,涉及到了硬件设计及软件下载开发等多个方面,但是在软件SDK如何开发,程序如何下载等方面学的并不够细致,在一些场景下,需要我们基于官方提供的程序进行二次开发,但是打开程序后,一看,都是什么鬼,完全无法入手,资料那么多,我又该从哪开始看,希望经过本轮的学习,能够快速的对该芯片进行二次开发。

    接下来开始我们的学习吧。(整个学习框架可配合思维导图进行查看)

    程序开发使用乐鑫官方提供的NONOS-SDK进行开发,并且之前主要开发单片机,所以更习惯使用集成开发环境,接下来也使用安信可提供的IDE进行开发,不过你也可以使用乐鑫提供的liunx开发环境进行开发。

    一.环境搭建

    工具

    版本

    说明

    ESP8266 IDE

    V0.5

    集成开发环境,用于程序的开发及编译(安信可提供)

    Flash_download_tools

    V3.6.5

    程序下载工具(乐鑫)

    NONOS-SDK

    V3.0

    SDK开发包(乐鑫)

    ESP-12F.pdf

     

    模组原理图及说明

    ESP8266调试工具_V2.1

    V2.1

    调试工具(安信可)

     

    安信可资料获取:https://wiki.ai-thinker.com/esp8266

    乐鑫资料获取:https://www.espressif.com/zh-hans/support/download/other-tools

     

    无论使用乐鑫做的模组还是安信可制作的模组,原理是一样,可能也就是IO口分布不太一样,当我们购买了单模组可以直接通过简单搭建进行测试,也可以直接购买测试板,模组的以下几个引脚需要注意。

    一般的测试板都是通过在GPIO0加个按键来实现模式的切换,这里我们使用安信可的ESP-12F进行测试。

     

    接下来我们需要安装安信可IDE集成开发环境,软件从安信可官网可以下载,我使用的是的v0.5版本,那它怎么安装怎么使用呢???

    https://wiki.ai-thinker.com/esp8266 这个网页里都有。

    一步步看一下就行了。

     

    那我们如何对下载的SDK进行配置,导入及编译呢???

     

    二.SDK的下载及编译

    现在我们从乐鑫官网下载最新的无系统SDK,ESP8266_NONOS_SDK-3.0,进行解压

    我们会看到如下文件夹,为了更好的理解,简单说下各个文件夹的作用。

    driver_lib重命名为app(用户程序文件,命名随意),然后将examples下文件夹复制到app目录下,例:将lOT_Demo(任意实例)文件替换到app文件夹,为了简化结构,删除整个examples文件夹,ESP8266_NONOS_SDK/third_party/makefile 重命名为 makefile.bak ,以防止编译时报错,接下来,我们启动 ESP_IDE,将项目导入 Eclipse

    https://wiki.ai-thinker.com/ai_ide_use (详细步骤可查看这个网址)

    导入后就可以进行编译啦,编译前需要进行保存,否则编译的为未保存之前的文件。

    编译前clean project.我们可以看到已经编译出了可以下载的固件。通过这个实例我们可以将程序进行简单的修改,就能成为我们自己的工程。

    注:使用ESP8266_NONOS_SDK 2.x的版本是可以正常编译的,由于我使用的3.0版本,直接这个步骤会报错,所以根据3.0版本还需要做一些修改。

    打开工程sdk的顶层makefile,找到配置变量SPI_SIZE_MAP,修改为432Mbit flash

    以下为编译成功信息。

     

    三.将SDK整理成模板

    现在将sdk 3.0的程序整理一下之后作为模板进行使用。调整app文件夹文件如下

     

    其他文件均删除。User_main.c中剩余user_init,和user_pre_init。

    user_init:上层程序的入口函数,给用户提供一个初始化接口。

    user_pre_init:配置RF初始化,注册地址信息等。

    2.0版本与3.0部分函数有一点区别,2.0不再单独说明。

    Esp8266实际上就是一个单片机,在以往的单片机开发中,我们都知道会有main函数作为入口函数然后有死循环,同时还会有定时器等。

    例:

    int main(void)

    {

    初始化

    While(1)

    {

    主循环进行处理

    }

    }

    Void xxx_IRQ(void) //中断

    {

    中断处理

    }

    ESP8266 SDK编程基于“内核回调”的方式:(功能均在库中实现,对用户不透明)

    Void user_init(void)//内核为用户提供的初始化接口函数

    {

    //IO口,定时器,中断等的初始化

    }

    *****以下为sdk内部操作***

    {

    User_init();//用户应用初始化

    While(1)

    {

    //执行内核功能

    //执行用户功能 例:用户初始化了一个1s定时,那么这里将进行定时器计时

    }

    }

    回调函数:当满足条件是,内核会调用回调函数

    例:user_init中初始化1s定时。

    然后直接从void xxx_cb(void)回调函数中做相应的操作就可以了。那么esp8266有几种函数形式呢??分为四类:应用函数 回调函数 用户任务 中断函数

    应用函数说白了就是我们平时封装的函数,主要实现一些功能,被其他函数调用。

    回调函数就是初始化后,满足条件会被调用。用户任务,在系统空闲的时候,会调用任务函数,任务函数Non-os中,只支持3个用户任务,优先级2>1>0.中断函数就不解释了。详细的可以查看官方的sdk编程指南,里面有详细的解释。

    四.简单的程序编写

    模板现在有了,为了更快的使用SDK开发,接下来我们使用模板写一个简单的hello world

    串口打印程序吧。参考文档:2c-esp8266_non_os_sdk_api_reference_cn(api说明文档)

    1. 添加.h头文件
    2. User_init中调用api打印函数

    os_printf("SDK version:%s\n",system_get_sdk_version());//打印版本

    1. 由于8266默认串口0打印波特率为 74800,所以需要重配置一下,要想重配置就要调用串口驱动中的函数,接下来添加串口驱动。

    sdk->driver_libdirverinclude 中的文件添加到app下的对应文件夹下。

    1. 引用.h文件。
    2. 然后下载验证

    现象正常,此时第一个程序就验证完成了。

     

    其他的驱动操作步骤都是类似的就不一一去操作了。

    五.实现网页控制

    我们当前的目的是写一个网页,通过控制网页来实现led亮灭的控制。那么该如何实现呢,让我们进行下关键点的梳理。

     

    Esp8266相当于作为一个web服务器,当我连接wifi后通过外部设备输入相应的IP,esp8266进行解析,将存储在8266,falsh中的网页读取并显示出来,当我点击网页上的按钮后,8266进行解析,控制灯亮。网页与服务器之间使用Get/POST协议。

     

    首先,将ESP8266作为AP模式,创建局域网。使外部设备能够接入ESP8266,

    Esp8266建立TCP server,打开相应端口,接收客户端的访问数据,进行相应的应答。

    写一个html网页,将网页烧写入FLASH中的user_param区中。

    当客户端以指定的格式发送数据给服务器时,发送网页给客户端。

    1.8266设置AP模式,建立wifi热点

    1. 创建TCP_server,建立帧听
    2. 等待clientl连接server,等待接收数据
    3. 根据接收的数据,读取flash中的网页,返回给浏览器。
    4. 当按下网页上按钮后,进行灯的亮灭控制。
    5. Html的制作,下载到flash中相应位置。

    注:以手机浏览器为例,其访问的ip地址,过程是怎样的?

    我们把8266作为服务器端,手机浏览器作为客户端,一般都是使用get请求,除非指定post提交。请求后,8266肯定要以http协议数据来回复内容的

    1.知识扩展

    (1)网络结构:

    接下来我们说一下网络结构。

    学过网络的都知道

    OSI模型七层结构:应用层,表示层,会话层,运输层,网络层,数据链路层,物理层。

    TCP/IP 协议四层结构:应用层,传输层,网络层,网络接口层。

    常用的五层协议:应用层(TFTP,HTTP,FTP,DNS,Telnet),传输层(TCP,UDP),网络层(IP,ICMP(ping),RIP,OSPF,BGP,IGMP),数据链路层(SLIP,CSLIP,PPP,ARP,RARP,MTU),物理层。

     

    例:小A在小B处买了一本书,小B叫来了快递公司快递员小C,小C检查包装,并在包装上填写好物品名称,收获人,地址等信息,然后将包裹带回了快递公司给了物流处,物流处查看包装信息后是北京的包裹,就将包裹放在飞机上运往北京,北京快递员小D接收到后,检查包裹,查看地址,将包裹配送给小A。

     

    小A和小B处在最上层,相当于应用层,依赖快递员小C和小D的服务。小C和小D为传输层,负责对书检查,打包等工作,填入地址等信息。快递公司物流处属于网络层,根据客户信息决定将包裹发到哪里,飞机属于网络接口层,以自己的方式完成物流处递交来的包裹运输。

     

    1997年IEEE制定无线局域网的协议标准802.11,系列标准。使用星型拓扑,中心接入点叫做AP。使用802.11系列协议的局域网又称为wifi。

     

    (2)GET/POST

     

    GET和POST是什么?HTTP协议中的两种发送请求的方法。

    HTTP是什么?HTTP是基于TCP/IP的关于数据如何在网中如何通信的协议。

    HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。

    (3)html制作

    Esp8266设置AP模式,建立热点后,作为tcp_server等待client接入,此时使用手机连入网络,然后打开浏览器,输入192.168.4.1:8266 此时浏览器弹出界面。

    输入url使用get机制,操作网页内部按钮使用post机制。

    程序内部:

    URL的解析,及从flash读取的数据到网页的转化该怎么实现

    网页该怎么写??

    打开dreamweaver,新建html网页

    新建一个表单,设置为post方法,新建按钮用于提交表单。详细的可以自行学习网页制作相关知识。

    我们平时访问百度等,可以通过浏览器抓一下过程,esp8266也要模拟该过程进行网页的提交,我使用火狐自带的抓包工具(F12),一般IE自带的抓包工具也可以。

     

     

     

     

     

     

    六.固件下载:

    我们要将生成的固件烧写到我们的板卡中,那么怎么下载呢

     

     

     

    那么固件的烧写地址是怎么得到,FLASH地址是怎么分配的,详细可查看《安信可ESP8266入门教程》 《程序下载》

    (1)NON-FOTA(不支持云端升级)

     

     

     

    乐鑫不同版本的SDF可能会改变文件的烧写地址,以控制台输出地址为准。

    (2)FOTA(支持云端升级)

     

     

     

     

    实例一:

    将web_server工程生成的文件下载到8266中,地址使用编译器提示的地址。

    Html的地址放在0x64000地址。

    通过手机连接ESP8266_HA wifi,密码12345678

    使用浏览器输入192.168.4.1:8266

    点击开灯按键,板卡上灯亮。

    实例二.(支持微信一键配网,支持网页固件升级,支持网页参数配置)

    将plug2.0进行编译,生成固件

    输入192.168.40.117/upload,会弹出升级界面,进行网页的升级。

    然后输入192.168.40.117进入主界面。

    可控制灯,及网络相关参数配置。

     

     

    八.项目应用

    可将esp8266模块应用到大多数的板卡中,测试人员可通过连入网页实现对设备的升级,参数修改,降低维护成本。示意图如下所示:

    输入192.168.40.117(之后固定使用192.168.4.1)会弹出如下界面

     

    输入192.168.40.117/upload,弹出升级界面

     

    展开全文
  • 1:单片机实现基础的网络功能,Ping 的通,能够进行TCP的自收发。网络模块(W5300 和W5500) 2:w5500提供 的例程里面有:  (1)Network install  (2)DHCP 向主机获取动态IP (3)TCP Server  (4)TCP Client (5)UDP...

    前言:

    1:要实现单片机实现基础的网络功能,首先Ping 的通,能够进行TCP的自收发。此时才能继续上层开发的websever。
    此时分为两层,底层能够进行正确的数据交换。
    顶层需要做的是对报文的解析和编辑加工。

    本人参考的是网络模块(W5300 和W5500),以及其例程。

    2:首先我们了解一下w5500提供 的例程里面有:
            (1)Network install 
    (2)DHCP   向主机获取动态IP
    (3)TCP Server 
    (4)TCP Client
    (5)UDP 
            (6)DNS    暂时不知道怎么用
    (7)SMTP  简单的邮件传输协议
    (8)HTTP Server  
    (9)HTTP Client
    (10)Net Bios  局域网内可以使用个API,
    (11)NTP    同步网络时间的协议  
    (12)ping
    其中感觉有进一步研究价值的,SMTP可以实现向使用者发布信息,其实就是一个单片机发邮箱的过程。
    HTTPserver配置参数,程序更新。这个最好结合IAP做一个方便控制,易于升级的好程序还是挺好的。
    Http/Client 接受电脑端的控制。  之前做过XML控制的从机设备。        
    NetBios可以给设备起个别名,不必在输入IP.http://bbs.elecfans.com/jishu_470902_1_1.html
    NTP同步时间。这个没用过,但是设备间同步时间应该还是蛮重要的。

    3:websever通讯的过程。
    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

    (1)建立TCP连接

    在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80

    2)Web浏览器向Web服务器发送请求命令<request-line>

    一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令

    例如:GET/sample/hello.jsp HTTP/1.1

    (3)Web浏览器发送请求头信息<headers>

    浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行<blank line>来通知服务器,它已经结束了该头信息的发送

    (4)Web服务器应答

    客户机向服务器发出请求后,服务器会客户机回送应答,HTTP/1.1 200 OK,应答的第一部分是协议的版本号和应答状态码

    5)Web服务器发送应答头信息

    正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

    (6)Web服务器向浏览器发送数据

    Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

    (7)Web服务器关闭TCP连接

    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码Connection:keep-alive

    TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

       4: 如下是HTTP的请求格式:
    \r 代表回车,\n代表换行 




    举个实例:
    请求:
    POST /index.html HTTP/1.1
    HOST: www.XXX.com
    User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0
    
    Username=admin&password=admin
    响应:
    HTTP/1.1 200 OK
    Content-Encoding: gzip
    Content-Type: text/html;charset=utf-8
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Document</title>
    </head>
    <body>
        <p>this is http response</p>
    </body>
    </html>


    请求方法:

    (1)GET方法意思是获取URL指定的资源,这个请求方式是最简单的也是最常用的。使用GET 方法时,可以将请求参数和对应的值附加在 URI 后面,利用一个问号(“?”)将资源的URI和请求参数隔开,参数之间使用与符号(“&”)隔开,因此传递参数长度也受到了限制,而且与隐私相关的信息也直接暴露在URI中。比如/index.jsp?username=holmofy&password=123123

    (2)HEAD 方法与GET用法相同,但没有响应体,使用场合没有GET多。比如下载前使用HEAD发送请求,通过ContentLength响应字段,来了解网络资源的大小;或者通过LastModified响应字段来判断本地缓存资源是否要更新。 
    (3)PUT:用于向指定资源位置上传其最新内容(原来没有就上传,有就上传并覆盖原来的内容) 

    GET和POST是最常用的

    Request-URI
    URI 的最常见形式是统一资源定位符 (URL),它也被称为 Web地址。这种网址是我们经常见到的。
    http://example.org/absolute/path/resource.txt
    在请求的URI中还有一种相对路径的,对于这种请求来说在请求头信息中一般有Host值来指定服务器主机。比如:
    GET /Test.jsp HTTP/1.1
    ...
    Host:www.example.com
    ...

    Http响应码

    HTTP/1.0 200 OK

    这个状态码是200,表示请求成功。HTTP协议中状态码有三位数字组成,第一位数字定义了响应的类别,有以下五种:

    • 1XX:信息提示。表示请求已被服务器接受,但需要继续处理,范围为100~101。
    • 2XX:请求成功。服务器成功处理了请求。范围为200~206。
    • 3XX:客户端重定向。重定向状态码用于告诉客户端浏览器,它们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对新资源发起请求。范围为300~305。
    • 4XX:客户端信息错误。客户端可能发送了服务器无法处理的东西,比如请求的格式错误,或者请求了一个不存在的资源。范围为400~415。
    • 5XX:服务器出错。客户端发送了有效的请求,但是服务器自身出现错误,比如Web程序运行出错。范围是500~505。

    常见的状态码务必要熟悉:

    200:客户端请求成功。

    302:重定向。

    404:请求资源不存在。

    400:请求语法错误,服务器无法理解。

    403:服务器收到请求,但拒绝提供服务。

    500:服务器内部错误。

    503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。

    (1)如图键入地址时,要求输入登陆密码:


           实现过程:

    服务器:输入地址和端口发送到内容为

    GET / HTTP/1.1
    Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
    Accept-Language: zh-CN
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
    Accept-Encoding: gzip, deflate
    Host: 192.168.0.101:5000
    Connection: Keep-Alive
    此时回复报文为
    HTTP/1.1 401 Authorization Required
    Server: MySocket Server
    WWW-Authenticate: Basic realm=\"MXCHIP 3280\"
    Content-Type: text/html
    Content-Length: 169
    <HTML>
    <HEAD>
    <TITLE>Error</TITLE>
    <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=ISO-8859-1\">
    </HEAD>
    <BODY>
    <H1>401 Unauthorized.</H1>
    </BODY>
    </HTML>

    这个输入HTTP的基本认证。用于web浏览器或其他客户端在请求时提供用户名和密码的登录认证。

    输入:账户和密码后收到的报文
    GET / HTTP/1.1
    Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
    Accept-Language: zh-CN
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
    Accept-Encoding: gzip, deflate
    Host: 192.168.0.101:5000
    Connection: Keep-Alive
    Authorization: Basic YWRtaW46YWRtaW4=

    YWRtaW46YWRtaW4=  是admin  admin 经过 base64编码后 的数值。


    常见的报文:

    <!DOCTYPE html>
    <html>
    <title>LOGIN</title> 
    <body>
    <form method='get' action='Login.cgi'> 
    NAME:<input type='text' name='username'><br> 
    PASSWORD:<input type='password' name='password'><br> 
    <input type='submit' value='LODA'>
    </form>
    </body>
    </html>



    突然发现WIZ 官网上竟然有好多资料。下面是一个web的资料, Mark一下。
    http://wizwiki.net/wiki/doku.php?id=products:wiz550web:wiz550webgsg_en#basic_demo_web_pages



    这世间最难的事情莫过于把事情讲清楚吧!
    展开全文
  • STM32驱动W5100实现http的网页浏览

    热门讨论 2020-07-30 23:33:35
    CPU采用STM32F103单片机,用户可以非常方便地移植软件到ST的Cortex单片机上;单片机采用SPI总线和间接总线与W5100接口,用户可任选一种方式;
  • 单片机实现HTTP网页服务器功能(详细教程)

    万次阅读 多人点赞 2017-04-17 00:18:51
    1、能够用单片机驱动网络模块(如W5100、ENC28J60),实现最基本的socket连接和数据收发。如果你没有驱动代码,请在百度中搜索下载。 2、了解TCP/IP协议。如果不了解,请查看谢希仁《计算机网络(第五版)》或其他相关...
    在阅读本教程时,假设你已经

    1、能够用单片机驱动网络模块(如W5100、ENC28J60),实现最基本的socket连接和数据收发。如果你没有驱动代码,请在百度中搜索下载。
    2、了解TCP/IP协议。如果不了解,请查看谢希仁《计算机网络(第五版)》或其他相关书籍。
    3、会用html语言编写(简单或复杂)网页。如果不会编写,请点击->  http://www.w3school.com.cn 

    一、通过浏览器向单片机发送请求

    我们在浏览器地址栏输入地址并确定,实际上就是发送一个网页请求,现在,我们把单片机作为网页的服务器,那么如何接收并响应这个请求呢?

    首先,将网络模块的某个socket设置为sever模式,并将此socket的端口设置为80(HTTP默认端口)。如果不想把端口设置为80行不行呢?当然可以,但是需要注意:
    假设socket的地址为192.168.1.199,端口号80,在浏览器输入HTTP://192.168.1.199后,就可以直接向此socket发起连接,因为HTTP的默认端口会自动加到IP后面。
    若此socket的端口为30000,那么输入地址的时候,就需要手动输入端口号,即:HTTP://192.168.1.199:30000。如果懒得输端口号,那就直接将端口设置为80吧。

    二、浏览器请求解析

    下面进行下一个准备工作:将网络模块 socket接收到的数据通过串口转发出来,并用串口助手观察。

    在浏览器输入socket地址后,可以在串口助手上看到以下数据:(以下数据均为字符)


    //------------------------------------------------

    GET / HTTP/1.1
    Host: 192.168.1.199
    Connection: keep-alive
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8

    //------------------------------------------------


    这就是浏览器向服务器发送的请求数据(不同浏览器的数据稍有不同),关于这些数据的含义,请参看以下两篇文章:

    ->(文章1) http://www.cnblogs.com/loveyakamoz/archive/2011/07/22/2113614.html
    ->(文章2) http://canrry.iteye.com/blog/1331292

    在这里我们只关心第一行,这行数据表明,浏览器向单片机请求网页。这是浏览器第一次请求的命令,若需要请求其他网页,第一行可能会变成:
    GET /xxxx.HTML HTTP/1.1,这时,只要判断此处的信息,就可以知道该发送哪个网页给浏览器。

    三、单片机返回相应网页数据包

    假设收到浏览器第一次发送的请求“GET / HTTP/1.1”,此时浏览器和网络模块的socket已经建立连接,并等待数据返回。

    我们通过相应socket向浏览器返回一个登陆界面 Login.HTML的代码:(下文相同代码均用(网页代码1)等方式表示)


    (网页代码1)

    //------------------------------------------------

    <!DOCTYPE html>
    <html>
    <title>LOGIN</title> 
    <body>
    <form method='get' action='Login.cgi'> 
    用户名:<input type='text' name='username'><br> 
    密 码:<input type='password' name='password'><br> 
    <input type='submit' value='登 录'>
    </form>
    </body>
    </html>

    //------------------------------------------------


    因为单片机的储存空间有限,一般将网页以const的形式存放在flash中,而且尽量精简,除了必要的效果和兼容性语句外,

    其他都可以删掉(如对齐格式时使用的大量tab、空格等),以减轻单片机负担。
    但是为了编写网页方便,建议将网页源文件复制粘贴到别处,删除多余的内容后再烧写到单片机中。

    好了,接着上面的说,真的只发一个网页过去就行了吗?

    当然了,肯定不行。因为浏览器无法知道单片机要发送什么类型、多少长度的数据。所以,我们还需要一个返回数据的格式。


    //------------------------------------------------

    HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length: xx

    //------------------------------------------------


    文章1`2中也已经讲到了。所以,我们发送到浏览器的数据应该是这样的:


    //------------------------------------------------

    HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length:282

    (网页代码1)


    //------------------------------------------------

    
    
    


    注意,这些数据中,有些换行是不能省的(下文\r\n起强调作用,并不是接收到的字符):


    //------------------------------------------------

    HTTP/1.1 200 OK\r\n
    Content-Type: text/html\r\n
    Content-Length:xx\r\n
    \r\n
    (网页代码1)\r\n
    \r\n

    //------------------------------------------------


    否则浏览器无法识别数据。

    其中的Content-Length:282是网页文件的大小(字节),需要提前算好。
    这样,浏览器收到了第一个网页,显示效果如下。



    不管其他的,我们先登陆一下试试,输入用户名:hello,密码:world,点击登录。然后我们发现单片机收到了如下数据:


    //------------------------------------------------

    GET /Login.cgi?Username=hello&Password=world HTTP/1.1
    Host: 192.168.1.199
    Connection: Keep-Alive
    Accept: */*
    Accept-Language: zh-CN
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2; SE 2.X MetaSr 1.0)
    Referer: http://192.168.1.199/
    Accept-Encoding: gzip, deflate

    //------------------------------------------------


    好了,我们需要的数据应该全在第一行里面了,有用户名和密码,但是看一下浏览器的地址栏,用户名和密码同样以URL的形式出现了:


    //------------------------------------------------

    HTTP://192.168.1.199/Login.cgi?Username=hello&Password=world

    //------------------------------------------------


    逗我呢这是,密码全看见了,有没有更为安全的方式呢,当然是有。首先看一下下面一篇文章:
    ->(文章3) http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

    知道了get 和 post 的区别,我们将Login.html中 method='get' 改为 method='post'重新操作一次,结果,单片机收到的数据变成了这样:


    //------------------------------------------------

    POST /Login.cgi HTTP/1.1
    Host: 192.168.1.199
    Connection: Keep-Alive
    Content-Length: 29
    Pragma: no-cache
    Cache-Control: no-cache
    Accept: */*
    Accept-Language: zh-CN
    Content-Type: application/x-www-form-urlencoded
    Origin: http://192.168.1.199
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2; SE 2.X MetaSr 1.0)
    Referer: http://192.168.1.199/
    Accept-Encoding: gzip, deflate\r\n
    \r\n
    Username=hello&Password=world

    //------------------------------------------------


    用户名和密码跑到了最后,浏览器地址栏也没有显示用户名和密码了,甚好!
    以此方法,其他网页也可以发送到浏览器并返回单片机所需要的数据。

    四、通过JS让网页活起来

    现在让我们先做一个设置单片机串口的网页,并通过网页更新单片机串口设置。网页代码如下   

    (网页代码2)

    //------------------------------------------------

    <!DOCTYPE html>
    <html>
    <title>COM SETTING</title> 
    <body>
    <form method='post' action='IP_Set.cgi'>
    串口号:<input type='text' id='COM' name='COM_NUM'/><br>
    波特率:<input type='text' id='BDR' name='BD_RATE'/><br>
    <input type='submit' value='确定'/>
    </form>
    </body>
    </html>

    //------------------------------------------------


     先看一下效果:

    串口的设置是在变的,不能写死到网页里,该怎么动态显示呢?
    当然,这种时候少不了Javascript。在网页的最后追加几句话:

    (网页代码3)

    //------------------------------------------------

    <script>
    document.getElementById('COM').value='1';
    document.getElementById('BDR').value='9600';
    </script>

    //------------------------------------------------


    value里的值是通过单片机实时生成的,我们姑且这样写。发送一下试试先:


    //------------------------------------------------

    HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length:410

    (网页代码2)
    (网页代码3)


    //------------------------------------------------


    现在,显示效果是这样的:


    这样,我们完成了单片机内部参数在网页上显示的效果。

    得陇望蜀,人之常情,做完串口配置,又想把所有的单片机配置全部用网页完成,结果做出来一个比较大的网页。

    这个网页上需要显示很多的值,需要动态生成很多的JS语句,如果采用Content-Length这种固定长度的方式发送,该怎么计算网页长度呢?

    当然,可以一句一句用strlen计算加上去,再更改Content-Length的值。
    然而这种方式很麻烦,不好操作(因为网页是const类型),有时候网页的长度根本没办法预知,会导致网页发送失败,浏览器打不开网页。
    实际上,这种问题当然是可以完全解决的。


    五、灵活的网页传输方式


    我们在上网的时候,实际上大部分的网页是动态的,不能预知长度,那么这些网页是怎么正确传输到浏览器上的呢?
    如果你有TCP/IP的抓包软件,在抓到的数据包中,可能会看到这样一句:
    Transfer-Encoding: chunked
    这句话的意思是:不定长发送,即每个数据包中规定此包数据的大小,等待发送完成后,再发送一个结束符。
    这样浏览器就不必知道整个网页有多大,只要等结束符就行。

    具体操作方式是这样的:


    //------------------------------------------------

    HTTP/1.1 200 OK\r\n
    Content-Type: text/html\r\n
    Transfer-Encoding: chunked\r\n
    \r\n
    数据长度1(16进制)\r\n
    数据1\r\n
    数据长度2(16进制)\r\n
    数据2\r\n
    ......
    0\r\n
    \r\n(结束符:0表示数据长度为0,换行后没有数据内容,再换行)

    //------------------------------------------------


    结束符前可以有任意多个数据。注意Content-Length方式的长度值是十进制,这种方式的长度值是十六进制。

    那么再试一试上面的网页:


    //------------------------------------------------

    HTTP/1.1 200 OK\r\n
    Content-Type: text/html\r\n
    Transfer-Encoding: chunked\r\n
    \r\n
    12C\r\n
    (网页代码2)\r\n
    6C\r\n
    (网页代码3)\r\n
    ......
    0\r\n
    \r\n

    //------------------------------------------------


    显示效果和之前的方法一样,但是这种方式操作起来就很方便了。
    如果想向网页中添加数据,只要在结束符之前发送就OK。

    现在,最基本的功能都实现了,但是,网页看起来有点丑,还能再给力点吗?

    通过CSS格式,可以做出很多炫酷的网页特效,但是有些效果,还是不能代替图片。那么,看下一节:


    六、图片,让网页绚丽多彩。


    是的,少了图片的网页,看起来枯燥无味。那么,让我们尝试着发送一张图片到浏览器上去。


    首先,需要把图片存入单片机,在百度中搜索“任意文件转C语言数组”,用这个小工具,把图片先转换成十六进制数组。


    (剩下部分还在探索,文章中有一些小问题,需要验证后再做更改,待续...如有疑问或建议,请直接回复)
    (原创文章,转载请注明出处)


    展开全文
  • 网页控制430单片机

    千次阅读 2017-05-04 16:25:26
    本文用网页控制单片机的实例,实现了软件和硬件之间的沟通。 一、开发技术 硬件:430单片机; 软件:jsp,servlet。 二、开发思路 我们在430单片机上写上我们的程序,把单片机连接到串口上,能够通过串口...
  • 实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求 二,空间划分 一般bootloader位于单片机代码空间的起始地址,用户程序...
  • 0x00前言 一提到智能家庭,大家可能首先想到的是各种大佬级公司搞的牛逼产品,或者说是创新产品。想想就觉得很复杂,有的用工控机,有的用树莓派,还有的... 0x01单片机实现web服务器 探讨用单片机来实现web服务...
  • 0×00前言  一提到智能家庭,大家可能首先想到的是各种大佬级公司搞的牛逼产品,或者说是创新产品。想想就觉得很复杂,有的用工控机,有的用树莓派,还有的用arduino,不管用什么...0×01单片机实现web服务器  ...
  • 基于C8051F020和cp2200芯片实现的modbus协议和Web服务器功能,将这两种功能集成在一起,实现了硬件上的网络信息传输和浏览。
  • 利用 51 单片机实现 0.0 ~ 10 秒表

    千次阅读 2016-01-25 11:27:10
    有个题目,要求使用 51 单片机驱动两个数码显示器,以 0.1s 递增,从 0.0 增到 10s。设计一个按键,按下一次,启动,再按,暂停,再按一次,清零。循环不已。做而论道先写了一个 0.0 ~ 9.9s 的。后来百度...
  • 如何利用廉价的51单片机来控制网卡芯片进行数据传输,加载TCP/IP协议连接到互联网,实现网络通信成了众多设计者的目标。但由于指令及资源的限制,实施过程会有许多困难。我们在设计方案中舍弃了耗费资源的高级协议,...
  • 关于8051的bootloader实现方式 一, 基本硬件需求要实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求 二, 空间划分一般...
  • ## 单片机仿真——用mega16实现流水灯 今天不知怎的,网页版的csdn写不了博客,总是显示服务超时,那就在手机上写写吧。 单片机与嵌入式系统开课两周了,第一次仿真上线。因为还没有开学,无法在实验室进行实验,...
  • Java串口通信, Java与单片机, 串口通信, msp430单片机串口通信, 单片机通信, 单片机发数据, Java如何往串口发数据, severlet, JSP实现串口通信, 在网页里往串口发数据
  • 单片机和嵌入式设计的区别

    万次阅读 2017-01-11 18:44:18
    单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们自己的定义,接下来,就谈谈本人对这两个概念的理解和感悟。 首先明确概念,什么是单片机单片机是一种...
  • 演示视频:... 测试功能:1.控制6路开关 2.红外引脚的上升沿中断后在网页上显示提示。 ...浏览器网页厂家乐鑫云端远程路由器Nesp8266模块N==>开关N ...如果要更复杂的功能,也可以加单片机。 浏览器网
  • 鄙人最近在研究stm32单片机联网的解决问题。有些心得通过此来记录下来,也算是留点纪念。不说多废话了。1.单片机联网一般有这么些方案(选择芯片)。自带TCPIP协议的W5500芯片 以及纯PHY的ENC28J60,dm9000等芯片...
1 2 3 4 5 ... 20
收藏数 2,356
精华内容 942
关键字:

单片机实现 网页