使用来自后端的Websockets上的MQTT连接到AWS IoT

时间:2018-01-04 19:47:09

标签: javascript websocket mqtt aws-iot aws-sdk-ios

我正在尝试从服务器端建立与AWS IoT的连接。我不想通过浏览器客户端连接到AWS IoT。

为了提供更多上下文,我模拟了一个设备(当前只是一个浏览器客户端),它接受输入并通过Websockets将其发送到我的服务器。从那里,我想获取该输入,并通过MQTT通过websockets将其发送到AWS IoT(或其他方式)。

由于我的设备仅限于通过Websockets通过其他协议进行通信,因此我的客户端不可能通过websockets直接通过MQTT。

将此视为协议转换器,或者只是将接收到的消息从一个套接字隧道传送到另一个套接字并将其交给另一个套接字。

(客户端)----通过ws发送消息----> (服务器)----使用MQTT --->(AWS IOT)发送消息

我希望这是有道理的。 我已成功运行了很多示例(我的第一个代码段连接到test.mosquitto.org),并且有mqttjs和AWS IoT sdk。在这个阶段,我正在努力使连接在我想要如何使用它的环境中正常工作。

非常感谢任何建议或意见。

我的第一个代码片段是我目前正在尝试的(以及我认为最可行的)

var options = {
    clientId : 1,
    endpoint: 'xxxxxxxxxx.iot.xxxxxxxxxx.amazonaws.com',
    accessKey: 'xxxxxxxxxx',
    secretKey: 'xxxxxxxxxxxxxxxxxxxx',
    regionName: 'xxxxxxxxxx',
    debug: true
};


var client = _mqtt.connect('ws://xxxxxxxxxx.iot.xxxxxxxxxx.com', options);
//var client  = _mqtt.connect('mqtt://test.mosquitto.org');

client.on('connect', function () {
    console.log("MQTT connected");
    client.subscribe('testing')
    client.publish('testing', 'Hello mqtt2')
})

client.on('message', function (topic, message) {
    // message is Buffer
    console.log(message.toString())
    client.end()
})

这是我其他失败的尝试之一。至少这一个提供了一个错误。

var device = awsIot.device({
    keyPath: './certs/xxxxxxxxxx-private.pem.key',
    certPath: './certs/xxxxxxxxxx-certificate.pem.crt',
    caPath: './certs/root-CA.crt',
    clientId: 1,
    debug: true,
    host: 'xxxxxxxxxx.iot.xxxxxxxxxx.amazonaws.com'
});

//
// Device is an instance returned by mqtt.Client(), see mqtt.js for full
// documentation.
//
device
    .on('connect', function() {
        console.log('connect');
        device.subscribe('topic_1');
        device.publish('topic_2', JSON.stringify({ test_data: 1}));
    });

device
    .on('message', function(topic, payload) {
        console.log('message', topic, payload.toString());
    });

这是输出/错误

{ keyPath: './certs/xxxxxxxxxx-private.pem.key',
  certPath: './certs/xxxxxxxxxx-certificate.pem.crt',
  caPath: './certs/root-CA.crt',
  clientId: 1,
  debug: true,
  host: 'xxxxxxxxxx.iot.xxxxxxxxxx.amazonaws.com',
  keepalive: 300,
  username: '?SDK=JavaScript&Version=2.2.0',
  reconnectPeriod: 1000,
  fastDisconnectDetection: true,
  resubscribe: false,
  protocol: 'mqtts',
  port: 8883,
  key: <Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 52 53 41 20 50 52 49 56 41 54 45 20 4b 45 59 2d 2d 2d 2d 2d 0a 4d 49 49 45 70 41 49 42 41 41 4b 43 41 51 45 41 32 42 ... >,
  cert: <Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 43 45 52 54 49 46 49 43 41 54 45 2d 2d 2d 2d 2d 0a 4d 49 49 44 57 54 43 43 41 6b 47 67 41 77 49 42 41 67 49 55 53 33 ... >,
  ca: <Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 43 45 52 54 49 46 49 43 41 54 45 2d 2d 2d 2d 2d 0d 0a 4d 49 49 45 30 7a 43 43 41 37 75 67 41 77 49 42 41 67 49 51 47 ... >,
  requestCert: true,
  rejectUnauthorized: true }
attempting new mqtt connection...
net.js:617
    throw new TypeError('invalid data');
    ^

TypeError: invalid data
    at TLSSocket.Socket.write (net.js:617:11)

1 个答案:

答案 0 :(得分:0)

发现了问题!

我得到了第一个提议的代码片段:

  • clientId未封装在引号
  • 我没有在AWS IoT控制台上为我现有的Thing添加策略

我仍然对我的第二次尝试是否可能感到好奇,所以如果您有任何建议,请提供见解。