Digi_Ned

digi_nedInteligentny program Digi_Ned, pracujący pod DOSem lub Linuxem, jest jednym z najbardziej funkcjonalnych programów dla obsługi digipeatera pracującego w sieci APRS. Pozwala on na określenie nie tylko obsługiwanych aliasów, ale także sposób obchodzenia się z każdym z nich; na wprowadzenie limitów dla przekazywanych ramek; na zróżnicowanie ścieżek dla własnych beaconów; posiada dwa czasy duplicate checking: dla wybranych ramek i dla pozostałych; odpowiada na zapytania (query); może wysyłać statystykę własnych dx; współpracuje ze stacją pogodową, ze stacją telemetryczną; oferuje tracking satelitów; zdalną obsługę digi. Może obsługiwać do ośmiu portów radiowych.

DIGI_NED APRS digipeater
			software.

Digi_Ned - PE1MEW

Digi_Ned - PE1DNN

O Digi_Ned po polsku - Robert SP6VWX

Nowa wersja 0.3.9 z 6 maja 2007 działa poprawnie przy obliczaniu odległości dx. Wcześniej zakradł się błąd, który powodował w trakcie przeliczeń, że lon wszystkich stacji wynosiło zero stopni.

Konfiguracja wybranych parametrów

Pliki konfiguracyjne, zaadoptowane dla nowych standardów pracy digi APRS wraz z polskim SPn-n, można pobrać w przykładowej konfiguracji dla digi w Liwoczu.

Znak wywoławczy

Własny znak, pod którym digi pracuje w eterze - wysyła swoje beacony, ale także odpowiada na zapytania do stacji o tym znaku. Ponadto znak ten automatycznie jest wstawiany przez program w każdym miejscu konfiguracji, gdzie znajduje się w konfiguracji DIGI_CALL

digi_call: SR3NNN

Beacon

Tekst, który będzie wysyłany w ramce własnego beaconu, należy zapisać w pliku digibcon.ini Wysyłanie tej ramki będzie się odbywało według:

beacon: [@]<time> <to-ports> [<dest>],[<digis>]
<filename>

time = odstępy czasowe w minutach. Dodając '@' określamy konkretną minutę pełnej godziny.
to-ports = <port>[,<port>]... określamy jeden port lub więcej portów, albo określamy "all", aby beacon wysyłany był na wszystkich portach
dest = określamy adres przeznaczenia, wpisując DIGI_DEST program sam będzie wstawiał adres przeznaczenia, który poniżej jest określony pod komendą digi_dest
digis = <digi>[,digi]... adres digi, czyli ścieżka packetowa
filename = nazwa pliku zawierającego tekst dla ramki beaconu, zwykle będzie to plik digibcon.ini

Przykład:

beacon: 20 all DIGI_DEST,WIDE2-2
digibcon.ini

W danym przykładzie beacon będzie wysyłany co 20 minut z adresem przeznaczenia określonym pod digi_dest i ścieżką packetową WIDE2-2. Będzie on również wysyłany jako odpowiedź na zapytanie (query) ?APRS?

Zalecane jest jednak skonfigurowanie beaconów, aby były wysyłane co 10 minut spełniając w ten sposób wymóg identyfikacji stacji automatycznej, ale z różnymi ścieżkami, czyli lokalnie co 10 minut, ale rzadziej z dłuższą ścieżką packetową. W tym celu należy posłużyć się znakiem @.

beacon: @0 all DIGI_DEST,WIDE2-2
digibcon.ini
beacon: @10 all DIGI_DEST
digibcon.ini
beacon: @20 all DIGI_DEST,SP5-5
digibcon.ini
beacon: @30 all DIGI_DEST
digibcon.ini
beacon: @40 all DIGI_DEST,WIDE2-2
digibcon.ini
beacon: @50 all DIGI_DEST
digibcon.ini

Dzięki takiej konfiguracj beacon, czyli ramka z tekstem zawartym w pliku digibcon.ini będzie wysyłany w następujący sposób:

@0 all DIGI_DEST,WIDE2-2 - o pełnej godzinie ze ścieżka dwustopniową
@10 all DIGI_DEST - w 10 minucie bez ścieżki
@20 all DIGI_DEST,SP5-5 - w 20 minucie ze ścieżka pięciostopniową
@30 all DIGI_DEST - w 30 minucie bez ścieżki
@40 all DIGI_DEST,WIDE2-2 - w 40 minucie ze ścieżką dwustopniową
@50 all DIGI_DEST - w 50 minucie bez ścieżki

A także wysyłany jako odpowiedź na zapytanie (query) ?APRS?

Opcjonalnie można posłużyć się różnymi komentarzami dla poszczególnych beaconów (współrzędne, symbol, PHG będą zawsze takie same). W tym celu należy stworzyć kolejne pliki podobne do digibcon.ini z różnymi nazwami, jak np. beacon1.ini, beacon2.ini i przypisać je odpowiednim czasom wysyłania, ale posługując się zamiast 'beacon', komendą 'send'. Różnica pomiędzy 'beacon' a 'send' dotyczy funkcji query, na zapytania wysyłany jest jedynie tekst beaconu związany z 'beacon'. Będzie wówczas konfiguracja w rodzaju:

beacon: @0 all DIGI_DEST,WIDE2-2
digibcon.ini
send: @10 all DIGI_DEST
beacon1.ini
send: @20 all DIGI_DEST,SP5-5
beacon2.ini
beacon: @30 all DIGI_DEST
digibcon.ini
send: @40 all DIGI_DEST,WIDE2-2
beacon1.ini
send: @50 all DIGI_DEST
beacon2.ini

Ramka z tekstem beaconu zapisana w pliku digibcon.ini powinna zawierać dane, jak w przykładowej konfiguracji dla SR8NWF:

=4948.83NS02121.05E#PHG3630 W2,SPn,R Liwocz alt=562m asl

Szczegółowy opis beaconu znajduje się w ogólnym temacie dotyczącym digi.

Status

Oprócz beaconów (pozycja) stacja może wysyłać ramki ze statusem, który daje dodatkowe informacje o stacji. Tekst ramki statusu należy wpisać w pliku digi_id.ini Wysyłanie ramki statusu będzie odbywało się według konfiguracji:

send: 30 all DIGI_DEST
digi_id.ini

Można nawet dokładnie określić czas wysyłania statusu, nie tylko jego odstępy. Definiowanie odbywa się podobnie, jak w przypadku beaconów.

send: @15 all DIGI_DEST
digi_id.ini
send: @45 all DIGI_DEST
digi_id.ini

Ramka statusu musi zaczynać się od >, który jest identyfikatorem danych APRS przewidzianym dla statusu przez specyfikację APRS. Dalsze informacje i ich kolejność są dowolne. Plik digi_id.ini dla SR8NWF zawiera następujący status:

>DIGI_NED: digipeater na Liwoczu 562m asl, klub SP8KJX op. SQ8ERB sq8erb@wp.pl

Adres przeznaczenia

Własne ramki powinny być wysyłane na jeden ze standardowych adresów przeznaczenia. Zalecane jest wpisanie w nim informacji o programie obsługującym digi i jego wersji. W tym celu należy się posłużyć adresem APNDxx, gdzie APND oznacza program Digi_Ned, a xx wersję zgodnie z:

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018
01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0G 0H 0I
 
019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036
0J 0K 0L 0M 0N 0O 0P 0Q 0R 0S 0T 0U 0V 0W 0X 0Y 0Z 10
 
037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054
11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 1G 1H 1I

Dla wersji 0.3.9 będzie to adres APND13. Należy wpisać:

digi_dest: APND13

Zdefiniowany tu adres przeznaczenia będzie wstawiany wszędzie, gdzie w konfiguracji jest DIGI_DEST

Duplicate checking

Duplicate checking wymaga przechowywania w pamięci powtórzonych ramek, aby nie powtarzać ich ponownie, kiedy docierają one kolejny raz od innych digi. Należy określić czas ich przechowywania. W digi_ned jest on określony pod komendą

keep_time: 300

Czas jest w sekundach, standardowo jest wpisane 300 sekund. Jest to długi okres, zwykle w digi ustawiane jest 30 sekund i w digi_ned też można tak ustawić, ale nie ma takiej potrzeby, bo stacje mobilowe będą wysyłały za każdym razem inną ramkę skoro ich pozycja się zmienia, stacje stałe nie muszą wysyłać tak często swojej pozycji. Krótszy czas jest potrzebny dla wiadomości, które są ponawiane, o ile nie dotarł ack, podobnie krótszy czas potrzebny jest dla query. W tym celu znajduje się w digi_ned komenda:

short_keep_time: 10

oraz korespondująca z nią:

data_prefix: :?~

I tu określone są prefiksy danych, czyli identyfikatory danych APRS, dla których duplicate checking będzie miał krótszy czas. Wiadomości w APRS mają identyfikator dwukropka, a query znak zapytania i są one już domyślnie umieszczone na liście dla short_keep_time.

Czas 30 sekund, który jest stosowany w digi opartych na samodzielnych TNC wynika z ograniczeń wewnętrznej pamięci, bo powtórzone ramki muszą być gdzieś przechowywane, aby można było z nimi porównywać nowo przychodzące. 30 sekund w zasadzie skutecznie eliminuje duplikaty, a TNC nie mają takich możliwości programowych, aby dać dwa różne czasy dla duplikatów, jak w digi_ned.

Powtarzanie odbieranych ramek

Zakwalifikowanie odebranej ramki, aby została powtórzona opiera się na takich kryteriach, jak port, na którym została odebrana, oraz kolejny adres digi (ścieżka); dodatkowo może być określony sposób obchodzenia się z ramką w zależności, czy jest to pierwszy, czy ostatni etap ścieżki i parę innych parametrów.

Sposoby operowania ścieżką:

Do powyższych operacji można dodać liczbę, która jest maksymalną liczbą dla listy wcześniej zrealizowanych digi, domyślnie jest 1, dla innej wartości należy wpisać cyfrę 0-8.

Digipeat

Podstawowa funkcja powtarzania ramek określana jest komendą digipeat, a jej kryteria dotyczą:

digipeat: <from-ports> <due-digis> <to-ports> [operation[n] [<digis>]]

from-ports = <port>[,<port>]..., odebrane na porcie: <port>[,<port>]..., lub "all" na wszystkich portach.
due-digis = <due>[,<due>]... lista "due" obejmuje formaty ścieżek (adres digi), na które przypada kolejność w operowanej ramce. Np. SP3-3. Można posłużyć się wariacjami w postaci ?, #, @ lub *.
to-ports = <port>[,<port>]... wysyłane na porcie: <port>[,<port>]..., lub "all", aby wysyłać na wszystkich portach; "allbut" na wszystkich portach z wykluczeniem odbierającego portu.

operation = add | replace | new | swap | hijack | erase | keep | shift - sposób operowania ścieżką
n = liczba zaznaczonych digipeaterów w ścieżce jako zrealizowane, domyślnie 1
digis = <digi>[,digi]... wstawiana ścieżka (adres digi)

Przykład:

digipeat: all sp3-3 all swap0 sp3-2

DigiEnd

digiend: <from-ports> <end-digis> <to-ports> [operation[n] [<digis>]]

from-ports = <port>[,<port>]..., odebrane na porcie: <port>[,<port>]..., lub "all" na wszystkich portach.
end-digis = <end>[,<end>]... lista obejmuje formaty ścieżek (adres digi), którymi są zakończone przychodzące ścieżki (poprzedni zrealizowany element w ścieżce) i na które należy zareagować, np. WIDE2-1. Można posłużyć się wariacjami w postaci ?, #, @ lub *.
to-ports = <port>[,<port>]... wysyłane na porcie: <port>[,<port>]..., lub "all", aby wysyłać na wszystkich portach; "allbut" na wszystkich portach z wykluczeniem odbierającego portu.

operation = add | replace | new | swap | hijack | erase | keep | shift - sposób operowania ścieżką
n = liczba zaznaczonych digipeaterów w ścieżce jako zrealizowane, domyślnie 1
digis = <digi>[,digi]... wstawiana ścieżka (adres digi)

Przykład:

digiend: all wide2*,sp2* 2 add TAMA

DigiTo

DigiTo zadziała tylko wtedy, gdy jest adres przeznaczenia, a nie ma ścieżki (adresu digi) w ramce.

digito: <from-ports> <destinations> <to-ports> <ssid> [operation[n] [<digis>]]

from-ports = <port>[,<port>]..., odebrane na porcie: <port>[,<port>]..., lub "all" na wszystkich portach.
destinations = <dest>[,<dest>]... lista adresów przeznaczenia odebranych ramek, np. APRS, BEACON. Można posłużyć się wariacjami w postaci ?, #, @ lub *.
to-ports = <port>[,<port>]... wysyłane na porcie: <port>[,<port>]..., lub "all", aby wysyłać na wszystkich portach.

operation = add | replace | new | swap | hijack | erase | keep | shift - sposób operowania ścieżką
n = liczba zaznaczonych digipeaterów w ścieżce jako zrealizowane, domyślnie 1
digis = <digi>[,digi]... wstawiana ścieżka (adres digi)

Przykład:

digito: all *-3 all 2 add0 DIGI_CALL

DigiSSID

DigiSSID ma pierwszeństwo przed Digipeat.

digissid: <from-ports> <destinations> <to-ports> <ssid> [operation[n] [<digis>]]

from-ports = <port>[,<port>]..., odebrane na porcie: <port>[,<port>]..., lub "all" na wszystkich portach; "allbut" na wszystkich portach z wykluczeniem odbierającego portu.
destinations = <dest>[,<dest>]... lista adresów przeznaczenia odebranych ramek, np. APRS, BEACON. Można posłużyć się wariacjami w postaci ?, #, @ lub *.
to-ports = <port>[,<port>]... wysyłane na porcie: <port>[,<port>]..., lub "all", aby wysyłać na wszystkich portach; "allbut" na wszystkich portach z wykluczeniem odbierającego portu.

operation = add | replace | new | swap | hijack | erase | keep | shift - sposób operowania ścieżką
n = liczba zaznaczonych digipeaterów w ścieżce jako zrealizowane, domyślnie 1
digis = <digi>[,digi]... wstawiana ścieżka (adres digi)
ssid = wstawiane SSID do adresu przeznaczenia

Przykład:

digissid: 1 *-12 all 0 add WIDE

DigiFirst

DigiFirst zadziała tylko wtedy, jeśli due-digi jest pierwszym elementem ścieżki, ale jeśli jest już dalszym, to zadziała DigiNext.

digifirst: <from-ports> <due-digis> <to-ports> [operation[n] [<digis>]]

from-ports = <port>[,<port>]..., odebrane na porcie: <port>[,<port>]..., lub "all" na wszystkich portach.
due-digis = <due>[,<due>]... lista "due" obejmuje formaty ścieżek (adres digi), na które przypada kolejność w operowanej ramce. Można posłużyć się wariacjami w postaci ?, #, @ lub *.
to-ports = <port>[,<port>]... wysyłane na porcie: <port>[,<port>]..., lub "all", aby wysyłać na wszystkich portach; "allbut" na wszystkich portach z wykluczeniem odbierającego portu.

operation = add | replace | new | swap | hijack | erase | keep | shift - sposób operowania ścieżką
n = liczba zaznaczonych digipeaterów w ścieżce jako zrealizowane, domyślnie 1
digis = <digi>[,digi]... wstawiana ścieżka (adres digi)

Przykład:

digifirst: all sp5-5 all swap DIGI_CALL,sp5-4

DigiNext

diginext: <from-ports> <due-digis> <to-ports> [operation[n] [<digis>]]

from-ports = <port>[,<port>]..., odebrane na porcie: <port>[,<port>]..., lub "all" na wszystkich portach.
due-digis = <due>[,<due>]... lista "due" obejmuje formaty ścieżek (adres digi), na które przypada kolejność w operowanej ramce. Można posłużyć się wariacjami w postaci ?, #, @ lub *.
to-ports = <port>[,<port>]... wysyłane na porcie: <port>[,<port>]..., lub "all", aby wysyłać na wszystkich portach; "allbut" na wszystkich portach z wykluczeniem odbierającego portu.

operation = add | replace | new | swap | hijack | erase | keep | shift - sposób operowania ścieżką
n = liczba zaznaczonych digipeaterów w ścieżce jako zrealizowane, domyślnie 1
digis = <digi>[,digi]... wstawiana ścieżka (adres digi)

Przykład:

diginext: all sp5-5 all swap0 sp5-4

SSID_Ignore_Prefix

ssid_ignore_prefix: <char>[<char>]...

char = identyfikator danych APRS, które mają być pominięte przy powtarzaniu według DigiSSID. Przykład:

ssid_ignore_prefix: ~

Konfiguracja digi z limitami W2,SPn

Zazwyczaj stacja pracuje z jednym portem, stąd użyte jest uproszczenie - wszędzie porty określone są jako all.

Obsługa własnego znaku

digipeat: all DIGI_CALL all

Powtarzane są wszystkie ramki zawierające w ścieżce własny znak digi.

Obsługa WIDEn-n

digipeat: all wide7-7 all swap DIGI_CALL,wide2-1
digipeat: all wide7-6 all swap2 DIGI_CALL,wide2
digipeat: all wide6-6 all swap DIGI_CALL,wide2-1
digipeat: all wide6-5 all swap2 DIGI_CALL,wide2
digipeat: all wide5-5 all swap DIGI_CALL,wide2-1
digipeat: all wide5-4 all swap2 DIGI_CALL,wide2
digipeat: all wide4-4 all swap DIGI_CALL,wide2-1
digipeat: all wide4-3 all swap2 DIGI_CALL,wide2
digipeat: all wide3-3 all swap DIGI_CALL,wide2-1
digipeat: all wide3-2 all swap2 DIGI_CALL,wide2
digipeat: all wide2-2 all swap DIGI_CALL,wide2-1
digipeat: all wide2-1 all swap2 DIGI_CALL,wide2
digipeat: all wide1-1 all swap DIGI_CALL,wide1

Według aktualnych standardów APRS, obsługa WIDEn-n polega na wstawianiu do przekazywanej ramki znaku digi, czyli WIDEn-n jest trasowany. Limitowanie w digi_ned pozwala na przekazywanie ramek z nadmierną ścieżką, która zostaje jednocześnie zamieniona na zgodną z lokalnymi limitami. Np. WIDE6-6 nie tylko zostaje zredukowane o jeden (zwykle do WIDE6-5), ale także zamienione na WIDE2-1. Zostają zignorowane ramki, które przeszły już przez tyle digi, że nie mieszczą się w limicie. Np. WIDE5-3 przeszedł już przez dwa digi, obecny byłby trzecim stopniem, więc ramki z taką ścieżką nie są obsługiwane.

Obsługa SPn-n

digifirst: all sp7-7 all swap DIGI_CALL,sp7-6
diginext: all sp7-7 all swap0 sp7-6
digipeat: all sp7-6 all swap0 sp7-5
digipeat: all sp7-5 all swap0 sp7-4
digipeat: all sp7-4 all swap0 sp7-3
digipeat: all sp7-3 all swap0 sp7-2
digipeat: all sp7-2 all swap0 sp7-1
digipeat: all sp7-1 all swap sp7

digifirst: all sp6-6 all swap DIGI_CALL,sp6-5
diginext: all sp6-6 all swap0 sp6-5
digipeat: all sp6-5 all swap0 sp6-4
digipeat: all sp6-4 all swap0 sp6-3
digipeat: all sp6-3 all swap0 sp6-2
digipeat: all sp6-2 all swap0 sp6-1
digipeat: all sp6-1 all swap sp6

digifirst: all sp5-5 all swap DIGI_CALL,sp5-4
diginext: all sp5-5 all swap0 sp5-4
digipeat: all sp5-4 all swap0 sp5-3
digipeat: all sp5-3 all swap0 sp5-2
digipeat: all sp5-2 all swap0 sp5-1
digipeat: all sp5-1 all swap sp5

digifirst: all sp4-4 all swap DIGI_CALL,sp4-3
diginext: all sp4-4 all swap0 sp4-3
digipeat: all sp4-3 all swap0 sp4-2
digipeat: all sp4-2 all swap0 sp4-1
digipeat: all sp4-1 all swap sp4

digifirst: all sp3-3 all swap DIGI_CALL,sp3-2
diginext: all sp3-3 all swap0 sp3-2
digipeat: all sp3-2 all swap0 sp3-1
digipeat: all sp3-1 all swap sp3

digifirst: all sp2-2 all swap DIGI_CALL,sp2-1
diginext: all sp2-2 all swap0 sp2-1
digipeat: all sp2-1 all swap sp2

digipeat: all sp1-1 all swap sp1

Alias SPn-n nie jest limitowany, przyjmowane są wszystkie n-n. Digi nie wstawia swojego znaku do przekazywanej ramki, chyba, że jest on pierwszym digi, który przekazuje daną ramkę.

Dodatkowe kryteria powtarzania ramek

Preempt

Funkcja Preempt dotyczy wstępnej operacji zanim ramka będzie podlegała wyżej wymienionym operacjom jej powtarzania. Polega ona na wyszukiwaniu określonych elementów ścieżki, gdyby one znalazły się na dalszym miejscu niż wynika to ze zwykłej kolejności. Dzięki niej nastąpi przejście do określonego miejsca ścieżki i wymazanie wcześniejszych nieużytych elementów.

preempt: <from-ports> <on-digis> [<replace>]

from-ports = <port>[,<port>]..., odebrane na porcie: <port>[,<port>]..., lub "all" na wszystkich portach
on-digis = <find>[,<find>]... lista poszukiwanych elementów ścieżki (adresów digi), na podstawie których zadziała Preempt. Można posłużyć się wariacjami w postaci ?, #, @ lub *.

replace = wstawiany zamiennik (np. znak digi) w miejsce znalezionego. Jeśli replace nie jest określone, find pozostaje nie zmienione.

Przykład:

preempt: all SR3DPN POZN

Preempt_keep

preempt_keep: <digis>

digis = <keep>[,<keep>]... lista elementów ścieżki (adresów digi), które mają być zachowane, gdy zadziała Preempt. Można posłużyć się wariacjami w postaci ?, #, @ lub *.

Przykład:

preempt_keep: SR*,SP3*,SQ3*

Preempt_never_keep

preempt_never_keep: <digis>

digis = <keep>[,<keep>]... lista elementów ścieżki (adresów digi), które nigdy nie powinny być pozostawione, gdy zadziała Preempt. Można posłużyć się wariacjami w postaci ?, #, @ lub *.

Przykład:

preempt_never_keep: RELAY*,WIDE*,TRACE*,GATE*

Local

local: <local-ports>

local-ports = <port>[,<port>]... lista portów lub "all", jeśli wszystkie porty

Przykład:

local: 2