2015-11-17 70 views
0


我嘗試從具有「EventHubReceiver」(Device2Cloud)的設備接收消息。每個設備應該有它自己的單個接收器。

那麼是不是所有的設備創建(每個分區)一個單一EventHubReceiver一個問題:Azure IoT Hub - 使用多個EventHub接收器接收來自不同設備的事件

string iotHubconnectionString = CloudConfigurationManager.GetSetting("Microsoft.IotHub.ConnectionStringPayed"); 
string iotHubD2cEndpoint = "messages/events"; 
EventHubClient eventHubClient = EventHubClient.CreateFromConnectionString(iotHubconnectionString, iotHubD2cEndpoint); 
EventHubRuntimeInformation runtimeInformation = eventHubClient.GetRuntimeInformation(); 

如果我當時想從我做以下步驟客戶端接收郵件:

EventHubReceiver eventHubReceiver = eventHubClient2.GetDefaultConsumerGroup().CreateReceiver(partition); //Get the partitions via the runtimeInformation: string[] partitions = runtimeInformation.PartitionIds; 
var incommingMessage = eventHubReceiver.ReceiveAsync(); //Wait here for incomming messages 

工作正常,但是所有「設備」中的所有消息都到達此「EventHubReceiver」。我想有多個接收器,只接收來自單個設備的消息。
我試圖更改以下代碼行:

string iotHubD2cEndpoint = "messages/events"; 

string iotHubD2cEndpoint = "devices/{deviceID}/messages/events"; 

但不起作用沒事。我得到以下錯誤:

The link address 'devices/secondDevice/messages/events/$management' did not match any of the expected formats. Supported formats: '/$cbs', '/devices/{deviceid}/messages/events', '/devices/{deviceid}/messages/deviceBound', '/messages/deviceBound', '/messages/serviceBound/feedback', '/messages/events/*'. 

所以問題是,我得到'devices/secondDevice/messages/events/$management'
insted的的'devices/secondDevice/messages/events/'
我不知道,它是否僅僅是不可能爲每個設備或我一個EventHubReceiver代碼或思想中有錯誤。

回答

2

當設備將遙測數據發送到IoT Hub時,這些事件可用於雲中與「事件集線器兼容」相關的D2C端點。 它具有「事件中心樣」行爲,因此我們可以使用EventHubReceiver獲取消息。 但是,事件集線器在分區中工作,並且可以按循環方式將傳入消息分配給分區或散列分區鍵。 在IoT Hub體系結構中,我不知道它是否使用輪循機制,但它可能用於散列設備ID(作爲分區鍵),以使設備中的所有消息進入分區。這並不意味着該分區僅包含該設備的消息!每個設備都有一個分區是不可能的:-) 因此......一個分區包含來自不同設備的混合消息(但來自特定設備的消息始終在同一分區中)。事件集線器接收器可以從分區讀取,以便從更多設備獲取所有消息。您需要根據設備ID區分它們。

+0

他,你喜歡回答我的問題:D ... – Franklin84

+0

我已經回答了其他任何問題嗎?太好了! :-)你覺得最後一個有用嗎? – ppatierno

+0

只是幾天前:http://stackoverflow.com/questions/33689947/azure-iot-hub-feedbackreceiver-receiveasync-is-very-slow-15-seconds-high-laten – Franklin84

0

我忘了提,我已經有了一個解決方案。但它是不是很漂亮:

  • 所有deviceThreads(每個分區和設備)等在一個點(「WaitOne的」)(鎖定用的AutoResetEvent)
  • 我收到一個接收器
  • 所有消息
  • 我把消息放入每個設備(包含作爲設備的對象(id和分區)作爲關鍵字的字典,並作爲值列表
  • 我使用「set」命令設置了一個單獨的線程集。
  • 線程查看其隊列:
    • 如果在繼續隊列中的消息,並且以「產量回歸」返回結果 - >再次新消息
  • 等待
    • 否則它設置一個不同的線程費,並返回到凍結狀態

所有線程在一段時間內循環(true)等待消息。 該解決方案正在工作,但它看起來並不是非常高效(具有很多線程)並且有點複雜。