本プログラムは、
を拡張したものです。index.htmlは、このページに記載されているものを、そのまま、使って下さい。
こちらのプログラムでは、Webサーバに繋っているブラウザが、全部いなくなったと確認できた場合(30秒後)に、url = "http://localhost:8000/cancelAllVideoStreamGround"へメッセージを渡すプログラムです。
デバッグの為に使っていたコメントが残っていますので、適当に削除して下さい。
# c:\users\ebata\webMonitor.py
# https://wp.kobore.net/%e6%b1%9f%e7%ab%af%e3%81%95%e3%82%93%e3%81%ae%e6%8a%80%e8%a1%93%e3%83%a1%e3%83%a2/post-12475/を参照のこと
import threading
import time
import requests
import sys
from flask import Flask, request, jsonify
from requests.exceptions import Timeout
from flask_cors import CORS
app = Flask(__name__)
CORS(app) # すべてのリクエストに対してCORSを有効にする
last_heartbeat_time = 0
lock = threading.Lock()
def send_notification():
url = "http://localhost:8000/cancelAllVideoStreamGround"
try:
response = requests.post(url, timeout=3)
response.raise_for_status()
print("Notification sent successfully.")
sys.stdout.flush() # 標準出力をフラッシュする
except Timeout:
print("Error: Timeout while sending notification")
except requests.exceptions.RequestException as e:
print(f"Error sending notification: {e}")
def check_heartbeat():
global last_heartbeat_time
while True:
current_time = time.time()
print("ct:",current_time)
print("lht:",last_heartbeat_time)
diff = current_time - last_heartbeat_time
print("diff:",diff)
with lock:
if current_time - last_heartbeat_time > 30:
send_notification()
last_heartbeat_time = current_time
time.sleep(1)
@app.route('/heartbeat', methods=['POST'])
def receive_heartbeat():
print("pass receive_heartbeat()")
global last_heartbeat_time
data = request.get_json()
print(f"Received heartbeat: {data}")
sys.stdout.flush() # 標準出力をフラッシュする
with lock:
last_heartbeat_time = time.time()
print("lht_2:",last_heartbeat_time)
# data = request.get_json()
# print(f"Received heartbeat: {data}")
# sys.stdout.flush() # 標準出力をフラッシュする
return jsonify({"status": "OK"})
if __name__ == "__main__":
heartbeat_thread = threading.Thread(target=check_heartbeat)
heartbeat_thread.start()
app.run(host='0.0.0.0', port=3000)
私用のコメント
(1)receive_heartbeat():と receive_heartbeat()を同時に走らせる為に、スレッド化しなければならなくなった → で Ctrl-Cで止められなくなったので、ちょっと困っている(が、シェル画面ごと落せばいいので、現在はそうしている)
(2)url = "http://localhost:8000/cancelAllVideoStreamGround" からの時間がもたつく場合には、Timeoutを設定すると良いかもしれない。send_notification()を丸ごと差し替えると、こんな感じ。
def send_notification():
url = "http://localhost:8000/cancelAllVideoStreamGround"
try:
response = requests.post(url, timeout=3)
response.raise_for_status()
print("Notification sent successfully.")
sys.stdout.flush() # 標準出力をフラッシュする
except Timeout:
print("Error: Timeout while sending notification")
except requests.exceptions.RequestException as e:
print(f"Error sending notification: {e}")
(3)Webブラウザは、バックエンドに置いておくと、Heatbeatを出力しないことがあるので、常にアクティブにしておく必要があります(バックエンドのままにしておくと、cancelAllVideoStreamGroundが動き出します)
以上