首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向IoTHub发送消息失败

问向IoTHub发送消息失败
EN

Stack Overflow用户
提问于 2019-08-01 12:26:57
回答 1查看 452关注 0票数 0

我一直在开发一个设备,它将一些数据发送到Azure IoT集线器,该设备在代码中的两个不同位置执行此操作。一方面,它工作得很完美,我可以通过连接字符串和传输类型MQTT_WebSocket_Only连接到集线器。

代码语言:javascript
复制
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安全通道建立信任关系“。

但是:我从来没有使用过任何授权,不是在第一部分,也不是在第二部分。

如果有人能帮我,我会很高兴的。在这个问题上,我没有发现任何这样的东西。

耽误您时间,实在对不起。迈克尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-07 05:37:39

我找到了不起作用的原因。应用了Persmissice证书策略,该策略在项目的一侧阻止证书。我禁用了它,现在它运行得非常好。

不管怎样,谢谢你的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57309062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档