Page 1 of 1

Reflector Announcement - how to?

Posted: Tue May 29, 2018 4:33 am
by N6MIK
I have a P25 reflector, and I'd like it to 'announce itself' the way "Worldwide", "North America" and others do, upon first transmission. How is this done?

Thanks!
N6MIK

Re: Reflector Announcement - how to?

Posted: Tue May 29, 2018 12:08 pm
by KR0SIV
Unfortunately this is not something so easily done.
I've been making some modifications to P25Reflector and P25Gateway for my own areas amateur radio linked system and have also pondered having announcements.

The way MMDVM (well P25Clients) is implemented at least for P25 is taking captured UDP voice frames, modifying the header and then injecting those frames back when you move to a given channel/talkgroup (reflector)

P25Gateway is actually compiled (hard coded) with announcements for the official channels like North America. In order to add your own announcement you would have to capture P25 voice frames, convert them to UDP frames, modify the header and then modify several C++ source files within P25Gateway and then re-compile and replace the binary on every repeater/hotspot that you wanted to have this announcement.

Perhaps someday it could be supported but I find it unlikely due to the lack of simple software allowing a quick capture and header modification of P25 voice frames. It would also require the developers completely re-write how speech is handled.

I'll link to the gateway source below and give a few examples of what I mean.


https://github.com/g4klx/P25Clients/blo ... P25Gateway


Snip of Speech.cpp source:
Below you can see several calls that are hard coded to bring up various announcements based on the talkgroup id.

Code: Select all

	case 10202U:
		m_speech = SPEECH_NA_TAC2;
		m_count = SPEECH_NA_TAC2_COUNT;
		m_id = id;
		break;
	case 10203U:
		m_speech = SPEECH_NA_TAC3;
		m_count = SPEECH_NA_TAC3_COUNT;
		m_id = id;
		break;
	case 10300U:
		m_speech = SPEECH_EU;
		m_count  = SPEECH_EU_COUNT;
		m_id     = id;
		break;
	case 10301U:
Below you can see most of the SpeechNA.h file which contains the UDP voice frames.

Code: Select all

#if !defined(SPEECH_NA_H)
#define SPEECH_NA_H

const unsigned char SPEECH_NA[] = {
	0x94U, 0x4CU, 0x82U, 0x8EU, 0x6DU, 0x65U, 0x00U, 0x0EU, 0x09U, 0x6FU, 0xD8U, 
	0x80U, 0x94U, 0x58U, 0x2EU, 0xB8U, 0xC6U, 0x4DU, 0xD8U, 0x0FU, 0x66U, 0xD5U, 
	0x90U, 0xC0U, 0xCCU, 0xD1U, 0x95U, 0x7DU, 0x1CU, 0x40U, 0x6DU, 0xA9U, 0x86U, 
	0x90U, 0x5CU, 0x04U, 0x85U, 0x6EU, 0x79U, 0x90U, 0x4EU, 0x54U, 0x2EU, 0x37U, 
	0x90U, 0x23U, 0xFCU, 0x7FU, 0x7AU, 0x6BU, 0x00U, 0x0FU, 0x1AU, 0x4EU, 0x5EU, 
	0xA0U, 0x51U, 0x1CU, 0x2EU, 0x99U, 0xA9U, 0x00U, 0x0EU, 0xF8U, 0xC4U, 0xD5U, 
	0xA0U, 0x5DU, 0x15U, 0x73U, 0xA0U, 0x0FU, 0x9CU, 0x8FU, 0x6AU, 0xBAU, 0xBCU, 
	0x84U, 0x48U, 0xAEU, 0x2EU, 0x74U, 0xB7U, 0x18U, 0x0FU, 0x37U, 0xAEU, 0x1DU, 
	0x90U, 0x54U, 0x44U, 0x98U, 0x44U, 0xCFU, 0x58U, 0x48U, 0x3BU, 0xBDU, 0x7EU, 
	0x90U, 0x43U, 0xDAU, 0x6FU, 0x59U, 0xE0U, 0x58U, 0x4FU, 0x14U, 0xEEU, 0x4FU, 
	0x80U, 0x90U, 0x39U, 0x2FU, 0xDDU, 0x63U, 0x30U, 0x00U, 0x0CU, 0x03U, 0x18U, 
	0x90U, 0x4FU, 0x94U, 0x71U, 0xD4U, 0x68U, 0x00U, 0x0DU, 0xF2U, 0x45U, 0x77U, 
	0x84U, 0x49U, 0xAAU, 0x4CU, 0x94U, 0xC5U, 0x00U, 0x0FU, 0x3BU, 0xFBU, 0x0CU, 
	0x94U, 0x4CU, 0x82U, 0x05U, 0x25U, 0x1FU, 0x98U, 0x2CU, 0xA8U, 0x45U, 0x3BU, 
	0x94U, 0x40U, 0xEFU, 0xF8U, 0xBFU, 0x07U, 0x08U, 0x8EU, 0x7EU, 0x8EU, 0x0AU, 
	0x84U, 0x51U, 0x1AU, 0x83U, 0xFAU, 0xE8U, 0x00U, 0x0CU, 0xDCU, 0x8FU, 0x7BU, 
	0x50U, 0x48U, 0x9EU, 0xD5U, 0x39U, 0x36U, 0x00U, 0x67U, 0x5EU, 0x1CU, 0x14U, 
	0x50U, 0x44U, 0xC2U, 0x9EU, 0xFEU, 0x9DU, 0x20U, 0x70U, 0x9AU, 0xD5U, 0x49U, 
	0x4CU, 0x50U, 0x7DU, 0xF2U, 0x58U, 0x9AU, 0x00U, 0x71U, 0x90U, 0xA0U, 0xFEU, 
	0x80U, 0x50U, 0xCAU, 0x88U, 0xD7U, 0xFBU, 0x5BU, 0x00U, 0x0FU, 0x21U, 0x27U, 
	0x5CU, 0x54U, 0x64U, 0x36U, 0x47U, 0xBBU, 0x00U, 0x38U, 0xB3U, 0x9BU, 0x04U, 
	0x50U, 0x52U, 0x59U, 0x99U, 0xABU, 0xD2U, 0x00U, 0x6DU, 0x81U, 0x95U, 0x99U, 
	0x14U, 0xC9U, 0x8DU, 0xE9U, 0xF3U, 0xFFU, 0x00U, 0xAFU, 0x99U, 0x6BU, 0xD8U, 
	0x25U, 0xFFU, 0xDCU, 0x67U, 0xDFU, 0x9CU, 0x81U, 0xA4U, 0xFEU, 0xAEU, 0x87U, 
	0x2AU, 0x5BU, 0xE4U, 0x1FU, 0x63U, 0xDCU, 0xC3U, 0x30U, 0x46U, 0x50U, 0x7CU, 
	0x2AU, 0xE7U, 0xFAU, 0x14U, 0x60U, 0xECU, 0xE1U, 0xCFU, 0x34U, 0x10U, 0xA5U, 
	0x2EU, 0xDDU, 0x17U, 0xC0U, 0xB2U, 0xD8U, 0xFFU, 0xB6U, 0xFCU, 0x25U, 0x48U, 
	0x2FU, 0x6CU, 0x97U, 0xE8U, 0x8BU, 0x69U, 0xFCU, 0x36U, 0xE9U, 0x0AU, 0x93U, 
	0x80U, 0x2FU, 0x4FU, 0xA5U, 0xD4U, 0x37U, 0x98U, 0xFEU, 0x9BU, 0x79U, 0x48U, 
	0x2BU, 0x6FU, 0xC0U, 0x87U, 0x94U, 0x70U, 0xF9U, 0x17U, 0x08U, 0x6EU, 0xAFU, 
	0x2AU, 0xFFU, 0xC0U, 0x95U, 0x13U, 0xE1U, 0xE3U, 0x08U, 0xFCU, 0x15U, 0xA6U, 
	0x32U, 0x5EU, 0xB9U, 0xD5U, 0x13U, 0x06U, 0xC9U, 0x97U, 0x60U, 0x46U, 0x53U, 
	0x41U, 0xCBU, 0xA9U, 0xACU, 0xC8U, 0x44U, 0x80U, 0xBEU, 0x96U, 0xBEU, 0xA2U, 
	0x35U, 0x70U, 0xEEU, 0x0CU, 0x3EU, 0x18U, 0x81U, 0xB4U, 0x91U, 0x6AU, 0x53U, 
	0x31U, 0xBBU, 0x2CU, 0x44U, 0x72U, 0x15U, 0x01U, 0xC4U, 0x0AU, 0x61U, 0x6AU, 
	0x1EU, 0x6DU, 0x48U, 0xFDU, 0x47U, 0x8DU, 0x02U, 0x14U, 0x4DU, 0x38U, 0x5BU, 
	0x2AU, 0xFFU, 0xE2U, 0x0AU, 0x65U, 0xF2U, 0xE0U, 0xD9U, 0x54U, 0x9CU, 0x38U, 
	0x80U, 0x2EU, 0x6DU, 0xB3U, 0xB9U, 0x8BU, 0x47U, 0xF1U, 0xD4U, 0x52U, 0x7AU, 
	0x2EU, 0x6EU, 0xD1U, 0x3FU, 0xC2U, 0xABU, 0xF9U, 0x0EU, 0xBBU, 0x1CU, 0x5AU, 
	0x26U, 0x77U, 0xE8U, 0x14U, 0xE8U, 0x5FU, 0xA2U, 0xD6U, 0xDBU, 0x65U, 0x2DU, 
	0x27U, 0x4CU, 0xFBU, 0x09U, 0xE2U, 0xB4U, 0x80U, 0xF7U, 0x13U, 0xBAU, 0xAEU, 
	0x2BU, 0x48U, 0x9FU, 0xA5U, 0x5DU, 0x23U, 0xFFU, 0xFBU, 0x46U, 0xD5U, 0x25U, 
	0x2BU, 0x59U, 0xA6U, 0xB3U, 0x89U, 0x50U, 0xFEU, 0x49U, 0xF6U, 0xF6U, 0x1CU, 
	0x2BU, 0x69U, 0xDEU, 0x94U, 0x92U, 0xC4U, 0xF9U, 0x24U, 0x55U, 0x0BU, 0xDBU, 
	0x2BU, 0x6DU, 0x90U, 0xA9U, 0x8EU, 0xFEU, 0xF1U, 0x65U, 0x73U, 0xEAU, 0x62U, 
	0x2BU, 0x6FU, 0xD0U, 0x89U, 0x05U, 0x40U, 0xFCU, 0xDAU, 0x9BU, 0x22U, 0x29U, 
	0x80U, 0x2BU, 0x6EU, 0xD1U, 0x8BU, 0x4DU, 0x51U, 0xFCU, 0x4CU, 0xE8U, 0xEDU, 
	0x2BU, 0x4DU, 0xFAU, 0x8AU, 0x06U, 0xE6U, 0xFDU, 0x45U, 0x78U, 0x66U, 0xB3U, 
	0x2BU, 0x4AU, 0xBDU, 0xB5U, 0x40U, 0x7DU, 0xFDU, 0x7FU, 0x7CU, 0x37U, 0x5AU, 
	0x2EU, 0xDFU, 0x70U, 0x71U, 0x61U, 0xE4U, 0x80U, 0x76U, 0xCAU, 0xB2U, 0xC5U, 
	0x39U, 0x4EU, 0xC3U, 0x4FU, 0xF4U, 0x34U, 0x00U, 0xDDU, 0x8BU, 0x60U, 0x36U, 
	0x29U, 0x5FU, 0x70U, 0xD2U, 0x98U, 0x84U, 0x00U, 0x4DU, 0x49U, 0x4EU, 0xC3U, 
	0x38U, 0xCFU, 0x8FU, 0x15U, 0x51U, 0xCFU, 0x80U, 0xC4U, 0xBBU, 0x15U, 0x48U, 
	0x22U, 0x97U, 0x10U, 0x20U, 0xD9U, 0xBEU, 0x00U, 0x6FU, 0x1FU, 0x30U, 0xD9U, 
	0x2EU, 0x5FU, 0xF5U, 0x82U, 0x17U, 0x05U, 0x00U, 0x89U, 0x63U, 0x04U, 0x1EU, 
	0x80U, 0x32U, 0xFEU, 0x45U, 0x84U, 0x13U, 0x7BU, 0xFDU, 0x97U, 0x58U, 0x82U, 
	0x37U, 0x65U, 0x3AU, 0x63U, 0x38U, 0xC7U, 0xD8U, 0x15U, 0x0AU, 0x55U, 0xCCU, 
	0x3EU, 0xD3U, 0x35U, 0x39U, 0xB7U, 0x93U, 0xF4U, 0x99U, 0xE8U, 0x3EU, 0xEFU, 
	0x42U, 0xD4U, 0xDEU, 0x98U, 0x1CU, 0x1DU, 0xFCU, 0x74U, 0x70U, 0x38U, 0x68U, 
	0x3EU, 0xD5U, 0x55U, 0x23U, 0xEBU, 0x65U, 0xFEU, 0x3AU, 0x3FU, 0x80U, 0xDFU, 
	0x42U, 0x53U, 0x59U, 0x43U, 0x62U, 0xF9U, 0xFDU, 0xC5U, 0xBCU, 0x9FU, 0x42U, 
	0x42U, 0x3FU, 0x4AU, 0xF9U, 0x05U, 0x14U, 0x80U, 0xF2U, 0x4CU, 0x69U, 0xF9U, 
	0x41U, 0xFBU, 0x0CU, 0xFCU, 0x2DU, 0x0FU, 0x80U, 0xD7U, 0x15U, 0x39U, 0xB2U, 
	0x41U, 0xD7U, 0x52U, 0x59U, 0x07U, 0x9EU, 0xB2U, 0xB9U, 0xDFU, 0x15U, 0xDBU, 
	0x80U, 0x45U, 0x5FU, 0x03U, 0xD7U, 0x61U, 0xA1U, 0x80U, 0xCBU, 0x8EU, 0x76U, 
	0x40U, 0xA9U, 0x6DU, 0xE9U, 0x00U, 0x3BU, 0x00U, 0x36U, 0x51U, 0x39U, 0xADU, 
	0xA0U, 0x07U, 0x80U, 0x6BU, 0x4BU, 0x39U, 0x80U, 0x0DU, 0xFFU, 0x88U, 0x50U, 
	0x90U, 0xD8U, 0x0EU, 0xF9U, 0xC2U, 0x08U, 0x38U, 0x40U, 0x3CU, 0xA0U, 0x77U, 
	0x90U, 0xCCU, 0xA6U, 0x98U, 0x93U, 0x36U, 0x00U, 0x01U, 0x27U, 0xB7U, 0xD6U, 
	0x90U, 0x44U, 0xC0U, 0x9EU, 0x6EU, 0x57U, 0x00U, 0x0EU, 0x32U, 0xCFU, 0x25U, 
	0x90U, 0xD8U, 0x18U, 0xEBU, 0xE4U, 0xECU, 0x5CU, 0x40U, 0x28U, 0xA0U, 0x56U, 
	0x94U, 0x46U, 0xC5U, 0x15U, 0xFBU, 0xC7U, 0x00U, 0x0EU, 0x8DU, 0x43U, 0x61U, 
	0x94U, 0x50U, 0x46U, 0xDEU, 0x96U, 0x5AU, 0x38U, 0x0CU, 0x3DU, 0x58U, 0x8AU, 
	0x80U, 0x84U, 0x4AU, 0xAEU, 0x21U, 0x6BU, 0x19U, 0x98U, 0x0DU, 0x1AU, 0xEFU, 
	0x94U, 0x31U, 0x56U, 0x38U, 0xD2U, 0xEFU, 0x18U, 0x0BU, 0xBEU, 0x53U, 0x9AU, 
	0x94U, 0x4AU, 0x8CU, 0x57U, 0x6EU, 0x5AU, 0x00U, 0x0CU, 0x46U, 0x7FU, 0x7FU, 
	0x90U, 0x55U, 0x66U, 0x99U, 0x43U, 0x0EU, 0x18U, 0x4CU, 0x66U, 0x00U, 0x96U, 
	0x90U, 0x48U, 0x8BU, 0xF7U, 0x87U, 0xB4U, 0x00U, 0x0BU, 0xD9U, 0xBFU, 0x7FU, 
	0xA0U, 0xDDU, 0x00U, 0x6BU, 0xBEU, 0x15U, 0x81U, 0x40U, 0xF3U, 0x8FU, 0x10U, 
	0x90U, 0x3DU, 0x20U, 0x97U, 0x60U, 0x5EU, 0x80U, 0x0CU, 0x78U, 0x2EU, 0x4DU, 
	0x90U, 0xC0U, 0xDEU, 0xB9U, 0xA9U, 0xBFU, 0x98U, 0x42U, 0x17U, 0x23U, 0xB6U, 
	0x84U, 0x58U, 0x8BU, 0x3FU, 0x11U, 0xD3U, 0x00U, 0x0CU, 0x1FU, 0xBBU, 0x4DU, 
	0x80U, 0x84U, 0xD1U, 0x9BU, 0xC5U, 0x7BU, 0xCCU, 0x98U, 0xA3U, 0x1AU, 0x4DU, 
	0x90U, 0x44U, 0xC2U, 0x09U, 0xCEU, 0x2DU, 0x18U, 0xCEU, 0x3DU, 0x05U, 0x77U, 
	0x94U, 0x5AU, 0x08U, 0x74U, 0x8FU, 0x95U, 0x08U, 0x0EU, 0x9BU, 0xD4U, 0x98U, 
	0x90U, 0x48U, 0x8CU, 0xD9U, 0x77U, 0x95U, 0x00U, 0x0EU, 0x2DU, 0xBCU, 0x17U, 
	0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x44U, 
	0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x45U, 
	0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x44U, 
	0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x45U};

const unsigned int SPEECH_NA_COUNT = 90U;

Re: Reflector Announcement - how to?

Posted: Wed May 30, 2018 11:50 pm
by N6MIK
Wow. Yeah, that’s way over my head! Thank you for the explanation about how it works!

Re: Reflector Announcement - how to?

Posted: Thu May 31, 2018 7:14 pm
by KR0SIV
No problem, if I get the time to work out the UDP frame conversion I'll let you know.
I wouldn't mind creating an announcement or two time permitting if I get that figured.

The OP25 project by the osmocom group does have software that handles this conversion http://osmocom.org/projects/op25/wiki
I've also considered compiling wireshark with the P25 dissector patch and grabbing the frames as they enter my dev reflector as well.

Either way, if I get around to it I'll post back here.

Re: Reflector Announcement - how to?

Posted: Thu May 31, 2018 8:23 pm
by MW0MWZ
Of course the other thing to do is make your P25 reflector public, submit a pull request to put its information into the up-stream source for the P25 hosts file, and ask Jonathan nicely to add your announcement :)