http web事物实现

webthing的Python项目详细描述


网络事物

https://travis-ci.org/mozilla-iot/webthing-python.svg?branch=masterhttps://img.shields.io/pypi/v/webthing.svghttps://img.shields.io/badge/license-MPL--2.0-blue.svg

http Web Thing的实现。此库与Python2.7和3.4+兼容

安装

webthing可以通过pip安装,例如:

$ pip install webthing

运行样本

$ wget https://raw.githubusercontent.com/mozilla-iot/webthing-python/master/example/single-thing.py
$ python3 single-thing.py

这将启动一个服务器,并允许您通过MDN从网关搜索它。若要将其添加到网关,请导航到网关用户界面中的“物品”页,然后单击右下角的+图标如果两者都在同一个网络上,则会自动出现示例。

示例实现

在本代码演练中,我们将设置一个可调光灯和一个湿度传感器(当然,这两个都使用假数据)。这两个工作示例都可以在here中找到。

可调光

假设您有一个可调光,您希望通过webofthingsapi公开它。灯可以打开/关闭,亮度可以设置为0%到100%除了名称、描述和类型之外,还需要一个^{tt3}$来公开两个属性:

  • on:灯光的状态,无论它是打开还是关闭
    • 通过对rest api的PUT {"on": true/false}调用设置此属性可以切换灯光。
  • brightness:0-100%
    • 通过对rest api的put调用设置此属性将设置此灯光的亮度级别。

首先,我们创造一个新事物:

light=Thing('urn:dev:ops:my-lamp-1234','My Lamp',['OnOffSwitch','Light'],'A web connected lamp')

现在我们可以添加所需的属性

on属性报告并设置灯光的开/关状态为此,我们需要一个Value对象来保存实际状态,还需要一个方法来打开/关闭灯光。出于我们的目的,我们只想在灯打开/关闭时记录新状态

light.add_property(Property(light,'on',Value(True,lambdav:print('On-State is now',v)),metadata={'@type':'OnOffProperty','title':'On/Off','type':'boolean','description':'Whether the lamp is turned on',}))

brightness属性报告灯光的亮度级别并设置该级别和以前一样,我们只是记录光的水平,而不是实际设置光的水平

light.add_property(Property(light,'brightness',Value(50,lambdav:print('Brightness is now',v)),metadata={'@type':'BrightnessProperty','title':'Brightness','type':'number','description':'The level of light from 0-100','minimum':0,'maximum':100,'unit':'percent',}))

现在我们可以将新创建的内容添加到服务器并启动它:

# If adding more than one thing, use MultipleThings() with a name.# In the single thing case, the thing's name will be broadcast.server=WebThingServer(SingleThing(light),port=8888)try:server.start()exceptKeyboardInterrupt:server.stop()

这将启动服务器,通过wot rest api使灯光可用,并通过mdns将其作为本地网络上的可发现资源宣布。

传感器

现在我们还要将湿度传感器连接到为灯光设置的服务器上

一个^{tt10}$(返回一个级别而不是仅仅打开/关闭的传感器)有一个必需的属性(除了名称、类型和可选描述之外):level。我们希望监视此属性,并在值更改时获得通知。

首先,我们创造一个新事物:

sensor=Thing('urn:dev:ops:my-humidity-sensor-1234','My Humidity Sensor',['MultiLevelSensor'],'A web connected humidity sensor')

然后我们创建并添加适当的属性:

  • level:告诉我们传感器实际读数

    • 与之相反,不能通过API调用设置该值,因为设置传感器读取的内容没有多大意义因此,我们正在创建一个readOnly属性

      level=Value(0.0);sensor.add_property(Property(sensor,'level',level,metadata={'@type':'LevelProperty','title':'Humidity','type':'number','description':'The current humidity in %','minimum':0,'maximum':100,'unit':'percent','readOnly':True,}))

现在我们有一个传感器不断报告0%为了使它可用,当传感器有新的读数时,我们需要一个线程或某种输入。为此,我们启动一个线程,每隔几秒钟查询一次物理传感器为了我们的目的,它只是调用一个假方法。

self.sensor_update_task= \
    get_event_loop().create_task(self.update_level())asyncdefupdate_level(self):try:whileTrue:awaitsleep(3)new_level=self.read_from_gpio()logging.debug('setting new humidity level: %s',new_level)self.level.notify_of_external_update(new_level)exceptCancelledError:pass

这将通过self.level.notify_of_external_update(read_from_gpio())调用使用传感器读数更新Value对象。对象Value现在通知属性和值已更改的内容,这反过来通知所有websocket侦听器

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
datetime如何使用JodaTime在Java中设置时间属性   java固定算法的性能时间   java如何从JMenu中获取所选项以更改文本区域的文本颜色?   java配置单元UDF传递数组<string>作为参数   javaapachebeam和BigQuery   java与PrintWriter之间的差异。printf和PrintWriter。格式方法   继承如何处理按Java版本更改的导入,以及在多个版本上编译   xml java。lang.noClassDefFoundant生成错误   java如何使用包含映射的JSON发送POST请求?   java如何在任何应用程序的JAR文件中绑定MySql数据库?   Java脚本解释器   sslhttpclientjava。网SocketException:未实现未连接的socket   java如何为Android应用程序创建类似于Cron作业的东西   java JButton+radiobox+复选框   java内存管理将文件写入内存   java这是计算对象实例的有效方法吗?   用于死锁情况的java代码?   JavaSpring容器作为新实体插入,而不是存储在表中