Git Product home page Git Product logo

aprs-python's People

Contributors

joergschultzelutter avatar jpronans avatar kb1lqc avatar rossengeorgiev avatar thecranston avatar wsmitchell3 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aprs-python's Issues

Parsing has extra u in front of value

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*']}

Understanding callback function

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.

What do we pass for the passwd?

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)

Add TelemetryReport packet Generation Function

I have successfully implemented your PositionReport() function into my @FaradayRF APRS application to generate and send position reports to APRS-IS.

Example:
image

TelemetryReport

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.

TypeError: __init__() got an unexpected keyword argument 'passcode'

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.

set_filter function does not appear to work.

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

Is aprslib Intended to Generate Valid APRS packets?

Per the APRS Protocol:

image

image

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:
image

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?

print statement

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)

Add tests for the entire parsing module

Now that the module is split into smaller bits, it should be easier to add unit tests.

List of completed submodules:

  • parsing.py
  • common
  • message
  • position
  • mice
  • misc
  • telemetry
  • weater

Connectin with inet.py

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)

so many format errors

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

UI frame of death crashes aprslib

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

IS: Comment line filtering fails in python3

The code filtering out comment lines from the feed fails under python3. Line come in as bytes, addressing a single byte return int rather than bytes.

Reported in #34

aprs-python/aprslib/inet.py

Lines 178 to 187 in b6d67fd

while True:
try:
for line in self._socket_readlines(blocking):
if line[0] != "#":
if raw:
callback(line)
else:
callback(self._parse(line))
else:
self.logger.debug("Server: %s", line)

Problem when Parsing Messages that include Emojies

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

BASE91 Conversion Creates Invalid Value for Decimal 0 Telemetry

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 "!!":

image

This is rejected by aprs.fi:

Sequence = 0, Channel 1 (ADC0) = 0
image

This turns into "|!!|" at the end of the following APRS-IS string:
image

However, the specification clearly intends for sequence of 0 with channel 1 = 0 to be "|!!!!|"

image

Generating APRS messages?

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!

Blocking=False in consumer causes errors

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

Message Id (msgNO) is being concatenated

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

Parsing Message Acks

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

parse() cannot handle special characters in message ID

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

ValueError while parsing a MicE packet

>>> 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'

Comment field jibberish in compressed Mic-E packets

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": "]=",  #<---------
}

Telemetry Parser

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")

Packets not being returned by parser

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.

Add packet_type into the dict returned by parse.

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')

Does not support BEACON format.

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>

Move docs to readthedocs and API reference

  • move docs to readthedocs

Currently the docs are out of date as they are generated manually, with rtd they will be generated whenever commits are pushed.

  • add module api to docs via autodoc

base91 test errors on pypy and pypy3

======================================================================
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

Drop aprsc server status messages

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.

[question] how to extract parsed value from the dictionary

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

gepeername() returns tuples of different size based on address family

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

unit test for PHG accepts protocol decode error

def test_PHG(self):

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.

for i in range(channels): - TypeError: 'float' object cannot be interpreted as an integer

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

I dont want to connect to aprs.is

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.

unexpected keyword passcode

Hi,

Thanks for providing this library.

Using the example for send a packet:

import aprslib

a valid passcode for the callsign is required in order to send

AIS = aprslib.IS("K7UDR", passcode="16273", port=14580)
AIS.connect()

send a single status message

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'

line number ack format not being parsed

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'}

Socket KeepAlive()

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']:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.