Hi all!
This weekend I was thinking how to make my webcam connected to
OrangePI send a picture “on demand”. There are daemons (e.g. motion or
webcam-mjpg) which do this but they capture images even when you are not
watching and I wanted to avoid this. There are also projects (fswebcam)
which are able to take single picture, save it to disk and end. I just
needed to run it after http request and send back the image. Installing
full webserver with some kind of interpreter (php, lua,…) seemed to me
like an overkill. So I came to an idea to use inetd.
And this is how I did.
First you need to install inetd and fswebcam:
apt install openbsd-inetd fswebcam
Then you make it listen on some TCP  port and define which
script to run. To  do this add following line to /etc/inetd.conf
8083 stream tcp,sndbuf=64k nowait root /root/webcam.sh
and restart it
service inetd restart
Then you need a script which will run the webcam binary and fake a HTTP response.
Create /root/webcam.sh
In case you want just one shot:
#!/bin/bash
FILE=/tmp/webcam.jpg
fswebcam --resolution 640x480 --save $FILE &>/dev/null 
len=stat -c '%s' $FILE echo "HTTP/1.1 200 OK" echo "Content-Type: image/jpeg" echo "Content-Length: $len" echo cat $FILE # let the client to close the connection sleep 1
In case you want a mjpeg stream:
#!/bin/bash
FILE=/tmp/webcam.jpg
function cleanup {
  killall fswebcam
}
trap cleanup EXIT
fswebcam --loop 1 --resolution "640x480" --timestamp "%d-%m-%Y %H:%M:%S (%Z)" --save $FILE --background
BOUND="AA3284238420182340189sdsadwZZ"
echo -e "HTTP/1.1 200 OK\r"
echo -e "Content-Type: multipart/x-mixed-replace;boundary=$BOUND\r"
echo -e "\r"
OK=0
echo -e "--$BOUND\r"
while [ $OK -eq 0 ]
do
  if [ "stat --format=%Y $FILE" == "$MOD" ]   then     sleep 1   else     MOD=stat --format=%Y $FILE     echo -e "Content-Type: image/jpeg\r"     len=stat -c '%s' $FILE     echo -e "Content-Length: $len\r"     echo -e "\r"     cat $FILE     OK=$?     echo -e "\r\n--$BOUND\r"   fi   if ! ps | grep fswebcam &> /dev/null   then     exit 1   fi done
Then make it executable
chmod +x /root/webcam.sh
And you are done!
This way you can run any shell script with various output (text, binary, image, etc.).
Looking forrward to your comments.
Hi,
I am really not familiar with shell-scripting, so I have been not able to figure out whether the start of the mjpeg stream can be limited to a certain time span…like 5sec. Can you give me a hint to adpat your script accordingly?
Kr,
Michael
What behavior do you want to achieve?