it编程 > 网页制作 > 网页播放器

ESP32进程开启http和webSocket服务

306人参与 2024-08-03 网页播放器

esp32进程开启http和websocket服务意义

在esp32上同时开启http(用来提供html页面),和websocket(用来接受数据,控制芯片引脚)

代码环境

esp32+micropython

实现代码

import usocket as socket
import network
import time
import ubinascii
import hashlib
import struct
import _thread
# 连接到wi-fi
ssid = 'your_ssid'
password = 'your_password'

station = network.wlan(network.sta_if)
station.active(true)
station.connect(ssid, password)

while not station.isconnected():
    time.sleep(1)

print('connection successful')
print(station.ifconfig())

# websocket服务器
def websocket_server():
    addr = socket.getaddrinfo('0.0.0.0', 8080)[0][-1]
    s = socket.socket()
    s.bind(addr)
    s.listen(1)

    print('websocket server listening on', addr)

    # websocket握手过程
    def websocket_handshake(client):
        request = client.recv(1024).decode()
        headers = request.split('\r\n')
        websocket_key = ""
        for header in headers:
            if 'sec-websocket-key' in header:
                websocket_key = header.split(': ')[1]
                break
        websocket_accept = ubinascii.b2a_base64(hashlib.sha1(websocket_key.encode() + b'258eafa5-e914-47da-95ca-c5ab0dc85b11').digest()).decode().strip()
        response = 'http/1.1 101 switching protocols\r\n'
        response += 'upgrade: websocket\r\n'
        response += 'connection: upgrade\r\n'
        response += f'sec-websocket-accept: {websocket_accept}\r\n\r\n'
        client.send(response.encode())

    # 解码websocket掩码消息
    def websocket_decode(message):
        length = message[1] & 127
        if length == 126:
            mask = message[4:8]
            data = message[8:]
        elif length == 127:
            mask = message[10:14]
            data = message[14:]
        else:
            mask = message[2:6]
            data = message[6:]
        decoded = bytearray([data[i] ^ mask[i % 4] for i in range(len(data))])
        return decoded

    # 处理websocket消息
    def websocket_handler(client):
        while true:
            try:
                message = client.recv(1024)
                if not message:
                    break
                decoded_message = websocket_decode(message)
                print('received message:', decoded_message.decode('utf-8'))
                # 在此处添加处理接收到的消息的逻辑
            except exception as e:
                print('websocket error:', e)
                break

    while true:
        client, addr = s.accept()
        print('websocket client connected from', addr)
        websocket_handshake(client)
        websocket_handler(client)
        client.close()
        print('websocket client disconnected')

# http服务器
def http_server():
    html = """<!doctype html>
    <html>
    <head>
        <title>esp32 http server</title>
    </head>
    <body>
        <h1>welcome to esp32 http server</h1>
        <button onclick="sendmessage()">send message</button>

        <script>
            let socket;

            function connect() {
                socket = new websocket('ws://10.102.2.205:8080');

                socket.onopen = function() {
                    console.log('websocket is connected.');
                };

                socket.onmessage = function(event) {
                    console.log('received message: ' + event.data);
                };

                socket.onclose = function() {
                    console.log('websocket is closed.');
                };

                socket.onerror = function(error) {
                    console.log('websocket error: ' + error);
                };
            }

            function sendmessage() {
                if (socket && socket.readystate === websocket.open) {
                    socket.send('hello esp32!');
                } else {
                    console.log('websocket is not open.');
                }
            }

            window.onload = connect;
        </script>
    </body>
    </html>
    """

    addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
    s = socket.socket()
    s.bind(addr)
    s.listen(1)

    print('http server listening on', addr)

    while true:
        client, addr = s.accept()
        print('http client connected from', addr)
        request = client.recv(1024)
        request = str(request)
        print('content = %s' % request)

        response = html
        client.send('http/1.1 200 ok\n')
        client.send('content-type: text/html\n')
        client.send('connection: close\n\n')
        client.sendall(response)
        client.close()

# 启动websocket服务器和http服务器


_thread.start_new_thread(websocket_server, ())
_thread.start_new_thread(http_server, ())

使用方法

esp32与要访问网页的设备在连接同一个wifi下,在浏览器中输入ip(运行起来代码后thonny会打印出来ip),点击网页的按钮esp32就会收到收到数据,然后就可以开发你想要的功能了。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

「图文教程」Windows系统Microsoft Edge浏览器设置搜索框搜索引擎为百度

08-03

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

08-03

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索_es全文检索word文件

08-03

高效抓取网页模板:Go 1.19站点模板爬虫实战指南

08-03

智慧电商SAAS平台、门店管理、仓储管理、订单管理、店铺运营、采购管理、数据分析、交易分析、留存分析、用户运营、围栏管理、自提点管理、商城运营、流量分析、用户权限、销量分析、佣金明细、Axure原型

08-03

Selenium安装WebDriver:ChromeDriver谷歌浏览器驱动下载安装与使用最新版116/117/118/119/120/121/122/123

08-03

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论