2017-02-23 55 views
0

我开始使用Azure IoT集线器,并且配置了我的端点和servicehub以通过路由向其学习。 在这条线路我指定,当消息称水平=关键,它将该消息转发给我的端点就像下面的链接解释说:https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-csharp-csharp-process-d2cAzure路由在过滤查询后没有转发到enpoint

不同的是,我用我自己的代码为我的温度传感器与编程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”:“ -23T05:34:00.4544388-08:00“,”measurename“:”LightSensor“,”level“:”critical“}

消息在IOT集线器中接收但未转发给端点。 我在做什么错?你无法查询json对象消息吗?如果是这种情况,那么你怎么做呢?我不想发送不必要的消息。

谢谢。

+0

看来,湛蓝的过程Json的不同?当我在其他地方测试json时,json是有效的,但是在Azure中,我得到: “您的物业包无效JSON” 希望我很快就能找到它并发布解决方案。 – Tvt

回答

0

看来这是发送消息时编码的问题。

我用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");