Reflector Announcement - how to?

Help with P25 issues
Post Reply
N6MIK
Posts: 59
Joined: Wed Apr 18, 2018 12:53 am

Reflector Announcement - how to?

Post 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
KR0SIV
Posts: 6
Joined: Mon May 07, 2018 12:57 am
Contact:

Re: Reflector Announcement - how to?

Post 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;
N6MIK
Posts: 59
Joined: Wed Apr 18, 2018 12:53 am

Re: Reflector Announcement - how to?

Post by N6MIK »

Wow. Yeah, that’s way over my head! Thank you for the explanation about how it works!
KR0SIV
Posts: 6
Joined: Mon May 07, 2018 12:57 am
Contact:

Re: Reflector Announcement - how to?

Post 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.
User avatar
MW0MWZ
Site Admin
Posts: 1505
Joined: Wed Apr 04, 2018 9:15 pm
Location: Wales, UK
Contact:

Re: Reflector Announcement - how to?

Post 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 :)
Andy

73 de MW0MWZ
http://pistar.uk
Post Reply