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 |