You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.5 KiB
84 lines
2.5 KiB
#!/usr/bin/env python
|
|
import sys
|
|
import argparse
|
|
import zmq
|
|
import json
|
|
from hexdump import hexdump
|
|
from threading import Thread
|
|
|
|
from cereal import log
|
|
import selfdrive.messaging as messaging
|
|
from selfdrive.services import service_list
|
|
|
|
def run_server(socketio):
|
|
socketio.run(app, host='0.0.0.0', port=4000)
|
|
|
|
if __name__ == "__main__":
|
|
context = zmq.Context()
|
|
poller = zmq.Poller()
|
|
|
|
parser = argparse.ArgumentParser(description='Sniff a communcation socket')
|
|
parser.add_argument('--pipe', action='store_true')
|
|
parser.add_argument('--raw', action='store_true')
|
|
parser.add_argument('--json', action='store_true')
|
|
parser.add_argument('--dump-json', action='store_true')
|
|
parser.add_argument('--no-print', action='store_true')
|
|
parser.add_argument('--proxy', action='store_true', help='republish on localhost')
|
|
parser.add_argument('--map', action='store_true')
|
|
parser.add_argument('--addr', default='127.0.0.1')
|
|
parser.add_argument("socket", type=str, nargs='*', help="socket name")
|
|
args = parser.parse_args()
|
|
|
|
republish_socks = {}
|
|
|
|
for m in args.socket if len(args.socket) > 0 else service_list:
|
|
if m in service_list:
|
|
port = service_list[m].port
|
|
elif m.isdigit():
|
|
port = int(m)
|
|
else:
|
|
print("service not found")
|
|
exit(-1)
|
|
sock = messaging.sub_sock(context, port, poller, addr=args.addr)
|
|
if args.proxy:
|
|
republish_socks[sock] = messaging.pub_sock(context, port)
|
|
|
|
if args.map:
|
|
from flask.ext.socketio import SocketIO
|
|
from flask import Flask
|
|
app = Flask(__name__)
|
|
socketio = SocketIO(app, async_mode='threading')
|
|
server_thread = Thread(target=run_server, args=(socketio,))
|
|
server_thread.daemon = True
|
|
server_thread.start()
|
|
print 'server running'
|
|
|
|
while 1:
|
|
polld = poller.poll(timeout=1000)
|
|
for sock, mode in polld:
|
|
if mode != zmq.POLLIN:
|
|
continue
|
|
msg = sock.recv()
|
|
evt = log.Event.from_bytes(msg)
|
|
if sock in republish_socks:
|
|
republish_socks[sock].send(msg)
|
|
if args.map and evt.which() == 'liveLocation':
|
|
print 'send loc'
|
|
socketio.emit('location', {
|
|
'lat': evt.liveLocation.lat,
|
|
'lon': evt.liveLocation.lon,
|
|
'alt': evt.liveLocation.alt,
|
|
})
|
|
if not args.no_print:
|
|
if args.pipe:
|
|
sys.stdout.write(msg)
|
|
sys.stdout.flush()
|
|
elif args.raw:
|
|
hexdump(msg)
|
|
elif args.json:
|
|
print(json.loads(msg))
|
|
elif args.dump_json:
|
|
print json.dumps(evt.to_dict())
|
|
else:
|
|
print evt
|
|
|
|
|