首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合使用Dash和socket API

问结合使用Dash和socket API
EN

Stack Overflow用户
提问于 2019-01-25 06:56:01
回答 1查看 1.3K关注 0票数 1

我想做一个网络应用程序,显示来自我们的自定义设备网格的实时传感器数据。我熟悉Dash Python框架,所以我决定这次也使用它。其中一个设备与W5500 shield通信,这是启动的基础。不幸的是,当我试图在python中融合Dash和BSD套接字时,我在Linux (Ubuntu 18.04)或Windows10上都遇到了奇怪的行为。

在打开套接字的情况下运行任何Dash应用程序时,尽管我显式使用不同的接口和/或端口- Dash应用程序托管在本地主机端口8050上,并且我使用分配的IP和其他端口作为套接字,但我收到错误声明端口/地址对在仍然打开时被重用(在Linux或WinError 10048上是errno 98 )。我尝试了_thread数据包的不同方法,但仍然出现相同的错误。

我也意识到在这个示例中我不接受连接,但只要绑定/侦听不起作用,我就没有把它放在这里。

如果我在单独的线程中服务应用程序,其中一个线程没有以任何方式响应,所以我要么不服务应用程序,要么不接收任何数据。我附上了Dash教程的示例代码修改的方式,以显示问题。

代码语言:javascript
复制
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import socket
import _thread
import atexit

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print('socet created')
PORT = 9001
IP_ADDR = '192.168.0.38'
s.bind((IP_ADDR, PORT))

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    dcc.Input(id='my-id', value='initial value', type='text'),
    html.Div(id='my-div')
])
@app.callback(
    Output(component_id='my-div', component_property='children'),
    [Input(component_id='my-id', component_property='value')]
)
def update_output_div(input_value):
    return 'You\'ve entered "{}"'.format(input_value)

def on_close():
    global s
    print('port closed')
    s.close()

def get_data(dummy):
    while True:
        data, addr = s.recvfrom(1024)
        print('received: ' + str(list(data)))

def run_app(dummy):
    app.run_server(debug=True)
    #while True:
    #     pass

if __name__ == '__main__':
    atexit.register(on_close)

    _thread.start_new_thread( get_data, ('data',))
    #_thread.start_new_thread( run_app, ('app',) )
    app.run_server(debug=True, host = '127.0.0.1')
    while True:
        pass

我真正想要的是在开始时保持简单,修改感兴趣的值列表,然后每隔n毫秒在实时图上绘制它们(无论它们是否更新)。

如果有人设法将Dash与套接字一起使用,请提供一些帮助或提示如何建立TCP套接字侦听。

EN

回答 1

Stack Overflow用户

发布于 2019-05-09 04:51:23

您可以尝试如下所示:

代码语言:javascript
复制
app.layout = html.Div([
    dcc.Input(id='my-id', value='initial value', type='text'),
    html.Div(id='my-div'),
    html.Div(id='my-hidden-div', style='hidden')
    ])

@app.callback(
    [Output(component_id='my-div', component_property='children'),
     Output(component_id='my-hidden-div', component_property='children')
    [State(component_id='my-hidden-div', component_property='children')]
)
def get_data(dummy):
    while True:
        data, addr = s.recvfrom(1024, timeout=0.1)
        print('received: ' + str(list(data)))

    return str(list(data)), str(list(data))

在这种情况下,只要my-hidden div发生变化,就会触发get_data回调。recvfrom在100毫秒后超时,然后将一个值返回给my-hidden div,后者随后回调get_data回调。

我不知道这是否有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54356584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档