+++ /dev/null
-#!/usr/bin/env python
-# -*- coding: iso-8859-15 -*-
-
-import sys
-import socket
-import json
-
-def set_keepalive(sock, after_idle_sec=1, interval_sec=3, max_fails=5):
- """Set TCP keepalive on an open socket.
-
- It activates after 1 second (after_idle_sec) of idleness,
- then sends a keepalive ping once every 3 seconds (interval_sec),
- and closes the connection after 5 failed ping (max_fails), or 15 seconds
- """
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
- sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, after_idle_sec)
- sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval_sec)
- sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, max_fails)
-if not hasattr(socket, "set_keepalive"):
- socket.set_keepalive = set_keepalive
-
-class JsonClient:
- def __init__(self, addr = ("arm", 10002)):
- self.pSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.pSocket.settimeout(1)
- socket.set_keepalive(self.pSocket)
- self.pSocket.connect(addr)
- self.lMsgs = []
-
- def write(self, cmd):
- data = {'command': cmd}
- num = self.pSocket.sendall(json.dumps(data))
- while True:
- msg = json.loads(self.pSocket.recv(4096))
- if msg.has_key("return"): return msg["return"]
- elif msg.has_key("error"): return msg["error"]
- self.lMsgs.insert(0, msg)
-
- def read(self):
- if len(self.lMsgs) > 0:
- return self.lMsgs.pop()
- self.pSocket.setblocking(False)
- try:
- return json.loads(self.pSocket.recv(4096))
- except socket.error:
- pass
- finally:
- self.pSocket.setblocking(True)
-
-if __name__ == "__main__":
- print JsonClient().write(sys.argv[1])
-
- #from datetime import datetime
- #from time import sleep
- #pClient = JsonClient()
- #while True:
- # msg = pClient.read()
- # if msg:
- # print "Got async", msg
- # print datetime.now(), float(pClient.write("get distance forward lower"))
- # sleep(0.1)