Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Esimerkki "EDS Ethernet to 1-Wire Bridge" laitteiden skannaaminen

jalski [05.09.2021 10:24:37]

#

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 ;

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta