配合本專欄前端文章對應的后端文章——從模擬到展示:一步步搭建傳感器數據交互系統

對應文章:進一步完善前端框架搭建及vue-konva依賴的使用(Vscode)-CSDN博客

目錄

一、后端開發

1.模擬傳感器數據

2.前端頁面呈現數據+后端互通

2.1更新模擬傳感器數據程序(多次請求)

2.2🧩 功能目標

2.3🧱 系統結構簡述

2.4? 實現步驟(附代碼)

2.4.1步驟1:Django 視圖中添加獲取模擬傳感器數據的接口

2.4.2步驟2:配置 Django URL 路由

2.4.3步驟3:前端 Vue3 使用 Axios 獲取數據

2.4.4完善2.4.3


一、后端開發

功能模塊子功能描述技術建議
🧪 模擬傳感器程序數據模擬模擬溫度、濕度、火情等傳感器數據Python 腳本 / Node.js
網絡發送將數據定時打包并發送至本機某個端口(TCP/UDP)Socket 編程
配置可調支持調整模擬頻率、數值范圍等JSON 配置或命令行參數
🌐 后端服務端口監聽后端監聽指定端口,接收來自模擬程序的數據Spring Boot / Node.js / django
數據解析將接收到的字符串(如 JSON)解析為結構化數據JSON解析器
數據推送使用 WebSocket 將實時數據推送給前端Spring Boot WebSocket / Socket.IO
REST 查詢接口提供歷史數據查詢接口(可選)RESTful API
日志與錯誤處理數據記錄、連接失敗、格式異常處理日志組件如 Logback

1.模擬傳感器數據

由于硬件還未到位所以手動模擬傳感器數據:

  1. 在原本的工程中創建腳本文件夾:scripts

    然后再創建🧪 模擬傳感器程序:

    # sensor_simulator.py
    import socket
    import json
    import random
    import time
    ?
    # 模擬數據生成函數
    def generate_sensor_data():return {"temperature": round(random.uniform(20, 40), 2),  # 攝氏度"humidity": round(random.uniform(30, 90), 2), ? ? # 百分比"light": random.randint(100, 1000), ? ? ? ? ? ? ? # lux"pressure": random.randint(80, 120), ? ? ? ? ? ?  # kPa}
    ?
    # 啟動 TCP 服務器
    def start_sensor_server(host='127.0.0.1', port=9000):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(1)print(f"傳感器模擬器已啟動,監聽 {host}:{port}")
    ?client_socket, addr = server_socket.accept()print(f"客戶端已連接:{addr}")
    ?try:while True:data = generate_sensor_data()json_data = json.dumps(data)client_socket.sendall((json_data + '\n').encode('utf-8'))print(f"發送數據: {json_data}")time.sleep(2)  # 每2秒發送一次數據except (ConnectionResetError, BrokenPipeError):print("客戶端斷開連接")finally:client_socket.close()server_socket.close()
    ?
    if __name__ == '__main__':start_sensor_server()
    ?

    同時呢,可以寫一個模擬前端的測試程序,看模擬傳感器數據程序是否正常運行:

    # test_client.py
    import socket
    ?
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.connect(('127.0.0.1', 9000))while True:data = s.recv(1024)print("接收到數據:", data.decode('utf-8'))

    然后,我們就在Vscode中創建兩個終端分別運行這兩個腳本文件:

    PS E:\py_project\Security_System\Security_System_workplace\Security_System_project\scripts> python .\sensor_simulator_v2.py
    ?
    PS E:\py_project\Security_System\Security_System_workplace\Security_System_project\scripts> python .\test_client.py

    如圖所示:

2.前端頁面呈現數據+后端互通

2.1更新模擬傳感器數據程序(多次請求)

# sensor_simulator.py
import socket
import json
import random
import time
?
# 生成模擬傳感器數據
def generate_sensor_data():return {"temperature": round(random.uniform(20, 40), 2),  # 攝氏度"humidity": round(random.uniform(30, 90), 2), ? ? # 百分比"light": random.randint(100, 1000), ? ? ? ? ? ? ? # lux"pressure": random.randint(80, 120), ? ? ? ? ? ?  # kPa"timestamp": time.strftime('%Y-%m-%d %H:%M:%S')}
?
def start_sensor_server(host='127.0.0.1', port=9000):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen()print(f"傳感器模擬器已啟動,監聽 {host}:{port}")
?try:while True:# 等待客戶端連接client_socket, addr = server_socket.accept()print(f"新連接:{addr}")
?# 生成并發送一次數據data = generate_sensor_data()json_data = json.dumps(data)client_socket.sendall(json_data.encode('utf-8'))client_socket.close()  # 關閉當前連接except KeyboardInterrupt:print("模擬器已停止")finally:server_socket.close()
?
if __name__ == '__main__':start_sensor_server()
?

2.2🧩 功能目標

通過 Django 后端連接本地 socket 模擬器程序,將接收到的數據通過接口返回給 Vue 前端頁面進行展示。

2.3🧱 系統結構簡述

Vue3 (前端頁面)? Axios 請求
Django 后端接口? socket 通信
傳感器模擬器(本地監聽端口)

2.4? 實現步驟(附代碼)

2.4.1步驟1:Django 視圖中添加獲取模擬傳感器數據的接口
def get_sensor_data(request):try:# 創建 socket 客戶端連接本地監聽端口with socket.create_connection(("127.0.0.1", 9000), timeout=5) as client:# 接收數據(1024字節)received_data = client.recv(1024).decode('utf-8')parsed_data = json.loads(received_data)  # ? 轉為 dictreturn JsonResponse({"status": "success", "data": parsed_data})except Exception as e:return JsonResponse({"status": "error", "message": str(e)})
2.4.2步驟2:配置 Django URL 路由
path('api/sensor-data/', views.get_sensor_data, name='get_sensor_data')
2.4.3步驟3:前端 Vue3 使用 Axios 獲取數據
<template><div class="sensor-view"><h2>實時傳感器數據</h2>
?<div v-if="error" class="error">{{ error }}</div>
?<div v-else-if="!sensorData || Object.keys(sensorData).length === 0" class="loading">加載中...</div>
?<div v-else class="sensor-data"><p><strong>溫度:</strong>{{ sensorData.temperature }} ℃</p><p><strong>濕度:</strong>{{ sensorData.humidity }} %</p><p><strong>光照強度:</strong>{{ sensorData.light }}</p><p><strong>氣壓:</strong>{{ sensorData.pressure }}</p><p><strong>時間戳:</strong>{{ sensorData.timestamp }}</p></div>
?<button @click="fetchData">刷新</button></div>
</template>
?
<script setup>
import { ref, onMounted } from 'vue'
import { getSensorData } from '@/api/sensor_data'
?
const sensorData = ref(null)
const error = ref(null)
?
const fetchData = async () => {try {const res = await getSensorData()console.log('傳感器數據:', res.data)if (res.data.status === 'success') {sensorData.value = res.data.dataerror.value = null} else {error.value = res.data.message || '數據異常'}} catch (err) {error.value = '請求失敗:' + err.messageconsole.error(err)}
}
?
onMounted(() => {fetchData()setInterval(fetchData, 2000)
})
</script>
?
<style scoped>
.sensor-view {max-width: 400px;margin: auto;padding: 20px;font-family: Arial, sans-serif;
}
?
.sensor-data p {margin: 6px 0;
}
?
.error {color: red;
}
?
.loading {color: gray;
}
?
button {margin-top: 12px;padding: 6px 12px;
}
</style>
?
2.4.4完善2.4.3

想要讓2.4.3中的組件在瀏覽器中能夠正常顯示,應該再做以下幾個操作:

  1. Vue 前端通過 Axios 請求 Django 后端 API 接口。比如:

    axios.get('http://127.0.0.1:8000/api/sensor-data/')

    這樣前端才能訪問后端接口

  2. 因為前后端分別運行在不同端口,所以需要進行跨域配置:

    前端:

    1. 首先:需要配置axios

      操作步驟:

      1. 在src目錄下創建api文件夾放置有關后端的接口函數:

      2. 創建axios.js文件:

        import axios from 'axios'
        ?
        const instance = axios.create({baseURL: 'http://127.0.0.1:8000/api', // Django 后端地址timeout: 5000,
        })
        ?
        export default instance
        ?
      3. 就在全局中進行注冊axios:main.js文件中

        // 全局掛載 axios 到 $axios
        app.config.globalProperties.$axios = axios
      4. 為了和后端接口對應上:path('api/sensor-data/', views.get_sensor_data, name='get_sensor_data'),

        所以需要創建sensor_data.js文件中的接口函數:

        // 獲取模擬傳感器數據
        export const getSensorData = () => {return request.get('sensor-data/')  // 實際訪問的是 http://127.0.0.1:8000/api/sensor-data/
        }
      5. 接下來寫我們的傳感器數據組件即可:

        <template><div class="sensor-view"><h2>實時傳感器數據</h2>
        ?<div v-if="error" class="error">{{ error }}</div>
        ?<div v-else-if="!sensorData || Object.keys(sensorData).length === 0" class="loading">加載中...</div>
        ?<div v-else class="sensor-data"><p><strong>溫度:</strong>{{ sensorData.temperature }} ℃</p><p><strong>濕度:</strong>{{ sensorData.humidity }} %</p><p><strong>光照強度:</strong>{{ sensorData.light }}</p><p><strong>氣壓:</strong>{{ sensorData.pressure }}</p><p><strong>時間戳:</strong>{{ sensorData.timestamp }}</p></div>
        ?<button @click="fetchData">刷新</button></div>
        </template>
        ?
        <script setup>
        import { ref, onMounted } from 'vue'
        import { getSensorData } from '@/api/sensor_data'
        ?
        const sensorData = ref(null)
        const error = ref(null)
        ?
        const fetchData = async () => {try {const res = await getSensorData()console.log('傳感器數據:', res.data)if (res.data.status === 'success') {sensorData.value = res.data.dataerror.value = null} else {error.value = res.data.message || '數據異常'}} catch (err) {error.value = '請求失敗:' + err.messageconsole.error(err)}
        }
        ?
        onMounted(() => {fetchData()setInterval(fetchData, 2000)
        })
        </script>
        ?
        <style scoped>
        .sensor-view {max-width: 400px;margin: auto;padding: 20px;font-family: Arial, sans-serif;
        }
        ?
        .sensor-data p {margin: 6px 0;
        }
        ?
        .error {color: red;
        }
        ?
        .loading {color: gray;
        }
        ?
        button {margin-top: 12px;padding: 6px 12px;
        }
        </style>
        ?
      6. 運行后我們可以發現并沒有正確界面顯示

      7. 所以這就是我接下來要說的:

        端口轉發問題:

        配置 Vite 的開發代理

        打開或創建 vite.config.js 文件,然后添加如下配置:

        // vite.config.js
        server: {proxy: {'/api': {target: 'http://127.0.0.1:8000',changeOrigin: true,// rewrite: (path) => path.replace(/^\/api/, '')}}}
      8. 同時我接下來要說的:

        我們每次需要跳轉一個界面時都需要使用router(路由),所以我們需要再router下的index.js文件里面的內容完善以下:

        import SensorViewer from '../components/SensorViewer.vue'
        { path: '/sensor-view',name: 'SensorView',component: SensorViewer}

    后端:

    1. 首先:需要再settings.py文件中的INSTALLED_APPS中添加:

      "corsheaders"

      然后在MIDDLEWARE 中添加:

       "corsheaders.middleware.CorsMiddleware",

      注意:上面這行代碼必須在:

      "django.middleware.common.CommonMiddleware",

      之前。

    2. 接著:

      配置允許的前端地址:

      CORS_ALLOWED_ORIGINS = ["http://localhost:5173",  # 允許 Vue 的端口
      ]
    3. 獲取傳感器數據的視圖函數中:

      parsed_data = json.loads(received_data)  # ? 轉為 dict

      將原本的字符串格式轉換成為JSON格式。

      以JSON格式的數據傳遞給前端部分,然后前端獲取標準數據格式后進行數據解析最終

      在頁面中呈現數據

實現效果圖:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81713.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81713.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81713.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

牛客網NC209794:使徒襲來

牛客網NC209794:使徒襲來 題目背景 問題分析 數學建模 設三位駕駛員的戰斗力分別為 a, b, c已知條件&#xff1a;a b c n (n為輸入的正整數)目標&#xff1a;求 a b c 的最小值 解題思路 根據算術-幾何平均值不等式(AM-GM不等式)&#xff0c;對于任意正實數a, b, c&a…

動態規劃之爬樓梯模型

文章目錄 爬樓梯模型LeetCode 746. 使用最小花費爬樓梯思路Golang 代碼 LeetCode 377. 組合總和 Ⅳ思路Golang 代碼 LeetCode 2466. 統計構造好字符串的方案數思路Golang 代碼 LeetCode 2266. 統計打字方案數思路Golang 代碼 爬樓梯模型 爬樓梯模型是動態規劃當中的一個經典模型…

【每天一個知識點】湖倉一體(Data Lakehouse)

“湖倉一體”&#xff08;Data Lakehouse&#xff09;是一種融合了數據湖&#xff08;Data Lake&#xff09;與數據倉庫&#xff08;Data Warehouse&#xff09;優勢的新型數據架構。它既繼承了數據湖對多類型數據的靈活存儲能力&#xff0c;也具備數據倉庫對結構化數據的高效查…

Linux | mdadm 創建軟 RAID

注&#xff1a;本文為 “Linux mdadm RAID” 相關文章合輯。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 Linux 下用 mdadm 創建軟 RAID 以及避坑 喵??&#xfecc;?? Oct 31, 2023 前言 linux 下組軟 raid 用 mdadm 命令&#xff0c;multi…

Unity自定義shader打包SpriteAtlas圖集問題

Unity打包圖集還是有一些坑的&#xff0c;至于圖集SpriteAtlas是什么請參考我之前寫的文章&#xff1a;【Sprite Atlas】Unity新圖集系統SpriteAtlas超詳細使用教程_spriteatlas 使用-CSDN博客 問題&#xff1a; 今天碰到的問題是&#xff0c;shader繪制的時候&#xff0c;因…

如何用 OceanBase 的 LOAD DATA 旁路導入進行大表遷移

前言 在日常工作中&#xff0c;我們時常會遇到需要將某個大數據量的單表進行遷移的情況。在MySQL中&#xff0c;針對這樣的大表&#xff0c;我們通常會選擇先將原表導出為csv格式&#xff0c;然后利用LOAD DATA語法來導入csv文件&#xff0c;這種方法相較于mysqldump在效率上有…

VR 互動實訓的顯著優勢?

&#xff08;一&#xff09;沉浸式學習&#xff0c;提升培訓效果? 在 VR 互動實訓中&#xff0c;員工不再是被動的知識接受者&#xff0c;而是主動的參與者。以銷售培訓為例&#xff0c;員工戴上 VR 設備&#xff0c;就能置身于逼真的銷售場景中&#xff0c;與虛擬客戶進行面對…

OpenCV 第6課 圖像處理之幾何變換(重映射)

1. 概述 簡單來說,重映射就是把一副圖像內的像素點按照規則映射到到另外一幅圖像內的對應位置上去,形成一張新的圖像。 因為原圖像與目標圖像的像素坐標不是一一對應的。一般情況下,我們通過重映射來表達每個像素的位置(x,y),像這樣: g(x,y)=f(h(x,y)) 在這里g()是目標圖…

Java虛擬機 - 程序計數器和虛擬機棧

運行時數據結構 Java運行時數據區程序計數器為什么需要程序計數器執行流程虛擬機棧虛擬機棧作用虛擬機棧核心結構運行機制 Java運行時數據區 首先介紹Java運行時數據之前&#xff0c;我們要了解&#xff0c;對于計算機來說&#xff0c;內存是非常重要的資源&#xff0c;因為內…

MySQL數據庫——支持遠程IP訪問的設置方法總結

【系列專欄】&#xff1a;博主結合工作實踐輸出的&#xff0c;解決實際問題的專欄&#xff0c;朋友們看過來&#xff01; 《項目案例分享》 《極客DIY開源分享》 《嵌入式通用開發實戰》 《C語言開發基礎總結》 《從0到1學習嵌入式Linux開發》 《QT開發實戰》 《Android開發實…

CSS- 4.6 radiu、shadow、animation動畫

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 點…

排序算法之基礎排序:冒泡,選擇,插入排序詳解

排序算法之基礎排序&#xff1a;冒泡、選擇、插入排序詳解 前言一、冒泡排序&#xff08;Bubble Sort&#xff09;1.1 算法原理1.2 代碼實現&#xff08;Python&#xff09;1.3 性能分析 二、選擇排序&#xff08;Selection Sort&#xff09;2.1 算法原理2.2 代碼實現&#xff…

第十節第一部分:常見的API:Math、System、Runtime

Math類介紹及常用方法&#xff08;了解知道即可&#xff09; System類介紹及常用方法&#xff08;了解知道即可&#xff09; Runtime類介紹及常用方法&#xff08;了解知道即可&#xff09; 代碼&#xff1a; 代碼一&#xff1a;Math類 package com.itheima.d14_math;public …

智能體間協作的“巴別塔困境“如何破解?解讀Agent通信4大協議:MCP/ACP/A2A/ANP

AI 智能體的興起觸發了AI應用協作的新領域。這些智能體不再局限于被動的聊天機器人或獨立的系統&#xff0c;它們現在被設計用于推理、計劃和協作ーー跨任務、跨域甚至跨組織。但隨著這一愿景成為現實&#xff0c;一個挑戰很快浮出水面&#xff1a; 智能體如何以一種安全、可伸…

項目進度延誤,如何按時交付?

項目進度延誤可以通過加強計劃管理、優化資源分配、強化團隊溝通、設置關鍵里程碑和風險管理機制等方式來實現按時交付。加強計劃管理、優化資源分配、強化團隊溝通、設置關鍵里程碑、風險管理機制。其中&#xff0c;加強計劃管理尤為關鍵&#xff0c;因為明確而詳細的計劃能提…

詳解ip地址、子網掩碼、網關、廣播地址

1. IP 地址 定義&#xff1a;IP 地址是網絡設備在網絡中的唯一標識&#xff0c;用于標識設備的網絡位置&#xff0c;類似于現實中的門牌號。它分為 IPv4&#xff08;如 192.168.1.5&#xff09;和 IPv6&#xff08;如 240e:305:3685:8100:a00:27ff:fefb:56b8&#xff09;。 示…

為 Windows 和 Ubuntu 中設定代理服務器的詳細方法

有時下載大模型總是下載不出來&#xff0c;要配置代理才行 一、Windows代理設置 ① 系統全局代理設置 打開【設置】→【網絡和Internet】→【代理】。 在【手動設置代理】下&#xff0c;打開開關&#xff0c;輸入&#xff1a; 地址&#xff1a;10.10.10.215 端口&#xff1a;…

鴻蒙OSUniApp 實現的表單驗證與提交功能#三方框架 #Uniapp

UniApp 實現的表單驗證與提交功能 前言 在移動端應用開發中&#xff0c;表單是用戶與應用交互的重要媒介。一個好的表單不僅布局合理、使用方便&#xff0c;還應該具備完善的驗證與提交功能&#xff0c;以確保用戶輸入的數據準確無誤。本文將分享如何在 UniApp 中實現表單驗證…

前端的面試筆記——HTMLJavaScript篇(二)前端頁面性能檢測

前端頁面性能檢測和判定是優化用戶體驗的核心環節&#xff0c;需要結合實驗室數據&#xff08;Lab Data&#xff09;、現場數據&#xff08;Field Data&#xff09;和行業標準綜合評估。以下是主流方法、工具及判定標準的詳細解析&#xff1a; 一、性能檢測的核心維度與指標 …

再來1章linux系列-19 防火墻 iptables 雙網卡主機的內核 firewall-cmd firewalld的高級規則

學習目標&#xff1a; 實驗實驗需求實驗配置內容和分析 &#xff08;每一個設備的每一步操作&#xff09;實驗結果驗證其他 學習內容&#xff1a; 實驗實驗需求實驗配置內容和分析 &#xff08;每一個設備的每一步操作&#xff09;實驗結果驗證其他 1.實驗 2.實驗需求 圖…