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.