目标:使用节点模块 azure-iot-hub 从浏览器(angular2)创建azure iot集线器设备。
问题: 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 < / em>的
问题:
答案 0 :(得分:2)
azure-iothub节点模块是服务客户端SDK,用于创建将用于管理IoT Hub实例的后端应用程序,而非用于设备。
在设备方面,您需要使用设备客户端SDK模块azure-iot-device。 也就是说,即使你解决了各种依赖问题,即你所发现的,因为IoT Hub服务并不支持CORS意味着它不会接受来自Web客户端的请求,因此仍然无法解决问题。 CORS对IoT Hub的支持在我们的积压中,但尚未确定优先顺序,因此我们没有ETA。
您可以尝试解决此限制的方法是在网站后端运行设备客户端节点模块,在新的Web浏览器客户端连接到您的站点时创建设备客户端的新实例。
答案 1 :(得分:0)
库https://github.com/PeculiarVentures/webcrypto-liner将为您提供一个可以在浏览器中使用的加密对象(甚至是下层/ IE)https://github.com/PeculiarVentures/node-webcrypto-ossl将为您提供一个Node。
切换到webcrypto应该没有问题,请参阅https://github.com/diafygi/webcrypto-examples#hmac以获取如何拨打电话的示例。