306人参与 • 2024-08-03 • 网页播放器
在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就会收到收到数据,然后就可以开发你想要的功能了。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论