#!/usr/bin/env python # COAP ping implementation # 0x4000 0001 <--> 0x7000 0001 # 0x4000 0002 <--> 0x7000 0002 # 0x4000 0003 <--> 0x7000 0003 import socket import struct import sys from time import sleep, time from optparse import OptionParser # Parse Options if __name__ == '__main__': parser = OptionParser() parser.add_option("-n", "--hostname", action="append", dest="host_name", help="Define COAP host name") parser.add_option("-p", "--port", action="append", dest="host_port", default=5683, help="Define COAP host port (default: 5683)") parser.add_option("-l", "--loops", type="int", dest="ping_loops", default=0, help="Number of ping loops (default: 0 - forever)") parser.add_option("-t", "--sleep", type="float", dest="sleep_sec", default=1, help="Time in seconds between two pings (default: 1 sec)") (options, args) = parser.parse_args() # COAP ping parameters setup host = options.host_name[0] port = options.host_port sleep_sec = options.sleep_sec ping_loops = options.ping_loops ping_no = 1 # ping payload counter ping_cnt = 0 # global ping cnt print('COAP ping script') print('COAP ping to: %s:%s...' % (host, port)) try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) except socket.error: print('Error: Failed to create socket') sys.exit() while(1): loop_time = time() msg = '' #[0x40, 0x00, 0x00, 0x00] msg += struct.pack("B", 0x40) msg += struct.pack("B", 0x00) msg += struct.pack("B", 0x00) msg += struct.pack("B", ping_no) try : print('[0x%08X] Send ping:' % (ping_cnt), [hex(ord(c)) for c in msg]) # Set the whole string s.sendto(msg, (host, port)) s.settimeout(2 + sleep_sec) # receive data from client (data, addr) d = s.recvfrom(4) reply = d[0] addr = d[1] # We need to check if ping peyload counter is the same in reply status = bytes(msg)[3] == bytes(reply)[3] print('[0x%08X] Recv ping:' % (ping_cnt), [hex(ord(c)) for c in reply], 'ok' if status else 'fail') except socket.error as e: print('Error: socket.error: ', str(e)) sleep(3) # Waiting to recover ;) except socket.timeout: print("Error: closing socket") s.close() if ping_no >= 0xFF: ping_no = 1 else: ping_no += 1 sleep(sleep_sec - (time() - loop_time)) print(('In %.2f sec' % (time() - loop_time))) if ping_loops > 0: if ping_loops == 1: break ping_loops -= 1 ping_cnt += 1