首页 > 编程知识 正文

esp8266websocket,qpython

时间:2023-05-06 21:23:48 阅读:46705 作者:2665

文章目录目的WebServer基础说明WebServer演示的基础实施演示在第三方WebServer库的介绍中进行了总结,该库通过浏览器控制设备

目的

WebServer是一项非常常用的功能,在设备上使用此功能后,用户可以直接从浏览器访问和操作设备,而无需依赖app。 另外,即使使用APP,对APP开发来说直接访问webapi也比使用tcp/udp更方便。 本文简要介绍了如何使用基于TCP的套接字编程实现web服务器功能。

WebServer的基本说明WebServer主要用于响应来自客户端的基于HTTP协议的请求。 例如,当用户在浏览器中输入网址进行访问时,请求标头将发送到该地址。 请求标头的示例如下:

get/http/1.1 host : www.Baidu.com connection :关闭用户-代理: Mozilla/5.0 (windows nt 6.1; WOW64; rv:6.0 ) gecko/2010 01 01 Firefox/6.0 accept-encoding : gzip,deflate,sdchAccept-Language: zh-CN,zh; q=0.8上方的字符串是请求标头(注意最后一个空行),该请求访问百度主页,百度服务器在收到该请求后返回响应标头和请求内容。

上面的请求标头实际上是字符串,字符串包含特定的内容和格式。 这在HTTP协议中有规定。 该字符串以TCP方式传输,因此可以通过TCP方式的套接字编程实现web服务器功能。

以下是web服务器使用演示基础实现演示的演示TCP方式的套接字编程中实现web服务器功能的简单演示。

importnetworkimportusocketassocket #参考socket模块#响应标头response headers=b ' ' http/1.1200 ok content-type : text/html connect ' ' AP=network.WLAN (network.AP _ if ) AP.config ) essid='lala ',authmode=4, password=' 12345678 ' (AP.active (true )无线热点def main ) : s=socket.socket ) s.setsockopt ) socket.sol_ 80 ) (0) (-1 ) )绑定地址s.listen(5)监听(最大连接数5 ) print ) )访问热点后,可以通过浏览器访问以下地址: () ((print ) AP.ifconfig ) ) ) ) ) print )在此情况下,client _ addr=s.acceppr,同时拦截来自浏览器的请求和相应的处理client_sock 收到来自客户端的请求和客户端地址print (客户端地址3360 ),然后单击client _ addr (while true : h=client _ sock.readline ) # end=' ' ) ifh=n': #读空行时,完整的请求标头break client _ sock.write # (response headers )响应客户端

在上面的示例中,可以打开TCP侦听,从浏览器访问它以接收来自浏览器的请求。 代码逐行读取请求内容,读取到空行后,以请求完整为由,向浏览器发送了响应标头和网络内容。

虽然上面的示例没有检查请求的内容,但是要实际使用,必须分析请求的内容并根据请求的内容进行响应。 例如,控制浏览器请求IO端口以驱动LED指示灯等功能。

从浏览器控制设备web服务器的最实用功能是从浏览器获取或控制电路状态。 下面的例子简单说明。

importnetworkfrommachineimportpinimportusocketassocket #引用socket模块AP=network.WLAN(network.AP_if ) AP.config ()

13, Pin.OUT, value=0) # 初始化LED管脚,低电平点亮def main(): s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # (重要)设置端口释放后立即就可以被再次使用 s.bind(socket.getaddrinfo("0.0.0.0", 80)[0][-1]) # 绑定地址 s.listen(5) # 开启监听(最大连接数5) print('接入热点后可从浏览器访问下面地址:') print(ap.ifconfig()[0]) print('') while True: # mian()函数中进行死循环,在这里保持监听浏览器请求与对应处理 client_sock, client_addr = s.accept() # 接收来自客户端的请求与客户端地址 q = '' while True: h = client_sock.readline() # 按行读取来自客户端的请求内容 q += h.decode('utf8') if h == b'' or h == b'rn': # 当读取到空行的时候表示接收到一个完整的请求头 break if q.startswith('GET / HTTP/1.1'): # 从浏览器访问 / client_sock.write('led is on' if(not led.value()) else 'led is off') # 向客户端发送内容 elif q.startswith('GET /on HTTP/1.1'): # 从浏览器访问 /on led.off() # 低电平点亮led client_sock.write('led turn on') # 向客户端发送内容 elif q.startswith('GET /off HTTP/1.1'): # 从浏览器访问 /off led.on() # 高电平关闭led client_sock.write('led turn off') # 向客户端发送内容 else: client_sock.write('not found') # 向客户端发送内容 client_sock.close()main() # 运行main()函数


上面例子中通过浏览器访问不同链接,WebServer检索请求头内容分别给出不同应答。

更多内容可以参考我别的博文:
《从零开始的ESP8266探索(06)-使用Server功能搭建Web Server》

第三方WebServer库介绍

实际使用中如果用上面的方式处理,如果遇到大型的项目就显得麻烦了,这时候可以尝试使用人家写好的WebServer库,这里介绍一些:

MicroWebSrv
这个库注意用于MicroPython,总共就三个文件,分别提供了WebServer基本功能、WebSocket、模板支持。

MicroWebSrv is a micro HTTP Web server that supports WebSockets, html/python language templating and routing handlers, for MicroPython (principally used on ESP32 and Pycom modules. Now supports all variants of Pyboard D-series from the makers of Micropython)

项目地址:https://github.com/jczic/MicroWebSrv

MicroWebSrv2
这个库功能更加全面,性能上也更好,不过库的大小和内存占用也更加高了,基本上不带外部SPI RAM的ESP32模块都别想好好跑。这个库不仅持MicroPython,还支持标准的CPython。

MicroWebSrv2 is the new powerful embedded Web Server for MicroPython and CPython that supports route handlers, modules like WebSockets or PyhtmlTemplate and a lot of simultaneous requests (in thousands!).


Fully asynchronous, its connections and memory management are very optimized and truly fast.


Mostly used on Pycom WiPy, ESP32, STM32 on Pyboard, … Robust and efficient!

项目地址:https://github.com/jczic/MicroWebSrv2

总结

WebServer是一个常用的功能,MicroPython上想要用也不麻烦,更多内容除了可以参考上面第三方的库,也可以参考官方的例程。MicroPython官方的WebServer例程可以在下面链接中找到:
https://github.com/micropython/micropython/tree/master/examples/network

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。