RepeaterPage » History » Version 6
max, 04/22/2017 04:04 PM
1 | 1 | max | |
---|---|---|---|
2 | 4 | max | = SUMMARY = |
3 | * Simultaneous multi-channel transmission/reception |
||
4 | * Uses USRP and/or conventional receiver/transmitter hardware |
||
5 | * Generic interface to Asterisk via app_rpt (full VOIP, radio control, and standard repeater functions) |
||
6 | * Features: P25, analog NBFM with CTCSS |
||
7 | * Expected to be fully "ROIP" [Radio Over IP] compatible |
||
8 | |||
9 | 1 | max | = Multi-channel reception using the USRP = |
10 | |||
11 | 6 | max | Assume we want to receive simultaneously the four signals shown below; |
12 | 1 | max | one conventional (analog) FM voice channel plus three P25 |
13 | signals. The two P25 voice channels are to be IMBE-decoded whereas the |
||
14 | 4 | max | P25 data channel is to be sent to Wireshark after decoding. For all three voice |
15 | channels, we want to forward the received PTT and audio info to Asterisk app_rpt. |
||
16 | The received PTT [Push To Talk, or "keyed"] signal is a bit that ideally tracks |
||
17 | the state of the PTT key at transmitter, indicating the presence or absence of the |
||
18 | received signal. |
||
19 | 1 | max | |
20 | 3 | max | [[Image(sa.png)]] |
21 | |||
22 | 1 | max | Fig. 1 - Spectrum of repeater input band (sample; diagram not to scale) |
23 | |||
24 | For now, it's necessary to edit the source code file manually to specify |
||
25 | the list of channels/modes to be received (file usrp_rx.py): |
||
26 | |||
27 | {{{ |
||
28 | channels = [ |
||
29 | {'freq':435.200e6, 'mode':'c4fm', 'port':32001}, |
||
30 | {'freq':435.350e6, 'mode':'fm', 'port':32002, 'ctcss':97.4}, |
||
31 | {'freq':435.600e6, 'mode':'cqpsk', 'port':23456, 'wireshark':1}, |
||
32 | {'freq':435.775e6, 'mode':'cqpsk', 'port':32003} |
||
33 | ] |
||
34 | }}} |
||
35 | |||
36 | Individual channels are defined one per line; note that all definition lines |
||
37 | except the last must end with a comma. |
||
38 | |||
39 | We choose a frequency somewhere close to the center of this band. |
||
40 | which will set the USRP's nominal receive frequency; this must also |
||
41 | be manually set in the source file: |
||
42 | |||
43 | {{{ |
||
44 | center_freq = 435.500e6 |
||
45 | }}} |
||
46 | |||
47 | Before running the receiver app, we |
||
48 | * measure the current calibration error value (I use kalibrate) |
||
49 | * determine the optimum USRP receiver gain value |
||
50 | The values used in this example are +1234 and 35, respectively. |
||
51 | |||
52 | We're now ready to start the receiver: |
||
53 | |||
54 | {{{ |
||
55 | usrp_rx.py -RA -c 1234 -H 127.0.0.1 -g 35 -d 25 |
||
56 | }}} |
||
57 | |||
58 | The receiver continuously monitors all four channels. For each of the three |
||
59 | voice channels, the audio and the PTT info ("key up" and "key down" events) |
||
60 | are forwarded to asterisk app_rpt over separate UDP channels. |
||
61 | |||
62 | = P25 and/or analog NBFM Reception using a discriminator-tapped receiver = |
||
63 | |||
64 | One or more disc-tapped conventional receivers may be used at the same time, and can |
||
65 | coexist with one or more USRP's. |
||
66 | |||
67 | 4 | max | An audio cable is connected between the disc-tap point in the receiver and the PC soundcard. |
68 | |||
69 | 1 | max | Single-channel reception is possible using disctap_rx.py. |
70 | 4 | max | The app dynmically auto-detects the modulation type (P25 or analog NBFM). |
71 | 1 | max | |
72 | Audio and PTT events are forwarded to asterisk app_rpt over two separate UDP |
||
73 | 4 | max | channels, depending on modulation type: |
74 | * received P25 audio is sent to asterisk on UDP port 32004 |
||
75 | * when analog NBFM is received with the proper CTCSS tone (97.4 Hz), port 32005 is used |
||
76 | 1 | max | |
77 | {{{ |
||
78 | disctap_rx.py -i -A 0.05 -c 97.4 -H 127.0.0.1 -p 32004 -g 35 -d 25 |
||
79 | }}} |
||
80 | |||
81 | The -g (gain) parameter is used to set the proper audio gain level. See |
||
82 | the hardware page for further guidance - this value is important for achieving |
||
83 | correct operation. |
||
84 | 4 | max | |
85 | = Asterisk and app_rpt = |
||
86 | |||
87 | For all voice modes (IMBE and analog FM) the audio is transmitted |
||
88 | as frames over the UDP channel to and from Asterisk in the standard native audio format: |
||
89 | * 50 frames per second |
||
90 | * 160 audio samples per frame |
||
91 | 6 | max | * 8000 samples per second |
92 | 4 | max | * signed |
93 | * 16-bit |
||
94 | * linear |
||
95 | |||
96 | 5 | max | == Installation == |
97 | |||
98 | First, obtain and unpack the app_rpt source tree. |
||
99 | |||
100 | Second, locate the subdirectory named {{{asterisk/channels}}} in the source tree you just unpacked, |
||
101 | and copy the files {{{chan_usrp.c}}} and {{{chan_usrp.h}}} (from {{{src/lib}}}) to this subdirectory. |
||
102 | |||
103 | Next, build and install asterisk and app_rpt, and verify that chan_usrp is included |
||
104 | |||
105 | == Configuration == |
||
106 | |||
107 | We define five repeater nodes in {{{/etc/asterisk/rpt.conf}}} |
||
108 | |||
109 | {{{ |
||
110 | [000] |
||
111 | rxchannel = usrp/127.0.0.1:34001:32001 |
||
112 | duplex = 2 |
||
113 | scheduler=scheduler |
||
114 | functions = functions-repeater |
||
115 | hangtime=0 |
||
116 | authlevel = 0 |
||
117 | |||
118 | [001] |
||
119 | rxchannel = usrp/127.0.0.1:34002:32002 |
||
120 | duplex = 2 |
||
121 | scheduler=scheduler |
||
122 | functions = functions-repeater |
||
123 | hangtime=0 |
||
124 | authlevel = 0 |
||
125 | |||
126 | [002] |
||
127 | rxchannel = usrp/127.0.0.1:34003:32003 |
||
128 | duplex = 2 |
||
129 | scheduler=scheduler |
||
130 | functions = functions-repeater |
||
131 | hangtime=0 |
||
132 | authlevel = 0 |
||
133 | |||
134 | [003] |
||
135 | rxchannel = usrp/127.0.0.1:34004:32004 |
||
136 | duplex = 2 |
||
137 | scheduler=scheduler |
||
138 | functions = functions-repeater |
||
139 | hangtime=0 |
||
140 | authlevel = 0 |
||
141 | |||
142 | [004] |
||
143 | rxchannel = usrp/127.0.0.1:34005:32005 |
||
144 | duplex = 2 |
||
145 | scheduler=scheduler |
||
146 | functions = functions-repeater |
||
147 | hangtime=0 |
||
148 | authlevel = 0 |
||
149 | }}} |
||
150 | |||
151 | Continuing the example of five voice channels from above, we define five repeater nodes (channels). Voice and PTT traffic that |
||
152 | is output by asterisk/app_rpt for RF transmission is forwarded to usrp_tx.py (see below) using UDP ports in the 3400x range. |
||
153 | Voice data received in usrp_rx.py and/or disctap_rx.py is forwarded to asterisk/app_rpt (chan_usrp.c) via ports in the 3200x range. |
||
154 | |||
155 | The driver invocation in {{{rpt.conf}}} is |
||
156 | {{{ |
||
157 | usrp/HISIP:HISPORT[:MYPORT] |
||
158 | HISIP is the IP address (or FQDN) of the GR app |
||
159 | HISPORT is the UDP socket of the GR app |
||
160 | MYPORT (optional) is the UDP socket that Asterisk listens on |
||
161 | for this channel |
||
162 | }}} |
||
163 | |||
164 | TIP: You can use the {{{usrp show}}} command to display status information from within the Asterisk CLI. |
||
165 | |||
166 | TIP: Another handy command is {{{rpt playback}}} to start transmission on a channel. |
||
167 | |||
168 | == Channel Bank Configuration == |
||
169 | |||
170 | Typically the audio links are terminated on channel banks which provide a standard interface to user |
||
171 | equipment. Commonly, this equipment places an "offhook" indication on the signalling circuit when it |
||
172 | wishes to initiate a radio transmission, and signals the end of the transmission by placing the circuit |
||
173 | in the "onhook" state. Standard audio transmission levels are defined at the channel bank interface. |
||
174 | |||
175 | A standard FXS port on the channel bank is defined in {{{/etc/asterisk/zapata.conf}}} with |
||
176 | {{{ |
||
177 | signalling=fxo_ls |
||
178 | immediate=yes |
||
179 | context = chan1 |
||
180 | channel => 1 |
||
181 | }}} |
||
182 | |||
183 | An offhook (PTT) signal from user equipment on the FXS channel bank port |
||
184 | (due to the {{{immmediate=yes}}}) starts processing in {{{/etc/asterisk/extensions.conf}}}: |
||
185 | |||
186 | {{{ |
||
187 | 1 | max | [chan1] |
188 | exten => s,1,Dial(local/1@radio/n) |
||
189 | 6 | max | }}} |
190 | This jumps to extension "1" in context {{{radio}}} (also in {{{/etc/asterisk/extensions.conf}}}) |
||
191 | {{{ |
||
192 | 5 | max | [radio] |
193 | exten => 1,1,rpt(000|D) |
||
194 | exten => 2,1,rpt(001|D) |
||
195 | exten => 3,1,rpt(002|D) |
||
196 | exten => 4,1,rpt(003|D) |
||
197 | exten => 5,1,rpt(004|D) |
||
198 | }}} |
||
199 | |||
200 | So the call resulting from the offhook (PTT) signal is routed to |
||
201 | extension "1" in context {{{[radio]}}} where it's connected to the desired |
||
202 | repeater node (channel). If the GR app is running it will initiate |
||
203 | radio transmission. An onhook signal on the FXS channel bank port |
||
204 | causes the end of the transmission by ending the asterisk call in |
||
205 | progress*. The {{{hangtime=0}}} setting in {{{rpt.conf}}} was used to reduce the |
||
206 | tail delay in this setup. |
||
207 | |||
208 | *The end of the transmission may be modified however, for example when |
||
209 | 1 | max | app_rpt appends an "ID" or if a "timeout" occurs. |
210 | |||
211 | Note: "Dumb" mode is used in these examples (theory: if it can't be made to work in its dumb mode, there's no prayer of getting smart mode to work) |
||
212 | |||
213 | 6 | max | = USRP Transmission = |
214 | 1 | max | |
215 | 6 | max | The multi-channel USRP transmitter app currently has some limitations: |
216 | * Transmit channel spacing is at arbitrary 25 KHz intervals |
||
217 | * Analog NBFM mode is not yet supported |
||
218 | Before running the app you must first determine (example values shown in square brackets - YMMV) |
||
219 | * the USRP TX daughterboard ID (A or B) [A] |
||
220 | * carrier frequency of the first ("center") TX channel [435.125 MHz] |
||
221 | * number of channels to be transmitted [five] |
||
222 | * the first UDP port number over which usrp_tx.py receives data from chan_usrp.c [34,001] |
||
223 | Example: |
||
224 | {{{ |
||
225 | usrp_tx.py -TA -e -f 435.125e6 -n 5 -p 34001 |
||
226 | }}} |
||
227 | Here we also request a FFT display. With port 34001 as the starting UDP port number and |
||
228 | five channels, {{{usrp_tx.py}}} listens on ports 34001-34005 for TX traffic coming from chan_usrp.c, as |
||
229 | configured in {{{/etc/asterisk/rpt.conf}}} (see above). |