首页 > 编程问答 >在 Windows 机器内使用 Fast API、React、Raspberry Pi 制作服务器应用程序

在 Windows 机器内使用 Fast API、React、Raspberry Pi 制作服务器应用程序

时间:2024-09-25 03:51:22浏览次数:11  
标签:python reactjs postgresql windows raspberry-pi

系统规格

  • 处理器 - i5 第 13 代
  • RAM - 16GB
  • SSD - Nvme 500GB
  • 操作系统 - Windows Home
  • Raspberry Pi - Pi4 8GB

我有一个托管的 Fast API 应用程序在 Windows 机器上,同一台机器上还有一个 React 应用程序。 React 应用程序使用 fastAPI 应用程序进行 CRUD 操作。该服务用于存储制造工厂中生产线的数据,记录每天不同班次的每条生产线的生产计数。

生产计数通过连接到机器的 Raspberry Pi 发送到每条生产线的服务器。通过 API 从 fastAPI 应用程序发送计数的行。现在 Raspberry Pi 也有一个屏幕,用于显示生产计数、目标计数余额等详细信息。

我在树莓派中编写了一个脚本,它打开 pywebview 窗口并在显示屏上显示 React 应用程序页面,下面是脚本。

import webview
import requests
import threading
import time
 
# Define the URL to load on success
success_url = 'http://172.17.17.110:3000/line/12'
 
# Define the path to the error HTML file
error_html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Connection Error</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f8f8f8;
            font-family: Arial, sans-serif;
        }
        .error-message {
            font-size: 48px;
            color: #ff0000;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="error-message">Connection Error</div>
</body>
</html>
"""
 
# Define the health check API URL
health_check_url = 'http://172.17.17.110:8000/healthz'
 
# Time interval (in seconds) between health checks
check_interval = 5

request_timeout = 5
 
def load_error_html(window):
    window.evaluate_js(f'document.documentElement.innerHTML = `{error_html_content}`')
 
def health_check(window):
    first_success = False
    while True:
        print("FIRST SUCCESS", first_success)
        try:
            response = requests.get(health_check_url, timeout=request_timeout)
            print("RESPONSE", response)
            if response.status_code == 200:
                if not first_success:
                    # Load the success URL in the webview window
                    window.load_url(success_url)
                    first_success = True
            else:
                if first_success:
                    # If the health check fails, load the error HTML
                    load_error_html(window)
                    first_success = False
        except requests.RequestException:
            print("REQUEST EXCEPTION")
            if first_success:
                load_error_html(window)
                first_success = False
        except requests.Timeout:
            print("TIMEOUT EXCEPTION")
            if first_success:
                # If there is an exception, load the error HTML
                load_error_html(window)
                fisrt_success = False
 
        # Wait for the specified interval before checking again
        time.sleep(check_interval) 
def create_window():
    # Create an initial window with the error HTML
    window = webview.create_window(title='IILMS',
                               html=error_html_content,
                               width=1920, height=1080, fullscreen=True,
                               resizable=False, text_select=False)

 
    # Start the health check in a background thread
    threading.Thread(target=health_check, args=(window,), daemon=True).start()
 
    # Start the webview
    webview.start()
 
if __name__ == '__main__':
    create_window()
 

该脚本在启动时自动运行。 Raspberry Pi 中还有一个在后台运行的脚本,它监听 GPIO 引脚以将数据发送到 fastAPI 应用程序。

fastAPI 和 React 应用程序在启动时分别使用 uvicorn main:app --host 0.0.0.0 --port 8000 npm start --host 0.0.0.0 运行。

当Windows 机器启动时会创建两个 cmd 窗口,在其中运行上述命令。整个系统包括 Raspberry Pi(数量 16)和服务器机器,通过本地有线连接进行连接,其中所有 Raspberry Pi 都与交换机连接,然后交换机与 Wi-Fi 路由器连接,服务器与路由器连接通过 LAN 电缆。

问题

问题是,如果 Raspberry Pi 一次有超过 7 个活动连接,上面提供的脚本会给出 HTML 页面的连接错误。

在有线连接之前Raspberry Pi 使用连接到主 Wi-Fi 路由器的 Wi-Fi 中继器 (2.4Ghz) 通过 Wi-Fi 连接,问题是即使将连接设置为自动,Raspberry Pi 也开始自动与中继器断开连接并且无法连接在尝试了所有方法之后,除了手机和笔记本电脑等其他设备能够连接到中继器之外。

然后我决定采用有线方法,但现在出现了上述问题。我不知道整体设置出了什么问题,我认为 Wi-Fi 路由器可能无法处理那么多请求,所以我直接将交换机插入服务器计算机,但仍然没有运气。


看起来在尝试使用 Raspberry Pi 扩展生产线数据收集系统时遇到了问题。具体来说,当有超过 7 个 Raspberry Pi 客户端连接到托管在 Windows 机器上的 FastAPI 服务器时,似乎遇到了连接问题。让我们将潜在问题分解,并找到解决这些问题的最佳方法。

分析问题

  • 瓶颈 :第一个要解决的问题是瓶颈的根源。这可能是:
    • FastAPI 服务器 :虽然 FastAPI 以其性能而闻名,但它可能无法正确处理并发连接。
    • 网络 :的有线网络基础设施(交换机、路由器、电缆)可能无法处理高数据流量,尤其是在大量 Raspberry Pi 同时发送数据时。
    • Windows 机器 :的 Windows 机器本身(CPU、内存或网络适配器)可能是瓶颈。
    • Raspberry Pi 客户端 :虽然不太可能,但如果脚本没有以最佳方式发送请求,则 Raspberry Pi 客户端本身可能会导致问题。
  • Wi-Fi 中继器问题 :之前遇到的 Wi-Fi 中继器问题表明存在与网络相关的挑战。虽然有线连接更可靠,但潜在的网络配置问题可能仍然存在。

故障排除步骤

  1. 隔离瓶颈

    • 负载测试 :使用 k6 Locust 等工具对 FastAPI 服务器进行负载测试。这将帮助了解服务器在不同并发连接下的执行情况。
    • 网络监控 :在 Windows 机器上使用 Performance Monitor Wireshark 等工具监控网络使用情况。检查是否有任何丢包或高延迟。
    • 资源使用情况 :在 Windows 机器上运行 FastAPI 服务器时,请监控 CPU、内存和磁盘使用情况。任务管理器可以为此提供见解。
  2. 优化 FastAPI

    • 异步 :确保的 FastAPI 应用程序利用异步功能来有效处理并发请求。
    • 工作程序 :调整 Uvicorn 工作程序的数量以匹配的硬件(CPU 内核)。可以通过在启动命令中添加 --workers 4 (其中 4 是工作程序的数量)来做到这一点。
    • 数据库连接 :如果使用数据库,请优化查询并考虑使用连接池。
  3. 增强网络

    • 有线连接 :如果可能,请确保所有设备(包括 Windows 机器和 Raspberry Pi)都通过有线连接连接到网络以获得最佳稳定性。
    • 网络设备 :验证的交换机和路由器是否能够处理所需的流量。升级它们可能是必要的。
  4. 审查 Raspberry Pi 脚本

    • 错误处理 :实现强大的错误处理以捕获并记录 Raspberry Pi 脚本中的任何连接问题。这将提供有关问题性质的更多信息。
    • 请求频率 :如果的 Raspberry Pi 经常发送数据,请考虑调整请求频率或实现批处理机制以减少网络开销。
  5. 其他注意事项

    • 防火墙 :确保 Windows 防火墙或任何其他安全软件都没有阻止来自 Raspberry Pi 的传入连接。
    • IP 地址 :在的网络设置中验证所有 Raspberry Pi 是否都具有静态 IP 地址或在 DHCP 服务器上为它们预留了地址。

代码改进

虽然提供的 Python 脚本似乎不是问题的主要根源,但这里有一些小的改进建议:

  • 错误处理 :考虑添加更具体的错误处理以区分不同的 requests.exceptions 类型(例如, ConnectionError Timeout )。
  • 用户体验 :可能希望改进错误页面上的用户体验,方法是在建立连接时提供更具信息量的消息或进度指示器。

通过系统地解决这些问题,应该能够确定连接问题的根本原因,并优化的生产线数据收集系统以实现可靠性。请记住仔细监控系统在进行任何更改时的行为,以隔离问题并衡量改进情况。

标签:python,reactjs,postgresql,windows,raspberry-pi
From: 79020096

相关文章

  • 如何在 Python 中获得类似 Cron 的调度程序?
    我正在寻找一个Python库,它将提供at和cron类似的功能。我很想有一个纯Python解决方案,而不是依赖于安装在盒子上的工具;这样我就可以在没有cron的机器上运行。对于那些不熟悉cron的人:您可以根据如下表达式来安排任务:02**7/usr/bin/run......
  • 我找不到一种方法让我的 python print 语句在几秒钟后自行删除
    我正在尝试制作一款基于文本的冒险游戏,我希望能够让文本自行删除。举个例子,游戏将使用print()语句打印文本,5秒后文本将被删除或对玩家隐藏。我试图找到其他人与此问题相关的问题,并且我找不到任何信息。我不知道该使用什么命令或与之相关的任何内容,请帮忙。Ivetriedtof......
  • 在 python 中可视化四元数
    我在无人机上安装了一个IMU,每0.1秒收集一次四元数数据(w,x,y,z)。现在我想将四元数数据与实际的无人机方向(视频数据)进行比较。所以我想创建某种盒子对象来显示基于四元数数据的方向。我实现了以下教程,将四元数转换为欧拉以进行可视化:https://www.youtube.com/watch?......
  • 有没有办法在 python 中获取特定的键盘输入
    我正在为学校开发一个项目,它目前有行输入(“按Enter继续”),它可以工作,但只要用户按Enter键程序继续,输入是什么并不重要,而且我我希望它仅在按下特定键时才起作用。我查了一下,曾经有一个键盘模块,但由于某种莫名其妙的原因它被删除了,那么还有其他方式获取输入吗?你绝对可以......
  • python+flask计算机毕业设计基于微信小程序的法律问题咨询系统设计与实现(程序+开题+论
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展和智能手机的普及,人们获取信息和解决问题的途径日益多样化。在法律服务领域,传统的线下咨询方式已难以满足公众日益增......
  • python+flask计算机毕业设计基于人脸识别的医疗保险系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着科技的飞速发展和人口老龄化的加剧,医疗保险系统面临着前所未有的挑战与机遇。传统医疗保险管理方式依赖于人工审核与纸质记录,不仅效率......
  • python+flask计算机毕业设计基于微信小程序的河南省美食分享平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在移动互联网时代,智能手机和社交媒体已成为人们日常生活不可或缺的一部分。微信小程序作为腾讯推出的一种轻量级应用形态,凭借其无需安装、......
  • python+flask计算机毕业设计基于微信小程序的网络文学管理平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的迅猛发展,网络文学已成为当代文化生活中不可或缺的一部分,它不仅丰富了人们的阅读体验,还促进了文学创作的多元化与普及化。然而......
  • 随时关闭与开启Windows更新功能
    亲测有效,随时可以开启、关闭Windows更新的方法Win10成功关闭时的状态:Win11成功关闭时的状态: 主要方法及原理是通过修改注册表使Windows更新相关的服务配置关闭和出错,从而导致Windows系统后台启动更新服务失败。具体步骤如下:一、运行regedit打开系统注册表,分别找到下面四......
  • Python不同方式正倒序遍历的时间开销
    fromtimeitimporttimeitli=[iforiinrange(1000000)]deffor_loop(n):#使用for直接遍历ret=0foriinli:ret=li[i]deffor_loop_enumerate(n):#使用enumerate进行遍历ret=0foridx,iinenumerate(li):re......