# Downlink

Downlink encoders are used to encode or "translate" a human-readable JSON object into a device-specific payload (e.g. JSON -> HEX payload).

The downlink encoder script follows a similar notation to uplink decoders, however it uses `emit('downlink', payload)` to execute a downlink.&#x20;

Using the `downlink` emit type has no effect in uplink scripts and custom logic blocks will be ignored and not further processed.

Generally, Downlinks can only be created for LoRa, NB-IoT and MQTT Devices. Downlinks for HTTP and CoAP devices are not supported at this point.

## Output Format

### LoRa Downlinks

The object needs to have a pre-defined structure as shown below.

```typescript
{
    "port": 1, // needs to 0 or any other positive integer
    "confirmed": true, // used for confirmed downlinks and is optional, default false
    "payloadHex": "hex-string" // has to be a hex-string
}
```

If this specification is not followed, an error will be thrown during the forwarding of the downlink object to the LoRaWAN carrier.

### MQTT Downlinks

The object needs to have a pre-defined structure as shown below.

```typescript
{
    "topic": "string", // the MQTT topic
    "payload": {
        // object with any properties
    }
}
```

If this specification is not followed, an error will be thrown during the publishing of the downlink to the MQTT device.

## Example downlink encoder

```javascript
function asciiToHexString(input) {
  let output = "";

  for (let i = 0; i < input.length; i += 1) {
    output += input.charCodeAt(i).toString(16);
  }

  return output;
}

function consume(event) {
  const payload = asciiToHexString(event.payload.message);
  const port = event.port ? event.port : 1;
  const confirmed = event.confirmed ? event.confirmed : false;

  emit("downlink", { payloadHex: payload, port, confirmed });
}
```
