Selaa lähdekoodia

Docsify Auto Published

willin 7 vuotta sitten
vanhempi
commit
e3727f42e5
2 muutettua tiedostoa jossa 115 lisäystä ja 0 poistoa
  1. 1 0
      _sidebar.md
  2. 114 0
      experience/azure/iot-hub-route.md

+ 1 - 0
_sidebar.md

@@ -84,6 +84,7 @@
     - [CloudFlare](experience/operation/cloudflare-nginx.md)
   - Azure(Node.js)
     - [IoT Hub](experience/azure/iot-hub.md)
+    - [IoT Hub路由](experience/azure/iot-hub-route.md)
     - [Storage](experience/azure/storage.md)
     - [WebAPP](experience/azure/web-app.md)
   - 进阶

+ 114 - 0
experience/azure/iot-hub-route.md

@@ -0,0 +1,114 @@
+# Azure IoT Hub路由开发指南
+
+本章主要讲解:
+
+- 如何使用 eventhub 创建路由
+- 如何将一条设备消息同时传入两个路由进行不同的处理
+
+## 概念讲解
+
+- 事件中心(Event Hubs): 用于服务器端侦听并处理的 EventHub 终结点
+- 终结点(IOT Hub): 关联到 Event Hubs 中的事件中心
+- 路由(IOT Hub): 关联到 IOT Hub中的终结点, 处理路由分发的主要配置环节
+
+## 在 Azure 中创建并配置路由相关的基础服务
+
+首先需要分别创建 IOT Hub 和 EventHubs.
+
+### 1. 创建EventHubs事件中心
+
+![eventhub](https://user-images.githubusercontent.com/1890238/29015275-06999aa8-7b13-11e7-893c-2f75ca58bb14.png)
+
+### 2. 创建IOT Hub终结点
+
+![endpoint](https://user-images.githubusercontent.com/1890238/29015320-334b5a00-7b13-11e7-8c12-dcc4d152e6e7.png)
+
+注意这里, `状态` 初始不显示, 首次消息通讯成功后再来这里看应该会变.
+
+系统可能会存在这样的Bug, 怎么也收不到消息. 这里的状态就会一直不显示:
+
+![err](https://user-images.githubusercontent.com/1890238/29015355-4a0427c2-7b13-11e7-8a9c-24e6bc87144b.png)
+
+像这样的情况发生的时候, 删除路由,删除终结点,删除事件中心, 重头再来.
+
+### 3. 配置路由
+
+![route](https://user-images.githubusercontent.com/1890238/29015397-7cb355bc-7b13-11e7-8a65-957e76defadd.png)
+
+仔细看上图, 两个路由的查询条件一样, 但分别放进 `test`/`test2` 两个不同的终结点.
+
+## 示例代码
+
+### 服务器端
+
+```js
+// eventhub.js
+const EventHubClient = require('azure-event-hubs').Client;
+
+const getPartitionIds = async (client) => {
+  const partitionIds = await client.getPartitionIds();
+  return partitionIds;
+};
+
+const defaultErrorHandler = async (err) => {
+  console.error(err);
+};
+
+const defaultMessageHandler = (message) => {
+  console.log(message.body);
+  console.log(message.body.toString());
+};
+
+const createReceiver = async ({ connStr = '', messageHandler = defaultMessageHandler } = {}, errorHandler = defaultErrorHandler) => {
+  const client = EventHubClient.fromConnectionString(connStr);
+  await client.open();
+  const partitionIds = await getPartitionIds(client);
+  partitionIds.forEach(async (partitionId) => {
+    const receiver = await client.createReceiver('$Default', partitionId, { startAfterTime: Date.now() });
+    receiver.on('errorReceived', async (err) => {
+      if (err.transport && err.transport.name === 'AmqpProtocolError') {
+        console.log(`Restart #${partitionId}`);
+        await createReceiver({ connStr, errorHandler, messageHandler });
+      } else {
+        await errorHandler(err);
+      }
+    });
+    receiver.on('message', messageHandler);
+  });
+};
+
+module.exports = createReceiver;
+```
+
+```js
+// server.js
+const receiver = require('./eventhub');
+
+(async () => {
+  await receiver({
+    connStr: 'test事件中心的连接',
+    messageHandler: (msg) => {
+      console.log('test');
+      console.log(msg.body);
+    }
+  });
+  await receiver({
+    connStr: 'test2事件中心的连接',
+    messageHandler: (msg) => {
+      console.log('test2');
+      console.log(msg.body);
+    }
+  });
+})();
+```
+
+### 客户端模拟消息发送
+
+参考官方的示例: <https://github.com/azure/azure-iot-sdk-node/blob/master/device/samples/simple_sample_device.js#L44>
+
+注意第44行位置, 下面添加一行, 加入路由属性
+
+```js
+message.properties.add('route', 'tt');
+```
+