8.物联网LWIP,简要介绍http(超文本,URL),html(css,ajax),web实现打开灯

news2024/11/16 5:28:25

一。HTTP详解

1.超文本:(HyperText)

(1)超文本文件彼此链接,形成网状(web),内含有超链接(Link)与各种媒体元素标记(Markup)。

(2)超文本文件彼此链接使用URL表示。(下面解释URL)

(3)常见超文本格式是超文本标记语言HTML。(下面解释HTML,代码)

综上:学习超文本需要了解超链接,超文本标记语言

2.URL

(1)URL称为统一资源定位符Uniform Resource Locator,唯一标识万维网的某个文档。

(2)URL组成:协议+(主机+端口)+文件名

 3.HTTP

(1)工作原理

        在我看来就是建立TCP连接,客户机发送请求文档,服务器端发送响应文档。三次握手四次挥手。

(2)请求报文与响应报文(字段为ASCLL码, CRLF为回车)

 (3)请求方法

1.GET:请求读取一个Web页面

2.POST:附加一个命名资源(如Web页面)

3.DELETE:删除Web页面

4.CONNECT:用于代理服务器

5.HEAD:请求读取一个Web页面的首部

6.PUT:请求存储一个Web页面

7.TRACE:用于测试,要求服务器送回收到的请求

8.OPTION:查询特定选项

二。实验:初步使用Web超文本标记语音html

1.实验1:html

    复制下面代码到一个文件夹下,后缀改为 .html,双击打开。

<HTML>
    <HEAD>
        <TITLE>欢迎进入 HTML 世界</TITLE>
    </HEAD>
    <BODY>
        <P>这会是一种很有趣的体验</P>
    </BODY>
</HTML>

代码解答:

        1.大框架,<HTML> 内容 </HTML>

        2.头名称,<HEAD> 内容 </HEAD>

                <TITLE>欢迎进入 HTML 世界</TITLE>

                

        3.页面内容,<BODY> 内容 </BODY>

                <P>这会是一种很有趣的体验</P>

                 

                      

结果:

2.实验2:引入CSS 

(1)CSS作用:样式修改

(2)步骤:

创建一个文件夹,后缀名为 .html

<HTML>
	<HEAD>
		<TITLE>欢迎进入 HTML 世界</TITLE>
		<style type="text/css">
		p{ 
			font-size:200px;
			color:red;
		 } 
		</style>
	</HEAD>
	<BODY>
		<P>这会是一种很有趣的体验</P>
	</BODY>
</HTML>

代码解答:

        1.style样式:中间写对<BODY>中的样式处理

        2.样式中的p{}对应<BODY>中的<p>,即style中对<p></p>中数据进行样式处理

3.实验:引入javascript

(1)javascript介绍

1.javascript是互联网上最流行的脚本语言,可以用于HTML和web。

2.具体的功能包括:

  • 直接写入 HTML 输出流

  • 对事件的反应

  • 改变 HTML 内容

  • 改变 HTML 图像

  • 改变 HTML 样式

  • 验证输入

(2)步骤:

<HTML>
	<HEAD>
		<TITLE>欢迎进入 HTML 世界</TITLE>
		<script type = "text/javascript">
		var arr = new Array();
		arr[0] = "1.jpg";
		arr[1] = "2.jpg";
		arr[2] = "3.jpg";
		var i = 0;
		setInterval(changeImg,1000);
		function changeImg()
		{
			var obj = document.getElementById("obj");
			obj.src = arr[i++];
			if(i == 3){
				i = 0;
			}
		
		}
		</script>
	</HEAD>
	<BODY>
		<P>这会是一种很有趣的体验</P>
		<img id = "obj" src = "1.jpg"/>
	</BODY>
</HTML>

解释:

        1.<script type = "text/javascript"> 内容 </script>中是写HTML的动作

        2.setInterval(changeImg,1000);//使用函数,1秒运行一次
           function changeImg(){}//函数具体实现

        3.<img id = "obj" src = "1.jpg"/>命名图片的id,初始化一个属性为“src”,在javaScript中使用可以对其进行修改,这样就可以改变HTML的动作。

使用代码步骤

1.在桌面下创建

2.点击hello.html

会自己改变图片。

 三。实验三:ajax技术

1.ajax作用

        ajax主要是为了与服务器交换数据,更新部分页面内容。

2.ajax使用

(1)创建XMLHttpRequest

var xmlhttp;
if (window.XMLHttpRequest)
{
    //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
    xmlhttp=new XMLHttpRequest();
}
else
{
    // IE6, IE5 浏览器执行代码
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

(2)向服务器发送请求

<GET>

xmlhttp.open("GET","/try/ajax/demo_get.php",true);
xmlhttp.send();

<POST>

xmlhttp.open("POST","/try/ajax/demo_post2.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");

        上述GET与POST都是需要先open打开,其次send发送数据。

<异步true>

xmlhttp.onreadystatechange=function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
}
xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
xmlhttp.send();

        xmlhttp.onreadystatechange=function()相当于C语言的回调函数,所以使用异步true可以像C语言中断回调一样,不需要堵塞程序。

<同步false>

xmlhttp.open("GET","/try/ajax/ajax_info.txt",false);
xmlhttp.send();
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

        同步会堵塞程序,即没有连接成功会一直在等待连接,效率差。

3.html实现

(1)基础实现

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>web 点灯</title>
<script defer="defer">
        function ledSwitch(string) {
		document.getElementById("txtState").style.backgroundColor = string;
        }
    </script>
</head>

<body style="background-color:black">
<font size="12" color="yellow">
<b>
<div class="text" style=" text-align:center;"><big>Web 点灯</big></div>
</b>
</font>
<br> </br>     
<div align="center" id="txtState"style="margin:auto;width:160px;height:160px;border-radius:50%;background:white;"></div>
<br> </br>
<div style=" text-align:center;">
<input type="button" value="打开" style="width:160px;height:80px;background:green;" onclick="ledSwitch('red')" />
<input type="button" value="关闭" style="width:160px;height:80px;background:red;" onclick="ledSwitch('white')" />
</div>
</body>
</html>

1.使用方法        

        复制到 .html文件中,直接运行。

2.解释

        (1)<script></script>中写函数

        (2)onclick表示按键,按下后调用script中的函数。

3.详细解释

(2)交互功能实现

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>web 点灯</title>
<script defer="defer">
        function ledSwitch(string) {
            var xmlhttp;
            if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
            } else {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange = function () {
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                        document.getElementById("txtState").style.backgroundColor = xmlhttp.responseText;
						console.log(xmlhttp.responseText);
					}
                },
            xmlhttp.open("GET", string, true);
            xmlhttp.send(); 
        }
    </script>
</head>

<body style="background-color:black">
<font size="12" color="yellow">
<b>
<div class="text" style=" text-align:center;"><big>Web 点灯</big></div>
</b>
</font>
<br> </br>     
<div align="center" id="txtState"style="margin:auto;width:160px;height:160px;border-radius:50%;background:white;"></div>
<br> </br>
<div style=" text-align:center;">
<input type="button" value="打开" style="width:160px;height:80px;background:green;" onclick="ledSwitch('on')" />
<input type="button" value="关闭" style="width:160px;height:80px;background:red;" onclick="ledSwitch('off')" />
</div>
</body>
</html>

 代码解释:

        (1)复制到.html中

        (2)打开EasyWebServer,设置主目录为桌面,端口号80

        (3)在浏览器中输入127.0.0.1/hello.html

四。最终实验:web点亮stm32的led灯

1.cubemx创建工程

 (0)串口,时钟,Freertos都配置完成

  (1)配置灯led6,初始化为高电平(不亮)

 (2)LWIP配置

使能DNS

 使能muticast

 使能IGMP 

2.步骤:

(1)修改端口号为80wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(2)http_server.h

#ifndef _HTTP_SERVER_H
#define _HTTP_SERVER_H

void vHttpServerTask(void);

#endif

(3)http_server.c

#include "socket_tcp_server.h"
#include "socket_wrap.h"
#include "ctype.h"
#include "http_server.h"
#include "string.h"

static char ReadBuff[BUFF_SIZE];
char SendBuff[128];
char *HtmlPage = 
"<html>"
"<head>"
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />"
"<title>web 点灯</title>"
"<script defer=\"defer\">"
"        function ledSwitch(string) {"
"            var xmlhttp;"
"            if (window.XMLHttpRequest) {"
"                xmlhttp = new XMLHttpRequest();"
"            } else {"
"                xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");"
"            }"
"            xmlhttp.onreadystatechange = function () {"
"                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {"
"                        document.getElementById(\"txtState\").style.backgroundColor = xmlhttp.responseText;"
"						console.log(xmlhttp.responseText);"
"					}"
"                },"
"            xmlhttp.open(\"GET\", string, true);"
"            xmlhttp.send(); "
"        }"
"    </script>"
"</head>"
"<body style=\"background-color:black\">"
"<font size=\"12\" color=\"yellow\">"
"<b>"
"<div class=\"text\" style=\" text-align:center;\"><big>Web 点灯</big></div>"
"</b>"
"</font>"
"<br> </br>     "
"<div align=\"center\" id=\"txtState\"style=\"margin:auto;width:160px;height:160px;border-radius:50%;background:white;\"></div>"
"<br> </br>"
"<div style=\" text-align:center;\">"
"<input type=\"button\" value=\"打开\" style=\"width:160px;height:80px;background:green;\" onclick=\"ledSwitch(\'on\')\" />"
"<input type=\"button\" value=\"关闭\" style=\"width:160px;height:80px;background:red;\" onclick=\"ledSwitch(\'off\')\" />"
"</div>"
"</body>"
"</html>";

void HttpParResponse(int cfd, char *Buff)
{
	//是否为请求主页
	if(strstr(Buff, "GET / HTTP/1.1") != NULL){
		
		//响应头
		sprintf(SendBuff, "HTTP/1.1 200 OK\r\n");
		Write(cfd, SendBuff, strlen(SendBuff));
		//响应首部
		sprintf(SendBuff, "Content-Type: text/html\r\n");
		Write(cfd, SendBuff, strlen(SendBuff));
		sprintf(SendBuff, "Connection: Keep-Alive\r\n");
		Write(cfd, SendBuff, strlen(SendBuff));
		sprintf(SendBuff, "Content-Length: %d\r\n", strlen(HtmlPage));
		Write(cfd, SendBuff, strlen(SendBuff));
		sprintf(SendBuff, "\r\n");
		Write(cfd, SendBuff, strlen(SendBuff));
		//响应主题
		Write(cfd, HtmlPage, strlen(HtmlPage));
	
	//是否为 打开led
	}else if(strstr(Buff, "GET /on HTTP/1.1") != NULL){
		Write(cfd, "red", strlen("red"));
		HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, GPIO_PIN_RESET);
	//是否为 关闭led
	}else if(strstr(Buff, "GET /off HTTP/1.1") != NULL){
		Write(cfd, "white", strlen("white"));
		HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, GPIO_PIN_SET);
	//请求资源无效, 就是404
	}else{
		printf("GET Method Error\r\n");
		close(cfd);
	
	
	}
	



}


/**
  * @brief  http 服务器任务
  * @param  None
  * @retval None
  */
void vHttpServerTask(void){

	int 	 sfd, cfd, n;
	struct sockaddr_in server_addr, client_addr;
	socklen_t	client_addr_len;

	
	
	//创建socket
	sfd = Socket(AF_INET, SOCK_STREAM, 0);
	server_addr.sin_family 			= AF_INET;
	server_addr.sin_port   			= htons(SERVER_PORT);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	//绑定socket
	Bind(sfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
	//监听socket
	Listen(sfd, 5);
	//等待客户端连接
	client_addr_len = sizeof(client_addr);
again:
	cfd = Accept(sfd, (struct sockaddr *)&client_addr, &client_addr_len);
	printf("client is connect cfd = %d\r\n",cfd);
	while(1){
		//等待客户端发送数据
		n = Read(cfd, ReadBuff, BUFF_SIZE);
		if(n <= 0){
			goto again;
		}
		//解析响应http协议
		HttpParResponse(cfd, ReadBuff);
		//http响应后要关闭fd
		close(cfd);
		goto again;
	}
}

4.结果

stm32为服务器,所以输入stm32的IP地址192.168.1.10,stm32的灯会被按钮控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#添加WebApi,配置Swagger

1、创建一个WebAPI项目 下载、安装、引入【Swashbuckle.AspNetCore】包 右击【解决方案】&#xff0c;然后点击【管理Nuget包】&#xff0c;搜索【Swashbuckle.AspNetCore】包 2、配置Swagger中间件 在【Startup.cs】文件中的【ConfigureService】类中添加如下代码。 在【Sta…

Git管理

Git管理 ①对于项目目录中有.git的&#xff0c;可以在idea里面更改远程提交地址 Git->>Manage Remotes 中修改远程提交地址 ②对于没有.git目录的项目 在项目的根目录下进入cmd&#xff0c;使用下面的语句初始化.git目录 ##初始化 git init

笔记本电脑连接不上wifi怎么办?3种方法轻松搞定!

在现代社会中&#xff0c;无线网络已经成为人们日常生活和工作中必不可少的一部分。然而&#xff0c;有时候我们可能会遇到笔记本电脑无法连接到Wi-Fi网络的问题。这种情况可能会让人感到困扰&#xff0c;影响正常的工作和娱乐体验。那笔记本电脑连接不上wifi怎么办呢&#xff…

VB:判断一个数是否为质数

VB编程&#xff1a;判断一个数是否为质数 Private Sub Command1_Click() 点击事件 Dim N%, I%, K% 定义N,I,K为整型 N Val(InputBox("N?")) 输入信息 K Int(Sqr(N)) 对N取平方根&#xff0c;并转换为整型 For I 2 To K 定义循环If N Mod I 0 Then Exit For Nex…

jenkins 发布job切换不同的jdk版本/ maven版本

1. 技术要求 因为有个新的项目需要使用jdk17 而旧的项目需要jdk1.8 这就需要jenkins在发布项目的时候可以指定jdk版本 2. 解决 jenkins全局工具配置页面 配置新的jdk 路径 系统管理-> 全局工具配置 如上新增个jdk 名称叫 jdk-17 然后配置jdk-17的根路径即可&#xff08;这…

趣味微项目:玩转Python编程,轻松学习快乐成长!

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在学习Python编程的旅程…

Mysql读取binlog并分析 binlog

1&#xff0c;Mysql 开启 binlog 配置文件中增加 [mysqld] log-binmysql-bin 2.常用 binlog命令 # 是否启用binlog日志 show variables like log_bin;# 查看详细的日志配置信息 show global variables like %log%;# 查看binlog的目录 show global variables like "%l…

无涯教程-Flutter - Dart简介

Dart是一种开源通用编程语言&#xff0c;它最初是由Google开发的&#xff0c; Dart是一种具有C样式语法的面向对象的语言&#xff0c;它支持诸如接口&#xff0c;类之类的编程概念&#xff0c;与其他编程语言不同&#xff0c;Dart不支持数组&#xff0c; Dart集合可用于复制数据…

The remote endpoint was in state [TEXT_FULL_WRITING]

报这个错是因为在websocket接收与发送消息时&#xff0c;资源互抢造成的&#xff0c;有很多帖子说将session锁住&#xff0c; 但是同一个账号多个客户端登陆的时候&#xff0c;session是不同的&#xff0c;所以只能锁住一个session&#xff0c;还是出现这个问题。 解决办法&a…

FPGA GTX aurora 8b/10b编解码 PCIE 视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择ADV7611解码芯片配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据…

【Python】Web学习笔记_flask(7)——Jinja2模板(1)

Jinja2是基于python的模板引擎&#xff0c;功能类似于PHP的amarty、J2ee的Freemarker和velocity&#xff0c;完全支持Unicode&#xff0c;并具有集成的沙箱执行环境&#xff0c;Jinja2使用的事BSD协议&#xff0c;允许使用者修改和重新发布代码&#xff0c;也允许使用或在BSD代…

幂等问题解决方案

一、什么是幂等 数学中幂等就是多次运算结果一致&#xff0c;对应到实际工作的软件或者网络环境中就是同一个操作不管你操作多少次结果是一样的。 我们在编程过程中会看到一些幂等是天然存在的&#xff0c;比如&#xff1a; select查询操作delete删除操作其中的根据某个key值…

[BitSail] Connector开发详解系列四:Sink、Writer

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 Sink Connector BitSail Sink Connector交互流程介绍 Sink&#xff1a;数据写入组件的生命周期管理&#xff0c;主要负责和框架的交互&#xff0c;构架作业&#x…

Vue2项目练手——通用后台管理项目第四节

Vue2项目练手——通用后台管理项目 数据的请求mock数据模拟实战文件目录src/api/mock.jssrc/api/mockServeData/home.jsmain.js 首页组件布局可视化图表可视化图表布局Home.vue echarts表Home.vue 数据的请求 mock数据模拟实战 mock官方文档 前端用来模拟后端接口的工具&…

3分钟做出的大屏可视化报表,被领导疯狂点赞

3分钟&#xff0c;不仅做出了大屏可视化报表&#xff0c;还被领导疯狂点赞&#xff01;你没看错&#xff0c;这确实是可以实现的。奥威BI数据可视化工具提供大量可视化大屏报表模板&#xff0c;只需一键下载使用&#xff0c;替换数据源&#xff0c;再根据个性化需求进行调整修改…

Windows环境下的Tomcat服务器安装和配置教程,包括外网远程访问的设置方法

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

【算法与数据结构】617、LeetCode合并二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;采用递归的方式遍历二叉树&#xff0c;【算法与数据结构】144、94、145LeetCode二叉树的前中后遍历&am…

手机提词器怎么开启?这些方法不要错过

随着科技的发展&#xff0c;手机提词器成为了越来越多人写作的好帮手。在很多情况下比如直播、视频会议我们不方便一边看镜头一边看文稿&#xff0c;这种时候我们就需要使用提词器功能来规避麻烦了&#xff0c;如何开启手机提词器&#xff1f;有哪些需要注意的事项呢&#xff1…

常见变频器品牌-修改参数时的密码汇总

常见变频器品牌-修改参数时的密码汇总 1. 艾默生TD3000系列 密码:8888 2. 艾默生TD3300系列 密码:2002 3. 施耐德变频器 在SUP菜单下,找到COD选项进入,输入6969即可, 4. 台达变频器-B系列 密码:57522 5. 台达变频器-H系列 密码:33582 6. 台达S1系列 密码:57522