将事件 socketio 发送到 Flask-socketio

时间:2021-02-12 21:43:37

标签: flask socket.io flask-socketio

我在使用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.

0 个答案:

没有答案