-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhub.py
More file actions
104 lines (73 loc) · 3.01 KB
/
hub.py
File metadata and controls
104 lines (73 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import importlib
import json
import geohash
import os
import sys
DEV_ID = ''
RAW_DATA = ''
root = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, root)
def get_node_info(dev_id):
node_file = os.path.join(root, 'nodes', dev_id + '.json')
print(node_file)
f = open(node_file)
node = json.load(f)
return node
def load_data_parser(parser_module_name):
parser_path = 'plugin.parser.' + parser_module_name
parser = importlib.import_module(parser_path)
return parser
def load_device_define(dev):
dev_file = os.path.join(root, 'devices', dev + '.json')
print(dev_file)
f = open(dev_file)
dev = json.load(f)
return dev
def mapping_node_data(dev, node, dev_id, data):
node_structure = {"device": {"id": dev_id, "latitude": None, "longitude": None, "geohash": None}, "sensors": {}}
if node['node_conf']['ref_latitude'] and node['node_conf']['ref_longitude']:
node_structure['device']['latitude'] = node['node_conf']['ref_latitude']
node_structure['device']['longitude'] = node['node_conf']['ref_longitude']
node_structure['device']['geohash'] = geohash.encode(node['node_conf']['ref_latitude'], node['node_conf']['ref_longitude'])
# print(len(PARSE_DATA), len(DEV_DATA['sensor_conf']))
if type(data) == dict:
i = 0
for k, v in data.items():
node_structure['sensors']['field_%d' % i] = {}
node_structure['sensors']['field_%d' % i]['key'] = dev['sensor_conf'][k]['field']
node_structure['sensors']['field_%d' % i]['value'] = eval(dev['sensor_conf'][k]['type'])(v)
i += 1
elif type(data) == list:
if len(data) == len(dev['sensor_conf']):
for k, v in enumerate(data):
k = k + 1
node_structure['sensors']['field_%d' % k] = {}
node_structure['sensors']['field_%d' % k]['key'] = dev['sensor_conf']['field_%d' % k]['field']
node_structure['sensors']['field_%d' % k]['value'] = eval(dev['sensor_conf']['field_%d' % k]['type'])(v)
else:
print('Unknown data type:', type(data))
return node_structure
def load_data_forwarder(forwarder_module_name):
forwarder_path = 'plugin.forwarder.' + forwarder_module_name
forwarder = importlib.import_module(forwarder_path)
return forwarder
def process(dev_id, raw_data):
node = get_node_info(dev_id)
dev = load_device_define(node['node_conf']['device'])
print(dev)
print()
if node['node_conf']['parser']:
parser = load_data_parser(node['node_conf']['parser'])
parse_data = parser.parse(raw_data)
else:
parse_data = raw_data
print(parse_data)
print()
node_data = mapping_node_data(dev, node, dev_id, parse_data)
print(json.dumps(node_data, indent=4, sort_keys=True))
print()
if node['node_conf']['forwarder']:
forwarder = load_data_forwarder(node['node_conf']['forwarder'])
ret = forwarder.forward(node_data)
if __name__ == "__main__":
process(DEV_ID, RAW_DATA)