LoRa radio can be controlled via command line and web interface
This commit is contained in:
@@ -1 +1 @@
|
||||
/usr/sbin/beacon -d "APRX29" -s ax2 '!5302.78NL00707.91E&LoRa APRS RX iGATE (https://meezenest.nl/pe1rxf)'
|
||||
/usr/sbin/beacon -d "APRX29" -s ax2 '!5302.78N/00707.91E-https://meezenest.nl/pe1rxf'
|
||||
|
@@ -40,4 +40,4 @@
|
||||
#* * * * * /home/marcel/ham/aprs_utils/send_beacon_external_radio.sh
|
||||
|
||||
#Send beacon on AX2 (LoRa internal radio)
|
||||
#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_lora.sh
|
||||
#* * * * * /home/marcel/ham/aprs_utils/send_beacon_lora_radio.sh
|
||||
|
@@ -71,3 +71,36 @@ ax1_message4_id=Message 4
|
||||
ax1_message4_text=Fourth message
|
||||
ax1_message4_destination=PE1RXF-7
|
||||
ax1_message4_path=WIDE2-2
|
||||
|
||||
# LoRa radio settings
|
||||
ax2_name=Digipeater LoRa
|
||||
ax2_frequency=433.775 MHz
|
||||
|
||||
# Beacon time LoRa radio (ax2) in minutes. 0-60, where 0 disables beaconing.
|
||||
ax2_beacon_time=0
|
||||
ax2_beacon_destination=APRX29
|
||||
ax2_beacon_path=none
|
||||
ax2_beacon_position=!5302.78N/00707.91E-
|
||||
ax2_beacon_comment=https://meezenest.nl/pe1rxf
|
||||
ax2_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax2.txt
|
||||
|
||||
# Predefined messages
|
||||
ax2_message1_id=Message 1
|
||||
ax2_message1_text=First message
|
||||
ax2_message1_destination=PE1RXF-7
|
||||
ax2_message1_path=WIDE2-2
|
||||
|
||||
ax2_message2_id=Message 2
|
||||
ax2_message2_text=Second message
|
||||
ax2_message2_destination=PE1RXF-7
|
||||
ax2_message2_path=WIDE2-2
|
||||
|
||||
ax2_message3_id=Message 3
|
||||
ax2_message3_text=Thirth message
|
||||
ax2_message3_destination=PE1RXF-7
|
||||
ax2_message3_path=WIDE2-2
|
||||
|
||||
ax2_message4_id=Message 4
|
||||
ax2_message4_text=Fourth message
|
||||
ax2_message4_destination=PE1RXF-7
|
||||
ax2_message4_path=WIDE2-2
|
||||
|
@@ -69,3 +69,36 @@ ax1_message4_text=Fourth message
|
||||
ax1_message4_destination=PE1RXF-7
|
||||
ax1_message4_path=WIDE2-2
|
||||
|
||||
# LoRa radio settings
|
||||
ax2_name=Digipeater LoRa
|
||||
ax2_frequency=433.775 MHz
|
||||
|
||||
# Beacon time LoRa radio (ax2) in minutes. 0-60, where 0 disables beaconing.
|
||||
ax2_beacon_time=0
|
||||
ax2_beacon_destination=APRX29
|
||||
ax2_beacon_path=none
|
||||
ax2_beacon_position=!5302.78N/00707.91E-
|
||||
ax2_beacon_comment=https://meezenest.nl/pe1rxf
|
||||
ax2_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax2.txt
|
||||
|
||||
# Predefined messages
|
||||
ax2_message1_id=Message 1
|
||||
ax2_message1_text=First message
|
||||
ax2_message1_destination=PE1RXF-7
|
||||
ax2_message1_path=WIDE2-2
|
||||
|
||||
ax2_message2_id=Message 2
|
||||
ax2_message2_text=Second message
|
||||
ax2_message2_destination=PE1RXF-7
|
||||
ax2_message2_path=WIDE2-2
|
||||
|
||||
ax2_message3_id=Message 3
|
||||
ax2_message3_text=Thirth message
|
||||
ax2_message3_destination=PE1RXF-7
|
||||
ax2_message3_path=WIDE2-2
|
||||
|
||||
ax2_message4_id=Message 4
|
||||
ax2_message4_text=Fourth message
|
||||
ax2_message4_destination=PE1RXF-7
|
||||
ax2_message4_path=WIDE2-2
|
||||
|
||||
|
@@ -82,7 +82,15 @@ while read LINE
|
||||
PORT="ax1"
|
||||
fi
|
||||
|
||||
# Lets do something with the frame from channel 1 or 2
|
||||
# If call is still empty, frame not from channel 1 or 2, maybe from channel 3?
|
||||
if [ -z $CALL ]; then
|
||||
#CALL="$(grep -o -P "(?<=PE1RXF-3 R \*).+?\>"<<<$LINE)"
|
||||
CALL="$(grep -oP "(?<=PE1RXF-3 R ).+?\>"<<<$LINE)"
|
||||
|
||||
PORT="ax2"
|
||||
fi
|
||||
|
||||
# Lets do something with the frame from channel 1, 2 or 3
|
||||
if [[ $CALL ]]; then
|
||||
|
||||
# Remove last character from string
|
||||
@@ -92,10 +100,12 @@ while read LINE
|
||||
if [ $PORT == "ax0" ]; then
|
||||
#FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 R \*).+?:'<<<$LINE)"
|
||||
FULL_PATH="$(grep -oP "(?<=PE1RXF-1 R ).+?:"<<<$LINE)"
|
||||
|
||||
else
|
||||
#FULL_PATH="$(grep -o -P '(?<=PE1RXF-2 R \*).+?:'<<<$LINE)"
|
||||
elif [ $PORT == "ax1" ]; then
|
||||
#FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 R \*).+?:'<<<$LINE)"
|
||||
FULL_PATH="$(grep -oP "(?<=PE1RXF-2 R ).+?:"<<<$LINE)"
|
||||
else
|
||||
#FULL_PATH="$(grep -o -P '(?<=PE1RXF-3 R \*).+?:'<<<$LINE)"
|
||||
FULL_PATH="$(grep -oP "(?<=PE1RXF-3 R ).+?:"<<<$LINE)"
|
||||
fi
|
||||
|
||||
FULL_PATH="$(grep -o -P '(?<=\>).*'<<<$FULL_PATH)"
|
||||
|
52
aprs_utils/send_beacon_lora_radio.sh
Executable file
52
aprs_utils/send_beacon_lora_radio.sh
Executable file
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
|
||||
##################################################################################
|
||||
# Send beacon via APRS channel 2 (ax1) #
|
||||
# #
|
||||
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
|
||||
# #
|
||||
# This file is part of PE1RXF-APRS-server. #
|
||||
# #
|
||||
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with PE1RXF-APRS-server. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
##################################################################################
|
||||
|
||||
source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions
|
||||
|
||||
ConfigFile="/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg"
|
||||
BEACON_FILE="$(config_get ax2_beacon_file $ConfigFile)"
|
||||
|
||||
if [ -f "$BEACON_FILE" ]; then
|
||||
BEACON_TEXT=$(cat "$BEACON_FILE")
|
||||
|
||||
# The BEACON_FILE holds the command for sending a beacon. So make this file part of the script.
|
||||
# I shouldn't really do this, as it is a potential security risk. But the BEACON_FILE is as safe as this script itself.
|
||||
# The BEACON_FILE can not be altered via the web interface, but only by the main program. So it should be ok.
|
||||
# But this makes the code potential self altering, which is bad! Realy realy bad!
|
||||
# But than again, is it really not the same as calling an external program from the script, as this program can also be alterred.
|
||||
# Anyway, enough of my rambling, let's continue with the script.
|
||||
|
||||
# To be safe, lets do some minimal safety checks before executing the external file:
|
||||
|
||||
# BEACON_FILE should only have one line:
|
||||
NR_OF_LINES=$(awk 'END { print NR }' $BEACON_FILE)
|
||||
# And this line should contain the beacon command:
|
||||
RESULT=$(grep "/usr/sbin/beacon" $BEACON_FILE)
|
||||
|
||||
if [ -n "$RESULT" ] && [ $NR_OF_LINES -eq 1 ]; then
|
||||
# Send the beacon
|
||||
. $BEACON_FILE
|
||||
fi
|
||||
|
||||
fi
|
@@ -43,7 +43,7 @@ Help()
|
||||
echo
|
||||
echo "Syntax: set_beacon.sh [-i <interface>|-c <call>|-p <path>|-m <message>]"
|
||||
echo "Options:"
|
||||
echo "-i AX.25 interface (ax0 or ax1)"
|
||||
echo "-i AX.25 interface (ax0, ax1 or ax2)"
|
||||
echo "-c Destination call"
|
||||
echo "-p Path: 0=none, WIDE2-1, WIDE2-2, WIDE3-3 or call of digipeater"
|
||||
echo "-m Message to send."
|
||||
@@ -101,7 +101,7 @@ if [ "$Interface" == "ax0" ]; then
|
||||
echo "$APRS_FRAME" > "$AX0_APRS_TRANSMIT_DIR"message.msg
|
||||
#echo "$APRS_FRAME $AX0_APRS_TRANSMIT_DIR"
|
||||
|
||||
else
|
||||
elif [ "$Interface" == "ax1" ]; then
|
||||
# Log message
|
||||
echo "$CURRENT_DATE_TIME,ax1,$Call,APRX29,$Message" >> $APRS_RECEIVED_MESSAGES_DIR$MESSAGE_FILE
|
||||
|
||||
@@ -126,6 +126,32 @@ else
|
||||
|
||||
#"$APRS_CMD" > tmp.tmp
|
||||
|
||||
/usr/sbin/beacon "${args[@]}"
|
||||
elif [ "$Interface" == "ax2" ]; then
|
||||
# Log message
|
||||
echo "$CURRENT_DATE_TIME,ax2,$Call,APRX29,$Message" >> $APRS_RECEIVED_MESSAGES_DIR$MESSAGE_FILE
|
||||
|
||||
# if call is less than 9 characters, add spaces at the end (according to the APRS protocol)
|
||||
printf -v Call %-9.9s "$Call"
|
||||
if [ "$Path" == "0" ]; then
|
||||
APRS_FRAME="PE1RXF-3>APRX29::$Call:$Message"
|
||||
args[0]=-d
|
||||
args[1]="APRX29"
|
||||
args[2]=-s
|
||||
args[3]=ax2
|
||||
args[4]=":$Call:$Message"
|
||||
else
|
||||
APRS_FRAME="PE1RXF-3>APRX29,$Path::$Call:$Message"
|
||||
args[0]=-d
|
||||
args[1]="APRX29 $Path"
|
||||
args[2]=-s
|
||||
args[3]=ax2
|
||||
args[4]=":$Call:$Message"
|
||||
fi
|
||||
#echo "$APRS_FRAME"
|
||||
|
||||
#"$APRS_CMD" > tmp.tmp
|
||||
|
||||
/usr/sbin/beacon "${args[@]}"
|
||||
|
||||
fi
|
||||
|
@@ -50,6 +50,8 @@ UpdateCrontab()
|
||||
# All those escaped characters were a nightmare, but in the end the resulting string was perfect. But executing the string directly from this script proved to be another nightmare:
|
||||
# It appears that bash inserts additional escape characters, resulting in the command not working. The solution below is not very elegant, but hey...it works!
|
||||
# Let's make a bash script, execute is and remove it again.
|
||||
echo "#!/bin/bash"
|
||||
echo "$sed_string"
|
||||
echo "#!/bin/bash" > $sed_tmp_command_file
|
||||
echo "$sed_string" >> $sed_tmp_command_file
|
||||
chmod u+x $sed_tmp_command_file
|
||||
@@ -82,7 +84,7 @@ ConstructBeaconFile()
|
||||
echo $ConstructBeaconFile_Beacon
|
||||
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
|
||||
|
||||
else
|
||||
elif [ "${1}" == "ax1" ]; then
|
||||
ConstructBeaconFile_Destination="$(config_get ax1_beacon_destination $ConfigFile)"
|
||||
ConstructBeaconFile_Path="$(config_get ax1_beacon_path $ConfigFile)"
|
||||
ConstructBeaconFile_Position="$(config_get ax1_beacon_position $ConfigFile)"
|
||||
@@ -104,6 +106,30 @@ ConstructBeaconFile()
|
||||
ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination $ConstructBeaconFile_Path\" -s ax1 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'"
|
||||
fi
|
||||
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
|
||||
|
||||
elif [ "${1}" == "ax2" ]; then
|
||||
ConstructBeaconFile_Destination="$(config_get ax2_beacon_destination $ConfigFile)"
|
||||
ConstructBeaconFile_Path="$(config_get ax2_beacon_path $ConfigFile)"
|
||||
ConstructBeaconFile_Position="$(config_get ax2_beacon_position $ConfigFile)"
|
||||
ConstructBeaconFile_Comment="$(config_get ax2_beacon_comment $ConfigFile)"
|
||||
ConstructBeaconFile_File="$(config_get ax2_beacon_file $ConfigFile)"
|
||||
|
||||
if [ "$ConstructBeaconFile_Path" == "none" ]; then
|
||||
ConstructBeaconFile_Beacon="PE1RXF-3>$ConstructBeaconFile_Destination:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
|
||||
else
|
||||
ConstructBeaconFile_Beacon="PE1RXF-3>$ConstructBeaconFile_Destination,$ConstructBeaconFile_Path:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
|
||||
fi
|
||||
|
||||
echo "Beacon for ax2:"
|
||||
echo $ConstructBeaconFile_Beacon
|
||||
|
||||
if [ "$ConstructBeaconFile_Path" == "none" ]; then
|
||||
ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination\" -s ax2 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'"
|
||||
else
|
||||
ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination $ConstructBeaconFile_Path\" -s ax2 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'"
|
||||
fi
|
||||
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
|
||||
|
||||
|
||||
fi
|
||||
|
||||
@@ -120,6 +146,7 @@ TimeInterval="-1"
|
||||
crontab_time_string="* * * * *"
|
||||
crontab_command_string_ax0="/home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh"
|
||||
crontab_command_string_ax1="/home/marcel/ham/aprs_utils/send_beacon_external_radio.sh"
|
||||
crontab_command_string_ax2="/home/marcel/ham/aprs_utils/send_beacon_lora_radio.sh"
|
||||
crontab_full_string="#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh"
|
||||
crontab_intermediate_file="/home/marcel/ham/aprs_utils/crontab.pe1rxf"
|
||||
sed_tmp_command_file="/home/marcel/ham/aprs_utils/sed.cmd"
|
||||
@@ -153,13 +180,15 @@ done
|
||||
if [ "$work_with_config_file" -eq "1" ]; then
|
||||
|
||||
|
||||
for ax_port in ax0 ax1
|
||||
for ax_port in ax0 ax1 ax2
|
||||
do
|
||||
Interface="$ax_port"
|
||||
if [ "$Interface" == "ax0" ]; then
|
||||
TimeInterval="$(config_get ax0_beacon_time $ConfigFile)"
|
||||
else
|
||||
elif [ "$Interface" == "ax1" ]; then
|
||||
TimeInterval="$(config_get ax1_beacon_time $ConfigFile)"
|
||||
elif [ "$Interface" == "ax2" ]; then
|
||||
TimeInterval="$(config_get ax2_beacon_time $ConfigFile)"
|
||||
fi
|
||||
|
||||
# Let's generate new beacon files according to values in configuration file
|
||||
@@ -186,6 +215,9 @@ if [ "$work_with_config_file" -eq "1" ]; then
|
||||
elif [ "$Interface" == "ax1" ]; then
|
||||
crontab_full_string="$crontab_time_string $crontab_command_string_ax1"
|
||||
sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
|
||||
elif [ "$Interface" == "ax2" ]; then
|
||||
crontab_full_string="$crontab_time_string $crontab_command_string_ax2"
|
||||
sed_string="sed -i \"/send_beacon_lora_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
|
||||
else
|
||||
echo "No valid value. Using default."
|
||||
crontab_full_string="$crontab_time_string $crontab_command_string_ax0"
|
||||
@@ -199,6 +231,7 @@ if [ "$work_with_config_file" -eq "1" ]; then
|
||||
printf -- "Values read from file: %s$ConfigFile\n";
|
||||
printf -- "ax0 beacon time: %s\n" "$(config_get ax0_beacon_time $ConfigFile)";
|
||||
printf -- "ax1 beacon time: %s\n" "$(config_get ax1_beacon_time $ConfigFile)";
|
||||
printf -- "ax2 beacon time: %s\n" "$(config_get ax2_beacon_time $ConfigFile)";
|
||||
# Read values from command line arguments
|
||||
else
|
||||
|
||||
@@ -224,6 +257,9 @@ else
|
||||
elif [ "$Interface" == "ax1" ]; then
|
||||
crontab_full_string="$crontab_time_string $crontab_command_string_ax1"
|
||||
sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
|
||||
elif [ "$Interface" == "ax2" ]; then
|
||||
crontab_full_string="$crontab_time_string $crontab_command_string_ax2"
|
||||
sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
|
||||
else
|
||||
echo "Syntax error!"
|
||||
Help
|
||||
|
Reference in New Issue
Block a user