我在使用flask-socketio 时遇到了问题。 事情是这样的,当应用程序运行并到达本地主机时一切正常,我可以从服务器向客户端发出消息,并以其他方式发送。
但是当服务器运行(在 Raspberry 上)并且页面在同一网络上的任何其他计算机上启动时,从客户端发送到服务器的消息不起作用。 (服务器到客户端工作)。
这是我的设置:
|
+--/static <-- css/js/etc.
|
+--/templates <- only index.html
|
+--api.py
服务器 -> api.py
#!/usr/bin/env python3.7
# app/socket.py
from gevent import monkey
monkey.patch_all()
from flask import Flask, render_template
from flask_cors import CORS, cross_origin
from flask_socketio import SocketIO, emit
from threading import Thread
from bluepy import btle
import binascii
import struct
import json
import time
import os
import status
app = Flask(__name__)
CORS(app)
app.config['SECRET_KEY'] = 'cleSecrete'
app._static_folder = os.path.abspath("templates/static/")
socketio = SocketIO(app)
socketio.init_app(app)
thread = None
data_ble = [b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00',b'00']
class MyDelegate(btle.DefaultDelegate):
def __init__(self,params):
btle.DefaultDelegate.__init__(self)
def handleNotification(self,cHandle,data):
global data_ble
for i in range(0,17):
data_ble[i] = binascii.b2a_hex(data[i:(i+1)])
## print(data_ble)
def back_thread():
mower = btle.Peripheral('50:33:8B:F8:5A:90')
mower.setDelegate(MyDelegate(0))
while True:
mower.waitForNotifications(1)
data_json = status.decodeReceivedData(data_ble)
## print(data_json)
socketio.emit('message', data_json)
@app.route('/')
def sessions():
global thread
if thread is None:
thread = Thread(target=back_thread)
thread.start()
return render_template("index.html")
@socketio.on('command')
def get_start_command(json, methods=['GET']):
print("event")
print(str(json))
if __name__ == '__main__':
# app.run()
socketio.run(app, host='0.0.0.0', port=5000, debug=True)
客户端 -> app.js
var socket = io.connect();
socket.on( 'message', function( msg ) {
console.log(msg);
var elementStatus = document.getElementById("status");
elementStatus.innerHTML = msg.status;
var elementError = document.getElementById("error");
elementError.innerHTML = msg.error;
var elementLatitude = document.getElementById("latitude");
elementLatitude.innerHTML = msg.latitude;
var elementLongitude = document.getElementById("longitude");
elementLongitude.innerHTML = msg.longitude;
var elementHeures = document.getElementById("heures");
elementHeures.innerHTML = msg.heures;
var elementMinutes = document.getElementById("minutes");
elementMinutes.innerHTML = msg.minutes;
var elementJours = document.getElementById("jours");
elementJours.innerHTML = msg.jours;
var elementMois = document.getElementById("mois");
elementMois.innerHTML = msg.mois;
var elementAnnee = document.getElementById("annee");
elementAnnee.innerHTML = msg.annee;
})
function sendStart() {
socket.emit('command', {
"command": "Start"
})
}
function sendStop() {
socket.emit('command', {
"command": "Stop"
})
}
在 html 代码中有两个按钮带有 onClick 回调,调用 sendStop 和 sendStart 并发送到服务器。
任何帮助都会很棒;) 谢谢
M.