After writing Swarm Space – Payload Formatter Debugging I then tested it creating a new payload formatter for my new Swarm Asset Tracker.
The Swarm Asset Tracker has a slightly different payload to the Swarm Eval Kit which is detailed in the product manual.
The first message sent shortly after I powered up the device had the latitude and longitude of Null Island
The Asset Tracker UserApplicationId is 65002 and the payload is similar to the Swarm Eval Kit. I created some message payloads (location of Christchurch Cathedral) for testing.
The JSON payload sent by my Swarm Asset Tracker
{
"dt": 1677396395,
"lt": -43.5333,
"ln": 172.6333,
"al": 25,
"sp": 0,
"hd": 126,
"gj": 92,
"gs": 1,
"bv": 4103,
"tp": 20,
"rs": -110,
"tr": -107,
"ts": 3,
"td": 1677396357,
"hp": 166,
"vp": 187,
"tf": 36526
}
The Base64 representation of the payload sent by my Swarm Asset Tracker
ew0KICAiZHQiOiAxNjc3Mzk2Mzk1LA0KICAibHQiOiAtNDMuNTMzMywNCiAgImxuIjogMTcyLjYzMzMsDQogICJhbCI6IDI1LA0KICAic3AiOiAwLA0KICAiaGQiOiAxMjYsDQogICJnaiI6IDkyLA0KICAiZ3MiOiAxLA0KICAiYnYiOiA0MTAzLA0KICAidHAiOiAyMCwNCiAgInJzIjogLTExMCwNCiAgInRyIjogLTEwNywNCiAgInRzIjogMywNCiAgInRkIjogMTY3NzM5NjM1NywNCiAgImhwIjogMTY2LA0KICAidnAiOiAxODcsDQogICJ0ZiI6IDM2NTI2DQp9
The initial version of my payload formatter
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json.Linq;
public class FormatterUplink : PayloadFormatter.IFormatterUplink
{
public JObject Evaluate(IDictionary<string, string> properties, uint organisationId, uint deviceId, byte deviceType, ushort userApplicationId, JObject payloadJson, string payloadText, byte[] payloadBytes)
{
JObject telemetryEvent = new JObject();
if ((payloadText != "") && (payloadJson != null))
{
JObject location = new JObject();
location.Add("lat", payloadJson.GetValue("lt"));
location.Add("lon", payloadJson.GetValue("ln"));
location.Add("alt", payloadJson.GetValue("al"));
telemetryEvent.Add("DeviceLocation", location);
}
// Course & speed
telemetryEvent.Add("Course", payloadJson.GetValue("hd"));
telemetryEvent.Add("Speed", payloadJson.GetValue("sp"));
// Battery voltage
telemetryEvent.Add("BatteryVoltage", payloadJson.GetValue("bv"));
// RSSI
telemetryEvent.Add("RSSI", payloadJson.GetValue("rs"));
properties.Add("iothub-creation-time-utc", DateTimeOffset.FromUnixTimeSeconds((long)payloadJson.GetValue("dt")).ToString("s", CultureInfo.InvariantCulture));
return telemetryEvent;
}
}
The PayloadFormatterMaintenanceApplication command line I used for testing my Swarm Asset Tracker payload formatter
The console output of my Swarm Asset Tracker payload formatter

The PayloadFormatterMaintenanceApplication is better than trying to debug a payload formatter in a staging/production environment.
Currently the payload formatters still have to be manually uploaded to the application’s Azure Blob Storage for final testing.



