繁体   English   中英

通过后端通过Websocket使用MQTT连接到AWS IoT

[英]Connecting to AWS IoT using MQTT over Websockets from the backend

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

为了提供更多的上下文,我模拟了一个设备(目前只是一个浏览器客户端),该设备接受输入并将其通过Websockets发送到我的服务器。 从那里,我想接收输入,然后通过MQSocket通过Websocket将其发送到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)

找到了问题!

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

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

我仍然对是否可以进行第二次尝试感到好奇,因此,如果您有任何建议,请务必提供见解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM