Я пытаюсь получить данные из Azure IoT Hub в свое приложение Unity. У меня проблемы с URI.
Во-первых, общая картина - это малиновый пи, отправляющий данные о температуре в IoT-концентратор Azure (благодаря IoT-концентратору Azure для устройств Python SDK). My Unity, благодаря Azure Event Hub .NET SDK подключается к конечной точке концентратора событий моего IoT-концентратора Azure для получения данных о температуре.
Я изменил пример кода на c #, предоставляемый Azure, чтобы он работал с Unity. Но когда я играю в приложение, у меня появляется сообщение об ошибке «Invalid Uri».
Сообщение об ошибке:
UriFormatException: неверный URI: недопустимая схема URI.
System.Uri.CreateThis (System.String uri, System.Boolean dontEscape, System.UriKind uriKind) (в: 0)
System.Uri..ctor (System.String uriString) (по адресу: 0)
deviceToCloud + d__6.MoveNext () (в разделе Ресурсы / Сценарии / deviceToCloud.cs: 89)
Rethrow as AggregateException: произошла одна или несколько ошибок.
System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0)
System.Threading.Tasks.Task.Wait (System.Int32 миллисекундыTimeout, System.Threading.CancellationToken cancellationToken) (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0)
System.Threading.Tasks.Task.Wait () (в <1f0c1ef1ad524c38bbc5536809c46b48>: 0)
deviceToCloud.Start () (в разделе Активы / Сценарии / deviceToCloud.cs: 121)
Кто-нибудь имеет представление об этой ошибке и как ее исправить?
Речь идет о конечной точке?
Спасибо за помощь!
Вот код.
public class deviceToCloud : MonoBehaviour
{
// Event Hub-compatible endpoint
private readonly static string s_eventHubsCompatibleEndpoint = "Endpoint=sb://xxx.servicebus.windows.net/;SharedAccessKeyName=xxx;SharedAccessKey=xxx;EntityPath=xxx";
// Event Hub-compatible name
private readonly static string s_eventHubsCompatiblePath = "xxx";
// Keys
private readonly static string s_iotHubSasKey = "xxx";
private readonly static string s_iotHubSasKeyName = "xxx";
private static EventHubClient s_eventHubClient;
// Asynchronously create a PartitionReceiver for a partition and then start
// reading any messages sent from the simulated client.
private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct)
{
// Create the receiver using the default consumer group.
// For the purposes of this sample, read only messages sent since
// the time the receiver is created. Typically, you don't want to skip any messages.
var eventHubReceiver = s_eventHubClient.CreateReceiver("$Default", partition, EventPosition.FromEnqueuedTime(DateTime.Now));
while (true)
{
if (ct.IsCancellationRequested) break;
// Check for EventData - this methods times out if there is nothing to retrieve.
var events = await eventHubReceiver.ReceiveAsync(100);
// If there is data in the batch, process it.
if (events == null) continue;
foreach (EventData eventData in events)
{
string data = Encoding.UTF8.GetString(eventData.Body.Array);
Debug.Log("Message received: " + data);
}
}
}
//private static async Task Main(string[] args)
public async Task ReadD2C()
{
Debug.Log("Fonction principale ReadD2C");
// Create an EventHubClient instance to connect to the
// IoT Hub Event Hubs-compatible endpoint.
var connectionString = new EventHubsConnectionStringBuilder(new Uri(s_eventHubsCompatibleEndpoint), s_eventHubsCompatiblePath, s_iotHubSasKeyName, s_iotHubSasKey);
s_eventHubClient = EventHubClient.CreateFromConnectionString(connectionString.ToString());
// Create a PartitionReciever for each partition on the hub.
var runtimeInfo = await s_eventHubClient.GetRuntimeInformationAsync();
var d2cPartitions = runtimeInfo.PartitionIds;
CancellationTokenSource cts = new CancellationTokenSource();
Console.CancelKeyPress += (s, e) =>
{
e.Cancel = true;
cts.Cancel();
Debug.Log("Exit");
};
var tasks = new List<Task>();
foreach (string partition in d2cPartitions)
{
tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token));
}
// Wait for all the PartitionReceivers to finsih.
Task.WaitAll(tasks.ToArray());
}
private void Start()
{
Debug.Log("Start");
ReadD2C().Wait();
}
}