murano设备客户端是与外部murano平台通信的主要库。
murano-client的Python项目详细描述
用于快速测试、评估和编写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 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-打开或关闭日志记录。有效值是字符串值DEBUG、INFO、WARNING、ERROR和CRITICAL。
下面的应用程序使用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_token。Device类将在激活后设置/保存它。
# 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