Tag Archives: axis

Running Python on Axis devices

Axis’ platform for running applications on the camera itself is really great. For you who haven’t seen ACAP share I really suggest you click yourself over there to see what it’s all about.

As mentioned in other posts, Axis have created an embedded platform where you can install applications on the different devices to add features to the edge. This can be analytics that is looking for something unique like a people counter or advanced cross line-type detection. It can also be for simpler tasks like sending a message using a service platform similar to the pushbullet integration that I published here some time ago.

The only downside is that to develop these applications you have to know C which can be tough for the average script kiddie who just wants to perform something small. So, in order to solve some of the more simple scripting that you can be interested in doing. On ACAP Share there’s a PHP application that allows someone to write a PHP script that can be executed on a camera. This is a great application if you’re looking to use smaller APIs for your task.

PHP is extremely popular and allows you to do a number of great things. Python is another extremely popular language. Soo.. Enough said, below is the compiled ACAP and how to build it if you have the environment.

Build script:

buildpython

The python binary itself:

Python_2.7.1_1_0_mipsisa32r2el

Recommended FW: 5.80+. The reason is that the package is pretty big and will need some space. We’ve seen problems with 5.60 and 5.70 firmware that doesn’t allow the package to go through due to it’s size. After 5.80 it seems fine though. (Yes, python is a big library)

It’s build to run on the MIPS architecture, meaning it will work on ARTPEC-4 and ARTPEC-5 devices but that’s it. Python version is 2.7.1 with some limitation built to it (see buildpython.sh)

When you upload the binary there’s an attached python script in that folder. Edit that and make sure you run a continuous loop on it to perform whatever you want to achieve.

ACAP is actually so powerful that you can create your own applications that are essentially script that runs off another application. To start a python script from the command line, use:

LD_LIBRARY_PATH=/usr/local/packages/python_2_7_1/lib /usr/local/packages/python_2_7_1/bin/python /path/to/script.py

This can be called from system(); as well in your C application.

Hopefully this can save some time for people who’re interested in developing in python on Axis devices.

/Marcus

Axis PTZ and Swiping

I got a funny request today on how to control Axis PTZ on a webpage that was running on a tablet. And by controlling the PTZ i mean by the gestures that are supported in many different tablets and smartphones. The Swipe!

It’s fairly easy to control the Axis PTZ devices since they all have a unified API. From Axis website: http://www.axis.com/files/manuals/vapix_ptz_52933_en_1307.pdf

 

I’m also a big fan of jQuery have used that a lot while I’m doing anything related to web development. It’s so easy to use and has a ton of plugins. A quick search on google today gave me TouchSwipe, a jQuery plugin for tablets. Awesome, this shouldn’t be any issue to hack together.

Requirements

  1. The webpage / webapp does not run directly on the camera so both MJPEG streaming and PTZ controlling must be done from within the app.
  2. It cannot run on any plugins but what Javascript and HTML5 allows.

Alright, lets start looking into the streaming part. Streaming MJPEG is super easy with the Axis devices on a web page all that is needed is:

<img src="http://username:password@axis-device/axis-cgi/mjpeg/video.cgi?resolution=640x480" alt="" />

Note: This will not work on IE, but who cares? We want this on tablets.

The next part is a little trickier. Nothing else but HTML and Javascript. Since the app is not running on the same webpage Cross domain scripting is not allowed. So how do we translate our swipe movement into a HTTP command that can be sent to the Axis device? The answer is an ugly but lovely hack called the <iframe>. Iframes can load whatever content you like from whatever source  you like. Without even asking why.  Why is this so good? Because the PTZ api is all HTTP GET. Boom! Easy enough.

Ok, we have all our pieces for our solution. MJPEG will work with our browser, SwipeTouch will trigger when a user Swipes and the PTZ can be controlled from an iframe.

SwipeTouch is super easy to implement, just take a look at this piece

 $("html").swipe( {
 //Generic swipe handler for all directions
 swipe:function(event, direction, distance, duration, fingerCount, fingerData) {
 
 alert('Swiped '+direction)
 },
 //Default is 75px, set to 0 for demo so any distance triggers swipe
 threshold:75
 });
 });

So, here we are listening on swipe events on all of the webpage, we could do it on the image tag as well if we wanted but lets keep it on the HTML for now. When the swipe event is triggered we get the direction, distance, finger count and finger data. The direction is particulary interesting, it comes in up,down,left,right. It’s super convenient since the PTZ API also allows commands like ?move=[left,right,up,down].

This means that we can translate this super easy, have a look:

$('#swipeFrame').attr('src', 'http://root:pass@[ip]/axis-cgi/com/ptz.cgi?move='+direction);

Put that between in the swipe event and create an iframe what has the id swipeFrame and you’ll have Axis PTZ control that moves 25% of its field of view on each swipe. It’s not enterprice vms integration but certainly good enough for some basic checks from your Tablet!

This blog post requires some basic HTML knowledge to understand what’s going on as I didnt tell how to include the JS files or how to set up the actual html frame. If I was too messy in my write up, have a look at the source code 🙂

Enkelt övervakningssystem och linux

För längesen satt jag och labbade lite grann med AXIS Nätverkskameror och hur man kan spela in automatiskt med dem.

Jag försökte använda mig av bash och andra linux/gnu-kommando som jag bara kunde för att få systemet uppe och rulla.

Hur fungerar det?
Lösningen är väldigt enkel. Som första program ligger där ett script som väntar på ett tcp-meddelande som kommer in på port 31337 (nördigt va) och som därefter startar en nedladdning av en motion jpeg-ström som hålls vid liv i 5 sekunder per trigger som kommer från kameran. Det vill säga, får man samma larm under en pågående nedladdning av strömmen så läggs fem nya sekunder på innan man stänger strömmen.

Hur ställer jag in det?
Event Server SetupEvent setupBörja med att gå in i din kamera och skapa ett Motion Detection fönster. Därefter går du in till Event Servers och skapar din TCP-server med dina anslutningsinställningar. Glöm inte att porten skall vara 31337. När servern har satts upp, skapar du ett event som triggar på det motion detection-fönster som du skapat. Lägger till att det skall gå till tcp-servern du skapat och att det ska trigga ungefär 30 gånger per minut som eventet är igång. Detta gör att så länge något rör sig så hålls strömmen vid liv.

Som du säkert ser så är meddelandet en MAC-adress som är specific för varje enhet. Du måste givetvis inte döpa dina filer efter MAC-adressen men jag gjorde det för enkelhetens skull. Se bara till att du inte använder mellanrum i namnet.

Nästa steg är att installera filerna som är skapade på en lämplig plats. Låt säga att vi skapar det under en egen användare som vi döper till “security”. Vi lägger filerna i hemmappen, packar upp och skapar mappar.
/home/security:$ tar xvf supersimpleNVR.tar.gz
/home/security:$ cd supersimpleNVR/
/home/security:$ mkdir settings && mkdir captures && mkdir captures/tmp && captures/processed_captures && tmp

Det du ska göra nu är att gå in i settings mappen och skapa en fil som heter precis det meddelandet som du angett i ditt event i kameran och med filändelsen .sh. I mitt fall blir det 00408C630000.sh

I denna skall innehålla:

  1. #!/bin/sh
  2. user=root
  3. pass=pass
  4. fps=5
  5. ip=192.168.1.15
  6. port=80

Ändra allting så att det passar med dina inställningar och behov. Glöm inte att filen måste finnas i mappen som heter settings.

Mappen captures innehåller alla dina inspelningar och mappen captures/tmp används för att extrahera bilddata i sparade strömmar.

Vad ska jag med mappen captures/tmp till?
Mjpg kan ställa till det när det gäller lagring. Därför finns scriptet “creatempeg” som skapar mpeg4-filer av nedladdningarna. Detta script använder ett C#-program som klipper ur bilderna ur strömmen och skapar jpg-filer utav dem.

Vanliga tmp då?
Den gör inget speciellt mer än sparar tidsstämplar för att veta när en ström startades.

Vad behöver jag för program?
Du behöver bara standardprogram för att kunna spela in.

Du behöver:

  1. Netcat
  2. Curl
  3. Mono
  4. mencoder

Begränsningar för närvarande!
För närvarande kommer filmer som konverteras till mpeg4 alltid gå skapa filer med 5fps, oavsett vad du laddat ner i. Fixa detta själv genom att sätta den fps du önskar.

Hur startar jag det?
Du startar det lättast genom att starta filen nc med screen:
/home/security/reallysimpleNVR/:$ screen sh nc
/home/security/reallysimpleNVR/:$ [ CTRL + A + D ]

Ladda ner källkoden här: reallysimpleNVR.tar

Har inte testat det på länge, och det kan hända att den måste modifieras något. Speciellt c#-koden. Använd på egen risk 🙂

Ha en bra kväll
/marcus

Linux i rymden

Hittade nyss en intressant länk på “Universe today” där man visar nästa generation “lunar rovers”.

Än mer spännande så ser jag att man satt på nätverksbaserade kameror på bland annat dräkterna. Och inte vilka kameror som helst!

På bilderna kan man se AXIS 207MW samt AXIS 211A/210A.

210A/211A sitter uppe på Lunar rovern och 207MW sitter till höger om hjälmen.

Det som gör det här intressant är att alla AXIS kameror kör linux, därmed linux i rymden! Häftigt!

Känner du till några rymdprojekt där man använder linux som OS? Berätta gärna genom att kommentera!