Project

General

Profile

RepeaterPage » History » Version 10

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 10 max
 == Build asterisk with app_rpt ==
106
107
First obtain and unpack the sources
108
109
 - http://ohnosec.org/drupal/node/6   [use {{{svn checkout}}} to grab the "Asterisk Sources"]
110
111
Locate the toplevel directory - this should have several subdirectories including {{{zaptel}}} and {{{asterisk}}} .
112
113
Then locate the subdirectory named {{{asterisk/channels}}} ,
114
and copy the files {{{chan_usrp.c}}} and {{{chan_usrp.h}}} (from {{{repeater/src/lib}}} in the op25 sources) to this subdirectory.
115
116
Now, build and install asterisk and app_rpt
117
118
{{{cd}}} to the toplevel directory
119
{{{
120
cd zaptel && ./configure && make && sudo make install
121
}}}
122
and then (again from the toplevel directory)
123
{{{
124
cd asterisk && ./configure && make && sudo make install
125
}}}
126
127
For a first time installation of asterisk there are also other steps such as config file installation.
128
Before setting up {{{rpt.conf}}} you must first set up asterisk itself - see for example
129
130
http://www.voip-info.org/wiki/view/Asterisk+quickstart
131
132 5 max
 == Configuration ==
133
134
We define five repeater nodes in {{{/etc/asterisk/rpt.conf}}}
135
136
{{{
137
[000]
138
rxchannel = usrp/127.0.0.1:34001:32001
139
duplex = 2
140
scheduler=scheduler
141
functions = functions-repeater
142
hangtime=0
143
authlevel = 0
144
145
[001]
146
rxchannel = usrp/127.0.0.1:34002:32002
147
duplex = 2
148
scheduler=scheduler
149
functions = functions-repeater
150
hangtime=0
151
authlevel = 0
152
153
[002]
154
rxchannel = usrp/127.0.0.1:34003:32003
155
duplex = 2
156
scheduler=scheduler
157
functions = functions-repeater
158
hangtime=0
159
authlevel = 0
160
161
[003]
162
rxchannel = usrp/127.0.0.1:34004:32004
163
duplex = 2
164
scheduler=scheduler
165
functions = functions-repeater
166
hangtime=0
167
authlevel = 0
168
169
[004]
170
rxchannel = usrp/127.0.0.1:34005:32005
171
duplex = 2
172
scheduler=scheduler
173
functions = functions-repeater
174
hangtime=0
175
authlevel = 0
176
}}}
177
178
Continuing the example of five voice channels from above, we define five repeater nodes (channels).  Voice and PTT traffic that 
179
is output by asterisk/app_rpt for RF transmission is forwarded to usrp_tx.py (see below) using UDP ports in the 3400x range.
180
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.
181
182
The driver invocation in {{{rpt.conf}}} is
183
{{{
184
    usrp/HISIP:HISPORT[:MYPORT]       
185
    HISIP is the IP address (or FQDN) of the GR app
186
    HISPORT is the UDP socket of the GR app
187
    MYPORT (optional) is the UDP socket that Asterisk listens on
188
             for this channel   
189
}}}
190
191
TIP: You can use the {{{usrp show}}} command to display status information from within the Asterisk CLI.
192
193
TIP: Another handy command is {{{rpt playback}}} to start transmission on a channel.
194
195
 == Channel Bank Configuration ==
196
197
Typically the audio links are terminated on channel banks which provide a standard interface to user
198
equipment.  Commonly, this equipment places an "offhook" indication on the signalling circuit when it
199
wishes to initiate a radio transmission, and signals the end of the transmission by placing the circuit
200
in the "onhook" state.  Standard audio transmission levels are defined at the channel bank interface.
201
202
A standard FXS port on the channel bank is defined in {{{/etc/asterisk/zapata.conf}}} with
203
{{{
204
signalling=fxo_ls
205
immediate=yes
206
context = chan1
207
channel => 1
208
}}}
209
210
An offhook (PTT) signal from user equipment on the FXS channel bank port 
211
(due to the {{{immmediate=yes}}}) starts processing in {{{/etc/asterisk/extensions.conf}}}:
212
213
{{{
214 1 max
[chan1]
215
exten => s,1,Dial(local/1@radio/n)
216 6 max
}}}
217
This jumps to extension "1" in context {{{radio}}} (also in {{{/etc/asterisk/extensions.conf}}})
218
{{{
219 5 max
[radio]
220
exten => 1,1,rpt(000|D)
221
exten => 2,1,rpt(001|D)
222
exten => 3,1,rpt(002|D)
223
exten => 4,1,rpt(003|D)
224
exten => 5,1,rpt(004|D)
225
}}}
226
227
So the call resulting from the offhook (PTT) signal is routed to 
228
extension "1" in context {{{[radio]}}} where it's connected to the desired
229
repeater node (channel).  If the GR app is running it will initiate
230
radio transmission.  An onhook signal on the FXS channel bank port
231
causes the end of the transmission by ending the asterisk call in
232
progress*. The {{{hangtime=0}}} setting in {{{rpt.conf}}} was used to reduce the
233
tail delay in this setup.
234
235
*The end of the transmission may be modified however, for example when
236 1 max
app_rpt appends an "ID" or if a "timeout" occurs.
237
238
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)
239
240 6 max
 = USRP Transmission =
241 1 max
242 6 max
The multi-channel USRP transmitter app currently has some limitations:
243
 * Transmit channel spacing is at arbitrary 25 KHz intervals
244
 * Analog NBFM mode is not yet supported
245
Before running the app you must first determine (example values shown in square brackets - YMMV)
246
 * the USRP TX daughterboard ID (A or B) [A]
247
 * carrier frequency of the first ("center") TX channel [435.125 MHz]
248
 * number of channels to be transmitted [five]
249 7 max
 * the first UDP port number over which usrp_tx.py receives data from chan_usrp.c [port 34001]
250 6 max
Example:
251
{{{
252
usrp_tx.py -TA -e -f 435.125e6 -n 5 -p 34001
253
}}}
254
Here we also request a FFT display. With port 34001 as the starting UDP port number and
255
five channels, {{{usrp_tx.py}}} listens on ports 34001-34005 for TX traffic coming from chan_usrp.c, as
256
configured in {{{/etc/asterisk/rpt.conf}}} (see above).
257 8 max
258
 = Soundcard Transmission = 
259
260
The soundcard TX program outputs an analog waveform that is suitable for application to the
261
modulator stage of an FM transmitter.  It listens on the UDP port for audio frames sent to it
262
by asterisk/chan_usrp.  The analog audio thus received is encoded by the soundcard TX app to
263
IMBE voice code words, which are in turn assembled into P25 voice frames (LDU1/LDU2's).  The
264
resulting 4800 baud symbol stream is then RRC filtered and shaped according to the P25 spec.
265
This signal is output to the sound card (and optionally to an on-screen oscilloscope using
266
the {{{-e}}} option).
267
268
This app may be run on the same server as asterisk or on a different machine.
269
270
Currently only a single channel is supported (per invocation of soundcard_tx).  If more than
271
one TX channel is to be used simultaneously, run a another copy of the app (either on a different
272
host or using a different UDP port).
273
274
Syntax:
275
{{{
276
soundcard_tx.py -g 0.3 -p 32001 
277
}}}
278
279 9 max
The gain value ({{{0.3}}}) would cause the output envelope (ranging from -3 to +3) to be scaled to
280 8 max
fit within the standard band from -1 to +1.  Values larger than 0.3 may cause clipping and distortion.
281
282
The final output amplitude to the radio can also be adjusted in discrete steps using the audio mixer
283
application (e.g., {{{alsamixer}}})
Add picture from clipboard (Maximum size: 48.8 MB)