1 |
|
2 |
|
3 | import request = require('request');
|
4 | import mqtt = require('mqtt');
|
5 | import Q = require('q');
|
6 | import low = require('lowdb');
|
7 | import fs = require('fs');
|
8 |
|
9 | (function () {
|
10 | const dir = './resource';
|
11 | if (!fs.existsSync(dir)) {
|
12 | fs.mkdirSync(dir);
|
13 | }
|
14 | })();
|
15 | const db = new low('./resource/db.json');
|
16 |
|
17 | export let appID: string;
|
18 | export let appKey: string;
|
19 | export let site: string;
|
20 | let messageHandler;
|
21 |
|
22 |
|
23 | export function init(_appID, _appKey, _site) {
|
24 | db.defaults({ app: {}, gateway: {}, endNodes: [] }).value();
|
25 | appID = _appID;
|
26 | appKey = _appKey;
|
27 | site = _site;
|
28 | db.set('app.appID', appID).value();
|
29 | db.set('app.appKey', appKey).value();
|
30 | db.set('app.site', site).value();
|
31 | }
|
32 |
|
33 |
|
34 | export function onboardGatewayByOwner(ownerToken, ownerID, vendorThingID, password, type, properties) {
|
35 | let deferred = Q.defer()
|
36 | let options = {
|
37 | method: 'POST',
|
38 | url: site + '/thing-if/apps/' + appID + '/onboardings',
|
39 | headers: {
|
40 | authorization: 'Bearer ' + ownerToken,
|
41 | 'content-type': 'application/vnd.kii.onboardingWithVendorThingIDByOwner+json'
|
42 | },
|
43 | body: JSON.stringify({
|
44 | 'vendorThingID': vendorThingID,
|
45 | 'thingPassword': password,
|
46 | 'owner': 'USER:' + ownerID,
|
47 | 'thingType': type,
|
48 | 'layoutPosition': 'GATEWAY'
|
49 | })
|
50 | };
|
51 |
|
52 | request(options, (error, response, body) => {
|
53 | if (error) deferred.reject(new Error(error))
|
54 |
|
55 | db.set('gateway.vendorThingID', vendorThingID).value()
|
56 | db.set('gateway.thingID', JSON.parse(body).thingID).value()
|
57 | db.set('gateway.accessToken', JSON.parse(body).accessToken).value()
|
58 |
|
59 | deferred.resolve({
|
60 | gatewayInfo: JSON.parse(body)
|
61 | })
|
62 | });
|
63 |
|
64 | return deferred.promise
|
65 | }
|
66 |
|
67 |
|
68 | export function onboardEndnodeByOwner(ownerToken, ownerID, endNodeVendorThingID, endNodePassword, type, properties) {
|
69 | let gatewayThingID = db.get('gateway.thingID').value();
|
70 | let deferred = Q.defer()
|
71 | let options = {
|
72 | method: 'POST',
|
73 | url: site + '/thing-if/apps/' + appID + '/onboardings',
|
74 | headers: {
|
75 | authorization: 'Bearer ' + ownerToken,
|
76 | 'content-type': 'application/vnd.kii.OnboardingEndNodeWithGatewayThingID+json'
|
77 | },
|
78 | body: JSON.stringify({
|
79 | 'endNodeVendorThingID': endNodeVendorThingID,
|
80 | 'endNodePassword': endNodePassword,
|
81 | 'gatewayThingID': gatewayThingID,
|
82 | 'endNodeThingProperties': properties,
|
83 | 'endNodeThingType': type,
|
84 | 'owner': 'USER:' + ownerID
|
85 | })
|
86 | }
|
87 |
|
88 | request(options, (error, response, body) => {
|
89 | if (error) deferred.reject(new Error(error))
|
90 |
|
91 | if (db.get('endNodes').find({ 'vendorThingID': endNodeVendorThingID }).value())
|
92 | db.get('endNodes').find({ 'vendorThingID': endNodeVendorThingID }).assign({
|
93 | vendorThingID: endNodeVendorThingID,
|
94 | accessToken: JSON.parse(body).accessToken,
|
95 | endNodeThingID: JSON.parse(body).endNodeThingID
|
96 | }).value()
|
97 | else {
|
98 | if (!db.has('endNodes').value()) db.set('endNodes', []).value();
|
99 | db.get('endNodes').push({
|
100 | vendorThingID: endNodeVendorThingID,
|
101 | accessToken: JSON.parse(body).accessToken,
|
102 | endNodeThingID: JSON.parse(body).endNodeThingID
|
103 | }).value();
|
104 | }
|
105 | deferred.resolve(JSON.parse(body))
|
106 | });
|
107 |
|
108 | return deferred.promise
|
109 | }
|
110 |
|
111 |
|
112 | export function updateEndnodeState(ownerToken, endNodeThingID, states) {
|
113 | let deferred = Q.defer()
|
114 | let options = {
|
115 | method: 'PUT',
|
116 | url: site + `/thing-if/apps/${appID}/targets/thing:${endNodeThingID}/states`,
|
117 | headers: {
|
118 | authorization: 'Bearer ' + ownerToken,
|
119 | 'content-type': 'application/json'
|
120 | },
|
121 | body: JSON.stringify(states)
|
122 | };
|
123 | request(options, (error, response, body) => {
|
124 | if (error) deferred.reject(new Error(error));
|
125 | if (response.statusCode !== 204) deferred.reject(body);
|
126 | deferred.resolve(response.statusCode);
|
127 | });
|
128 | return deferred.promise
|
129 | }
|
130 |
|
131 |
|
132 | export function updateEndnodeConnectivity(ownerToken: string, endNodeThingID: string, online: boolean) {
|
133 | let gatewayThingID = db.get('gateway.thingID').value();
|
134 | let deferred = Q.defer()
|
135 | let options = {
|
136 | method: 'PUT',
|
137 | url: site + `/thing-if/apps/${appID}/things/${gatewayThingID}/end-nodes/${endNodeThingID}/connection`,
|
138 | headers: {
|
139 | authorization: 'Bearer ' + ownerToken,
|
140 | 'content-type': 'application/json'
|
141 | },
|
142 | body: JSON.stringify({
|
143 | 'online': online
|
144 | })
|
145 | };
|
146 | request(options, (error, response, body) => {
|
147 | if (error) deferred.reject(new Error(error));
|
148 | if (response.statusCode !== 204) deferred.reject(body);
|
149 | deferred.resolve(response.statusCode);
|
150 | });
|
151 | return deferred.promise
|
152 | }
|
153 |
|
154 |
|
155 | export function detectEndnodeOnboardingStatus(endNodeVendorThingID: string): boolean {
|
156 | return !!db.get('endNodes').find({ vendorThingID: endNodeVendorThingID }).value();
|
157 | }
|
158 |
|
159 |
|
160 | export function startCommandReceiver(chainInput) {
|
161 | let deferred = Q.defer()
|
162 | let gatewayInfo = chainInput.gatewayInfo
|
163 | let mqttEndpoint = gatewayInfo.mqttEndpoint;
|
164 | let option = {
|
165 | 'port': mqttEndpoint.portTCP,
|
166 | 'clientId': mqttEndpoint.mqttTopic,
|
167 | 'username': mqttEndpoint.username,
|
168 | 'password': mqttEndpoint.password,
|
169 | 'reconnectPeriod': 55000,
|
170 | 'keepalive': 60
|
171 | }
|
172 | console.log(mqttEndpoint)
|
173 | let client = mqtt.connect('tcp://' + mqttEndpoint.host, option);
|
174 | client.on('connect', connack => {
|
175 | if (!connack.sessionPresent) {
|
176 | client.subscribe(mqttEndpoint.mqttTopic, {
|
177 | qos: 0,
|
178 | retain: false
|
179 | }, (err, granted) => {
|
180 | if (err) deferred.reject(err)
|
181 | });
|
182 | } else {
|
183 | throw new Error('error connecting to MQTT broker')
|
184 | }
|
185 | })
|
186 | client.on('error', error => {
|
187 | throw new Error(error)
|
188 | })
|
189 | client.on('message', (topic, message, packet) => {
|
190 | let i;
|
191 | let messageStr = '';
|
192 | for (i = 0; i < message.length; i++) {
|
193 | messageStr += '%' + ('0' + message[i].toString(16)).slice(-2);
|
194 | }
|
195 | messageStr = decodeURIComponent(messageStr);
|
196 | this.messageHandler(messageStr)
|
197 | })
|
198 | }
|
199 |
|
200 | export function setOnCommandMessage(messageHandler) {
|
201 | this.messageHandler = messageHandler
|
202 | } |
\ | No newline at end of file |