Skip to content

Commit

Permalink
Add a little script to push RTCMv2 messages transcoded from NTRIP ove…
Browse files Browse the repository at this point in the history
…r UDP
  • Loading branch information
Ben Nizette committed Dec 20, 2013
1 parent 3012ec0 commit 1b8da7b
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 17 deletions.
47 changes: 30 additions & 17 deletions RTCMv3_decode.py
Expand Up @@ -16,6 +16,8 @@

from bitstring import BitStream

max_sats = 12

RTCMv3_PREAMBLE = 0xD3
PRUNIT_GPS = 299792.458
CLIGHT = 299792458.0
Expand Down Expand Up @@ -113,10 +115,11 @@ def decode_1004(pkt):
smint = pkt.read(3).uint

prs = {}
temp_corrs = {}

for n in range(nsat):
svid = pkt.read(6).uint
corr_set[svid] = {}
temp_corrs[svid] = {}

code1 = pkt.read(1).uint
pr1 = pkt.read(24).uint
Expand All @@ -133,27 +136,37 @@ def decode_1004(pkt):
pr1 = pr1 * 0.02 + amb * PRUNIT_GPS

if ppr1 != 0x80000:
corr_set[svid]['P1'] = pr1
temp_corrs[svid]['P1'] = pr1
cp1 = adjcp(svid, 0, ppr1 * 0.0005 / lam_carr[0])
corr_set[svid]['L1'] = pr1 / lam_carr[0] + cp1
temp_corrs[svid]['L1'] = pr1 / lam_carr[0] + cp1

corr_set[svid]['LLI1'] = lossoflock(svid, 0, lock1)
corr_set[svid]['SNR1'] = snratio(cnr1 * 0.25)
corr_set[svid]['CODE1'] = 'CODE_P1' if code1 else 'CODE_C1'
temp_corrs[svid]['LLI1'] = lossoflock(svid, 0, lock1)
temp_corrs[svid]['SNR1'] = snratio(cnr1 * 0.25)
temp_corrs[svid]['CODE1'] = 'CODE_P1' if code1 else 'CODE_C1'

if pr21 != 0xE000:
corr_set[svid]['P2'] = pr1 + pr21 * 0.02
temp_corrs[svid]['P2'] = pr1 + pr21 * 0.02

if ppr2 != 0x80000:
cp2 = adjcp(svid, 1, ppr2 * 0.0005 / lam_carr[1])
corr_set[svid]['L2'] = pr1 / lam_carr[1] + cp2
temp_corrs[svid]['L2'] = pr1 / lam_carr[1] + cp2

corr_set[svid]['LLI2'] = lossoflock(svid, 1, lock2)
corr_set[svid]['SNR2'] = snratio(cnr2 * 0.25)
corr_set[svid]['CODE2'] = L2codes[code2]
temp_corrs[svid]['LLI2'] = lossoflock(svid, 1, lock2)
temp_corrs[svid]['SNR2'] = snratio(cnr2 * 0.25)
temp_corrs[svid]['CODE2'] = L2codes[code2]

# Sort the list of sats by SNR, trim to 10 sats
quals = sorted([ (s, temp_corrs[s]['SNR1']) for s in temp_corrs], key=lambda x: x[1])
if len(quals) > max_sats:
print("Drop {} sats for encode".format(len(quals) - max_sats))
quals = quals[:max_sats]

# Copy the kept sats in to the correction set
corr_set = {}
for sv, snr in quals:
corr_set[sv] = temp_corrs[sv]
prs[sv] = temp_corrs[sv]['P1']

prs[svid] = corr_set[svid]['P1']

itow = tow


Expand Down Expand Up @@ -350,16 +363,16 @@ def parse_rtcmv3(pkt):
def RTCM_converter_thread(server, port, username, password, mountpoint, rtcm_callback = None):
import subprocess

"""nt = subprocess.Popen(["./ntripclient",
nt = subprocess.Popen(["./ntripclient",
"--server", server,
"--password", password,
"--user", username,
"--mountpoint", mountpoint ],
stdout=subprocess.PIPE)"""

nt = subprocess.Popen(["./ntrip.py", server, str(port), username, password, mountpoint],
stdout=subprocess.PIPE)

"""nt = subprocess.Popen(["./ntrip.py", server, str(port), username, password, mountpoint],
stdout=subprocess.PIPE)"""


if nt is None or nt.stdout is None:
indev = sys.stdin
Expand Down
42 changes: 42 additions & 0 deletions ntrip_to_udp.py
@@ -0,0 +1,42 @@
#!/usr/bin/env python
'''
NTRIP -> RTCMv2 transcode, UDP link
'''

import time, socket
import RTCMv3_decode

from optparse import OptionParser

parser = OptionParser("ntrip_to_udp.py [options]")

parser.add_option("--ntrip-server", default='192.104.43.25')
parser.add_option("--ntrip-port", type='int', default=2101)
parser.add_option("--ntrip-user")
parser.add_option("--ntrip-password")
parser.add_option("--ntrip-mount", default='TID10')

parser.add_option("--udp-port", type='int', default=13320)
parser.add_option("--udp-addr", default="127.0.0.1")


(opts, args) = parser.parse_args()

packet_count = 0

def send_rtcm(msg):
global packet_count
packet_count += 1
msg = msg[:-2] # Trim off \r\n that the RTCM encoder puts there
port.sendto(msg,(opts.udp_addr, opts.udp_port))
print(len(msg), msg)

RTCMv3_decode.run_RTCM_converter(opts.ntrip_server, opts.ntrip_port, opts.ntrip_user, opts.ntrip_password, opts.ntrip_mount, rtcm_callback=send_rtcm)

port = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# port.setsockopt...


while True:
print(packet_count)
time.sleep(10)

0 comments on commit 1b8da7b

Please sign in to comment.