UNPKG

6.77 kBPlain TextView Raw
1/// <reference types="node" />
2
3import request = require('request');
4import mqtt = require('mqtt');
5import Q = require('q');
6import low = require('lowdb');
7import fs = require('fs');
8
9(function () {
10 const dir = './resource';
11 if (!fs.existsSync(dir)) {
12 fs.mkdirSync(dir);
13 }
14})();
15const db = new low('./resource/db.json');
16
17export let appID: string;
18export let appKey: string;
19export let site: string;
20let messageHandler;
21
22// kii init
23export 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// onboard gateway by owner
34export 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// onboard endnode with gateway by owner
68export 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// update endnode state
112export 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// update endnode connectivity
132export 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// retrive endnode onboarding status
155export function detectEndnodeOnboardingStatus(endNodeVendorThingID: string): boolean {
156 return !!db.get('endNodes').find({ vendorThingID: endNodeVendorThingID }).value();
157}
158
159// mqtt
160export 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
200export function setOnCommandMessage(messageHandler) {
201 this.messageHandler = messageHandler
202}
\No newline at end of file