DN Engage 3rdparty Interop - rallytac/pub GitHub Wiki
Developer Note: Engage Interop with 3rd-party Systems
Using MELPe
MELPe is a coding standard used for highly compressed voice operating over severly bandwidth constrained networks. While it's been around for a long time (and is rather outdated in many respects), MELPe is still in widespread use in the military community worldwide. So, obviously, we support it in Engage.
However ... unlike other CODECs that Engage supports, MELPe is subject to intellectual property protections and is only availabe from a limited number of commercial vendors. The result is that we cannot simply include MELPe as a standard option in Engage without putting some protections around it for purposes of license tracking for those commercial entities.
So, what we do in Engage is to enable the use of its MELPe support through inclusion of a featureset JSON object in the Engine policy configuration.
What's super-important here is that the JSON object is tied to the license for the Engage Engine. This means that you can't just use a featureset from any other licensed Engage Engine and expect it to work with the license for your Engine. (Yeah, this is a pain but we have little choice in ensuring that MELPe is not used outside of the licensing agreements we have with the MELPe vendors.)
Here's an example of a featureset:
"featureset": {
"signature": "1DB23AFD62AC49B8ABFB8C01241793621CACC3CC831D4898B0BD868AF6928E31",
"features": [
{
"id": "{2BE94F5E-5630-4487-AAB6-77D820BB505A}",
"count": -1,
"comments": "MELPe CODEC"
}
]
}
In this example, our featureset contains just a single element - that being for MELPe as identified by its ID of {2BE94F5E-5630-4487-AAB6-77D820BB505A}
. Also, you'll notice the count
having a value of -1
- this means that the Engine is allowed to create an unlimited number of instances of the CODEC. (If count
had a positive number - say 6
- then only 6 instances would be allowed to be created at any one time.)
Now, what ties this featureset to the license is the signature
field. This field is a SHA256 hash of the ordered contents of the featureset (including their counts) combined with the license (and some other internal values). So ... if you use a featureset with a particular signature along with the license associated with that signature; you'd be good. But, if you take that featureset (with the same signature) and try to use with with a different license, Engage is going to bark at you and reject the configuration. Basically, your API call to engageInitialize()
will fail!
Hooking Up With Trellisware
TODO: Elaborate
While Engage can communicate with MANET radios from Trellisware; there's a few items to be aware of:
-
The
ingress
andegress
multicast addresses on the Trellisware MNG need to be the same. -
The
ingress
andegress
IP ports on the Trellisware MNG need to be the same (they're not by default). -
Trellisware does NOT support RTP traffic encryption on the enterprise network so, therefore, your group cannot have encryption. In other words, the
cryptoPassword
field must be empty or simply not provided. -
Trellisware does not support all the CODECs that Engage supports so we need to be sure that the CODEC selected on Engage matches the CODEC selected on the MNG.
Group Configuration
{
"id": "{E63EAFBB-FE39-46C4-B23C-88E52308AB79}",
"type": 1,
"name": "Trellisware MELPe Group",
"timeline": {
"enabled": true,
"maxAudioTimeMs": 60000
},
"rx": {
"address": "239.1.2.1",
"port": 20002
},
"tx": {
"address": "239.1.2.1",
"port": 20002
},
"txAudio": {
"encoder": 52,
"customRtpPayloadType": 117
},
"inboundRtpPayloadTypeTranslations":[
{
"external": 117,
"engage" : 77
}
]
}
-
id
The Engage ID of the group. -
type
This is an audio group so the value is1
. -
name
The group's name. -
timeline
In this object we've enabled timeline recording for the group and specified a maximum number of 60 seconds (60000 milliseconds) for the recording time window. -
rx
andtx
These two specify the multicast address and port to be used to ship audio traffic back and forth with the Trellisware system. In 99% of cases,rx
andtx
would be the same and would need to match theingress
andegress
settings for the channel configured on the Trellisware Multinet Gateway. -
txAudio
There's a bunch of options for thetxAudio
object but we can let Engage use its defaults for the most part. However, we do need to tell Engage what CODEC to use for transmission. In this case, we're going to use MELPe at 2,400 bps which, in Engage-world, is defined as a value of52
. (By the way, a value of51
represents MELP at 1,200 bps. A value of50
represents MELPe at 600 bps.) Also, we need to make sure that Trellisware will pay attention to the RTP packets we send to it - and that's done with a field in the RTP packet known as the payload type. Now, by default, Engage will use77
as a payload type for MELP at 2,400 bps. But Trellisware uses a payload type of117
- and that's not easily changed on the Trellisware side. So, we need to tell Engage to transmit its RTP packets using the custom payload type of117
. That's the setting you want to make forcustomRtpPayloadType
. -
inboundRtpPayloadTypeTranslations
Going on the above and understanding therefore that Trellisware is going to transmit a payload type of117
, we need to tell Engage what that means - i.e. "Hey, Engage, when you see a RTP payload type of 117, you need to treat that as MELPe at 2,400." We do this by including theinboundRtpPayloadTypeTranslations
object that tells Engage how to perform these translations. This object is an array of translation objects so you could technically have a whole bunch of translations. For our purposes though, we're just going to define a single element wherein we define theexternal
value (that coming from Trellisware) to be117
and the corresponding Engage value to be77
.
MELPe @ 0.6 kbps
Item | Value | Comments |
---|---|---|
cryptoPassword | (null) | |
txAudio / encoder | 50 |
|
txAudio / customRtpPayloadType | 117 |
NOT VERIFIED !!! |
inboundRtpPayloadTypeTranslations / external | 117 |
NOT VERIFIED !!! |
inboundRtpPayloadTypeTranslations / engage | 79 |
MELPe @ 1.2 kbps
Item | Value | Comments |
---|---|---|
cryptoPassword | (null) | |
txAudio / encoder | 51 |
|
txAudio / customRtpPayloadType | 117 |
NOT VERIFIED !!! |
inboundRtpPayloadTypeTranslations / external | 117 |
NOT VERIFIED !!! |
inboundRtpPayloadTypeTranslations / engage | 78 |
MELPe @ 2.4 kbps
Item | Value | Comments |
---|---|---|
cryptoPassword | (null) | |
txAudio / encoder | 52 |
|
txAudio / customRtpPayloadType | 117 |
|
inboundRtpPayloadTypeTranslations / external | 117 |
|
inboundRtpPayloadTypeTranslations / engage | 77 |