当前位置: 首页 > 知识库问答 >
问题:

通过IoTHub/Xamarin App/ESP8266进行双向通信

越嘉树
2023-03-14

正在开发一个新产品,该产品将使用ESP8266、Xamarin应用程序和Azure IoTHub为客户的设备启用双向通信。

我们有C2D(云2设备)和D2C(设备2云)通信在应用程序和电除尘器上正常工作,但是我们没有找到任何关于设置IoTHub来解释传入的遥测消息、处理它们各自的“到:”字段并将它们回到C2D主题,这应该允许我们的目标设备接收它。

我们的尝试:

  1. 逻辑应用。能够触发进入队列的消息,但不确定要做什么HTTP请求才能将其转发回C2D事件中心。
  2. 我们已经成功地将每个消息转发到队列中,但是Xamarin的PCL库无法连接到Azure服务总线队列(糟糕)。

我找到了微软一名实习生为车库开门器开发直接设备到设备通信的参考资料,但她使用的库仅适用于UWP应用程序,当我们真的想瞄准iOS时,这并不方便,Android和UWP(首先选择Xamarin的原因)。

https://blogs.windows.com/buildingapps/2016/09/08/device-to-device-communication-with-azure-iot-hub/#ykPJrVE734GpSEzV.97

是否有人能够使用Azure门户触发C2D条件事件?

共有1个答案

魏臻
2023-03-14

通过与Microsoft Azure团队的一些对话,我们确定webjob与队列路由相结合是我们的最佳解决方案。

所有消息都被路由到队列,当它们到达队列时,webjob将处理该消息并使用ServiceBus消息传递对象发送该消息,以发送云到设备响应消息。

这是给任何想使用它的人的代码。

只要消息的原始发送者在代理消息中指定“To”属性,它就会被传递到注册表中的该设备。您将需要服务总线和Azure。消息传递NuGet包以使用此。此代码将复制整个消息并将整个消息发送到所需的注册表设备。

private const string queueName = "<queue_name>";
    private const string IoTHubConnectionString = "HostName=<your_host>;SharedAccessKeyName=<your_service_user>;SharedAccessKey=<your sas>";
    // This function will get triggered/executed when a new message is written 
    // on an Azure Queue called <queue_name>.
    public static void ReceiveQueueMessages(
        [ServiceBusTrigger(queueName)] BrokeredMessage message,
        TextWriter log)
    {
        if (message.To == null)
        {
            //message = null
            return;
        }
        else
        {
            //Retrieve the message body regardless of the content as a stream
            Stream stream = message.GetBody<Stream>();
            StreamReader reader;

            if (stream != null)
                reader = new StreamReader(stream);
            else
                reader = null;

            string s;
            Message serviceMessage;

            if ( reader != null )
            {
                s = reader.ReadToEnd();
                serviceMessage = new Microsoft.Azure.Devices.Message(Encoding.ASCII.GetBytes(s));
            }
            else
            {
                serviceMessage = new Microsoft.Azure.Devices.Message();
            }

            foreach (KeyValuePair<string, object> property in message.Properties)
            {
                serviceMessage.Properties.Add(property.Key, property.Value.ToString());
            }
            SendToIoTHub(message.To.ToString(), serviceMessage);
        }
    }

    static async void SendToIoTHub(string target, Microsoft.Azure.Devices.Message message)
    {
        // Write it back out to the target device

        ServiceClient serviceClient = ServiceClient.CreateFromConnectionString(IoTHubConnectionString);

        var serviceMessage = message;
        serviceMessage.Ack = DeliveryAcknowledgement.Full;
        serviceMessage.MessageId = Guid.NewGuid().ToString();

        try
        {
            await serviceClient.SendAsync(target, serviceMessage);
        }
        catch
        {
            await serviceClient.CloseAsync();
            return;
        }

        await serviceClient.CloseAsync();
    }
 类似资料:
  • 示例: bidirectional 在正常情况下, 客户端发送请求,服务器返回结果,这样一问一答的方式就是request-response rpc 模型。 但是对于一些用户, 比如 IoT 的开发者, 可能需要在某些时候发送通知给客户端。 如果客户端和服务端都配两套代码就显得多余和臃肿了。 rpcx实现了一个简单的通知机制。 首先你需要缓存客户端的连接,可能还需要将用户的ID和连接进行关联, 以便

  • 问题内容: 我正在考虑AJAX应用程序必须轮询轮询更新有多大限制,而最理想的是javascript能够建立与服务器的真正双向连接。我想知道是否存在将javascript与可以建立tcp连接的浏览器插件集成的方法,以便可以将数据传入和传出浏览器插件。 问题答案: 这是具有类似方法的实现: 套接字 它使用Java Applet,并将其API桥接到JavaScript,有趣的是… 这里是另一个: 套接字

  • 我在实现哈夫曼算法,为此我使用了一个双链表。实现需要对列表进行排序,但仅仅交换数据是不够的——我需要交换整个节点。然而,这比我预想的要复杂一些。 我使用了这个选择排序的变体,但它会导致访问冲突错误。我假设这是因为我试图访问某个空指针,这两个条件本应阻止它。 任何帮助或建议都将不胜感激。

  • 使用 Yubico OTP 进行双因素验证(服务端) 提高环境安全的第一步是提高客户端安全性(利用 PIV 进行 SSH 认证)和简化服务器上的管理任务(通过用户证书进行 SSH 认证),不过它们依然只依赖一个契机进行认证,是时候让双因素认证改变这一切了。 在远程服务器上为 SSH 或 sudo 启用双因素认证需要进行线上验证。验证服务可以选择使用由 YubiCloud 提供的 YubiHSM(硬

  • 问题内容: 通过AJAX从标准HTTP页面调用HTTPS页面(例如信用卡授权服务,例如WorldPay)是否会有问题? 我无法想象为什么会有问题,响应将是HTML页面,然后我可以将其嵌入结果窗格或类似的页面? 问题答案: 是的,这将是跨域发布,并且将被浏览器阻止。

  • 问题内容: 我有一个MySql表,我想查询其中 成对 的列在特定集中的行。例如,假设我的表格如下所示: 现在,我希望提取其中 (f1,f2) 对为(’a’,30)或(’b’,20)的行,即行2,3,4。我也希望使用“ IN”样式的过滤器来完成此操作,因为我可能有很多对要提取。如果我尝试类似的方法: 我得到IN子句中为f1和f2指定的值的笛卡尔积,即具有f1 =’a’或’b’的所有可能组合的行,以及