我根据 Taoxuan-168的代码改了一下,是通过AP模式发送视频流,但是程序报错,手机连接热点后浏览器无法打开网址,请大佬帮忙看一下,谢谢。
import time, os, sys,network,socket
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
AP_SSID = 'LushanPi-AP' # 热点名称
AP_KEY = '123456781' # 至少8位密码
# 显示模式选择:可以是 "VIRT"、"LCD" 或 "HDMI"
DISPLAY_MODE = "VIRT"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
def ap_test():
# 初始化AP模式
ap = network.WLAN(network.AP_IF)
# 激活AP模式
if not ap.active():
ap.active(True)
print("AP模式激活状态:", ap.active())
# 配置热点参数
ap.config(ssid=AP_SSID,key=AP_KEY)
print("\n热点已创建:")
print(f"SSID: {AP_SSID}")
print(f"Channel: {AP_KEY}")
# 等待热点启动(暂定3秒)
time.sleep(3)
# 获取并打印IP信息
ip_info = ap.ifconfig()
print("\nAP网络配置:")
print(f"IP地址: {ip_info[0]}")
print(f"子网掩码: {ip_info[1]}")
print(f"网关: {ip_info[2]}")
print(f"DNS服务器: {ip_info[3]}")
# 启动Web服务器
addr = (ip_info[0], 80)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM,0)
s.bind(addr)
s.listen(5)
print('Web服务器已启动,访问 IP:', ip_info[0])
# 设置超时时间为 50 秒
s.settimeout(50)
try:
# 接受连接
client, addr = s.accept()
print(f"连接来自: {addr}")
client.send("HTTP/1.1 200 OK\r\n"
"Server: Yang\r\n"
"Content-Type: multipart/x-mixed-replace;boundary=Yang\r\n"
"Cache-Control: no-cache\r\n"
"Pragma: no-cache\r\n\r\n".encode())
except socket.timeout:
print("等待客户端连接超时")
finally:
s.close()
while True:
try:
while True:
# 捕获图像
img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 显示捕获的图像,中心对齐,居中显示
Display.show_image(img)
# 转为 JPEG 格式,默认 quality=50~90 可调
imge = img.to_jpeg()
header = "--Yang\r\n" \
"Content-Type: image/jpeg\r\n" \
f"Content-Length: {len(imge)}\r\n\r\n"
client.send(header.encode())
client.send(imge)
except KeyboardInterrupt as e:
print("user stop: ", e)
except BaseException as e:
print(f"Exception {e}")
finally:
# sensor stop run
if isinstance(sensor, Sensor):
sensor.stop()
# deinit display
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
# release media buffer
MediaManager.deinit()
if __name__ == "__main__":
# 构造一个具有默认配置的摄像头对象
sensor = Sensor(id=sensor_id)
# 重置摄像头sensor
sensor.reset()
# 无需进行镜像翻转
# 设置水平镜像
# sensor.set_hmirror(False)
# 设置垂直翻转
# sensor.set_vflip(False)
# 设置通道0的输出尺寸为显示分辨率
sensor.set_framesize(width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, chn=CAM_CHN_ID_0)
# 设置通道0的输出像素格式为RGB565
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
# 初始化媒体管理器
MediaManager.init()
# 启动传感器
sensor.run()
ap_test() # 运行AP热点模式