Alla oleva koodi skannaa verkosta EDS Ethernet to 1-Wire Bridge - latteita.
Tämä tapahtuu lähettämällä UDP broadcast viesti. Laite vastaa lähettämällä vastauksena viestin, mikä sisältää JSON-muodossa laitteen tietoja. Laitteet lähettävät myös samanlaisen UDP-viestin aina käynnistyesssään. Ohjelma vastaanottaa UDP-viestejä omassa säikeessään ja työntää ne jonoon. Toinen säie antaa puolen sekunnin välein edellisestä käsittelystä jonossa olevat tiedot käyttöliittymän säikeen käsiteltäväksi. Käyttöliittymässä on nappi mitä painamalla saa verkossa olevat laitteet haettua uudelleen aina halutessaan. Käyttöliittymä listaa löydettyjen laitteiden nimen, ip-osoitteen ja järjestelmä version.
needs nk/gui [] constant devices 255 q:new constant responses { type: @net:DGRAM, proto: @net:PROTO_UDP, sockopts: { broadcast: 1, reuseaddr: 1 } } net:socket "0.0.0.0" 30303 net:getaddrinfo over net:bind constant socket : send socket "255.255.255.255" 30303 net:getaddrinfo "D" 0 net:sendto t:err? "Problem sending %s\n" s:strfmt thrownull 2drop ; : receive socket repeat 2048 b:new 0 net:recvfrom t:err? "Failed the recvfrom: %s" s:strfmt thrownull drop json> null? not if responses swap q:push then 2drop again ; : request devices a:clear drop responses q:clear drop send ; : read-queue responses repeat q:len not if break else q:pop devices swap a:push drop then again drop over t:notify ; : update-devices repeat ' read-queue nk:do -1 sleep 0.5 sleep again ; with: nk : getcount \ -- n devices a:len n:1- nip ; : getitem \ n -- m devices swap a:@ nip ; : new-win { name: "main", title: "EDS Scanner", wide: 0.5, high: 0.5, bg: "white", fonts: { f1: ` 18 font:system ` }, font: "f1" } win "list" list-new m! ; : list-item \ m -- [ "Name", "IP", "FWVer" ] m:@ nip "%32s %20s %20s" s:strfmt widget drop [ 1, 0, -2, 0] ' n:+ a:2map dup [ 4, 4, 0, 0 ] ' n:+ a:2map swap 3rev null "bg" nk:get "black" draw-text 0 1 "black" stroke-rect ; : main-render { bg: "white", font: "f1", flags: [ @WINDOW_NO_SCROLLBAR ], padding: [0,0] } begin null { margin: 4, rows: [ 32, -1], cols: [-1], cgap: 0, rgap: 8 } layout-grid-begin 0 1 0 0 grid grid-push "Discover Devices" ' request button-label 1 1 0 0 grid grid-push "list" TEXT_LEFT get-row-height getcount "list" m@ dup>r list-begin if 30 1 layout-row-dynamic ( getitem list-item ) r@ list-range drop loop r@ list-end then rdrop layout-grid-end end ; : app:main ' receive t:task ' update-devices t:task send new-win ' main-render -1 render-loop ;
Aihe on jo aika vanha, joten et voi enää vastata siihen.