'Azure Message Routing: JSON message in wrong format

I'm working with a raspberry pi zero and Python to send and recieve sensor data with Azure IoT. I've already created an endpoint and message routing to the storage container. But when I check the JSON-Files in the container, I've got two problems:

  • The file include various general data which i don't need
  • My message body is in Base24-format

My message looks like this:

{"EnqueuedTimeUtc":"2021-06-25T13:03:25.7110000Z","Properties":{},"SystemProperties":{"connectionDeviceId":"RaspberryPi","connectionAuthMethod":"{"scope":"device","type":"sas","issuer":"iothub","acceptingIpFilterRule":null}","connectionDeviceGenerationId":"637555519600003402","enqueuedTime":"2021-06-25T13:03:25.7110000Z"},"Body":"eyJ0ZW1wZXJhdHVyZSI6IDI4Ljk1LCAicHJlc3N1cmUiOiA5ODEuMDg2Njk1NDU5MzMyNiwgImh1bWlkaXR5IjogNDYuMjE0ODE3NjkyOTEyODgsICJ0aW1lIjogIjIwMjEtMDYtMjUgMTQ6MDM6MjUuNjMxNzk1In0="}

The body included my sensor data in Base64-format. I've already read about contentType = application/JSON and contentEncoding = UTF-8 so that Azure can work with correct JSON files. But where do i apply these settings? When I apply it to the routing query, I get the following error:

Routing Query Error (The server didn't understand your query. Check your query syntax and try again)

I just want to get the body-message in correct JSON Format.

Thank you all for any kind of help! Since it's my first experience with this kind of stuff, I'm a little helpless.



Solution 1:[1]

Zero clue if this helps, but here is my code for sending data from Raspberry Pi Python to AWS - Parse Server using base64/JSON. The only reason I use base64 is to send pictures. You should only have to use JSON to send your other data.

    import requests
    import random, time
    import math
    import json
    import Adafruit_DHT
    import base64
    from Adafruit_CCS811 import Adafruit_CCS811
    from picamera import PiCamera
    from time import sleep


    DHT_SENSOR = Adafruit_DHT.DHT22
    DHT_PIN =4
    ccs =  Adafruit_CCS811()
    camera = PiCamera()


    while True:
       time.sleep(5)
       camera.start_preview()
       sleep(5)
       camera.capture('/home/pi/Desktop/image.jpg')
       camera.stop_preview()
       with open('/home/pi/Desktop/image.jpg', 'rb') as binary_file:
           binary_file_data = binary_file.read()
           base64_encoded_data = base64.b64encode(binary_file_data)
           base64_message = base64_encoded_data.decode('utf-8')
       humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
       ccs.readData()
       parseServer = {
           "temp": temperature,
           "humid": humidity,
           "co2": ccs.geteCO2(),
           "pic": base64_message
       }
       resultJSON = json.dumps(parseServer)

       headers = {
       'X-Parse-Application-Id': 'myappID',
       'Content-Type': 'application/json',
       }

       data = resultJSON
       response = 
       requests.put('http://1.11.111.1111/parse/classes/Gamefuck/TIuRnws3Ag', 
       headers=headers, data=data)

       print(data)

Solution 2:[2]

If you're using the Python SDK for Azure IoT, sending the message as UTF-8 encoded JSON is as easy as setting two properties on your message object. There is a good example here

msg.content_encoding = "utf-8"
msg.content_type = "application/json"

Furthermore, you don't need to change anything in IoT Hub for this. This message setting is a prerequisite to be able to do message routing based on the body of the message.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 George Thornburg
Solution 2 Matthijs van der Veer