Python IoT模拟

时间:2019-02-11 22:30:34

标签: python websocket python-asyncio python-3.7

一段时间以来,我一直在同一个问题上作斗争,我发现取得任何有意义的进步变得越来越困难。通过写这个问题,我希望找到一个潜在的解决方案,或者收集一些新的想法来继续尝试自己。

从总体上讲,这是我想要达到的目标:

  

我想模拟一个小规模的物联网部署,大致包括   50个设备。我可以使用基于Websocket的流式API访问传感器读数,频率大约为每分钟一个读数(每个传感器)。

     

除了处理此数据外,每个传感器还应与集中式协调器节点通信(全双工),该节点负责聚合数据并分发结果。

希望此描述足以说明我要达到的目标。

为了便于测试,我想通过封装操作(发送/接收/广播)的简单接口将每个组件建模为一个对象。

class Sensor(object):
   Receive : Receive sensor readings from the streaming API

   Send : Send data to the coordinator
   Receive : Receive data from the coordinator


class Coordinator(object)
   Send : Send data to a specific sensor
   Broadcast : Send data to all connected sensors 
   Receive : Receive data from a connected sensor

到目前为止,我的大部分工作都使用了asynciowebsockets库。

最新方法

我最近花了更多时间阅读有关asyncio框架的信息,并尝试了以下操作。这里的想法是,通过将共享的事件循环(调度程序)注入到每个对象中,我可以实现我想要的抽象。

传感器

import asyncio

from Client import Client
from Readings import Reading


class Sensor(object):

    def __init__(self):
        self.scheduler = asyncio.get_event_loop()
        self.urban_api = None  # Websocket streaming API 

        self.readings = Reading(self.scheduler, self.urban_api)
        self.coordinator = Client(self.scheduler, host='localhost', port=8080)

        self.scheduler.create_task(self.repetitive_message())

        try:
            self.scheduler.run_forever()
        except KeyboardInterrupt:
            pass


    async def called_on_new_reading():
        # Called on receipt of new reading.

    @staticmethod
    async def repetitive_message():
        while True:
            print('Sensor performing work')
            await asyncio.sleep(2)


if __name__ == '__main__':
    sensor = Sensor()

阅读-处理流式API

from websockets import connect


class Reading(object):

    def __init__(self, scheduler, urban_api):
        self.scheduler = scheduler
        self.urban_api = urban_api

        self.scheduler.create_task(self.receive())

    async def receive(self):
        async with connect(self.urban_api) as websocket:
            async for message in websocket:
                print(message)
  

自从切换到websockets以来,我在实现协调器方面未取得任何进展,但是我希望意图很明确。

我有几个问题:

  1. 这是实现我描述的仿真的正确策略吗?
  2. 有没有可以进一步简化此功能的库?
  3. 如何从传感器类中的websocket接收读数?

我无法找到任何OOP异步示例-也许我缺少了什么?

我很高兴这篇文章很长,而且缺少部分内容,但是任何反馈或指点将不胜感激。

0 个答案:

没有答案