0

目标:使用节点模块azure-iot-hub从浏览器(angular2)创建一个 azure iot hub 设备。

问题: azure-iot-common依赖于一个包crypto,它在浏览器中不起作用。

重建步骤:

import { Component, OnInit } from '@angular/core';
let iothub = require(‘azure-iothub’);

const connectionString = ‘HostName=<my-host>.azure-devices.net;SharedAccessKeyName=<my-key-name>;SharedAccessKey=<my-key>=’;

@Component({
  selector: 'acn-shop',
  template: `
<div class="al-main">
  <div class="al-content container-fluid">
    <h1>Azure IoT Hub Devices</h1>
  </div>
</div>`
})
export class ShopComponent implements OnInit {

  constructor() {
  }

  public ngOnInit() {
    this.connect();
  }

  public connect() {
    console.log('Calling connect()');
    const registry = iothub.Registry.fromConnectionString(connectionString);
  }
}

从 Chrome 工具控制台

Error: Uncaught (in promise): TypeError: crypto.createHmac is not a function
TypeError: crypto.createHmac is not a function
    at Object.hmacHash (authorization.js:36)
    at Function.create (shared_access_signature.js:67)
    at Object.create (shared_access_signature.js:15)
    at Function.fromConnectionString (registry.js:65)
    at ShopComponent.Array.concat.ShopComponent.connect (shop.component.ts:32)
   … (goes on for a bit) ...

潜在解决方案:将加密切换到webcrypto - 需要重写azure-iot-common/lib/authorization.js

问题:

  1. 有没有人使用节点模块azure-iot-hub从浏览器创建集线器设备?
  2. 有没有人使用其他方法从浏览器创建集线器设备?
  3. 如果不回答 Q1,2 - 我的潜在解决方案是否可行?
4

2 回答 2

3

azure-iothub节点模块是服务客户端 SDK,用于创建将用于管理 IoT 中心实例的后端应用程序,而不是用于设备。

在设备方面,您需要使用设备客户端 SDK 模块azure-iot-device。也就是说,即使您解决了各种依赖问题,例如您发现的加密问题,这仍然不起作用,因为 IoT 中心服务不支持 CORS,这意味着它不会接受来自 Web 客户端的请求。对 IoT 中心的 CORS 支持在我们的待办事项中,但尚未确定优先级,因此我们没有 ETA。

您可以尝试解决此限制的方法是在网站后端运行设备客户端节点模块,当新的网络浏览器客户端连接到您的站点时创建设备客户端的新实例。

于 2017-04-17T16:03:50.513 回答
0

https://github.com/PeculiarVentures/webcrypto-liner将为您提供一个可以在浏览器中使用的加密对象(甚至是下级/IE)https://github.com/PeculiarVentures/node-webcrypto-ossl将提供你是 Node.js 的一个。

切换到 webcrypto 应该没有问题,有关如何拨打电话的示例,请参阅https://github.com/diafygi/webcrypto-examples#hmac 。

于 2017-04-13T17:38:26.513 回答