There are lots of ways to access hardware interfaced devices across the internet. You can buy ready-to-go hardware easily. I've always enjoyed this sort of thing. However unless you work via a third-party server it can be messy programming, since most of us have an external dynamically-issued internet address which can change, so we may need to have an account on a DNS server to cover this, and may need to know about opening ( and protecting!) ports. And client and control machines will generally be off ( or offline) for significant amounts of time so a signal may be missed unless hosted on a third machine which is always on.
NB If interfacing to mains-driven kit be very aware of safety, loading and wiring considerations. I bought a web-enabled mains switch off the internet a few weeks back- works beautifully via a mobile phone interface. But although it uses a claimed 10 amp switching relay, it is wired via 3A connecting screw-blocks, and supplied with 2A twin-core cable, no earth, and few warnings. Buyer beware!
However we all use a web browser without needing to know such details. LB makes it pretty easy to webscrape a web page ( at client end), and also to ftp a file to a site ( at control- server- end). I've used this for several years for things like turning on a heater in a remote property 150 miles away, where I have a low power PC running continuously, or sometimes at pre-arranged times. This periodically scrapes the webpage and parses the contents and acts accordingly. Of course I could instead ftp to that remote machine and have the client program read the latest local command file. But I like being able to see the control file on a webpage from anywhere as well as being able to alter it from anywhere. For a simple guy like me it is even fun to see one of my home computers turn something on from another of my machines in the house!
This uses the httpget$() command to read the entire command file once a minute from a website. It then parses out the bit which tells it what a particular attached device is supposed to do. Here a graphics window simply changes color- normally it would actuate an external device.
timer 60000, [checkWeb] wait [checkWeb] htmlText$ = httpget$( "http://www.diga.me.uk/command.txt") ' a file on my website.. 'print upto$( afterlast$( htmlText$, ">command<"), ">/command<") ' for debug/testing c$ =upto$( afterlast$( htmlText$, ">command<"), ">/command<") if c$ ="on" then #wg "fill red" else #wg "fill darkblue" wait end
An easy file structure is fun to invent. Here I use a name for the device to identify it and follow it with the command. I also use things like 'lamp1|on' or 'lamp1|off', with CRLF separators in the file. This example commands just one device.
<command>off</command>
Uses ftp4w32.dll which works nicely on my Linux/Wine setup. Perfectly possible to do this instead outside LB, by suitable ftp ( or sftp) software on a computer or mobile phone.)
nomainwin dim error$(6000) error$( 0) ="No problem.." error$(1003) ="user not connected to server" error$(1004) ="cannot open file" error$(1008) ="action not taken" error$(1010) ="server cannot open file" error$(3001) ="3001" error$(5002) ="5002" WindowWidth = 100 WindowHeight = 40 UpperLeftX = 1 UpperLeftY = 1 port = 21 'port to use pasv = 1 'PASV mode? 1 is yes, 0 is no ftphost$ = "zzzzzzzzzz" 'ftp site address login$ = "zzzzzzzzz" 'ftp site username login password$ = "zzzzzzzz" 'ftp site password initpath$ = "" 'leave blank if you want the site's default upload$ = "command.txt" 'full path & file info for file to upload remotefile$ = "command.txt" 'what you want it to be called on the ftp server TRUE = 1 FALSE = 0 ftpsession = FALSE open "LB" for graphics as #main #main, "trapclose [quit.main]" hW =hwnd( #main) [upload] parentftp =hW 'nd( #session) open "ftp4w32.dll" for dll as #ftp ftpsession = TRUE calldll #ftp, "FtpInit", parentftp as long, res as long 'print res; " "; error$( res) calldll #ftp, "FtpSetSynchronousMode", void as long calldll #ftp, "FtpSetDefaultPort", port as long, void as long calldll #ftp, "FtpSetPassiveMode", pasv as long, void as long t =time$( "seconds") calldll #ftp, "FtpLogin", ftphost$ as struct, login$ as struct, password$ as struct, parentftp as long, 0 as long, res as long calldll #ftp, "FtpCWD", initpath$ as struct, res as long print res; " "; error$( res); " "; calldll #ftp, "FtpSendFile", upload$ as struct, remotefile$ as struct, 0 as long, 0 as long, parentftp as long, 0 as long, res as long 'print res; " "; error$( res); wait [closeftp] calldll #ftp, "FtpCloseConnection", void as long calldll #ftp, "FtpRelease", void as long close #ftp ftpsession = FALSE 'print "ftp call over: delaying 600000ms ie 600s or 10 minutes." wait [quit.main] close #main if ftpsession = TRUE then calldll #ftp, "FtpCloseConnection", void as long calldll #ftp, "FtpRelease", void as long close #ftp end if END