1function ArrayToString(fileData) {
2    var dataString = "";
3    for (var i = 0; i < fileData.length; i++) {
4        dataString += String.fromCharCode(fileData[i]);
5    }
6
7    return dataString;
8}
9
10console.log('mqtt: testing mqtt...');
11
12var mqtt = require('mqtt');
13if (!(mqtt && mqtt.createClient)) {
14    throw new Error("mqtt: [failed] require(\'mqtt\')");
15}
16
17console.log('mqtt: [success] require(\'mqtt\')');
18
19function testUnsubscribe() {
20    return new Promise(function (resolve, reject) {
21        mqttClient.subscribe({
22            topic: '/amp-test',
23            success: function () {
24                console.log('mqtt: [success] mqtt subscribe');
25                mqttClient.unsubscribe({
26                    topic: '/amp-test',
27                    success: function () {
28                        console.log('mqtt: [success] mqtt unsubscribe');
29                        resolve();
30                    },
31                    fail: function () {
32                        console.log('mqtt: [failed] mqtt unsubscribe');
33                        reject();
34                    }
35                });
36            },
37            fail: function () {
38                console.log('mqtt: [failed] mqtt subscribe');
39                reject();
40            }
41        });
42    });
43}
44
45function testOnMessage() {
46    return new Promise(function (resolve, reject) {
47        var testTopic = '/amp-hello';
48        var recvCnt = 0, sendCnt = 0;
49        var defaultMessage = 'AMP mqtt reply';
50        mqttClient.subscribe({
51            topic: testTopic
52        });
53        mqttClient.on('message', function (topic, payload) {
54            recvCnt++;
55            console.log('mqtt: [debug] mqtt on message, topic[' + topic + ']: ' + ArrayToString(payload) + ', cnt: ' + recvCnt);
56
57            if (!topic || typeof topic !== 'string' || !payload || typeof payload !== 'object') {
58                console.log("mqtt: [failed] mqtt on(\'message\')");
59                reject();
60            }
61
62            if (topic !== testTopic || ArrayToString(payload) !== defaultMessage) {
63                console.log("mqtt: [failed] mqtt on(\'message\')");
64                reject();
65            }
66            if (recvCnt >= 10) {
67                mqttClient.close();
68                console.log('mqtt: [success] mqtt.on(\'message\')');
69                console.log('mqtt: testing mqtt success');
70                resolve();
71            }
72        });
73
74        setTimeout(function () {
75            if (recvCnt != 10) {
76                console.log('mqtt: [failed] mqtt on message');
77                reject();
78            }
79        }, 12000);
80
81        var intervalHandle = setInterval(function () {
82            mqttClient.publish({
83                topic: testTopic,
84                message: defaultMessage,
85                success: function () {
86                    sendCnt++;
87                    console.log("mqtt: [debug] publish success, cnt: ", sendCnt);
88                    if (sendCnt >= 10) {
89                        clearInterval(intervalHandle);
90                        console.log('mqtt: [success] mqtt.publish()');
91                        resolve();
92                    }
93                },
94                fail: function () {
95                    console.log("mqtt: [failed] mqtt.publish()");
96                    reject();
97                }
98            });
99        }, 1000);
100    });
101}
102
103function onConnect() {
104    testUnsubscribe().then(function () {
105        return testOnMessage().then(function () {
106            console.log('mqtt: testing mqtt success');
107        });
108    }).catch(function () {
109        console.log('mqtt: testing mqtt failed');
110    });
111}
112
113var mqttClient = mqtt.createClient({
114    host: 'mqtt.eclipse.org',
115    port: 1883,
116    username: 'aiot',
117    password: '123',
118    success: function () {
119        console.log('mqtt: [debug] mqtt connected');
120    },
121    fail: function () {
122        console.log('mqtt: [debug] mqtt connect failed');
123    }
124});
125
126mqttClient.on('connect', function () {
127    console.log('mqtt: [success] mqtt.on(\'connect\')');
128    onConnect();
129});
130
131mqttClient.on('disconnect', function () {
132    console.log('mqtt: [success] mqtt.on(\'disconnect\')');
133});
134
135mqttClient.on('close', function () {
136    console.log('mqtt: [success] mqtt.on(\'close\')');
137});