向IoTHub发送消息失败

时间:2019-08-01 12:26:57

标签: azure client azure-iot-hub

我一直在研究将数据发送到Azure IoT中心的设备 设备正在代码中的两个不同位置执行此操作。一方面,它运行良好,我可以通过连接字符串和传输类型MQTT_WebSocket_Only连接到集线器。

public static class Mqtt2IoTNew
{
    private static string _DeviceConnectionString = Properties.Settings.Default.MqttUri;

    private static TransportType _TransportType = TransportType.Mqtt_WebSocket_Only;

   public static void Send(object argEntry, bool argIsList)
    {
        var deviceClient = DeviceClient.CreateFromConnectionString(_DeviceConnectionString, _TransportType);
        deviceClient.ReceiveAsync(TimeSpan.FromSeconds(2)).Wait();

        var message = new Message(deviceClient, argEntry, argIsList);
        message.RunAsync().GetAwaiter().GetResult();
    }

}

internal class Message
{
    private DeviceClient _DeviceClient;
    private readonly string _Message;

    public Message(DeviceClient argDeviceClient, object argEntry, bool isList)
    {
        _DeviceClient = argDeviceClient;
        StringBuilder stb = new StringBuilder();
        if (isList)
        {
            foreach (var entity in (List<object>) argEntry)
            {
                stb.Append("<entity>").Append(JsonConvert.SerializeObject(entity)).Append("</entity>\n");
            }
        }
        else
        {
            stb.Append(JsonConvert.SerializeObject(argEntry));
        }
        _Message = stb.ToString();
    }

    public async Task RunAsync()
    {
        await SendEvent().ConfigureAwait(false);
    }

    private async Task SendEvent()
    {
        Microsoft.Azure.Devices.Client.Message eventMessage = new Microsoft.Azure.Devices.Client.Message(Encoding.UTF8.GetBytes(_Message));
        await _DeviceClient.SendEventAsync(eventMessage).ConfigureAwait(false);
    }
}



//Call of method that does not work
    protected override void DoOnCompleted(IRepository argRepository)
    {
        if (_CurrentlySendingTreadId.HasValue)
        {
            if (_CurrentlySendingTreadId.Value == Thread.CurrentThread.ManagedThreadId)
            {
                return;
            }
        }

        TaskFactoryProvider.GetFactory().StartNew(()=>SendBatchProtocols());
    }

    public bool SendBatchProtocols()
    {
        using (var repository = RepositoryProviderHolder.RepositoryProvider.GetRepository(Constants.CONTAINERCONTRACT_PRODUCTIONREPOSITORY))
        {
            IQueryable<BatchProtocol> batchProtocolQuery = repository.GetQuery<BatchProtocol>().OrderBy(bp => bp.InternalNoInteger);
            batchProtocolQuery = batchProtocolQuery.Where(bp => !bp.IsArchived).Take(1);

            if (!batchProtocolQuery.Any()) return false;

            var batchProtocols = batchProtocolQuery.ToList();
            IsBatchProtocolSend = false;
            try
            {
                foreach (var bps in batchProtocols)
                {
                    Mqtt2IoTNew.Send(bps,false);
                }
                IsBatchProtocolSend = true;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        return IsBatchProtocolSend;
    }

//Call of Method that does work
    private void AddEntitiesAndSaveChanges(IEnumerable argEntities)
    {
        if (argEntities == null)
        {
            return;
        }

        lock (_UnderlyingRepositoryAccessLockObject)
        {
            #region Log2DornerIoT


            if (Properties.Settings.Default.Log2DornerIoT)
            {
                List<object> entities = new List<object>();
                int i = 0;
                foreach (var entity in argEntities)
                {
                    if (i < 100)
                    {
                        entities.Add(entity);
                        i++;
                    }
                    else
                    {
                        try
                        {
                            Mqtt2IoTNew.Send(entities, true);
                        }
                        catch (Exception e)
                        {
                            throw;
                        }
                        entities.Clear();
                        i = 0;
                    }
                }
            }
        }

在代码的另一部分,我只收集相同的类以相同的方式用于发送方法,但是在这里,我得到了一个异常,该异常显示为“ TLS身份验证错误”,而内部异常为“无法连接至远程服务器”,“基础连接已关闭:无法建立SSL / TLS安全通道的信任关系”。

但是:我从来没有在第一部分中使用过任何形式的授权,而在第二部分中却没有任何作用。

如果有人可以帮助我,我将非常高兴。关于此问题,我没有发现任何帮助。

感谢您的宝贵时间。 迈克尔

1 个答案:

答案 0 :(得分:0)

我找到了它不起作用的原因。应用了Persmissice证书策略,该证书在项目的一侧阻止了证书。我禁用了它,现在可以正常使用了。
无论如何,谢谢您的帮助。