1

我正在尝试使用 Azure IoT Hub Device SDK for Node 来监听存储帐户事件中的新 blob(或任何官方名称)。我正在关注这个示例

我已开启接收通知:

门户截图

但是,当我将文件添加到该容器时,客户端 SDK 什么也得不到。

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

如果我发送一条云到设备的消息(也来自 Portal 刀片),它会顺利通过,我可以在console.log().

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

4

2 回答 2

1

您似乎希望在云到设备的消息通道上接收文件上传通知。这不是这些通知出现的地方。

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

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

Device SDK 上传完成后,会调用该uploadToBlob方法的回调。

来自示例

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 。使用客户端获取“文件通知接收器”,然后监听该对象的“消息”事件。

示例的来源

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');
            }
          });
        });
      }
    });
  }
});
于 2017-11-10T19:26:18.393 回答
0

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

有关 Azure 事件网格的更多详细信息,请参见此处,事件驱动的 Blob 存储请参见此处

以下屏幕片段显示了从设备上传文件后我的订阅者(Azure 函数)中的事件消息示例。请注意,对于此示例(出于演示目的),设备使用 REST Api 调用来处理上传文件,请在此处查看更多详细信息。

在此处输入图像描述

于 2017-11-10T21:36:26.323 回答