#!/usr/bin/env python3.7 import socket import time pausee = 0.00001 # time between pings in seconds rate = 0.2 # 1/rate gives the time for a cycle in seconds ip_base = '2001:6a8:2880:2018::' def hue_to_rgb_float(h): i = int(h * 6.0) f = h * 6.0 - i g = 1.0 - f i %= 6 if i == 0: return 1.0, f, 0.0 elif i == 1: return g, 1.0, 0.0 elif i == 2: return 0.0, 1.0, f elif i == 3: return 0.0, g, 1.0 elif i == 4: return f, 0.0, 1.0 else: # i == 5 return 1.0, 0.0, g def send_ping(send_socket, rgb): addr = ip_base + '%.2x:%.2x:%.2x' % rgb try: send_socket.sendto(b'\x80\0\0\0\0\0\0\0', (addr, 0, 0, 0)) except: pass def main(): send_socket = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname('ipv6-icmp')) while True: # float that increases to 1 at speed given by rate hue = (time.time() * rate) % 1.0 # returns (r, g, b) where each is between 0 and 1 rgb_float = hue_to_rgb_float(hue) # returns (r, g, b) where each is a float between 0 and 255 rgb = tuple(int(min(x * 256, 255)) for x in rgb_float) send_ping(send_socket, rgb) time.sleep(pausee) if __name__ == '__main__': main()