我如何倾听"存储中的新blob"事件?

时间:2017-11-10 17:15:09

标签: node.js azure-iot-hub azure-iot-sdk

我尝试使用Azure IoT Hub Device SDK for Node来收听新的blob-in-storage-account事件(或者其他任何正式调用的事件)。我跟随this sample

我已收到通知:

portal screenshot

但是,当我向该容器添加文件时,客户端SDK什么都没有。

client.on('message', function (msg) {
   // message event does not fire
   console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
}

如果我发送云设备消息(也是来自门户网站刀片),它会很好地通过,我可以在console.log()中阅读。

我在听完全错误的事件 - message吗?

2 个答案:

答案 0 :(得分:0)

看起来您希望在云到设备的消息通道上接收文件上传通知。这不是这些通知浮出水面的地方。

Azure IoT Hub有两种类型的SDK:设备 SDK和服务 SDK。

  • 上传文件的功能位于 Device SDK azure-iot-device 包)中。
  • 监控文件上传通知(来自所有设备)的功能位于服务SDK azure-iothub 包)中。

设备 SDK中完成上传后,将调用uploadToBlob方法的回调。

source from example

var Protocol = require('azure-iot-device-mqtt').Mqtt;
var Client = require('azure-iot-device').Client;
var fs = require('fs');

var filePath = '[path/to/file]';
var client = Client.fromConnectionString(deviceConnectionString, Protocol);
fs.stat(filePath, function (err, fileStats) {
  var fileStream = fs.createReadStream(filePath);

  client.uploadToBlob('testblob.txt', fileStream, fileStats.size, function (err, result) {
    if (err) {
      console.error('error uploading file: ' + err.constructor.name + ': ' + err.message);
    } else {
      console.log('Upload successful - ' + result);
    }
    fileStream.destroy();
  });
});

如果要在设备将文件上载到Blob时侦听通知,则需要使用 Service SDK。使用客户端获取“文件通知接收器”,然后监听此对象的“消息”事件。

source for the example

var Client = require('azure-iothub').Client;
var client = Client.fromConnectionString(connectionString);

client.open(function (err) {
  if (err) {
    console.error('Could not connect: ' + err.message);
  } else {
    console.log('Client connected');

    client.getFileNotificationReceiver(function(err, receiver) {
      if(err) {
        console.error('Could not get file notification receiver: ' + err.message);
      } else {
        receiver.on('message', function(msg) {
          console.log('File uploaded: ');
          console.log(msg.data.toString());
          receiver.complete(msg, function(err) {
            if (err) {
              console.error('Could not complete the message: ' + err.message);
            } else {
              console.log('Message completed');
            }
          });
        });
      }
    });
  }
});

答案 1 :(得分:0)

除了@ pierreca-MSFT之外,还有另一个上传文件通知选项,例如使用 Azure Event Grid (今天在预览中)。在这种情况下,您的文件将上传到事件驱动的blob存储,它会自动将事件消息发布到事件网格。可以基于事件网格订阅以可靠的方式将这些事件消息分发(推送)给订户。这是一个事件驱动的推送模型。

有关Azure事件网格的更多详细信息是here以及事件驱动的blob存储here

以下屏幕截图显示了从设备上传文件后我的订阅者(Azure功能)中的事件消息的示例。请注意,对于此示例(出于演示目的),设备使用REST Api调用来处理上载文件,请参阅更多详细信息here

enter image description here