rossengeorgiev / aprs-python Goto Github PK
View Code? Open in Web Editor NEW📡 Python module for working with APRS
Home Page: http://aprs-python.readthedocs.io/en/latest/
License: GNU General Public License v2.0
📡 Python module for working with APRS
Home Page: http://aprs-python.readthedocs.io/en/latest/
License: GNU General Public License v2.0
When parsing, many of the values in the dictionary have a u before the quoted value.
Input:
W0DRK-2>APRS,KD0BXJ-2,N0PBA-1,WIDE2*:!4409.98N/09537.30W# W0DRK Digi Tracy MN<0x20>
Yields output:
{'comment': u'W0DRK Digi Tracy MN<0x20>', 'via': '', 'from': u'W0DRK-2', 'posambiguity': 0, 'to': u'APRS', 'messagecapable': False, 'symbol': u'#', 'format': 'uncompressed', 'longitude': -95.62166666666667, 'raw': u'W0DRK-2>APRS,KD0BXJ-2,N0PBA-1,WIDE2*:!4409.98N/09537.30W# W0DRK Digi Tracy MN<0x20>', 'symbol_table': u'/', 'latitude': 44.166333333333334, 'path': [u'KD0BXJ-2', u'N0PBA-1', u'WIDE2*']}
As I understand, when a line is received, it is passed to the callback function
if not self._connected:
raise ConnectionError("not connected to a server")
line = b''
while True:
try:
for line in self._socket_readlines(blocking):
if line[0:1] != b'#':
if raw:
callback(line)
else:
callback(self._parse(line))
How do I send the dictionary produced by:
callback(self._parse(line))
from
def callback(packet):
print(packet)
outside of the local scope of the callback function? Every time I have tried, I come up with empty sets. I don't know what I am doing wrong. Here is a snippet of the code I used:
packet_list = []
def callback(packet):
packet = list(packet) # I would like the whole packet, outside of this function
packet_list.append(packet)
return packet_list
but when I print the n-th term of the packet, I get nothing.
I have been trying to get the APRS-IS conencting with a password. But it keeps telling me my password is wrong?
If there some specific password we have to use? Or is this because I am using the default server. (I have an account with aprs.if but I can't find a link for if they have a server url for APRS-IS)
I have successfully implemented your PositionReport() function into my @FaradayRF APRS application to generate and send position reports to APRS-IS.
By extension, it would be nice to support a telemetry packet with aprslib. Would you like me to attempt to model a telemetry generation function off of your PositionReport() to add in this functionality with a PR? I would like to incorporate that into @FaradayRF code as well.
The "Sending a packet" example code in the documentation is no longer valid.
AIS = aprslib.IS("N0CALL", passcode="123456", port=14580)
results in a TypeError: __init__() got an unexpected keyword argument 'passcode'
AIS = aprslib.IS("N0CALL", "123456", port=14580)
and even
AIS = aprslib.IS('N0CALL', 123456, port=14580)
work though.
After connecting to APRS-IS with the connect function I run the following to try and set a filter for only weather packets.
aprs.set_filter("t/w")
Yet I still receive all sorts of other packets. Which either means some how aprs-lib is not passing the filter allow to the server or the way to do so has changed.
My filter was made by looking at http://www.aprs-is.net/javAPRSFilter.aspx
Per the APRS Protocol:
However with the following latitude and longitude the resulting string when using aprslib.packets.PositionReport()
is:
3359.7036
11826.9392
2017-03-05 01:13:28,890 - APRS - INFO - KB1LQC-0>KB1LQC-1:!335942.22N/1182656.35En/A=000023Faraday Wireless Node
However, NMEA GGA data is sent down as ddMM.mmmm and dddMM.mmmm:
This means that we shouldn't have to do any conversions, just rounding and some zero stuffing to get
latitude = ddMM.mm
Longitude = dddMM.mm
A correct string sent to APRS-IS with non aprslib code with similar coordinates is:
KB1LQC-2>GPSFDY,QAR,KB1LQC-1,qAS,KB1LQC:!3359.70N/11826.94Wn.../000/A=000037Faraday Wireless Node
This shows up exactly where I'd expect it to. I cannot get aprslib to generate APRS compliant strings. Is this the intended function?
Line 398 in 64593ef
There is a print statement on line 161 of common.py
# PHG format: PHGabcd....
# RHGR format: RHGabcdr/....
match = re.findall(r"^(PHG(\d[\x30-\x7e]\d\d)([0-9A-Z]\/)?)", body)
if match:
print(match)
aprsc
server software will drop connections that haven't send any data within a predefined period.
ClientTimeout 48h
When no data is received from a downstream client in N seconds, disconnect.
Now that the module is split into smaller bits, it should be easier to add unit tests.
List of completed submodules:
Using python3 and aprslib 6.45
I am unsuccessful at connecting to an APRS2 server except when I use literal strings in the function call.
I have verified that each part of my tuple is a string before I pass it to .IS.
As you can see it tries to login to the default APRS2 location not to args in the tuple.
I have included a commented line of code that works that includes the string literals.
Your suggestions on what I can change to make the .IS function call work in this situation.
Thanks,
Brian
Here is the code
login = (settings.APRS_USER, settings.APRS_PASSCODE, settings.APRS_SERVER_HOST, settings.APRS_SERVER_PORT, False)
print (settings.APRS_USER)
print (type(settings.APRS_USER))
print ("login - " , login)
logging.basicConfig(level=logging.DEBUG) # level=10
AIS = aprslib.IS(login)
#AIS = aprslib.IS('KG7AFQ-1', '18869', 'socal.aprs2.net', 14580, False) #this works
AIS.connect(blocking=False)
Here is the output
KG7AFQ-1
<class 'str'>
login - ('KG7AFQ-1', '18869', 'socal.aprs2.net', '14580', False)
INFO:aprslib.inet.IS:Attempting connection to rotate.aprs.net:10152
INFO:aprslib.inet.IS:Connected to ('212.11.82.7', 10152)
DEBUG:aprslib.inet.IS:Banner: # aprsc 2.1.4-g408ed49
INFO:aprslib.inet.IS:Sending login information
DEBUG:aprslib.inet.IS:Server: # Invalid username format
ERROR:aprslib.inet.IS:Failed to login
exception in clsAPRSConnection
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/aprslib/inet.py", line 289, in _send_login
_, _, callsign, status, _ = test.split(' ', 4)
ValueError: not enough values to unpack (expected 5, got 4)
I'm very happy to see your aprslib and it works very fine, but i have so many raise Exceptions. Its like 50%
What can i do for parse this messages?
F5ZEE>APRS,DB0TFM-1*:}DB0NRP-10>APK102,TCPIP,F5ZEE*::DK0WUE-10:rej1
format is not supported
DL1ZM>UP1PV5,DB0KT-2*,WIDE1*,DB0TFM-1*:'ßBDn+>>/]"5?}Op.Zeljko QRV 145.500 MHz
invalid data format
DB0HU>APU25N,DB0MI*,WIDE1*,DB0ODE-10*,WIDE2-1:<IGATE,MSG_CNT=0,LOC_CNT=10
format is not supported
DL1IFW-7>4XUSS6,DL1IFW-1*,WIDE1*,DB0RO*,DB0ODE-10*,WIDE2*:`ßC�n>|>/`"6l}9A pasman.... ._
invalid data format
DB0BL>APMI06,DB0ODE-10*,WIDE2*:}DB1NTO-2>RFONLY,TCPIP,DB0BL*::DG2NGO-7 :Firmware update 020 available! Look at www.db1nto.de{737
format is not supported
DL1IFW-7>4XUSR0,DL1IFW-1*,WIDE1*,DB0RO*,DB0ODE-10*,WIDE2*:`ßD6n{6>/`"6e}9A pasman.... ._
invalid data format
DK3UO-9>TY0YX0,DB0RO*,DB0ODE-10*,WIDE1*:`ß-en^$k/`"5"}439.125MHz T067 -760_1
invalid data format
DL1IFW-7>4XUSS1,DL1IFW-1*,WIDE1*,DB0RO*,DB0ODE-10*,WIDE2*:`ßDWoH?>/`"6f}9A pasman.... ._
invalid data format
There is only one automatic APRS station out there that manages to crash aprslib
with the following UI frame of death:
APRS Packet: b'CA2JAT-7>SPP20W,WIDE1-1,WIDE2-1,qAS,CA2JAT-10:`bFll \x1c[/`1200bps_$'
Traceback (most recent call last):
File "/home/bin/ham/afeed", line 118, in <module>
receive.consumer(callback, raw=True)
File "/usr/local/lib/python3.6/dist-packages/aprslib/inet.py", line 183, in consumer
callback(line)
File "/home/bin/ham/afeed", line 79, in callback
parsed_ui_frame = aprslib.parse(ui_frame)
File "/usr/local/lib/python3.6/dist-packages/aprslib/parsing/__init__.py", line 114, in parse
_try_toparse_body(packet_type, body, parsed)
File "/usr/local/lib/python3.6/dist-packages/aprslib/parsing/__init__.py", line 186, in _try_toparse_body
body, result = parse_mice(parsed['to'], body)
File "/usr/local/lib/python3.6/dist-packages/aprslib/parsing/mice.py", line 195, in parse_mice
for i in range(channels):
TypeError: 'float' object cannot be interpreted as an integer
How to use aprslib to convert compressed coordinates to decimal format?
lat=aprslib.xxxxx("4903.50N")
long=aprslib.xxxx("07201.75W")
hello.
i am new to this so please forgive me if i am doing something wrong.
i wanted to write a script that receives aprs messages and working with them.
i encountered a problem when a message comes in that contains emojies.
the error message is:
APRS Packet: b'SQ6VRS>APDR14,TCPIP*,qAC,T2EUSKADI:=5029.09N/01719.96E[293/001/027.280MHz/A=000902 SQ6VRS-9 \xf0\x9f\x9a\x9b.:Redzi:. MobileGSM: +48502075027'
Traceback (most recent call last):
File "C:/Users/hmst/Desktop/aprs.py", line 27, in <module>
client.consumer(receivepackage)
File "C:\Users\hmst\AppData\Local\Programs\Python\Python36-32\lib\site-packages\aprslib\inet.py", line 185, in consumer
callback(self._parse(line))
File "C:/Users/hmst/Desktop/aprs.py", line 23, in receivepackage
print(formatstring)
UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 67-67: Non-BMP character not supported in Tk
is there any solution to this problem? i tried to filter these messages out but i noticed that it fails before i can filter the message...
thanks alot
Hans
When using the base91 from_decimal
function with an input of 0 the output is "!". However, APRS.fi which follows the BASE91 comment telemetry specification should actually create a "!!":
This is rejected by aprs.fi:
Sequence = 0, Channel 1 (ADC0) = 0
This turns into "|!!|" at the end of the following APRS-IS string:
However, the specification clearly intends for sequence of 0 with channel 1 = 0 to be "|!!!!|"
Hi,
I am looking for a library for generating APRS messages in Python and I saw that at this projects supports this for at least a few basic message types.
Do you have plans to add support for encoding data into APRS payload syntax? Or do you know other Python libraries that do?
Thanks!
DAO extension is currently not parsed
I am trying to create a threaded app that can stop each thread upon CTRL-C, and would like to set a timeout on consumer select.select to check if the app should quit or not. When I set blocking=False in consumer setup, I get nothing but resource not available errors.
Source:
I edited the source to not include my callsign and password
import aprslib
import logging
def callback(packet):
try:
packet = aprslib.parse(packet)
print(packet)
except (aprslib.ParseError, aprslib.UnknownFormat) as exp:
pass
logging.basicConfig(level=logging.INFO) # level=10
AIS = aprslib.IS("<MY ACCOUNT HERE>", passwd="<MY PASSWORD HERE>", port=14580, host="rotate.aprs2.net")
AIS.connect()
AIS.consumer(callback, raw=True, blocking=False, immortal=True)
The output
INFO:aprslib.inet.IS:Attempting connection to rotate.aprs2.net:14580
INFO:aprslib.inet.IS:Connected to ('62.77.224.245', 14580)
INFO:aprslib.inet.IS:Sending login information
INFO:aprslib.inet.IS:Login successful
ERROR:aprslib.inet.IS:socket error on recv(): [Errno 11] Resource temporarily unavailable
I just started using YAAC to test my application. Using aprs-lib I receive a message from a YAAC client with an alphanumeric 'msgNo' or message id like this, 'C0001'. Aprslib converts it to the '1'. Here is the raw packet.
[KG7AFQ-8>APJYC1,TCPIP*,qAC,T2SJC::BAKERSMS :?{C0001]
It should create a 'msgNo' like this 'C0001'.
Would you look at this?
Thanks
Using python3 and aprslib 6.45
Moving my server app to Aprs-Python from libfap-python to make it Python3 compatible. I deal exclusively with APRS messages.
The challenge I have is when an 'ack' message is rec'd from a client. It is parsing it as a 'message' with 'message_text'. I believe it should be a 'message' with 'response'. I have looked through old commits and issues with no indications of related issues.
Here is a parsed packet showing my challenge;
{'via': 'T2SOCAL', 'format': 'message', 'to': 'APWW10', 'raw': 'KG7AFQ-11>APWW10,TCPIP*,qAC,T2SOCAL::BAKERSMS :ack38648', 'from': 'KG7AFQ-11', 'message_text': 'ack38648', 'path': ['TCPIP*', 'qAC', 'T2SOCAL'], 'addresse': 'BAKERSMS'}
I use APRSDroid, YAAC and APRSIS32 to test my application.
Thanks for your time
Even though the APRS specification states message IDs ought to be alphanumerical, in practice one now routinely sees any group of five printable ASCII characters as a message ID behind the {
.
Could you please fix this and make it available on PyPI? I am trying to develop an application using your library for the upcoming scouts JOTA event, but unfortunately, I need to jump through hoops to circumvent these special message IDs. Thanks & 73 de ON4AA
>>> aprslib.parse('HB9EMQ-3>4W1WQ2,WIDE1-1,WIDE2-1,qAR,HB9BHU-10:`}G-l \x1c!/`10-12/145.450MHz-FDMA/8-2-TDMA_%')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.cygwin-2.0.4-i686/egg/aprslib/parsing.py", line 179, in parse
File "build/bdist.cygwin-2.0.4-i686/egg/aprslib/parsing.py", line 627, in _parse_mice
ValueError: invalid literal for int() with base 16: '10-1'
The comment field is "]=" for the following Mic-E packet, which is compressed.
You probably know this, as the comment field s gibberish in your documents.
{
"raw": 'K6EYE-9>SWTUVY,WR6ABD,K6FGA-1*,WIDE2:`26SmJ`E/]"4V}=',
"from": "K6EYE-9",
"to": "SWTUVY",
"path": ["WR6ABD", "K6FGA-1*", "WIDE2"],
"via": "",
"format": "mic-e",
"symbol": "E",
"symbol_table": "/",
"posambiguity": 0,
"latitude": 37.7615,
"mbits": "111",
"mtype": "M0: Off Duty",
"longitude": -122.4425,
"speed": 25.928,
"course": 268,
"altitude": 63,
"comment": "]=", #<---------
}
Hi:
I've seen that the packets of telemetry are still not supported for parse. For any reason? I say that because telemetry.py has already parse_comment_telemetry that will do more or less the job.
If a force parse_comment_telemetry for this beacon:
DEBUG:aprslib.parsing:Parsing: ED5YAM>APTT4,EA5RCD-15,WIDE1,WIDE2-1:T#790,551,564,999,085,716,11000000*
DEBUG:aprslib.parsing:Parsed ok.
i will obtain this:
{'raw': u'ED5YAM>APTT4,EA5RCD-15,WIDE1,WIDE2-1:T#790,551,564,999,085,716,11000000', 'via': '', 'from': u'ED5YAM', 'to': u'APTT4', 'path': [u'EA5RCD-15', u'WIDE1', u'WIDE2-1'], 'format': 'beacon', 'text': u'T#790,551,564,999,085,716,11000000'}**
This is better than obtain:
Mar 15 14:42:54 MonitorAPRS sh[563]: File "/usr/local/lib/python2.7/dist-packages/aprslib/parsing/init.py", line 162, in _try_toparse_body
Mar 15 14:42:54 MonitorAPRS sh[563]: raise UnknownFormat("format is not supported")
Hi, when attempting to stream packets with a specific callsign, I am unable to stream said packet. The script hangs up at
def callback(packet):
return packet
Where it does not exit the loop. I previously had it working, where I could process, parse, and return positioning data from aprslib, but recently it has stopped working. I have tried using the non-blocking feature for the .consumer() method, but also had no success with it.
aprs-python/aprslib/parsing/position.py
Line 174 in ef5ecb8
The "Connect to a feed" example works fine in Python3 with the following adjustment.
def callback(packet):
print packet
should read:
def callback(packet):
print(packet)
It would be useful to add a way to know right away what type a packet is after it can back from parse with out having to just see if it has a specific key in it. (For example currently you can tell a weather packet by looking for the key 'weather')
Hello,
I'm working on an APRS client and am liking this library.
I discovered it doesn't support BEACON style messages. The format is a bit different than a standard packet, going directly into comment after the header. I think if we check for parsed['to'].upper() == 'BEACON':
we can assume everything in the body is the message.
FROMCALL->BEACON:FROMCALL COMMENT<0x0d)
W3YA-1>BEACON:W3YA-1 Nittany Amateur Radio Club Digipeater<0x0d>
K3ARL-6>BEACON:K3ARL Ogletown APRS Digipeater<0x0d>
K3ARL-5>BEACON:K3ARL Brush Mountain APRS-RPTR<0x0d>
Currently the docs are out of date as they are generated manually, with rtd
they will be generated whenever commits are pushed.
======================================================================
ERROR: test_stability (tests.test_base91.c_Both)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/travis/build/rossengeorgiev/aprs-python/tests/test_base91.py", line 110, in test_stability
result = base91.to_decimal(text)
File "/home/travis/build/rossengeorgiev/aprs-python/aprslib/base91.py", line 37, in to_decimal
raise ValueError("invalid character in sequence")
ValueError: invalid character in sequence
Unless the code is utilizing the date/time stamp in these messages I humbly request that the server keep alive messages which start with "# aprsc" be silently dropped and not passed on to the parsing engine. My logs are filling with ParseError messages on each of these keep alives.
# aprsc 2.1.10-gd72a17c 23 Sep 2021 14:53:45 GMT T2CAEAST 137.220.54.84:14580
The above message is a keep alive and should be silently dropped or at least not passed to the packet parser.
EUC-TW
is detected by chardet
, but not supported in python
.
def callback(packet):
T = packet.get('temperature')
print(T)
Running this callback function on a weather packet filtered stream, with AIS.consumer(callback, raw=False)
Why I'm getting only KeyError Exceptions or None value for the temperature (and for all the other key in the dict)? It seems that there is no key in packet.. What am I doing wrong?
thanks,
Marco
Traceback (most recent call last):
File "testaprs.py", line 11, in <module>
AIS.connect()
File "/usr/local/lib/python2.7/dist-packages/aprslib/IS.py", line 113,
in connect
self._connect()
File "/usr/local/lib/python2.7/dist-packages/aprslib/IS.py", line 228,
in _connect
raddr, rport = self.sock.getpeername()
ValueError: too many values to unpack
The above exception will be raised when connected over IPv6. The tuple returned is of size 4.
https://docs.python.org/3.5/library/socket.html#socket-families
aprs-python/tests/test_parse_common.py
Line 315 in f5776bf
From http://www.aprs.org/APRS-docs/PROTOCOL.TXT the PHG symbol is allowed for 4 decimals after the "PHG" symbol. The first unit test pulls in an extraneous "A" from the next field.
POWER-HEIGHT-GAIN: This optional field replaces the CSE/SPD fields with a
report of transmitter power, antenna height-above-average-terain and
antenna gain. APRS uses this to plot radio range circles around all
stations. The following details the format to be used in the BText of
a TNC dedicated as an APRS digipeater:
!DDMM.mmN/DDDMM.mmW#PHG5360/WIDE...(identifying comments)...
| | | | |||| |_____ makes station show up green
| | | | ||||________ Omni (Direction of max gain)
| | | | |||_________ Ant gain in dB
| | | | ||__________ Height = log2(HAAT/10)
LAT LONG | | |___________ Power = SQR(P)
| |_____________ Power-Height-Gain identifier *
|_______________ # is symbol for digipeater
As you can see by the integers in the PHG string, there are only 10
possible values for each of these fields as follows:
DIGITS 0 1 2 3 4 5 6 7 8 9 Equation
-------------------------------------------------------------------
POWER 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 watts SQR(P)
HEIGHT 10,20,40, 80,160,320,640,1280,2560,5120 feet LOG2(H/10)
GAIN 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 dB
DIR omni,45,90,135,180,225,270, 315, 360, . deg (D/45)
#48
The DIRECTIVITY field offsets the PHG circle by one third in the
indicated direction. This means a front to back range of 2 to 1.
Most often this is used to indicate a favored direction or a null
even though an OMNI antenna is at the site. Note that 0 means
OMNI and 8 means 360 or a NORTH offset.
HIGHTS are ABOVE-AVERAGE TERRAIN! Not above ground or sea
level. ALso, since DOS version 8.0 the Height character may be any
ascii character 0-9 and above. This is so that higher heights for
aircraft or satelites may be incorportated.
On receipt, the PHG values are converted to a usable radio range using
the following algorithms:
POWER = P^2
H = 10 as a default
H = ASCII(Hchar)-51 converts it to a decimal value
HAAT = 10*2^H
GAIN = 10^(G/10) converts from DB to decimal
RANGE = SQR(2*H*SQR((P/10)*(GAIN/2)))
PHG FOR MOBILES: Due to fading and multipath on mobile signals which
can average 6 to 10 dB and peak at 20 to 40 dB, the effective range of
packets for mobiles is about HALF the range of Fixed stations.
Thus in APRS852 I reduced the PHG circles by 50% when using the MAPS-
PLOTS-PHG command and you need to hit MAPS-PLOTS-FIXED to see the PHG
for fixed stations (like in all previous versions)
See #48 and #60 Not sure why #48 was closed but it's correct compared to the spec published above.
This packet:
APRS Packet: b'CA2JAT-7>SPP20W,WIDE1-1,WIDE2-1,qAR,CA2JAT-10:bFll \x1c[/
1200bps_$'
Ends up in this:
Traceback (most recent call last):
File "test2.py", line 102, in
AIS.consumer(callback, raw=True)
File "/usr/local/lib/python3.7/site-packages/aprslib/inet.py", line 183, in consumer
callback(line)
File "test2.py", line 68, in callback
parsed = aprslib.parse(packet)
File "/usr/local/lib/python3.7/site-packages/aprslib/parsing/init.py", line 114, in parse
_try_toparse_body(packet_type, body, parsed)
File "/usr/local/lib/python3.7/site-packages/aprslib/parsing/init.py", line 186, in _try_toparse_body
body, result = parse_mice(parsed['to'], body)
File "/usr/local/lib/python3.7/site-packages/aprslib/parsing/mice.py", line 195, in parse_mice
for i in range(channels):
TypeError: 'float' object cannot be interpreted as an integer
Current tests need to be reworked after the parsing module split, even though they still work.
I dont want to connect to aprs.is. I working on a action script that message chats with aprs stations. I dont quite understand how to redirect the code to connect to xastir, or a local aprs server.
List of completed submodules:
Line 517 in 64593ef
Hi,
Thanks for providing this library.
Using the example for send a packet:
import aprslib
AIS = aprslib.IS("K7UDR", passcode="16273", port=14580)
AIS.connect()
AIS.sendall("K7UDR>APRS,TCPIP*:>status text")
pi@WSPi:~/python/stuart $ python send.py
Traceback (most recent call last):
File "send.py", line 11, in
AIS = aprslib.IS("K7UDR", passcode="16273", port=14580)
TypeError: init() got an unexpected keyword argument 'passcode'
According to the spec here:
http://www.aprs.org/aprs11/replyacks.txt
Message id line number with acks should be parsed out, but don't seem to be.
└─[$] <> cat test-2.py
import aprslib
import pprint
msg = "KO4KWC-6>APRS,TCPIP*,qAC,T2MCI::KO4KWC-14:weather ve3kbr {22}AA"
packet = aprslib.parse(msg)
pprint.pprint(packet)
Results in
└─[$] <> python test-2.py
{'addresse': 'KO4KWC-14',
'format': 'message',
'from': 'KO4KWC-6',
'message_text': 'weather ve3kbr {22}AA',
'path': ['TCPIP*', 'qAC', 'T2MCI'],
'raw': 'KO4KWC-6>APRS,TCPIP*,qAC,T2MCI::KO4KWC-14:weather ve3kbr {22}AA',
'to': 'APRS',
'via': 'T2MCI'}
in IS.py (239):
self.sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 15)
does not exist in OSX, in the leading sys.platform, darwin should be added. solved problem.
if sys.platform not in ['cygwin', 'win32', 'darwin']:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.