首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中使用websocket和I/O串行?

在python中使用websocket和I/O串行?
EN

Stack Overflow用户
提问于 2019-11-22 10:13:59
回答 1查看 788关注 0票数 0

我正在努力让我的websocket脚本和I/O串行脚本一起运行在一起。

在我继续之前,我只提供一些基本的信息:

我使用的是Windows (无法访问linux ) pyserial-asyncio

  • I

  • --这就是为什么我使用AIOserial库而不是使用AIOserial没有异步的“超级”体验的原因,所以请:)

下面是我的“旧”websocket脚本:

代码语言:javascript
运行
复制
    from aiohttp import web
import socketio
import aiohttp_cors
import asyncio
import random

# creates a new Async Socket IO Server
sio = socketio.AsyncServer()
# Creates
app = web.Application()
sio.attach(app)


server_is_responding = "Message from the server:"
the_response  = "Hello there!"


async def index(request):
    with open('index.html') as f:
        print("Somebody entered the server from the browser!")
        return web.Response(text=f.read(), content_type='text/html')




@sio.on("android-device")
async def message(sid, data):
    print("message: ", data)
    #return send_message_to_client()



@sio.on('sendTextToServer')
async def message(sid, data):
    print("message: " , data)
    if data == "hei":
        await sio.emit("ServerMessage", {"hehe"})
    if data == "lol":
        await sio.emit("ServerMessage", {"Message from server:": "hehe, funny right?.."})
    else:
        await sio.emit("ServerMessage", {"Message from server:": "Hello There!"})



# We bind our aiohttp endpoint to our app
# router
cors = aiohttp_cors.setup(app)
app.router.add_get('/', index)

# We kick off our server
if __name__ == '__main__':
    web.run_app(app)

下面是我的I/O串行脚本(它工作并读取数据),我正在尝试与上面的一些websocket函数一起使用该脚本:

代码语言:javascript
运行
复制
import asyncio
import websockets
import socketio
import aiohttp_cors


import logging

from AIOExtensions.AIOSerial import (AIOSerial, AIOSerialClosedException,
                                     AIOSerialErrorException, AIOSerialNotOpenException)


logging.basicConfig(level=logging.DEBUG)

sio = socketio.AsyncServer()

async def hello(websocket, path):
    name = await websocket.recv()
    print(f"< {name}")

    greeting = f"Hello {name}!"

    await websocket.send(greeting)
    print(f"> {greeting}")


@sio.on("android-device")
async def message(sid, data):
    print("message: ", data)

async def read_IO_serial():

    try:

        async with AIOSerial('COM8', baudrate=115200, line_mode=True) as aios:

            await asyncio.sleep(100)

            try:
                while True:

                    # read with timeout
                    rcvd = await asyncio.wait_for(aios.read(), timeout=1.0)
                    # print the data received
                    print(f"data received: {rcvd}")


                    if rcvd == b'RF initialized\n':
                        print("CATCHED THIS LINE!")


            except asyncio.TimeoutError:
                print("reception timed out ;-(")

    except AIOSerialNotOpenException:
        print("Unable to open the port!")
        print()
        print("Have you specified the right port number? COM7? COM8?")
    # port fatal error
    except AIOSerialErrorException:
        print("Port error!")
    # port already closed
    except AIOSerialClosedException:
        print("Serial port is closed!")

start_server = websockets.serve(hello, "http://192.168.1.6", 8080)
#sio.attach(start_server) # HOW CAN I ATTACH THIS SO IT CAN BE USED WITH THE SIO FUNCTIONS BELOW?

if start_server:
    print("Server started!")

asyncio.run(read_IO_serial())

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

正如您在我的第一个简单的websocket脚本中所看到的,我可以使用"sio.attach(app)“来列出来自客户端的事件,所以我需要在我当前的脚本中替换这个”应用程序“。

有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2019-11-22 12:25:47

我用asyncio.gather()解决了这个问题,我就是这样写的:

代码语言:javascript
运行
复制
from aiohttp import web
import socketio
import aiohttp_cors
import asyncio
import random
​
import asyncio as aio
import logging
​
import sys
​
# creates a new Async Socket IO Server
sio = socketio.AsyncServer()
# Creates
app = web.Application()
sio.attach(app)
​
server_is_responding = "Message from the server:"
the_response = "Hello there!"
​
​
async def index(request):
    with open('index.html') as f:
        print("Somebody entered the server from the browser!")
        return web.Response(text=f.read(), content_type='text/html')
​
​
@sio.event
async def join(sid, message):
    sio.enter_room(sid, message['room'])
    await sio.emit('my_response', {'data': 'Entered room: ' + message['room']}, room=sid)
​
​
@sio.on("android-device")
async def message(sid, data):
    print("message: ", data)
​
​
@sio.on("receiveMessageFromServer")
async def message(sid, data):
    print("message: ", data)
    # await asyncio.sleep(1 * random.random())
    return "OKKKK", 123
​
​
​
from AIOExtensions.AIOSerial import (AIOSerial, AIOSerialClosedException,
                                     AIOSerialErrorException, AIOSerialNotOpenException)
​
logging.basicConfig(level=logging.DEBUG)
​
​
async def read_IO_serial():
    try:
​
        async with AIOSerial('COM8', baudrate=115200, line_mode=True) as aios:
            # aios.sp.baudrate = 230400
            # aios.sp.baudrate = 115200
​
            # await aios.write(b"AT\r\n")
​
            # await aios.read()
​
            # await aios.close()
​
            await aio.sleep(100)
​
            try:
                while True:
​
                    # read with timeout
                    rcvd = await aio.wait_for(aios.read(), timeout=1.0)
                    # print the data received
                    print(f"data received: {rcvd}")
​
                    if rcvd == b'RF initialized\n':
                        print("CATCHED THIS LINE!")
​
​
            except aio.TimeoutError:
                print("reception timed out ;-(")
​
    except AIOSerialNotOpenException:
        print("Unable to open the port!")
        print()
        print("Have you specified the right port number? COM7? COM8?")
    # port fatal error
    except AIOSerialErrorException:
        print("Port error!")
    # port already closed
    except AIOSerialClosedException:
        print("Serial port is closed!")
​
​
async def on_startup(app):
    pass
​
​
cors = aiohttp_cors.setup(app)
app.router.add_get('/', index)
​
# We kick off our server
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    group2 = asyncio.gather(read_IO_serial())
    group1 = asyncio.gather(web.run_app(app))
​
    all_groups = asyncio.gather(group1, group2)
​
    results = loop.run_until_complete(all_groups)
​
    # loop.close()
​
    #print(results)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58992017

复制
相关文章

相似问题

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