Install deps & start the python broadcast:
python -m venv venv
. ./venv/bin/activate
pip install -r requirements.txt
python broadcast.py
Start the clojure listener:
clj -M -m receive
| import msgpack | |
| import socket | |
| from time import sleep | |
| ADDR="127.255.255.255" | |
| PORT=13337 | |
| counter=0 | |
| sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) | |
| sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
| sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) | |
| while True: | |
| data = {"xyz": [1.1, 2.2, 3.3], "enabled": True, "counter": counter} | |
| counter = counter + 1 | |
| payload = msgpack.packb(data) | |
| print("send", data) | |
| sock.sendto(payload, (ADDR, PORT)) | |
| sleep(1) |
| {:paths ["."] | |
| :deps {clojure-msgpack/clojure-msgpack {:mvn/version "1.2.1"}}} |
| (ns receive | |
| (:require [msgpack.core :as msgpack]) | |
| (:import [java.net DatagramPacket DatagramSocket InetSocketAddress StandardSocketOptions])) | |
| (def read-port 13337) | |
| (def max-len 1500) | |
| (defn -main [] | |
| (let [sock (doto (DatagramSocket. nil) | |
| (.setBroadcast true) | |
| (.setReuseAddress true) | |
| (.setOption StandardSocketOptions/SO_REUSEPORT true) | |
| (.setSoTimeout 10000) | |
| (.bind (InetSocketAddress. read-port))) | |
| packet (DatagramPacket. (byte-array max-len) max-len)] | |
| (while true | |
| (.receive sock packet) | |
| (let [data (msgpack/unpack (.getData packet))] | |
| (prn :received data))))) |
| msgpack==1.0.7 |