Posts Tagged ‘Debian’

h1

Creating a Simple Linux Webcam Server

31/05/2013

Whether you’re needing to create your own security camera, or you’re wanting to set up an always-on web video, having constant, recorded video feed can be useful. It’s even more so if you can access it while you’re not at home, say, over the internet. That’s what I did a few weeks ago, with an old computer (Crusher) that I’ve been using as a file server. Now it’s pulling double duty as a constantly-streaming video service that broadcasts over the internet.

See and Record from anywhere

See and Record from anywhere

Now, this setup is quite simple, and as such has a few drawbacks. There is no security implemented in this guide, though that can be done fairly easily afterwards. There is a little bit of upkeep, and it doesn’t do everything on its own (such as file cleanup). On the flipside, it’s not very resource intensive, records everything, can be set up, sent off and running in an afternoon and is extremely stable. I’d also like to mention that it’s dirt cheap, as this can be put on almost any machine made in the last decade.

If these strengths and weaknesses sound like what you’re trying to do, here’s how to put it together.

The Tools

What you’ll need:

  • A PC with at least one free USB port.
  • Ubuntu Linux 10.04LTS or later installed.
  • A Linux-compatible webcam.
  • Access to the internet (from the PC).
  • A Router that can support Virtual Servers or Port Forwarding.

The USB port can be 1.1 or higher. Most webcams don’t push through enough data to really need the higher speeds. Though if you did get a higher-resolution webcam, then make sure you’re attaching it to a port that can handle the load.

This old Dell Optiplex GX1 is enough power to run both a Linux fileserver and webcam server.

This old Dell Optiplex GX1 is enough power to run both a Linux fileserver and webcam server.

In my case, I’m assuming that you picked up a really cheap webecam. For my purposes, I chose the Logitech C200. Everything Logitech is pretty much plug-n-play (ie “It just works”) with Linux. You can pick up that cam for about $12-20, but there are even less expensive ones out there that will function just as well.

The PC that I’m showing you this on is a very old one (Pentium 3-era) with about 512MB of RAM and running Ubuntu 10.04 LTS (server repositories). Now, 10.04 is out of date as of this writing, but I’ve since migrated the repositories over to the sever versions. This guide will still work on 12.04, as I tested it on that system as well, but for the sake of consistency, I’ll be showing you everything from my actual server’s view.

The router needs to support port-forwarding or virtual servers for you to be able to get to it from the internet. If you’re not worried about that, then you can ignore this requirement. Most routers support this anyway, so you’re probably fine. In either case, your “server” will need to able to access the internet.

Motion Setup

Booting your computer with the webcam plugged in should be sufficient to register it in the system. To find out if it is indeed in the system, use the lsusb command (List USB) to see all of the devices connected to your computer via USB. You should get output that says something like the following:

cjjulius@CRUSHER:~$ lsusb
Bus 001 Device 002: ID 046d:0802 Logitech, Inc.
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

The Logitech device is being registered by the system. If you don’t see your device here, then you’re most likely looking at a hardware issue, as Logitech uses the standard uvcvideo drivers and software-wise sets up very smoothly. If you’re not using Logitech and you’re not seeing your device here, then you’ve got some troubleshooting to do.

Next, we’ll need to find out where in the system our camera is mounted so we can point our software to it. Use the following command to see where your usb device is currently mounted. Basically this command lists all the devices connected to your system, then sends that to the grep tool which in turn filters everything out but devices with the word “video” in them.

cjjulius@CRUSHER:~$ ls /dev/ | grep video
video1

Make a note of this device’s lotion, which in my case is: /dev/video1

Now we need to install motion, our webcam recording software. So, we’ll act as a superuser, telling aptitude to get the software from the repositories and install it:

sudo apt-get install motion

Then we’ll go to the configuration file and edit it, so we can point motion to our webcam and maybe edit a few options. First I’ll copy a backup (in case we goof) and then we’ll edit the original. You can use either nano or gedit, depending on your preference. I’ll use nano, because it is low-resource and Crusher is an old computer doing a lot of stuff. Again, we’ll need to act as a superuser to do so.

sudo cp /etc/motion/motion.conf /etc/motion/montion.conf.bak
sudo nano /etc/motion/motion.conf

In here are a lot of options, and some you’ll probably want to tweak at a later date. Right now we’re just interested in getting this thing rolling and we don’t want to get bogged down in the details. We’re looking for a line labeled “videodevice” under the “Capture Devices” heading. It should be pretty close to the top.

On the same line as videodevice, we want the /dev/video0 line to point to our webcam that we found earlier. So, in my case it reads:

videodevice /dev/video1

Your device line should look something like this in motion.conf

Your videodevice line should look something like this in motion.conf

Save the file and exit the editor. Again, there are lots of options in here (including password protection) but we’re not interested in that right now. We just want to get a simple webcam server up and going, though I encourage you to come back and tweak the settings, or at the very least see what you can do with this program.

Now, you can run motion by simply typing “motion” at the command line. Remember that motion stores video streams as .jpgs and uses the folder you run the command from to store the files. This can fill up smaller drives very quickly.

My method to deal with this is simple, but isn’t elegant. I navigate to the Trash folder and run motion from there. Then, when I want to clear the files, I just log in and empty the trash.

cd ~/.local/Trash/files/
motion

Webcam Viewing

Assuming that motion is now running successfully in your terminal, we can see what your camera is seeing. Open a browser and go to http://127.0.0.1:8081

If you go to any other computer on your network, you can simply put into your browser the following to see your webcam:

(PC's IP address):8081

If you don’t know your Webcam Server’s IP address, we can look at the interface configuration output and filter it for an internet address. You can do this by opening a terminal and typing:

ifconfig | grep "inet addr"

It should be the first one on the first line. Not the 127.0.0.1 line. In my case it’s 192.168.100.6

But, if we’re away from the building with the webcam, that’s not very helpful. We want to be able to access our server from anywhere in the world. So, we need to set up a method of getting to our home machine from elsewhere.

First, we need to forward the appropriate ports so we can see the video stream. Motion, by default, uses only the one you saw before: 8081. We just need to get our router to connect the dots between any connection that comes in from the internet on that port, with our server.

This is what mine looks like, but they're all a little bit different.

This is what mine looks like, but they’re all a little bit different.

Go into your router’s settings page, in my case it’s an Arris modem/router, and go to the Firewall/NAT page (or something like it). Look for “Port Forwarding” or “Virtual Servers”. Select that you want to “Add New”.

Use the 8081-8081 range for both incoming and local ports and then put the local PC’s IP address that we got with the ifconfig above. The description can be anything.

Now, if you go outside your network, you can put in your own home IP address with the :8081 on the end and connect to your webcam. If you don’t know your outside IP address go to a site like WhatisMyIP.com and it will tell you.

Again, this is all well and good, but your IP can change, and even if it doesn’t for a while, that number is hard to remember. So, as our last step, let’s make this more human-readable and dynamic. We’ll go get a free dynamic DNS account and use it to redirect traffic from a more user-friendly name. Keep in mind that while useful, this is still an option and you can still use the IP web address [Your Outside IP]:8081 to get to your webcam.

This is approximately what the Dynamic DNS redirect setup should look like.

This is approximately what the Dynamic DNS redirect setup should look like.

Go to a site like NoIP.com and sign up for a free account. Select that you want to Add a Host and then come up with a unique hostname and use one of the default domains; usually only a few are available for free. You should see your outside IP listed in the box.*

Set it to a port 80 redirect and that you want it to connect to port 8081. You can also mask the URL if you want, but I’ve found that rarely works. Add the host and you should be good to go. Now pointing any browser to your no-ip domain name (without the :8081 on the end) will pipe you from anywhere to your webcam server.

And that’s it, you can go to any computer that has internet access and see what’s going on wherever you set up your webcam.

*I chose NoIP because they have a Linux software package that will update the IP your redirect is associated with automatically. Eventually, your IP is going to rotate and it’s nice to have that piece of software watching that for you. See their page for instructions on how to install it.

-CJ Julius

Advertisements
h1

Setting Up a Raspberry Pi with Ubuntu

17/05/2013

I had been putting off posting about this project until I had gotten RaspBMC to work, as that was step two, but it looks like the problem I need to be resolved is going to be a little while coming. So, I’m going to come back later and put an update if I get it running correctly. Either way, the Raspbian (the Debian Wheezy Raspberry Pi distro) setup is pretty clear and the same for every model of Raspberry Pi.

Here is the hardware that I’m working with:

  • Raspberry Pi Model B
  • Logitech USB Wireless Mouse Keyboard combo
  • 4GB SDHC Class 10 Memory Card
  • Edimax USB wireless adaptor
  • 4GB USB stick (for extra storage)
  • Gearhead Passive USB hub
  • USB 1.0A power adapter and Micro USB cable
Raspberry Pi Model B with SD card and wireless adapter inserted.

Raspberry Pi Model B with SD card and wireless adapter inserted.

I did this all in Ubuntu 12.04, so my work will be related to that OS; though commands are pretty similar across many distributions. Also, I have an SD card slot in my laptop, which means I did not need an adaptor to access the card directly.

The first step is to get the image on the card. I snapped in the card, it mounted and I went to the disk utility to find out where it had put it (in the system). It was mounted at /dev/mmclbk0. Once I knew that, I was ready to go get the Raspbian OS.

You can get the latest image off of Raspberrypi.org’s downloads page. I’d recommend the straight Raspberry Pi Wheezy image, as the “soft float” one is slow, and the others are more for advanced users that want to do very specific things.

Raspberry Pi booting for the first time

Raspberry Pi booting for the first time

In any case, once I had it downloaded I checked the SHA1 sum, because we’d hate to have a corrupted image from the word go. If you’re unfamiliar with SHA1, then it’s simply a method of verifying file integrity. Quite basically, an algorithm generates a unique number for a file and then that number can be checked against a copy of a file to make sure that it’s in good condition. In terminal, and in the folder that I downloaded the file into you put the command:

sha1sum 2013-02-09-wheezy-raspbian.zip

And you’ll get an output that looks something like the string listed on the downloads page. In my case, I was looking for the following: b4375dc9d140e6e48e0406f96dead3601fac6c81

Then, I just opened the archive and drag/dropped the file into a folder I had created previously, and returned to terminal. We’re going to be using the dd command to copy the extracted image (input file) to the card (output file). We’ll set the byte size to 4M and need be superuser to do this. My command was:

sudo dd bs=4M if=2013-02-09-wheezy-raspbian.img of=/dev/mmcblk0

Raspberry Pi Wheezy default Desktop

Raspberry Pi Wheezy default Desktop

Once it was done, I unmounted my card and slapped it in my Raspberry Pi for boot. On first boot you’ll get a lot of options. I’m not going to go through them one by one, as it’s pretty clear what each one is. The two I want to point you to however, are the expand rootfs and the memory split.

Expand rootfs is necessary if you have, like me, a larger than 2GB SD card. This opens up the rest of your card to be used by the system, so you have more storage space for your OS.

The memory split is important because the Raspberry Pi has a unified memory structure, meaning that it has one unified “bank” of memory that it divides towards certain tasks. If you’re going to be doing processor-heavy tasks like number crunching or multiple cron jobs, then you might want to push this towards the system memory side. However, if you intend to be using a lot of the graphical features, then you might want to lean towards the GPU.

My Raspberry Pi as it I use it now.

My Raspberry Pi as it I use it now.

The system is installed and ready to go. If you hit a command-line on boot, use startx to start the X Windows system (the GUI), and that’s it. I spent a good few hours customizing it, changing the wallpaper and such, but also removing and adding some software from the system to make it more useful to me, but that’s the basic setup.

I’ll come back at a later date if I get RaspBMC working, but as of right now it forgets that I have a mouse and keyboard attached to it, and there isn’t a simple solution that works so far. Everything works in Raspbian, and I’ve got quite a few things that I want to do in that, including Python that I mentioned in a previous post.

-CJ Julius