首页 > 编程问答 >我猜ESP8266陷入了无限的socket.accept()循环?

我猜ESP8266陷入了无限的socket.accept()循环?

时间:2024-07-21 00:18:42浏览次数:16  
标签:python sockets esp8266 micropython

我一直在使用 ESP8266,并遇到了一个似乎不知从何而来且无法解决的问题。至少 - 对我来说。

基本上我继续了 这个 构建一个简单的服务器套接字的教程。 然而我的 esp 突然停止允许与其自身的连接。代码正常工作,直到 main.py :

while True:
    conn, addr = s.accept()

第 23 行,并且只是停止工作或在 while 循环中继续前进。它只是卡在自己身上! 没有错误消息。至少 Thonny 不显示任何内容。

有趣的部分是 - 有时它确实接受连接。使用所有相同的代码和硬件,也许 100 次尝试之一。

我尝试在 stackoverflow 上查找类似的失败,@Techtician 也有相同的,我相信未解决的问题。 ( 链接到他的帖子


是对的,ESP8266/ESP32 的 MicroPython 中的 socket.accept() 可能会导致代码卡在无限循环中,并且在某些情况下难以调试。 以下是一些可能的解决方法,以及一些调试此类问题的技巧:

1. 处理非阻塞套接字:

问题可能源于 socket.accept() 的阻塞特性。 当没有传入连接时,代码会无限期地卡在 s.accept() 中。 要解决此问题,可以使用非阻塞套接字或使用 select 模块来管理多个连接。

  • 非阻塞套接字: 将套接字设置为非阻塞模式,以便 s.accept() 立即返回,即使没有可用的连接也是如此。 如果没有可用的连接,则返回 None
# 将套接字设置为非阻塞模式
s.setblocking(False)

while True:
    try:
        conn, addr = s.accept()
        # 如果接受连接,则处理连接
        # ...
    except OSError as e:
        # 处理没有可用连接的情况
        # 例如,执行其他任务或添加短暂延迟
        time.sleep(0.1)
  • 使用 select 模块: select 模块允许监视套接字是否有传入数据,并在数据准备好读取时通知。
import select

while True:
    # 监视套接字是否有传入连接
    readable, _, _ = select.select([s], [], [], 0.1)

    if s in readable:
        conn, addr = s.accept()
        # 处理连接
        # ...
    else:
        # 处理没有可用连接的情况
        # ...

2. 检查错误并实现超时:

  • 错误处理: 使用 try...except 块捕获 s.accept() 期间可能发生的任何异常。 这将帮助识别连接过程中可能出现的任何问题。

  • 超时: 实现超时机制,以便在指定时间内没有建立连接时,代码不会无限期地阻塞在 s.accept() 中。

import time

timeout = 5  # 设置超时时间(秒)
start_time = time.time()

while time.time() - start_time < timeout:
    try:
        conn, addr = s.accept()
        # 处理连接
        # ...
        break  # 成功连接,退出循环
    except OSError as e:
        # 处理错误(例如,超时)
        pass
else:
    print("连接超时")

3. 调试技巧:

  • 串行调试: 使用 print 语句或串行监视器在代码的不同点输出调试信息,尤其是 s.accept() 行之前和之后。 这将帮助了解代码的执行流程并识别潜在的阻塞点。

  • LED 指示灯: 使用连接到 ESP8266 的 LED 指示灯来指示代码执行的不同阶段。 例如,在调用 s.accept() 之前点亮一个 LED,在建立连接后点亮另一个 LED。

  • 代码审查: 仔细检查的代码,特别是套接字设置和连接处理部分,以确保正确设置了所有参数并处理了所有可能的条件。

4. 其他可能性:

  • 网络问题: 确保的 ESP8266 正确连接到 Wi-Fi 网络,并且客户端设备能够访问 ESP8266 的 IP 地址。

  • 电源问题: 如果 ESP8266 没有获得足够的电源,它可能会出现不可预测的行为,包括网络连接问题。 尝试使用其他电源或 USB 电缆。

  • 硬件问题: 在极少数情况下,ESP8266 本身可能存在硬件问题。 尝试使用其他 ESP8266 模块来查看问题是否仍然存在。

通过实施这些解决方案和调试技巧,应该能够识别并解决导致 ESP8266 卡在 socket.accept() 循环中的问题,并使的 Web 服务器可靠运行。

标签:python,sockets,esp8266,micropython
From: 78773202

相关文章

  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......
  • 让 cpython 优化恒定条件
    我正在用Python编写需要尽可能高效运行的代码,但有时我需要深入挖掘调试语句。不要注释这些输入或输出(或者使用外部预处理器来处理代码,就像这里建议的那样Python相当于#ifdefDEBUG或这里如何在python中实现“#ifdef”?|||)我想在模块的开头定义一个变量......
  • 如何使用 for 循环在 python jupyter 笔记本中创建动态图?
    我正在学习本课关于用Python求解热方程。该课程指出,在求解热方程后,我们可以通过在循环中简单地调用pyplot.plot()来可视化解的动画图,其中下面的代码将动态绘制每次每个点的温度,从而得到一个动画情节(课程帖子中提供了动画情节的示例)。importnumpyfrommatplotlibi......
  • Python:动态爱心代码
    importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE=11HEART_COLOR="#FF99CC"defcenter_......
  • 如何在 PYTHON 中查找输入数字的千位、百位、十位和个位中的数字?例如:256 有 6 个一、5
    num=int(input("Pleasegivemeanumber:"))print(num)thou=int((num//1000))print(thou)hun=int((num//100))print(hun)ten=int((num//10))print(ten)one=int((num//1))print(one)我尝试过这个,但它不起作用,我被困住了。代码几乎是正确的,但需......
  • ModuleNotFoundError:没有名为“pyaes”的模块 python 虚拟机
    在此处输入图像描述当我在启动python项目的虚拟机上构建某个工具时,几秒钟后会出现此消息。我已经尝试重新安装pyaes但无济于事。谁能帮我?非常感谢我已经尝试重新安装pyaes但无济于事,我搜索了tepyaes模块的十个路径,但我没有找到它,而我在另一台虚拟机上完成了......