【问题标题】:Azure route not forwarded to endpoint after filtering query筛选查询后 Azure 路由未转发到端点
【发布时间】:2017-02-23 13:11:14
【问题描述】:

我开始使用 Azure IoT 中心,并配置了我的端点和服务中心以通过路由从中学习。 在这条路线中,我指定当消息说 level = critical 时,它将消息转发到我的端点,如以下链接中所述:https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-csharp-csharp-process-d2c

不同之处在于我使用我自己的代码作为我的温度传感器和一个编程的 DTO,并且我将它作为一个大的 json 消息发送(见代码)

DTO 类:

[DataContract]
class Bmp280DTO
{
    [DataMember]
    public Guid guid { get; set; }
    [DataMember]
    public string deviceName { get; set; }
    [DataMember]
    public float tempSensorValue { get; set; }
    [DataMember]
    public float pressureSensorValue { get; set; }
    [DataMember]
    public float altitudeSensorValue { get; set; }
    [DataMember]
    public DateTime measurementTime { get; set; }
    [DataMember]
    public string measurename { get; set; }
    [DataMember]
    public string level { get; set; }

    public Bmp280DTO() { }

    public Bmp280DTO(Guid id, String Device, float TmpSensorValue, float PrSensorValue, float AlSensorValue)
    {
        this.guid = id;
        this.deviceName = Device;
        this.tempSensorValue = TmpSensorValue;
        this.pressureSensorValue = PrSensorValue;
        this.altitudeSensorValue = AlSensorValue;

        this.measurementTime = DateTime.Now;
        this.measurename = "LightSensor";
        this.level = DetermineMessageLevel(TmpSensorValue);
    }

    public string ToJson()
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Bmp280DTO));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, this);
        string json = Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length);

        return json;

    }

    public string DetermineMessageLevel(float temperaturesensorvalue)
    {
        if(temperaturesensorvalue > 22)
        {
            return "critical";
        }
        return "normal";
    }

}

消息发送:

    private void SendBmp280Data(Bmp280DTO AzureBmp280Data)
    {
        System.Text.StringBuilder Bmp280JsonMessage = new System.Text.StringBuilder();
        Bmp280JsonMessage.Append(AzureBmp280Data.ToJson());

        MessageCommands.SendMessage(Bmp280JsonMessage.ToString());

    }

消息示例: {"guid":"xxxx","deviceName":"Bmp280Sensor","tempSensorValue":23.59763,"pressureSensorValue":98792.11,"altitudeSensorValue":213.046539,"measurementTime":"2017-02-23T05:34:00.4544388- 08:00","measurename":"LightSensor","level":"critical"}

消息在 IOT 集线器中接收,但未转发到端点。 我究竟做错了什么?您无法查询 json 对象消息吗?如果是这样的话,你怎么做呢?我不想发送不必要的消息。

【问题讨论】:

  • 好像azure对Json的处理方式不同?当我在其他地方测试 json 时,json 是有效的,但在 Azure 中我得到:“你的属性包不是有效的 JSON”希望我能尽快找到它并发布解决方案。

标签: json azure endpoints custom-routes


【解决方案1】:

这似乎是发送消息时的编码问题。

我用 UTF8 编码消息,而它需要用 ASCII 值完成。 我还可以添加消息属性以使其更加明显。

如下:

        var messageString = JsonConvert.SerializeObject(AzureBmp280Data);
        Debug.WriteLine("Message Sent: {0}", messageString, null);
        var message = new Message(Encoding.ASCII.GetBytes(messageString));
        message.Properties.Add("level", "critical");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多