lethingaccesssdk/thing_access.py (247 lines of code) (raw):

#!/usr/bin/env python3 # -*- coding:utf-8 -*- import os import json import logging from leda_python import leda class ThingCallback(leda.BaseDeviceCallback): ''' 根据真实设备,命名一个类(如Demo_device)继承ThingCallback。 然后在Demo_device中实现callServiceset, getProperties和setProperties三个函数。 ''' def callService(self, name, input): ''' 调用设备服务函数 parameter: param name[string]: 方法名 param input[dict]: 方法参数, eg: { 'args1': 'xxx', 'args2': 'yyy', ... } return: code[int]: 若获取成功则返回LEDA_SUCCESS, 失败则返回错误码 output[dict]: 返回值, eg: { 'key1': 'xxx', 'key2': 'yyy', ... } ''' raise Exception("callService is empty") def getProperties(self, input): ''' 获取设备属性函数 param input[list]: 获取属性列表,eg:[property1,property2 ...] return: code[int]: 若获取成功则返回LEDA_SUCCESS, 失败则返回错误码 output[dict]: 属性返回值, eg: { 'property1': 'xxx', 'property2': 'yyy', ... } ''' raise Exception("getProperties is empty") def setProperties(self, input): ''' 设置设备属性的函数 param input[dict]:设置属性值, eg: { 'property1':'xxx', 'property2':'yyy', ... } return: code[int]: 若获取成功则返回LEDA_SUCCESS, 失败则返回错误码 output[dict]: 数据内容自定义,若无返回数据,则值空:{} ''' raise Exception("setProperties is empty") class ThingAccessClient(object): ''' 设备接入客户端类,用户主要通过它操作设备上下线和主动上报设备属性或事件 ''' def __init__(self, config=None): ''' 构造函数,使用设备的指定的ProductKey和DeviceName ''' self._ThingAccess = leda_handler if config is not None and isinstance(config, dict): if "productKey" in config and "deviceName" in config: self.pk = config["productKey"] self.dn = config["deviceName"] else: logging.error("config is error") self.pk = None self.dn = None else: logging.error("can't init ThingAccessClient, parameter is error") self.pk = None self.dn = None self.device = None def getTsl(self): ''' get tsl string return: deviceTsl[string]: device TSL ''' try: deviceTsl = self._ThingAccess.getTSL(self.pk) except Exception as e: logging.error("get TSL failed") return None return deviceTsl def getTslConfig(self): ''' get tsl config string return: deviceTslConfig[string]: device TSL config ''' try: deviceTsl = self._ThingAccess.getTSLConfig(self.pk) except Exception as e: logging.error("get TSL Config failed") return None return deviceTsl def getTslExtInfo(self): ''' get tsl config string return: deviceTslConfig[string]: device TSL config ''' try: deviceTsl = self._ThingAccess.getTSLConfig(self.pk) except Exception as e: logging.error("get TSL Config failed") return None return deviceTsl def registerAndOnline(self, callback): ''' device online param callback[ThingCallback]: ThingCallback object ''' return self.registerAndonline(callback) def registerAndonline(self, callback): ''' device online param callback[ThingCallback]: ThingCallback object ''' subdevice = None if self.dn is None or self.pk is None: logging.error("product key or device name is None") return None subdevice = self._ThingAccess.deviceRegister(self.dn, self.pk, '{}', callback) self.device = subdevice return subdevice def unregister(self): ''' device unregister ''' if self.device is not None: self._ThingAccess.deviceUnregister(self.device) def online(self): ''' device online ''' if self.device is not None: self.device.online() else: logging.error("plese register and online firstly\n") def offline(self): ''' device offline ''' if self.device is not None: self.device.offline() def reportProperties(self, propertiesDict): ''' report Property param propertiesDict[dict]:report property, eg: { 'property1':'xxx', 'property2':'yyy', ... } ''' if self.device is not None: self.device.reportProperties(propertiesDict) else: logging.error("plese register and online firstly") def reportEvent(self, eventName, eventDict): ''' report event param eventName[string]: Event name param eventDict[dict]: report event, eg: { "key1": 'xxx', "key2": 'yyy', ... } ''' if self.device is not None: self.device.reportEvent(eventName, eventDict) else: logging.error("plese register and online firstly") def cleanup(self): self.offline() del (self) class Config(object): def __init__(self, config=None): self.config = config def getDriverInfo(self): ''' get global driver info under driver return: driverInfo[dict]: driver Info ''' return _driverInfo def getThingInfos(self): ''' get device list under driver return: Thing infos[dict]: device List ''' return _thingInfos def getConfig(): ''' get config under driver return: config[str]: config ''' if _driverInfo is None: config = {"deviceList": _thingInfos} else: config = { "config": _driverInfo, "deviceList": _thingInfos} return json.dumps(config) _thingInfos = [] _driverInfo = None device_name = os.environ.get("FUNCTION_ID") leda_handler = leda.LedaModule() if device_name is not None: leda_handler.moduleInit(device_name) try: _config_info = leda_handler.getConfig() configinfo = json.loads(_config_info) if "config" in configinfo: _driverInfo = configinfo["config"] if "deviceList" in configinfo: devices = configinfo["deviceList"] for i in range(0, len(devices)): config = {} config['productKey'] = devices[i].get('productKey') pk = config['productKey'] config['deviceName'] = devices[i].get('deviceName') dn = config['deviceName'] if 'custom' in devices[i]: config['custom'] = devices[i].get('custom') _thingInfos.append(config) except Exception as e: logging.error("get config failed, %s", e) else: logging.error("can't get driver name") try: config_env = {"deviceList": _thingInfos} os.environ["FC_DRIVER_CONFIG"] = json.dumps(config_env) except Exception as e: logging.error("set env config failed, %s", e)