First working version

This commit is contained in:
2021-12-28 18:10:26 +01:00
parent 8f022ebfe3
commit 664f2d4b3a
92 changed files with 10922 additions and 1 deletions

View File

@@ -0,0 +1,5 @@
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:39,16.6,59.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

View File

@@ -0,0 +1,5 @@
2021-12-28 11:48,16.2,57.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 11:58,16.1,57.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:08,16.0,57.4,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:18,16.1,59.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:19,16.1,59.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

View File

@@ -0,0 +1,18 @@
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:39,16.6,59.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:49,16.9,59.4,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:59,17.1,59.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:24,16.3,58.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:24,16.3,58.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:24,16.3,58.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:34,16.1,59.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:44,16.1,59.1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:54,16.1,59.1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:04,16.1,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:05,16.1,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:15,16.2,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:25,16.2,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:35,16.3,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

View File

@@ -0,0 +1,228 @@
2021-12-26 10:18:05,ax0,PE1RXF-1,APRX29,Test message
2021-12-26 10:18:38,ax0,PE1RXF-1,APRX29,Test message
2021-12-26 10:18:56,ax1,PE1RXF-1,APRX29,Test message
2021-12-26 10:19:29,ax1,PA1RXF-1,APRX29,Test message
2021-12-26 10:28:22,ax1,PA1RXF-1,APRX29,Test message{001
2021-12-26 10:29:30,ax1,PE1RXF-1,APRX29,Test message{001
2021-12-26 10:30:20,ax1,PE1RXF-1,APRX29,Test message{001
2021-12-26 10:33:16,ax0,PE1RXF-1,APRX29,Test message{001
2021-12-26 14:42:29,ax0,PE1RXF-1,APRX29,Test message 3
2021-12-26 14:57:09,ax0,KM6LYW-9,APZ100,Your sister swims out to meet troop ships.{2
2021-12-26 14:57:18,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 14:58:19,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 14:59:01,ax0,KM6LYW-9,APZ100,You will be recognized and honored as a community leader.{3
2021-12-26 14:59:09,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:39:59,ax0,KM6LYW-9,APZ100,"A tall, dark stranger will have more fun than you.{4"
2021-12-26 19:40:06,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:40:13,ax0,KM6LYW-9,APZ100,A tall, dark stranger will have more fun than you.{4
2021-12-26 19:40:20,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:40:34,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:40:54,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:41:01,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:46:20,ax0,KM6LYW-9,APZ100,"A tall, dark stranger will have more fun than you."
2021-12-26 19:51:03,ax0,KM6LYW-9,APZ100,"Your lucky number has been disconnected.{5"
2021-12-26 19:51:14,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:51:25,ax0,KM6LYW-9,APZ100,"Your lucky number has been disconnected.{5"
2021-12-26 19:51:36,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:51:47,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:51:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:53:02,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:53:13,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:58:23,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:58:34,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:59:17,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:02:30,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-26 20:02:50,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-26 20:03:54,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:04:15,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:04:36,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:04:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:08:37,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:11:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:12:18,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:16:26,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:16:47,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:17:08,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:17:49,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:18:10,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:18:51,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:19:12,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 21:21:22,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 21:21:42,ax0,KM6LYW-9,APZ100,"You will gain money by a speculation or lottery.{9"
2021-12-26 21:21:43,ax0,KM6LYW-9,APZ100,"You will gain money by a speculation or lottery.{9"
2021-12-26 21:21:45,ax0,KM6LYW-9,APZ100,"You will gain money by a speculation or lottery.{9"
2021-12-26 21:21:56,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 21:21:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-28 08:58:07,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-28 08:58:08,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-28 09:07:02,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-28 09:08:53,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:11:50,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:14:11,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:15:02,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:17:10,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:49:49,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:53:28,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:54:35,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:59:04,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 09:59:05,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:59:06,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:59:43,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01<0x1b><0xa9>"
2021-12-28 10:00:11,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01<0x0d>F"
2021-12-28 10:00:51,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:07,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:15,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:29,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:55,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01<0xfb>"
2021-12-28 10:01:59,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01<0xf2><0x9d>"
2021-12-28 10:02:01,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:06,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:24,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:33,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:50,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:57,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:03:18,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:03:21,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:22,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:39,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:03:40,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:41,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:49,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:03:50,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:51,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:04:12,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:04:17,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:04:28,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:04:53,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:09,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:25,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:34,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:44,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:06:21,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:06:22,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:06:23,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:06:27,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:06:36,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:06:53,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:06:54,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:07:43,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:07:44,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:07:45,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:09:35,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:09:36,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:09:37,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:09:52,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:09:58,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:07,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:11:12,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:22,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:25,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:11:38,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:40,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:45,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:11:47,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:50,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:53,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:54,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:11:55,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:28,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:29,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:30,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:39,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:40,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:41,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:48,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:12:53,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:54,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:55,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:58,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:59,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:13:00,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:15:17,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:15:27,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:15:27,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:15:28,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:16:43,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:16:44,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:16:52,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:16:52,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:17:07,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:17:08,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:23,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:33:29,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:32,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:39,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:40,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:41,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:44,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:45,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:46,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:51,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:52,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:53,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:34:08,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:34:09,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:34:10,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:35:48,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:36:16,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:36:44,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:37:43,ax1,PE1RXF-7,APZMDM," 15.2,58.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0"
2021-12-28 10:38:21,ax1,PE1RXF-7,APZMDM,"ack10"
2021-12-28 10:39:17,ax1,PE1RXF-7,APZMDM,"rej51"
2021-12-28 10:41:04,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:41:05,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:10,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:15,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:20,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:50,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:44:08,ax0,PE1RXF-2,APRX29,"?21{21"
2021-12-28 10:44:09,ax0,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:44:10,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:44:11,ax1,PE1RXF-1,APRX29,"ack21"
2021-12-28 10:51:25,ax0,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:26,ax1,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:27,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:51:28,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:51:30,ax0,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:31,ax1,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:32,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:51:33,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:57:55,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 11:07:37,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:07:42,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:07:47,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:15:53,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:16:24,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:16:53,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:27:59,ax1,PE1RXF-7,APZMDM," 15.9,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:28:09,ax1,PE1RXF-7,APZMDM," 15.9,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:28:14,ax1,PE1RXF-7,APZMDM," 15.9,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:31:56,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 11:32:14,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 11:36:14,ax1,PE1RXF-7,APZMDM," 16.1,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:37:14,ax1,PE1RXF-7,APZMDM," 16.1,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 11:38:14,ax1,PE1RXF-7,APZMDM," 16.1,59.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{003"
2021-12-28 11:43:20,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 11:48:46,ax1,PE1RXF-7,APZMDM," 16.2,57.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:58:46,ax1,PE1RXF-7,APZMDM," 16.1,57.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 12:08:45,ax1,PE1RXF-7,APZMDM," 16.0,57.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{003"
2021-12-28 12:18:45,ax1,PE1RXF-7,APZMDM," 16.1,59.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{004"
2021-12-28 12:19:00,ax1,PE1RXF-7,APZMDM," 16.1,59.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{004"
2021-12-28 12:29:01,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:29:15,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:29:30,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:29:45,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:39:45,ax1,PE1RXF-7,APZMDM," 16.6,59.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{006"
2021-12-28 12:49:45,ax1,PE1RXF-7,APZMDM," 16.9,59.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{007"
2021-12-28 12:59:44,ax1,PE1RXF-7,APZMDM," 17.1,59.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{008"
2021-12-28 13:24:02,ax1,PE1RXF-7,APZMDM," 16.3,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 13:24:17,ax1,PE1RXF-7,APZMDM," 16.3,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 13:24:32,ax1,PE1RXF-7,APZMDM," 16.3,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 13:34:32,ax1,PE1RXF-7,APZMDM," 16.1,59.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 13:44:47,ax1,PE1RXF-7,APZMDM," 16.1,59.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{003"
2021-12-28 13:54:47,ax1,PE1RXF-7,APZMDM," 16.1,59.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{004"
2021-12-28 14:04:47,ax1,PE1RXF-7,APZMDM," 16.1,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 14:05:02,ax1,PE1RXF-7,APZMDM," 16.1,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 14:15:01,ax1,PE1RXF-7,APZMDM," 16.2,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{006"
2021-12-28 14:25:01,ax1,PE1RXF-7,APZMDM," 16.2,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{007"
2021-12-28 14:35:01,ax1,PE1RXF-7,APZMDM," 16.3,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{008"

View File

@@ -0,0 +1,36 @@
2021-12-26 19:06:37,ax1,PE1RXF-7,APRX29,test berichtje
2021-12-26 19:06:39,ax0,PE1RXF-7,APRX29,test berichtje
2021-12-26 19:57:59,ax0,PE1RXF-7,APRX29,Test message
2021-12-26 20:01:09,ax0,PE1RXF-7,APRX29,Test message
2021-12-26 20:02:20,ax0,PE1RXF-7,APRX29,Test message
2021-12-26 20:02:52,ax0,KM6LYW-9,APRX29,fortune
2021-12-26 21:20:39,ax0,KM6LYW-9,APRX29,fortune
2021-12-28 08:57:37,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:03,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:19,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:32,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:46,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:56,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 09:06:59,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 09:07:44,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 09:08:22,ax0,PE1RXF-7,APRX29,01
2021-12-28 09:08:50,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:09:37,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:11:07,ax0,PE1RXF,APRX29,?01
2021-12-28 09:11:36,ax0,PE1RXF,APRX29,?01
2021-12-28 09:11:47,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:14:08,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:14:59,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:17:06,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:49:47,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:53:25,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:54:31,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:59:02,ax0,PE1RXF-7,APRX29,?01
2021-12-28 10:03:15,ax0,PE1RXF-7,APRX29,?01
2021-12-28 10:04:50,ax0,PE1RXF-7,APRX29,?01
2021-12-28 10:07:41,ax0,PE1RXF-7,APRX29,?01
2021-12-28 11:30:48,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:31:03,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:31:13,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:31:53,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:32:12,ax1,PE1RXF-7,APRX29,?01

View File

@@ -0,0 +1,36 @@
2021-12-28 14:28:57,ax0,DO1IBS-4,APNU19-3
2021-12-28 14:42:54,ax0,DL0PBS-5,APMI03
2021-12-28 14:42:54,ax0,DO1EJK,APU25N
2021-12-28 10:27:43,ax0,DB0PDF-10,AP4R10
2021-12-28 14:40:48,ax0,SM5WXF-9,APOTC1
2021-12-28 13:50:33,ax0,DG4BRT-1,WIDE1-1
2021-12-28 14:40:18,ax0,DB0ET,APTT4
2021-12-27 20:38:17,ax0,DB0LER,APRX29
2021-12-28 14:40:31,ax0,DB0PBG-5,APMI03
2021-12-27 16:18:09,ax0,DL9OBG-9,UR5RY4
2021-12-28 14:33:57,ax0,DB0WHV,APRX29
2021-12-28 13:38:01,ax0,DH9AG-7,UR0TW1-2
2021-12-28 14:08:40,ax0,DO6DN-10,APRX28
2021-12-28 11:00:42,ax0,DL2KV-9,APPIC3
2021-12-28 11:28:49,ax0,DB0OL-10,AP4R10
2021-12-28 12:49:42,ax0,DB0SAH,APMI06
2021-12-28 14:27:43,ax0,DB0OHB,APDW16
2021-12-28 14:42:28,ax0,DO2DAN-6,APRS
2021-12-28 12:51:21,ax0,DL2MT-6,APRS
2021-12-28 12:54:26,ax0,DL1BJN-1,USRQX8
2021-12-28 09:05:06,ax0,DB1NTO-2,APRS
2021-12-28 14:30:36,ax0,DG4BRT-6,WIDE1-1
2021-12-28 11:14:11,ax0,DD1GO,5S0YX8
2021-12-28 13:47:01,ax0,DG9OBI-9,US2TT6
2021-12-27 15:29:20,ax0,DG9BFE-9,US2TR0
2021-12-28 04:53:47,ax0,DO6HT-9,US2VT3
2021-12-28 11:32:52,ax0,DL5UHR-9,US2TR2
2021-12-27 14:54:30,ax0,PA0EMS-9,US2PQ4
2021-12-28 13:54:19,ax0,PD1ATA,5S2RQ5
2021-12-28 14:38:38,ax0,DB0LER-13,APRX29
2021-12-28 08:44:58,ax0,OE5DRP-9,UQ3UT0
2021-12-28 09:07:03,ax0,PE1RXF-1,APRX29
2021-12-28 09:07:15,ax0,DB6PBG-5,APMI03
2021-12-28 11:52:50,ax0,DO9BG-9,APOTC1
2021-12-28 12:47:06,ax0,PA0KNW-2,APRS
2021-12-28 13:20:45,ax0,DG7ACF-9,5R1WQ2

View File

@@ -0,0 +1,8 @@
2021-12-28 14:41:24,ax0,DB0PBG-5,APMI03
2021-12-28 14:38:02,ax0,DB0LER,APRX29
2021-12-28 05:10:44,ax0,DL0PBS-5,APMI33
2021-12-28 14:39:31,ax0,PA0EMS,USRPR0
2021-12-28 10:51:30,ax0,PE1RXF-7,APZMDM
2021-12-28 10:51:33,ax1,PE1RXF-1,APRX29
2021-12-28 14:35:02,ax1,PE1RXF-7,APZMDM
2021-12-28 10:44:09,ax0,PE1RXF-2,APRX29

View File

@@ -0,0 +1 @@
16.3,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

View File

@@ -0,0 +1 @@
16.1,59.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

View File

@@ -0,0 +1,2 @@
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

View File

@@ -0,0 +1,2 @@
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

View File

@@ -0,0 +1 @@
PE1RXF-1>APRX29,WIDE2-1:!5302.78N/00707.91E-https://meezenest.nl/pe1rxf

View File

@@ -0,0 +1 @@
/usr/sbin/beacon -d "APRX29" -s ax1 '!5302.78N/00707.91E-https://meezenest.nl/pe1rxf'

44
aprs_utils/config.shlib Normal file
View File

@@ -0,0 +1,44 @@
##################################################################################
# Bash library for reading configuration file #
# #
# Example use: #
# #
# #!/usr/bin/env bash #
# source config.shlib; # load the config library functions #
# echo "$(config_get myvar)"; # will be found in user-cfg #
# printf -- "%s\n" "$(config_get myvar $config_file_name)"; # safer way of #
# # echoing! #
# myvar="$(config_get myvar)"; # how to just read a value without echoing #
# echo "$(config_get othervar)"; # will fall back to defaults #
# echo "$(config_get bleh)"; # "__UNDEFINED__" since it isn't set anywhere #
# #
# (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/>. #
# #
##################################################################################
config_read_file() {
(grep -E "^${2}=" -m 1 "${1}" 2>/dev/null || echo "VAR=__UNDEFINED__") | head -n 1 | cut -d '=' -f 2-;
}
config_get() {
val="$(config_read_file "${2}" "${1}")";
if [ "${val}" = "__UNDEFINED__" ]; then
val="$(config_read_file pe1rxf-aprs-server.cfg.defaults "${1}")";
fi
printf -- "%s" "${val}";
}

41
aprs_utils/crontab.pe1rxf Normal file
View File

@@ -0,0 +1,41 @@
# This is a template crontab for the pe1rxf-aprs-server software. Make sure crontab changes are listed in this file!
# Otherwise, changing the beacon from the website will delete your changes made with crontab -e
#
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
# Start APRS server at boot time (delay of 1 minute is needed. Otherwise direwolf will not start for some reason)
@reboot sleep 60 && /home/marcel/ham/start_aprs_server.sh
# Calculate minimum and maximum values from last day (run at one minute past midnight)
1 0 * * * /home/marcel/ham/aprs_utils/get_max_min_values.sh
# Generate new graphs from telemetry data every thirty minutes
*/30 * * * * /home/marcel/ham/aprs_utils/generate_diagrams_from_aprs_data_PE1RXF-7.sh
# Send beacon on AX0 (internal radio)
#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh
#Send beacon on AX1 (external radio)
#* * * * * /home/marcel/ham/aprs_utils/send_beacon_external_radio.sh

View File

@@ -0,0 +1,276 @@
#!/bin/bash
##################################################################################
# #
# Generates graphs and images of telemetry data for website #
# Run at the same frequency as telemetry data comes in #
# For example in the crontab #
#
# Data format: #
# [date],1,2,3,4,5,6,7,8,9,10 #
# #
# 1 = temperature outside #
# 2 = humidity outside #
# 3 = temperature small greenhouse #
# 4 = humidity small greenhouse #
# 5 = soil moisture small greenhouse #
# 6 = soil moisture small greenhouse #
# 7 = temperature large greenhouse #
# 8 = humidity large greenhouse #
# 9 = soil moisture large greenhouse #
# 10 = soil moisture large greenhouse #
# #
# (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/>. #
# #
##################################################################################
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
APRS_TELEMETRY_FILE_SUFFIX=_telemetry_PE1RXF-7.dat
APRS_LATEST_TELEMETRY_FILE=latest_telemetry_PE1RXF-7.dat
APRS_MAX_DATA=telemetry_PE1RXF-7_max_values.dat
APRS_MIN_DATA=telemetry_PE1RXF-7_min_values.dat
PUBLISH_DIR=/home/marcel/ham/web-interface/telemetry
# Get current date YYYY-MM-DD
CURRENT_DATE=$(date +"%Y-%m-%d")
YESTERDAY_DATE=$(date --date="yesterday" +"%Y-%m-%d")
MONTH_AGO_DATE=$(date --date="1 month ago" +"%Y-%m-%d")
APRS_TELEMETRY_FILE_TODAY="$CURRENT_DATE$APRS_TELEMETRY_FILE_SUFFIX"
APRS_TELEMETRY_FILE_YESTERDAY="$YESTERDAY_DATE$APRS_TELEMETRY_FILE_SUFFIX"
APRS_TELEMETRY_FILE="TEMP$APRS_TELEMETRY_FILE_SUFFIX"
cat "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE_YESTERDAY" > "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE"
cat "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE_TODAY" >> "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE"
#Temperatuur buiten en in beide kassen
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Temperatuur" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set xdata time
set xrange ["$YESTERDAY_DATE 00:00":"$CURRENT_DATE 23:59"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 2
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/temperature_graph.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:2 with lines linewidth 2 title "buiten", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:8 with lines linewidth 2 title "kleine kas", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:4 with lines linewidth 2 title "grote kas"
EOFMarker
#Luchtvochtigheid buiten en in beide kassen
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Luchtvochtigheid" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set xdata time
set xrange ["$YESTERDAY_DATE 00:00":"$CURRENT_DATE 23:59"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 2
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/humidity_graph.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:3 with lines linewidth 2 title "buiten", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:9 with lines linewidth 2 title "kleine kas", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:5 with lines linewidth 2 title "grote kas"
EOFMarker
#Bodemvochtigheid in beide kassen
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Bodemvochtigheid" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set xdata time
set xrange ["$YESTERDAY_DATE 00:00":"$CURRENT_DATE 23:59"]
set yrange [0:1000]
set xlabel "tijd"
set ylabel "absoluut"
set ytics 100
set mytics 2
set mxtics 2
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/soilmoisture_graph.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:10 with lines linewidth 2 title "kleine kas", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:6 with lines linewidth 2 title "grote kas"
EOFMarker
#Min-max temperatuur buiten afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale buitentemperatuur afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_temperature_outside.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:2 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:2 with lines linewidth 2 title "minima"
EOFMarker
#Min-max temperatuur kleine kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale temperatuur kleine kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_temperature_small_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:8 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:8 with lines linewidth 2 title "minima"
EOFMarker
#Min-max temperatuur grote kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale temperatuur grote kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_temperature_large_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:4 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:4 with lines linewidth 2 title "minima"
EOFMarker
#Min-max luchtvochtigheid buiten afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale luchtvochtigheid buiten afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_humidity_outside.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:3 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:3 with lines linewidth 2 title "minima"
EOFMarker
#Min-max luchtvochtigheid kleine kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale luchtvochtigheid kleine kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_humidity_small_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:9 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:9 with lines linewidth 2 title "minima"
EOFMarker
#Min-max luchtvochtigheid grote kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale luchtvochtigheid grote kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_humidity_large_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:5 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:5 with lines linewidth 2 title "minima"
EOFMarker
# rest of script, after gnuplot exits
# Remove temporary file
rm "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE"

132
aprs_utils/get_max_min_values.sh Executable file
View File

@@ -0,0 +1,132 @@
#!/bin/bash
##################################################################################
# Reads telemetry data file from yesterday and output minimum and maximum #
# values of every data field. #
# This script should be run once every day at midnight #
# #
# (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/>. #
# #
##################################################################################
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
APRS_TELEMETRY_FILE_SUFFIX=_telemetry_PE1RXF-7.dat
MIN_TELEMETRY_FILE=telemetry_PE1RXF-7_min_values.dat
MAX_TELEMETRY_FILE=telemetry_PE1RXF-7_max_values.dat
PUBLISH_DIR=/home/marcel/ham/aprs_utils/publish
# Get current and yesterdays date YYYY-MM-DD
CURRENT_DATE=$(date +"%Y-%m-%d")
YESTERDAY_DATE=$(date --date="yesterday" +"%Y-%m-%d")
APRS_TELEMETRY_FILE="$APRS_RECEIVED_MESSAGES_DIR$YESTERDAY_DATE$APRS_TELEMETRY_FILE_SUFFIX"
SINGLE_SHOT=0
declare -a max
declare -a min
#####################################################################
# Evaluate a floating point number conditional expression.
# Bash itself cannot work with floating point, so we use bc
function float_cond()
{
local cond=0
if [[ $# -gt 0 ]]; then
cond=$(echo "$*" | bc -q 2>/dev/null)
if [[ -z "$cond" ]]; then cond=0; fi
if [[ "$cond" != 0 && "$cond" != 1 ]]; then cond=0; fi
fi
local stat=$((cond == 0))
return $stat
}
#Read file line by line
while read LINE
do
#echo "$LINE"
#Datafiled should have comma as field seperator, so asume this and put values in array for later testing if data is valid
IFS=',' read -r -a array <<< "$LINE"
cnt=0
for index in "${!array[@]}"
do
#First time in the loop: we fill the min and max values with the first values in the array
if [[ $SINGLE_SHOT -eq 0 ]]; then
#echo "First: ${array[index]}"
max[cnt]=${array[index]}
min[cnt]=${array[index]}
else
#bash cannot work with floats, so we use this function instead
if float_cond "${array[index]} > ${max[cnt]}"; then
#if [[ ${array[index]} > ${max[cnt]} ]]; then
#echo "Max: $cnt ${max[cnt]} $index ${array[index]}"
max[cnt]=${array[index]}
fi
#bash cannot work with floats, so we use this function instead
if float_cond "${array[index]} < ${min[cnt]}"; then
#if [[ ${array[index]} < ${min[cnt]} ]]; then
min[cnt]=${array[index]}
# echo "Min: $cnt $index ${array[index]}"
fi
fi
#echo "$cnt"
cnt=$((cnt+1))
done
#First time through loop is different from all the rest
SINGLE_SHOT=1
#done < /dev/stdin
done < "$APRS_TELEMETRY_FILE"
#Store minimum values in file (append file)
for index in "${!min[@]}"
do
#first data field: remove time from date/time field and no leading comma
if [[ index -eq 0 ]] ; then
min[index]="$(echo "${min[index]}" | cut -b 1-10)"
echo -n "${min[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MIN_TELEMETRY_FILE"
else
echo -n ",${min[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MIN_TELEMETRY_FILE"
fi
done
#New line
echo "" >> "$APRS_RECEIVED_MESSAGES_DIR$MIN_TELEMETRY_FILE"
#Store maximum values in file (append file)
for index in "${!max[@]}"
do
#first data field: remove time from date/time field and no leading comma
if [[ index -eq 0 ]] ; then
max[index]="$(echo "${max[index]}" | cut -b 1-10)"
echo -n "${max[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MAX_TELEMETRY_FILE"
else
echo -n ",${max[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MAX_TELEMETRY_FILE"
fi
done
#New line
echo "" >> "$APRS_RECEIVED_MESSAGES_DIR$MAX_TELEMETRY_FILE"

View File

@@ -0,0 +1,73 @@
# Configuration file for PE1RXF-APRS-server
#
# Must be readable AND writable by www-data!
#
# This file is read periodically, so just changing this file will automatically
# update take effect.
# Internal radio settings
ax0_name=Digipeater 2 meter
ax0_frequency=144.800 MHz
# Beacon time internal radio (ax0) in minutes. 0-60, where 0 disables beaconing.
ax0_beacon_time=0
ax0_beacon_destination=APRX29
ax0_beacon_path=WIDE2-1
ax0_beacon_position=!5302.78N/00707.91E-
ax0_beacon_comment=https://meezenest.nl/pe1rxf
ax0_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax0.txt
ax0_transmit_directory=/home/marcel/ham/aprs_utils/aprs_files_to_transmit/
# Predefined messages
ax0_message1_id=Test naar PE1RXF
ax0_message1_text=Test message
ax0_message1_destination=PE1RXF-7
ax0_message1_path=WIDE2-2
ax0_message2_id=Fortune bot
ax0_message2_text=fortune
ax0_message2_destination=KM6LYW-9
ax0_message2_path=WIDE2-2
ax0_message3_id=Message 3
ax0_message3_text=Thirth message
ax0_message3_destination=PE1RXF-7
ax0_message3_path=WIDE2-2
ax0_message4_id=Message 4
ax0_message4_text=Fourth message
ax0_message4_destination=PE1RXF-7
ax0_message4_path=WIDE2-2
# External radio settings
ax1_name=Digipeater 70 cm
ax1_frequency=432.500 MHz
# Beacon time external radio (ax1) in minutes. 0-60, where 0 disables beaconing.
ax1_beacon_time=0
ax1_beacon_destination=APRX29
ax1_beacon_path=none
ax1_beacon_position=!5302.78N/00707.91E-
ax1_beacon_comment=https://meezenest.nl/pe1rxf
ax1_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax1.txt
# Predefined messages
ax1_message1_id=Message 1
ax1_message1_text=First message
ax1_message1_destination=PE1RXF-7
ax1_message1_path=WIDE2-2
ax1_message2_id=Message 2
ax1_message2_text=Second message
ax1_message2_destination=PE1RXF-7
ax1_message2_path=WIDE2-2
ax1_message3_id=Message 3
ax1_message3_text=Thirth message
ax1_message3_destination=PE1RXF-7
ax1_message3_path=WIDE2-2
ax1_message4_id=Message 4
ax1_message4_text=Fourth message
ax1_message4_destination=PE1RXF-7
ax1_message4_path=WIDE2-2

View File

@@ -0,0 +1,71 @@
# Default configuration file for PE1RXF-APRS-server
#
# The values in this file are read only if the correspondinf values in the main configuration file are missing.
# Internal radio settings
ax0_name=Digipeater 2 meter
ax0_frequency=144.800 MHz
# Beacon time internal radio (ax0) in minutes. 0-60, where 0 disables beaconing.
ax0_beacon_time=0
ax0_beacon_destination=APRX29
ax0_beacon_path=WIDE2-1
ax0_beacon_position=!5302.78N/00707.91E-
ax0_beacon_comment=https://meezenest.nl/pe1rxf
ax0_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax0.txt
ax0_transmit_directory=/home/marcel/ham/aprs_utils/aprs_files_to_transmit/
# Predefined messages
ax0_message1_id=Message 1
ax0_message1_text=First message
ax0_message1_destination=PE1RXF-7
ax0_message1_path=none
ax0_message2_id=Message 2
ax0_message2_text=Second message
ax0_message2_destination=PE1RXF-7
ax0_message2_path=WIDE2-1
ax0_message3_id=Message 3
ax0_message3_text=Thirth message
ax0_message3_destination=PE1RXF-7
ax0_message3_path=WIDE2-2
ax0_message4_id=Message 4
ax0_message4_text=Fourth message
ax0_message4_destination=PE1RXF-7
ax0_message4_path=WIDE3-3
# External radio settings
ax1_name=Digipeater 70 cm
ax1_frequency=432.500 MHz
# Beacon time external radio (ax1) in minutes. 0-60, where 0 disables beaconing.
ax1_beacon_time=0
ax1_beacon_destination=APRX29
ax1_beacon_path=none
ax1_beacon_position=!5302.78N/00707.91E-
ax1_beacon_comment=https://meezenest.nl/pe1rxf
ax1_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax1.txt
# Predefined messages
ax1_message1_id=Message 1
ax1_message1_text=First message
ax1_message1_destination=PE1RXF-7
ax1_message1_path=WIDE2-2
ax1_message2_id=Message 2
ax1_message2_text=Second message
ax1_message2_destination=PE1RXF-7
ax1_message2_path=WIDE2-2
ax1_message3_id=Message 3
ax1_message3_text=Thirth message
ax1_message3_destination=PE1RXF-7
ax1_message3_path=WIDE2-2
ax1_message4_id=Message 4
ax1_message4_text=Fourth message
ax1_message4_destination=PE1RXF-7
ax1_message4_path=WIDE2-2

View File

@@ -0,0 +1,62 @@
#!/bin/bash
##################################################################################
# Main loop of PE1RXF-APRS-server. #
# Here it all starts. From here all functions are called. #
# #
# (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"
web_interface_config_file="/home/marcel/ham/web-interface/config/pe1rxf-aprs-server.cfg"
ConfigFileMD5_previous=0
while :
do
# First check if configuration file has changed. If so, update the processes with the new changes.
# Ontherwise, do nothing.
ConfigFileMD5=$(md5sum $ConfigFile | cut -d ' ' -f1)
if [ $ConfigFileMD5 != $ConfigFileMD5_previous ]; then
echo "Configuration file has changed."
# Update beacon files and corresponding crontab entries
/home/marcel/ham/aprs_utils/set_beacon.sh -c $ConfigFile
ConfigFileMD5_previous=$ConfigFileMD5
fi
# If configuration file on web interface exists, we copy it to the program directory
# and remove it from the web interface
if [ -f "$web_interface_config_file" ]; then
cp $web_interface_config_file $ConfigFile
rm -f $web_interface_config_file
# change beacon settings
/home/marcel/ham/aprs_utils/set_beacon.sh -c $ConfigFile
fi
echo
echo "Loop repeats every 1 seconds. Press [CTRL+C] to stop.."
sleep 1
done

View File

@@ -0,0 +1,217 @@
#!/bin/bash
##################################################################################
# Background process started by the initializing script start_aprs_server.sh #
# #
# It processes all incomming messages for PE1RXF and sends acknowledges when #
# if asked for (via kissutil for ax0 and beacon for ax1. It also prosesses the #
# special telemetry messages from PE1RXF devices. #
# #
# (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/>. #
# #
##################################################################################
# Filters out all APRS messages to PE1RXF-1 and saves these to file.
# Generate and send acknowledge message when incomming message ask for it.
# Also, reads APRS message and when it is telemetry converts it to a format readeble by gnuplot
#
# The script aprs_utils.sh starts a filters means of tail | grep on the log file of aprx.
# The output of this command goes to this script via stdin. This script reads this line by line
# and sends an acknowledgement to the stations asking for one. This is done via kissutil, which
# is also started the script aprs_utils.sh
# Direectory where kissutils expect files to send
APRS_SEND_MESSAGE_DIRECTORY=/home/marcel/ham/aprs_utils/aprs_files_to_transmit/
# Directory where APRS messages are stored
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
MESSAGE_FILE=aprs_received_messages.log
# Get current date YYYY-MM-DD
#CURRENT_DATE=$(date +"%Y-%m-%d")
#Read file line by line and send acknowledge if needed
while read LINE
do
#################
# Section: filter out APRS messages and generate acknowledge if needed
#################
# Get current date YYYY-MM-DD (do this every time, because a day may already have passed)
CURRENT_DATE=$(date +"%Y-%m-%d")
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# figure out who sent the message
# Check channel 1 (internal radio)
CALL="$(grep -o -P "(?<=PE1RXF-1 d \*).+?\>"<<<$LINE)"
PORT="ax0"
# If call is empty, frame not from channel 1, maybe from channel 2?
if [ -z $CALL ]; then
CALL="$(grep -o -P "(?<=PE1RXF-2 d \*).+?\>"<<<$LINE)"
PORT="ax1"
fi
# Lets do something with the message from channel 1 or 2
if [[ $CALL ]]; then
# Remove last character from string
CALL=${CALL::-1}
ACKNOWLEDGE_NUMBER="$(grep -o -P '(?<={).*'<<<$LINE)"
#Write messages to file with name "YYYY-MM-DD_messages_from_NOCALL.log (append)
#echo "$LINE" >> "$APRS_RECEIVED_MESSAGES_DIR""$CURRENT_DATE""_messages_from_""$CALL"".log"
# Get full path of message
if [ $PORT == "ax0" ]; then
FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 d \*).+?:'<<<$LINE)"
else
FULL_PATH="$(grep -o -P '(?<=PE1RXF-2 d \*).+?:'<<<$LINE)"
fi
FULL_PATH="$(grep -o -P '(?<=\>).*'<<<$FULL_PATH)"
# Remove last character from string
FULL_PATH=${FULL_PATH::-1}
# Messages direct from sender do not contain a '*' in the path
DIRECT="$(grep '*' <<<$FULL_PATH)"
if [ -z $DIRECT ]; then
DIRECT="true"
else
unset DIRECT
fi
# First call in path is destination
DESTINATION="$(awk -F "," '{ print $1} ' <<<$FULL_PATH)"
# get the message
MESSAGE="$(grep -o -P '(?<=::).*'<<<$LINE)"
MESSAGE="$(grep -o -P '(?<=:).*'<<<$MESSAGE)"
# Write message to file
echo "$CURRENT_DATE_TIME"",""$PORT"",""$CALL"",""$DESTINATION",\"$MESSAGE\" >> "$APRS_RECEIVED_MESSAGES_DIR""$MESSAGE_FILE"
#Send incomming message as email
#echo "$LINE" | /home/marcel/ham/aprs_utils/send_aprs_message_to_email.sh
#Generate acknowledge frame and put in in de directory where kissutil can find (ax0) it or (for channel ax1) send it via beacon
if [[ $ACKNOWLEDGE_NUMBER ]]; then
# if call is less than 9 characters, add spaces at the end (according to the APRS protocol)
printf -v FORMATTED_CALL %-9.9s "$CALL"
OWN_CALL="$(grep "PE1RXF"<<<$CALL)"
# Message on port ax0
if [ $PORT == "ax0" ]; then
# Local (own) stations do not need to be digipeated
if [ $OWN_CALL ]; then
APRS_FRAME="PE1RXF-1>APRX29::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
# Everyone else is digipeated
else
APRS_FRAME="PE1RXF-1>APRX29,WIDE2-2::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
fi
# Send acknowledge frame
APRS_TRANSMIT_FILE="acknowledge_""$FORMATTED_CALL""_message_""$ACKNOWLEDGE_NUMBER"
echo "$APRS_FRAME" > "$APRS_SEND_MESSAGE_DIRECTORY$APRS_TRANSMIT_FILE"
# Message on port ax1
else
# Local (own) stations do not need to be digipeated
if [ $OWN_CALL ]; then
APRS_HEADER="APRX29"
APRS_FRAME="::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
args[0]=-d
args[1]="APRX29"
args[2]=-s
args[3]=ax1
args[4]=":$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
# Everyone else is digipeated
else
APRS_HEADER="APRX29 WIDE2-2"
APRS_FRAME="::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
args[0]=-d
args[1]="APRX29 WIDE2-2"
args[2]=-s
args[3]=ax1
args[4]=":$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
fi
# use beacon to send acknowledge frame
#echo "/usr/sbin/beacon -d '$APRS_HEADER' -s ax1 '$APRS_FRAME'"
#/usr/sbin/beacon -d "$APRS_HEADER" -s ax1 "$APRS_FRAME"
/usr/sbin/beacon "${args[@]}"
fi
fi
#################
# Section: process APRS telemetry to format readable by gnuplot
#################
# get date field
DATE="$(echo $LINE | cut -b 1-10)"
# get time field
TIME="$(echo $LINE | cut -b 12-16)"
# get telemetry fields and remove empty spaces and optional acknowledge message if it is present
TELEMETRY="$(echo $LINE | cut -b 65- | sed 's/{.*//' | tr -d "[:blank:]")"
#Datafiled should have comma as field seperator, so asume this and put values in array for later testing if data is valid
IFS=',' read -r -a array <<< "$TELEMETRY"
# Test if message contains valid numbers. It could be an acknowledge or beacon etc.
TELEMETRY_ERROR=0
for index in "${!array[@]}"
do
if ! [[ ${array[index]} =~ ^-?[0-9]+([.][0-9]+)?$ ]] ; then
TELEMETRY_ERROR=1
fi
done
# If telemetry message is valid, store it (change APRS date/time (UTM) with local time)
if [ $TELEMETRY_ERROR -eq 0 ] ; then
# Get current date and time YYYY-MM-DD %H:%M for local time stamp (do this every time, because a day may already have passed)
LOCAL_DATE_TIME=$(date +"%Y-%m-%d %H:%M")
#Format line by combining all needed fields
DATA_STRING="$(echo "$LOCAL_DATE_TIME","$TELEMETRY")"
#| tr -d "[:blank:]")"
#Write messages to file with name "YYYY-MM-DD_telemetry_NOCALL.log (append)
echo "$DATA_STRING" >> "$APRS_RECEIVED_MESSAGES_DIR""$CURRENT_DATE""_telemetry_""$CALL"".dat"
#Write last telemetry message to file (overwrite) for current values
echo "$TELEMETRY" > "$APRS_RECEIVED_MESSAGES_DIR""latest_telemetry_""$CALL"".dat"
fi
fi
# end channel 1
done < /dev/stdin

182
aprs_utils/process_traffic.sh Executable file
View File

@@ -0,0 +1,182 @@
#!/bin/bash
##################################################################################
# Background process started by the initializing script start_aprs_server.sh #
# #
# It processes all incomming traffic and filters out heard stations. #
# #
# (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/>. #
# #
##################################################################################
# The script aprs_utils.sh starts a filters means of tail | grep on the log file of aprx.
# The output of this command goes to this script via stdin. This script reads this line by line.
# Directory where APRS data files are stored
APRS_DATA_DIR=/home/marcel/ham/aprs_utils/aprs_log/
APRS_STATIONS_HEARD_DIRECT=aprs_stations_heard_direct.log
APRS_STATIONS_HEARD_DIGIPEATED=aprs_stations_heard_digipeated.log
# If files do not exist, create them
if [ ! -f "$APRS_DATA_DIR$APRS_STATIONS_HEARD_DIRECT" ]; then
touch $APRS_DATA_DIR$APRS_STATIONS_HEARD_DIRECT
fi
if [ ! -f "$APRS_DATA_DIR$APRS_STATIONS_HEARD_DIGIPEATED" ]; then
touch $APRS_DATA_DIR$APRS_STATIONS_HEARD_DIGIPEATED
fi
# Maybe there is an old temporary file still pressent: remove it
for ACTIVE_FILE in $APRS_STATIONS_HEARD_DIRECT $APRS_STATIONS_HEARD_DIGIPEATED
do
rm $APRS_DATA_DIR$ACTIVE_FILE".tmp"
done
# Get current date YYYY-MM-DD
#CURRENT_DATE=$(date +"%Y-%m-%d")
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
LAST_EPOCH_DATE="$(date -d"$CURRENT_DATE_TIME" +%s)"
#Read file line by line and send acknowledge if needed
while read LINE
do
# Start filter for received messages to PE1RXF (all sufixes)
# Messages addressed to PE1RXF are stored in file /home/marcel/ham/aprs_utils/aprs_received_messages.log
MESSAGE_FOR_PE1RXF="$(grep "::PE1RXF"<<<$LINE)"
if [[ $MESSAGE_FOR_PE1RXF ]]; then
#echo "Message from PE1RXF"
/home/marcel/ham/aprs_utils/process_aprs_messages.sh <<<$MESSAGE_FOR_PE1RXF
fi
# Get current date YYYY-MM-DD (do this every time, because a day may already have passed)
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
CURRENT_DATE=$(date +"%Y-%m-%d")
# figure out who sent the message
# Check channel 1 (internal radio)
CALL="$(grep -o -P "(?<=PE1RXF-1 d \*).+?\>"<<<$LINE)"
PORT="ax0"
# If call is empty, frame not from channel 1, maybe from channel 2?
if [ -z $CALL ]; then
CALL="$(grep -o -P "(?<=PE1RXF-2 d \*).+?\>"<<<$LINE)"
PORT="ax1"
fi
# Lets do something with the frame from channel 1 or 2
if [[ $CALL ]]; then
# Remove last character from string
CALL=${CALL::-1}
# Get full path of message
if [ $PORT == "ax0" ]; then
FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 d \*).+?:'<<<$LINE)"
else
FULL_PATH="$(grep -o -P '(?<=PE1RXF-2 d \*).+?:'<<<$LINE)"
fi
FULL_PATH="$(grep -o -P '(?<=\>).*'<<<$FULL_PATH)"
# Remove last character from string
FULL_PATH=${FULL_PATH::-1}
# Messages direct from sender do not contain a '*' in the path
DIRECT="$(grep '*' <<<$FULL_PATH)"
if [ -z $DIRECT ]; then
DIRECT="true"
else
unset DIRECT
fi
# First call in path is destination
DESTINATION="$(awk -F "," '{ print $1} ' <<<$FULL_PATH)"
#echo "Port: " $PORT
#echo "Call:" $CALL
#echo "Path:" $FULL_PATH
#echo "Destination: "$DESTINATION
# Select correct log file to use: direct or digipeated
if [ $DIRECT ]; then
ACTIVE_FILE=$APRS_STATIONS_HEARD_DIRECT
else
ACTIVE_FILE=$APRS_STATIONS_HEARD_DIGIPEATED
fi
# get line number where call occurs (will return NULL if call is never heard)
LINE_NUMBER="$(grep -n $PORT","$CALL "$APRS_DATA_DIR$ACTIVE_FILE" | cut -d : -f 1)"
#LINE_NUMBER=2
# If call already heard: replace line
if [[ $LINE_NUMBER ]]; then
# replace found line with new date and time
#SED_CMD="'$LINE_NUMBER c\\""$CURRENT_DATE_TIME"",""$CALL"","$DESTINATION"' ""$APRS_DATA_DIR""$ACTIVE_FILE"
#echo $SED_CMD
RESULT="$(sed -i "$LINE_NUMBER c\\$CURRENT_DATE_TIME,$PORT,$CALL,$DESTINATION" $APRS_DATA_DIR$ACTIVE_FILE )"
# If call not heard before: add to file
else
echo "$CURRENT_DATE_TIME"",""$PORT"",""$CALL"",""$DESTINATION" >> "$APRS_DATA_DIR""$ACTIVE_FILE"
fi
fi
# Do maintenance on all log files (every 10 minutes)
# Remove all heard calls older than 24 hours
EPOCH_DATE="$(date -d"$CURRENT_DATE_TIME" +%s)"
EPOCH_COUNTER=$((EPOCH_DATE-LAST_EPOCH_DATE))
if [ "$EPOCH_COUNTER" -gt "600" ]; then
LAST_EPOCH_DATE="$EPOCH_DATE"
for ACTIVE_FILE in $APRS_STATIONS_HEARD_DIRECT $APRS_STATIONS_HEARD_DIGIPEATED
do
touch $APRS_DATA_DIR$ACTIVE_FILE".tmp"
LINE_NR=1
while read FILE_LINE; do
# reading each line
# echo "Line No. $LINE_NR : $FILE_LINE"
LINE_DATE="$(awk -F "," '{ print $1} ' <<<$FILE_LINE)"
EPOCH_LINE_DATE="$(date -d"$LINE_DATE" +%s)"
# echo $EPOCH_LINE_DATE
ELAPSED_TIME=$((EPOCH_DATE-EPOCH_LINE_DATE))
# echo $ELAPSED_TIME
# Entry older than 24 hours? Remove entry
if [ "$ELAPSED_TIME" -lt "86400" ]; then
#RESULT="$(sed -e "$LINE_NR d" $APRS_DATA_DIR$ACTIVE_FILE >> $APRS_DATA_DIR$ACTIVE_FILE".tmp")"
echo $FILE_LINE >> $APRS_DATA_DIR$ACTIVE_FILE".tmp"
# echo "OUD"
fi
LINE_NR=$((LINE_NR+1))
done < $APRS_DATA_DIR$ACTIVE_FILE
cp $APRS_DATA_DIR$ACTIVE_FILE".tmp" $APRS_DATA_DIR$ACTIVE_FILE
rm $APRS_DATA_DIR$ACTIVE_FILE".tmp"
done
fi
# END: remove all heard calls older than 24 hours
done < /dev/stdin

View 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 ax1_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

View File

@@ -0,0 +1,36 @@
#!/bin/bash
##################################################################################
# Send beacon via APRS channel 1 (ax0) #
# #
# (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 ax0_beacon_file $ConfigFile)"
TRANSMIT_LOCATION="$(config_get ax0_transmit_directory $ConfigFile)"
if [ -f "$BEACON_FILE" ]; then
/bin/cp "$BEACON_FILE" "$TRANSMIT_LOCATION"
fi

131
aprs_utils/send_message.sh Executable file
View File

@@ -0,0 +1,131 @@
#!/bin/bash
##################################################################################
# Send an APRS message consrructed from the given parameters. #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# NOTE: the ax25 utility 'beacon' has a bug: the first few times it is called #
# the send string ends with some random characters. After these first few #
# times it all comes good and the utility works fine. #
# #
# 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
# Directory where APRS messages are stored
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
MESSAGE_FILE=aprs_send_messages.log
############################################################
# Help #
############################################################
Help()
{
# Display Help
echo "Send APRS message."
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 "-c Destination call"
echo "-p Path: 0=none, WIDE2-1, WIDE2-2, WIDE3-3 or call of digipeater"
echo "-m Message to send."
echo
}
############################################################
############################################################
# Main program #
############################################################
############################################################
# Set variables
Interface="0"
Call="0"
Path="0"
Message=""
############################################################
# Process the input options. #
############################################################
# Get the options
while getopts i:c:p:m: flag; do
case "${flag}" in
i) # Interface
Interface=${OPTARG};;
c) # Destination Call
Call=${OPTARG};;
p) # Path
Path=${OPTARG};;
m) # Message
Message=${OPTARG};;
\?) # Invalid option
echo "Syntax error!"
Help
exit;;
esac
done
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
if [ "$Interface" == "ax0" ]; then
# Log message
echo "$CURRENT_DATE_TIME,ax0,$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-1>APRX29::$Call:$Message"
else
APRS_FRAME="PE1RXF-1>APRX29,$Path::$Call:$Message"
fi
AX0_APRS_TRANSMIT_DIR="$(config_get ax0_transmit_directory $ConfigFile)"
echo "$APRS_FRAME" > "$AX0_APRS_TRANSMIT_DIR"message.msg
#echo "$APRS_FRAME $AX0_APRS_TRANSMIT_DIR"
else
# Log message
echo "$CURRENT_DATE_TIME,ax1,$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-2>APRX29::$Call:$Message"
args[0]=-d
args[1]="APRX29"
args[2]=-s
args[3]=ax1
args[4]=":$Call:$Message"
else
APRS_FRAME="PE1RXF-2>APRX29,$Path::$Call:$Message"
args[0]=-d
args[1]="APRX29 $Path"
args[2]=-s
args[3]=ax1
args[4]=":$Call:$Message"
fi
#echo "$APRS_FRAME"
#"$APRS_CMD" > tmp.tmp
/usr/sbin/beacon "${args[@]}"
fi

236
aprs_utils/set_beacon.sh Executable file
View File

@@ -0,0 +1,236 @@
#!/bin/bash
##################################################################################
# Formats crontab string for periodic APRS beacon and #
# replaces the original crontab entry string with this #
# new string thus changing the crontab. #
# #
# (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
############################################################
# Help #
############################################################
Help()
{
# Display Help
echo "Set interval of APRS beacons in crontab."
echo
echo "Syntax: set_beacon.sh [-i <interface>|-t <time>|-c <config-file>]"
echo "Options:"
echo "-i AX.25 interface (ax0 or ax1)"
echo "-t Time interval in minutes (0-60), 0 disables beacon"
echo "-c Read from config file instead of command line arguments"
echo
}
############################################################
# This function update the crontab of user marcel #
############################################################
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" > $sed_tmp_command_file
echo "$sed_string" >> $sed_tmp_command_file
chmod u+x $sed_tmp_command_file
$sed_tmp_command_file
rm $sed_tmp_command_file
# Update crontab
/usr/bin/crontab -u marcel $crontab_intermediate_file
}
###############################################################
# Generates beacon files which are send via a crontab process #
###############################################################
ConstructBeaconFile()
{
if [ "${1}" == "ax0" ]; then
ConstructBeaconFile_Destination="$(config_get ax0_beacon_destination $ConfigFile)"
ConstructBeaconFile_Path="$(config_get ax0_beacon_path $ConfigFile)"
ConstructBeaconFile_Position="$(config_get ax0_beacon_position $ConfigFile)"
ConstructBeaconFile_Comment="$(config_get ax0_beacon_comment $ConfigFile)"
ConstructBeaconFile_File="$(config_get ax0_beacon_file $ConfigFile)"
if [ "$ConstructBeaconFile_Path" == "none" ]; then
ConstructBeaconFile_Beacon="PE1RXF-1>$ConstructBeaconFile_Destination:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
else
ConstructBeaconFile_Beacon="PE1RXF-1>$ConstructBeaconFile_Destination,$ConstructBeaconFile_Path:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
fi
echo "Beacon for ax0:"
echo $ConstructBeaconFile_Beacon
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
else
ConstructBeaconFile_Destination="$(config_get ax1_beacon_destination $ConfigFile)"
ConstructBeaconFile_Path="$(config_get ax1_beacon_path $ConfigFile)"
ConstructBeaconFile_Position="$(config_get ax1_beacon_position $ConfigFile)"
ConstructBeaconFile_Comment="$(config_get ax1_beacon_comment $ConfigFile)"
ConstructBeaconFile_File="$(config_get ax1_beacon_file $ConfigFile)"
if [ "$ConstructBeaconFile_Path" == "none" ]; then
ConstructBeaconFile_Beacon="PE1RXF-2>$ConstructBeaconFile_Destination:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
else
ConstructBeaconFile_Beacon="PE1RXF-2>$ConstructBeaconFile_Destination,$ConstructBeaconFile_Path:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
fi
echo "Beacon for ax1:"
echo $ConstructBeaconFile_Beacon
if [ "$ConstructBeaconFile_Path" == "none" ]; then
ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination\" -s ax1 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'"
else
ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination $ConstructBeaconFile_Path\" -s ax1 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'"
fi
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
fi
}
############################################################
############################################################
# Main program #
############################################################
############################################################
# Set variables
Interface="0"
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_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"
work_with_config_file="0"
############################################################
# Process the input options. #
############################################################
# Get the options
while getopts i:t:c: flag; do
case "${flag}" in
i) # interface
Interface=${OPTARG};;
t) # time interval beacon
TimeInterval=${OPTARG};;
c) # work with config_file
work_with_config_file="1"
ConfigFile=${OPTARG};;
\?) # Invalid option
echo "Syntax error!"
Help
exit;;
esac
done
##############################################################
# Get Beacon Timer Interval and translate to crontab syntax #
##############################################################
# Read values from config-file
if [ "$work_with_config_file" -eq "1" ]; then
for ax_port in ax0 ax1
do
Interface="$ax_port"
if [ "$Interface" == "ax0" ]; then
TimeInterval="$(config_get ax0_beacon_time $ConfigFile)"
else
TimeInterval="$(config_get ax1_beacon_time $ConfigFile)"
fi
# Let's generate new beacon files according to values in configuration file
ConstructBeaconFile $Interface
# Every 1 to 59 minutes
if [ "$TimeInterval" -gt 0 ] && [ "$TimeInterval" -lt 60 ]; then
crontab_time_string="*/$TimeInterval * * * *"
# Never
elif [ "$TimeInterval" -eq 0 ]; then
crontab_time_string="#* * * * *"
# Every hour
elif [ "$TimeInterval" -eq 60 ]; then
crontab_time_string="0 * * * *"
else
echo "No valid value. Using default."
crontab_time_string="#* * * * *"
fi
# Select ax.25 port
if [ "$Interface" == "ax0" ]; then
crontab_full_string="$crontab_time_string $crontab_command_string_ax0"
sed_string="sed -i \"/send_beacon_internal_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
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"
else
echo "No valid value. Using default."
crontab_full_string="$crontab_time_string $crontab_command_string_ax0"
sed_string="sed -i \"/send_beacon_internal_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
fi
UpdateCrontab
done
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)";
# Read values from command line arguments
else
# Every 1 to 59 minutes
if [ "$TimeInterval" -gt 0 ] && [ "$TimeInterval" -lt 60 ]; then
crontab_time_string="*/$TimeInterval * * * *"
# Never
elif [ "$TimeInterval" -eq 0 ]; then
crontab_time_string="#* * * * *"
# Every hour
elif [ "$TimeInterval" -eq 60 ]; then
crontab_time_string="0 * * * *"
else
echo "Syntax error!"
Help
exit
fi
# Select ax.25 port
if [ "$Interface" == "ax0" ]; then
crontab_full_string="$crontab_time_string $crontab_command_string_ax0"
sed_string="sed -i \"/send_beacon_internal_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
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"
else
echo "Syntax error!"
Help
exit
fi
UpdateCrontab
fi