-
This commit is contained in:
@@ -1132,6 +1132,38 @@ def api_arm_camera_refresh():
|
||||
return "", 404
|
||||
|
||||
|
||||
@app.route("/api/camera/arm_preview")
|
||||
def api_arm_camera_preview():
|
||||
"""代理机械臂 MJPEG 视频流,供页面连续预览。"""
|
||||
import requests
|
||||
try:
|
||||
upstream = requests.get(
|
||||
ARM_CAMERA_CONFIG["url"],
|
||||
stream=True,
|
||||
timeout=(3, 10),
|
||||
)
|
||||
if upstream.status_code != 200:
|
||||
upstream.close()
|
||||
return "", 404
|
||||
|
||||
def generate():
|
||||
try:
|
||||
for chunk in upstream.iter_content(chunk_size=8192):
|
||||
if chunk:
|
||||
yield chunk
|
||||
finally:
|
||||
upstream.close()
|
||||
|
||||
return Response(
|
||||
generate(),
|
||||
mimetype="multipart/x-mixed-replace; boundary=frame",
|
||||
headers={"Cache-Control": "no-cache, no-store, must-revalidate, max-age=0"},
|
||||
)
|
||||
except Exception as ex:
|
||||
logger.error(f"arm_preview 失败: {ex}")
|
||||
return "", 404
|
||||
|
||||
|
||||
@app.route("/api/camera/qr_scan", methods=["GET"])
|
||||
def api_qr_scan():
|
||||
"""扫描一次二维码"""
|
||||
|
||||
@@ -16,7 +16,7 @@ createApp({
|
||||
currentState: 'idle',
|
||||
// 摄像头轮询
|
||||
agvCameraSrc: '/api/camera/refresh?t=' + Date.now(),
|
||||
armCameraSrc: '/api/camera/arm_refresh?t=' + Date.now(),
|
||||
armCameraSrc: '/api/camera/arm_preview?t=' + Date.now(),
|
||||
agvCameraError: false,
|
||||
armCameraError: false,
|
||||
reconnectingDevice: null
|
||||
@@ -43,7 +43,9 @@ createApp({
|
||||
methods: {
|
||||
refreshCams() {
|
||||
this.agvCameraSrc = '/api/camera/refresh?t=' + Date.now()
|
||||
this.armCameraSrc = '/api/camera/arm_refresh?t=' + Date.now()
|
||||
if (!this.armCameraSrc.startsWith('/api/camera/arm_preview')) {
|
||||
this.armCameraSrc = '/api/camera/arm_preview?t=' + Date.now()
|
||||
}
|
||||
},
|
||||
async refresh() {
|
||||
await this.refreshStatus()
|
||||
|
||||
@@ -9,7 +9,7 @@ createApp({
|
||||
tasks: [],
|
||||
report: null,
|
||||
agvPreviewUrl: API + '/api/camera/preview',
|
||||
armPreviewUrl: API + '/api/camera/arm_refresh',
|
||||
armPreviewUrl: API + '/api/camera/arm_preview',
|
||||
polling: null,
|
||||
logs: [],
|
||||
showQrModal: false,
|
||||
@@ -265,4 +265,4 @@ createApp({
|
||||
return ms[field] || ''
|
||||
}
|
||||
}
|
||||
}).mount('#app')
|
||||
}).mount('#app')
|
||||
|
||||
@@ -57,7 +57,7 @@ createApp({
|
||||
qrScanning: false,
|
||||
qrConfigs: [],
|
||||
qrScanningId: null,
|
||||
armCameraUrl: API + '/api/camera/arm_refresh',
|
||||
armCameraUrl: API + '/api/camera/arm_preview',
|
||||
newQrName: '',
|
||||
armInitialPose: [0, 0, 0, 0, 0, 0],
|
||||
}
|
||||
@@ -67,11 +67,7 @@ createApp({
|
||||
this.refreshAngles()
|
||||
this.loadQrConfigs()
|
||||
this.nav2Timer = setInterval(this.refreshNavStatus, 3000)
|
||||
// 机械臂摄像头自动刷新(每2秒)
|
||||
this.armCameraUrl = API + '/api/camera/arm_refresh?t=' + Date.now()
|
||||
this.armCameraTimer = setInterval(() => {
|
||||
this.armCameraUrl = API + '/api/camera/arm_refresh?t=' + Date.now()
|
||||
}, 2000)
|
||||
this.armCameraUrl = API + '/api/camera/arm_preview?t=' + Date.now()
|
||||
},
|
||||
computed: {
|
||||
hasQr() {
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
<div v-else-if="!cameraOpened" class="camera-placeholder">未打开(先点击连接设备)</div>
|
||||
</div>
|
||||
<div class="camera-box">
|
||||
<div class="camera-label">机械臂摄像头 <button class="btn btn-small" @click="armCameraSrc='/api/camera/arm_refresh?t='+Date.now(); armCameraError=false">刷新</button></div>
|
||||
<div class="camera-label">机械臂摄像头 <button class="btn btn-small" @click="armCameraSrc='/api/camera/arm_preview?t='+Date.now(); armCameraError=false">刷新</button></div>
|
||||
<img v-if="armCameraOpened && !armCameraError" :src="armCameraSrc" class="camera-img" @error="armCameraError=true">
|
||||
<div v-if="armCameraOpened && armCameraError" class="camera-placeholder">机械臂摄像头异常</div>
|
||||
<div v-else-if="!armCameraOpened" class="camera-placeholder">未连接</div>
|
||||
|
||||
Reference in New Issue
Block a user