murano设备客户端是与外部murano平台通信的主要库。

murano-client的Python项目详细描述


https://travis-ci.com/exosite/lib_murano_client_python.svg?token=tgjcyH1MG5sXqcVsD1kG&branch=master

用于快速测试、评估和编写Murano设备客户端软件的库。

支持的功能:

  • https设备api
  • MQTT设备API
  • 令牌验证
  • TLS客户端证书验证
  • 命令行接口(gdc --help

要求

  • python 2.7.9+、3.4、3.5、3.6
  • 多环芳烃mqtt(>;=1.3.1)
  • 请求(>;=2.13.0)
  • docopt(>;=0.6.2)

安装

运行以下命令。

> pip install murano-client

http cli示例

时间戳

> gdc -H https://t41hp23nod8s00000.m2.exosite.io/ http timestamp
1527272454

激活

> gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -u myDeviceName-1 http activate
97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW

写入

> gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http write data_in '{"some": "json data"}'
[204] No content

记录

> gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http record $(date +%s) data_in '{"historical": "data"}'
[204] No content

读取

> gdc -H https://t41hp23nod8s00000.m2.exosite.io/ -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http read data_in
data_in={"historical": "data"}

投票

> gdc  -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http poll config_io 3000
[304] Not modified
> gdc  -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http poll config_io 30000
[200] config_io={"some": "config data"}

含量

列出内容

> gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http content list
requests_check.v1.tar.gz
ota_bundle_test.v2.tar.gz
ota_bundle_test.v1.tar.gz
gwe.v1.5.RC68.tar.gz
gwe.v1.5.RC59.tar.gz
gwe.v1.5.RC58.tar.gz
gwe.v1.5.RC57.tar.gz

获取内容信息
> gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http content info gwe.v1.5.RC68.tar.gz
application/gzip,691529,1513931066,

下载内容

> gdc -H 'https://t41hp23nod8s00000.m2.exosite.io/' -k 97eWgtm9Et5VxwuJT8NiOK7w27Ly2GS092oSxgpW http content download gwe.v1.5.RC68.tar.gz
WARNING:urllib3.response:Received response with both Content-Length and Transfer-Encoding set. This is expressly forbidden by RFC 7230 sec 3.3.2. Ignoring Content-Length and attempting to process response as Transfer-Encoding: chunked.
> file gwe.v1.5.RC68.tar.gz
gwe.v1.5.RC68.tar.gz: gzip compressed data, last modified: Fri Dec 22 08:24:23 2017, from Unix

mqtt cli示例

激活

通过via mqtt激活客户机。

> gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ -u cleanup-stuff mqtt activate
oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk

发布

使用mqtt发布单个负载。

> gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ -k oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk mqtt publish \$resource/data_in "{\"time\": $(date +%s)}"
rc=0, mid=1: {"time": 1528214840}

订阅

订阅Murano客户端。

注意:mqtt subscribe对murano客户机的所有资源都有效。不支持订阅特定资源。也不支持取消订阅。

> gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ -k oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk mqtt subscribe
update_interval.1528215003884000=60

PubSub

使用此命令可以在订阅客户端资源的同时,将换行分隔的日期发布到客户端资源。

> while true
do
    echo "{\"time\": $(date +%s)}"
    sleep 0.5
done | gdc -H mqtt://t41hp23nod8s00000.m2.exosite.io/ \
           -k oihLldO3f53dqyJYDmiRCijVsf4eQJeUxFSBnEsk \
           mqtt pubsub \
           \$resource/config_io
update_interval.1528215003884000=60

客户端应用程序

有关如何导入此库的示例,请参见murano_client/commands/目录中的命令。

简单的http示例应用程序

#!/usr/bin/env python

# example.py

import time
import uuid
import json
from murano_client.http import MuranoHTTP, Http_ReadWriteCodes

HTTP_TIMEOUT = 5*60*1000 # 5 minutes
config_io = None

client_params = {
    "murano_host": "https://t41hp23nod8s00000.m2.exosite.io/",
    "murano_id": str(uuid.uuid4()),
    "http_timeout": 5.0,
    "debug": "DEBUG",
}

print("Client parameters: {}".format(json.dumps(client_params)))

hc = MuranoHTTP(**client_params)
hc.set_http_timeout(HTTP_TIMEOUT)

while not hc.is_activated():
    hc.http_activate()
    print("TOKEN: {}".format(hc.murano_token()))
    if not hc.is_activated():
        time.sleep(HTTP_TIMEOUT)

print("Starting long poll...")

while True:
    response_handler = hc.http_long_poll(
            'config_io',
            HTTP_TIMEOUT,
            time.time()
        )

    if response_handler.code == Http_ReadWriteCodes.NotModified:
        print("no config_io yet...")
    elif response_handler.code == Http_ReadWriteCodes.OK:
        print(response_handler.body)
        config_io = json.loads(response_handler.body.strip("config_io="))
        print("got config_io: {}".format(config_io))
        hc.http_write('config_io', "ACK")
    else:
        print(response_handler)

    if config_io:
        print(hc.http_write('data_in', str(uuid.uuid4())))

简单的mqtt示例应用程序

#!/usr/bin/env python

# example.py
from __future__ import print_function
import time
import uuid
import json
from murano_client.mqtt import MuranoMQTT

client_params = {
    "murano_host": "mqtt://t41hp23nod8s00000.m2.exosite.io/",
    "murano_id": str(uuid.uuid4()),
    # "debug": "DEBUG",
}

print("Client parameters: {}".format(json.dumps(client_params)))

mc = MuranoMQTT(**client_params)
mc.start()

mc.Config_IO = None

print("Starting activation...")
if not mc.is_activated():
    mc.activate()
    print("TOKEN: {}".format(mc.murano_token()))

def on_message(cls, userdata, msg):
    """ Override default on_message function. """
    _, resource, timestamp = msg.topic.split('/')[0:3]
    print("{}.{}={}".format(resource, timestamp, msg.payload))
    if 'config_io' == resource:
        try:
            cls.Config_IO = json.loads(msg.payload.decode())
            print("New Config_IO: {}".format(cls.Config_IO))
        except ValueError:
            print("Invalid JSON: {}".format(msg.payload.decode()))
mc.on_message = on_message

print("Starting program...")

mc.start()

while True:

    if mc.Config_IO:
        rand_data = str(uuid.uuid4())
        rc, mid = mc.publish(
                             '$resource/data_in',
                             rand_data,
                             qos=0
                             )
        print("rc={}, mid={}, data={}"
              .format(rc, mid, rand_data))
    else:
        print("waiting for config_io object...")

    mc.loop()
    time.sleep(1)

简单的MuranoClient客户端应用程序

MuranoClient类接受以下构造函数参数:

  • murano_host-必需。应用程序将根据产品设置使用适当的协议与murano通信。
  • murano_id-这是设备标识符(例如序列号等)。
  • watchlist-提供一个资源列表,当新数据可用时,将从中得到通知。注意:当前仅支持一个资源。
  • http_timeout-指定使用http时长轮询连接之间的时间长度。
  • debug-打开或关闭日志记录。有效值是字符串值DEBUGINFOWARNINGERRORCRITICAL

下面的应用程序使用MuranoClient类的mqtt选项将有效负载从config_io资源“回送”到data_in资源。

#!/usr/bin/env python

import sys
import signal
import time
from murano_client.client import MuranoClient

c = MuranoClient(
    murano_host='mqtt://t41hp23nod8s00000.m2.exosite.io/',
    murano_id=sys.argv[1],
    watchlist=['config_io'],
    http_timeout=5*60,
    debug='DEBUG')

def stop(signal, frame):
    print("stopping")
    c.stop_all()
    sys.exit(0)

signal.signal(signal.SIGINT, stop)

c.client_activate()
c.start_client()

while True:
    data_from_murano = c.watch()
    if data_from_murano:
        c.tell(
            resource='data_in',
            timestamp=time.time(),
            payload=data_from_murano.payload
        )

下面的示例使用http选项定期将当前时间写入data_in资源。

重要:

#!/usr/bin/env python

import sys
import signal
import time
from murano_client.client import MuranoClient

c = MuranoClient(
    murano_host='https://t41hp23nod8s00000.m2.exosite.io/',
    murano_id=sys.argv[1],
    watchlist=['config_io'],
    http_timeout=5,
    debug='DEBUG'
)

def stop(signal, frame):
    c.stop_all()
    sys.exit(0)

signal.signal(signal.SIGINT, stop)

c.client_activate()
c.start_client()

while True:
    c.tell(
        resource='data_in',
        timestamp=time.time(),
        payload='chirp: {}'.format(time.time())
    )
    print(c.watch(timeout=1.0))

INI状态文件

必需:

  • murano_host
  • murano_id
  • watchlist-murano资源的逗号分隔列表

可选:

  • murano_port-(https默认值:443,mqtt默认值:8883)
  • debug
  • murano_token

INI文件示例:

##注意:如果客户端尚未设置,则排除murano_tokenDevice类将在激活后设置/保存它。

# device.ini
[device]
murano_host = mqtt://t41hp23nod8s00000.m2.exosite.io/
murano_id = 4321
murano_port = 443
watchlist = config_io
debug = DEBUG
murano_token = XaFfMaOvrGxJgWk2Iftgw1cplYuZeSsUoKlKn0lb

使用上述ini示例的示例应用程序代码。

#!/usr/bin/env python

from murano_client.ini import Device

d = Device('device.ini')
d.client_activate()
d.start_client()
print(d.watch()) # now set a value in the watchlist

使用上述ini文件的示例cli命令。

gdc -f device.ini http timestamp
gdc -f device.ini http activate
gdc -f device.ini http read config_io
gdc -f device.ini http write data_in '{"a": "3.14"}'
gdc -f device.ini http record $(date +%s) data_in '{"a": "3.14"}'
gdc -f device.ini mqtt timestamp
gdc -f device.ini mqtt activate
gdc -f device.ini mqtt publish \$resource/data_in '{"a": "3.14"}'
gdc -f device.ini mqtt subscribe

日志记录

murano_client库内置了日志文件旋转器。它仅通过系统环境变量使用。它支持以下参数:

  • MURANO_CLIENT_DEBUG-不区分大小写,def故障:警告(调试信息严重)。
  • MURANO_CLIENT_LOGFILE-区分大小写,默认值:stderr,可以重写为stdout或任何文件路径。
  • MURANO_CLIENT_LOG_MAX_BYTES-整数(字节),默认值:1024000
  • MURANO_CLIENT_MAX_BACKUPS-整数(备份数),默认值:3
export MURANO_CLIENT_DEBUG=debug
export MURANO_CLIENT_LOGFILE=/var/log/murano_client.log
export MURANO_CLIENT_LOG_MAX_BYTES=$((1024*100))
export MURANO_CLIENT_MAX_BACKUPS=2

注意:任何应用程序(例如edged)都可以在运行时使用debug=<level>关键字参数覆盖MURANO_CLIENT_DEBUG参数。

测试

执行测试:

> export MURANO_HOST https://x28f1bttwbtzw0000.m2.exosite.io/
> pip install -U tox
> tox

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

推荐PyPI第三方库


热门话题
无法在Netbeans 8.2 JDK8u231中创建java Maven项目(Web应用程序)   java如何以设定的时间间隔生成随机数?   java从socket和inputStream的慢速读取   spring SCORM:Java中基于Web的SCORM播放器   Java将函数传递给方法   java绑定通用服务及其实现和子类型   java如何在运行时从选择列表框中动态选择选项?爪哇硒   java Selenium WebDriver什么是“Selenium客户端和WebDriver语言绑定”   elasticsearch需要elasticsearch高级Java客户端更新ByQueryRequest API帮助   JAVA哈希表查找最大值   WSDL操作中的java soapAction属性为空   java访问封闭类或父类方法的一般方法   eclipse在java中运行带有SeleneTestCase的ANT。lang.NoClassDefFoundError   java Hazelcast不会在节点启动时填充ReplicatedMap   如何在Java中从excel中读取特定行?   html JAVA将本地时间(GMT+8)转换为UTC时间   java将自定义端点添加到Spring数据REST存储库中,并以大摇大摆的方式显示   java计算未来位置