Skip to content

Commit 56b9305

Browse files
author
donghu-jiang
committed
1.hub使用单例模式;2.优化其他功能模块对log模块的引用
Change-Id: I254b407fba7e141a4061be46d32294f06684689e
1 parent 8eeb3d4 commit 56b9305

File tree

7 files changed

+48
-56
lines changed

7 files changed

+48
-56
lines changed

explorer/explorer.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,22 @@
3131
from enum import Enum
3232
from enum import IntEnum
3333
from Crypto.Cipher import AES
34-
from explorer.providers.providers import Providers
34+
from hub.hub import QcloudHub
3535
from explorer.services.template.template import Template
3636

3737
class QcloudExplorer(object):
3838

39-
def __init__(self, device_file, tls=True, userdata=None):
39+
def __init__(self, device_file, tls=True, userdata=None, domain=None, useWebsocket=False):
4040
self.__device_file = device_file
4141
self.__tls = tls
4242
""" 用户传参 """
4343
self.__userdata = userdata
44+
self.__domain = domain
45+
self.__useWebsocket = useWebsocket
4446
""" 存放用户注册的回调函数 """
4547
self.__user_callback = {}
4648

47-
self.__provider = Providers(device_file, self.__userdata, tls)
49+
self.__provider = QcloudHub(device_file, userdata, tls, domain, useWebsocket)
4850
self.__hub = self.__provider.hub
4951
"""
5052
向hub注册mqtt disconnect回调
@@ -607,7 +609,8 @@ def templateInit(self, productId, deviceName,
607609
构造对应client的template对象并加入字典
608610
"""
609611
client = productId + deviceName
610-
template = Template(self.__device_file, self.__tls, productId, deviceName, self.__logger)
612+
template = Template(self.__device_file, self.__tls, productId, deviceName,
613+
self.__userdata, self.__domain, self.__useWebsocket, self.__logger)
611614

612615
"""
613616
注册用户数据模板topic(property/action/event)对应回调

explorer/providers/__init__.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

explorer/providers/providers.py

Lines changed: 0 additions & 36 deletions
This file was deleted.

explorer/services/template/template.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
# limitations under the License.
1313

1414
import json
15-
from explorer.providers.providers import Providers
15+
# from explorer.providers.providers import Providers
16+
from hub.hub import QcloudHub
1617
from hub.utils.providers import TopicProvider
1718

1819
class Template(object):
19-
def __init__(self, device_file, tls, productId, deviceName, logger=None):
20+
def __init__(self, device_file, tls, productId, deviceName, userdata=None, domain=None, useWebsocket=False, logger=None):
2021
self.__logger = logger
21-
self.__provider = Providers(device_file, tls)
22+
# self.__provider = Providers(device_file, tls)
23+
# self.__hub = self.__provider.hub
24+
self.__provider = QcloudHub(device_file, userdata, tls, domain, useWebsocket)
2225
self.__hub = self.__provider.hub
2326

2427
self.__topic = TopicProvider(productId, deviceName)

hub/hub.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import urllib.error
2525
from enum import Enum
2626
from enum import IntEnum
27-
from hub.log.log import Log
2827
from hub.utils.codec import Codec
2928
from hub.utils.providers import TopicProvider
3029
from hub.utils.providers import DeviceInfoProvider
@@ -37,7 +36,26 @@
3736
from hub.services.shadow.shadow import Shadow
3837
from hub.services.ota.ota import Ota
3938

40-
class QcloudHub(object):
39+
class SingletonType(type):
40+
_instance_lock = threading.Lock()
41+
def __call__(cls, *args, **kwargs):
42+
if not hasattr(cls, "_instance"):
43+
with SingletonType._instance_lock:
44+
if not hasattr(cls, "_instance"):
45+
cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
46+
return cls._instance
47+
48+
class QcloudHub(metaclass=SingletonType):
49+
"""
50+
使用单例模式构建,保证对象只有一份
51+
"""
52+
def __init__(self, device_file, userdata=None, tls=True, domain=None, useWebsocket=False):
53+
self.hub = QcloudHubProvider(device_file, userdata=userdata, tls=tls, domain=domain, useWebsocket=useWebsocket)
54+
55+
def __new__(cls, *args, **kwargs):
56+
return object.__new__(cls)
57+
58+
class QcloudHubProvider(object):
4159
"""事件核心处理层
4260
作为explorer/user层与协议层的中间层,负责上下层通道建立、消息分发等事物
4361
"""
@@ -54,9 +72,9 @@ def __init__(self, device_file, userdata=None, tls=True, domain=None, useWebsock
5472
self.__log_provider = LoggerProvider()
5573
self._logger = self.__log_provider.logger
5674
self.__codec = Codec()
57-
# 确保__protocol初始化后再初始化__gateway,以便传参
5875
self.__gateway = None
59-
self.__device_info = DeviceInfoProvider(device_file, self._logger)
76+
self.__device_info = DeviceInfoProvider(device_file)
77+
6078
self.__hub_state = self.HubState.INITIALIZED
6179
self._topic = TopicProvider(self.__device_info.product_id, self.__device_info.device_name)
6280

@@ -155,7 +173,7 @@ class LoopWorker(object):
155173
""" mqtt连接管理维护 """
156174
def __init__(self, logger=None):
157175
self._connect_async_req = False
158-
self._exit_req = False
176+
self._exit_req = True
159177
self._runing_state = False
160178
self._exit_req_lock = threading.Lock()
161179
self._thread = TaskManager.LoopThread(logger)
@@ -1009,7 +1027,7 @@ def gatewayInit(self):
10091027

10101028
self.__gateway = Gateway(self.__host, self.__device_info.product_id, self.__device_info.device_name,
10111029
self.__device_info.device_secret, websocket=self.__useWebsocket,
1012-
tls=self.__tls, logger=self._logger)
1030+
tls=self.__tls)
10131031
json_data = self.__device_info.json_data
10141032
gateway_topic_sub = self._topic.gateway_topic_sub
10151033

hub/services/gateway/gateway.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@
1818
import random
1919
from enum import Enum
2020
from hub.utils.codec import Codec
21+
from hub.utils.providers import LoggerProvider
2122
from hub.utils.providers import ConnClientProvider
2223

2324
class Gateway(object):
2425
def __init__(self, host, product_id, device_name, device_secret,
25-
websocket=False, tls=True, logger=None):
26-
self.__logger = logger
26+
websocket=False, tls=True):
27+
# self.__logger = logger
28+
self.__log_provider = LoggerProvider()
29+
self.__logger = self.__log_provider.logger
2730
self.__provider = ConnClientProvider(host, product_id, device_name, device_secret,
28-
websocket=websocket, tls=tls, logger=logger)
31+
websocket=websocket, tls=tls)
2932
self.__protocol = self.__provider.protocol
3033
self.__codec = Codec()
3134

@@ -348,7 +351,7 @@ def gateway_get_subdev_bind_list(self, topic, qos, product_id, device_name):
348351
else:
349352
self.__logger.debug("client:%s %s fail" % (client_id, "get bind list"))
350353

351-
return self.__gateway_subdev_bind_list
354+
return rc, self.__gateway_subdev_bind_list
352355

353356
def gateway_get_subdev_config_list(self):
354357
"""

hub/utils/providers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,11 @@ def control_clientToken(self, token):
168168
self.__clientToken = token
169169

170170
class DeviceInfoProvider(object):
171-
def __init__(self, file_path, logger=None):
171+
def __init__(self, file_path):
172172
self.__file_path = file_path
173-
self.__logger = logger
173+
# self.__logger = logger
174+
self.__log_provider = LoggerProvider()
175+
self.__logger = self.__log_provider.logger
174176
self.__logger.info('device_info file {}'.format(file_path))
175177

176178
self.__auth_mode = None

0 commit comments

Comments
 (0)