I left the setup in the last post with a system that would email photos of the burgular off site and then an SMS message. This is a prety good solution but since nearly everybody has a phone capable of receiving picture messages it seamed like the next step is to not just email the photos off site, but to also send them as a picture message so they can be checked for false alarms even when I’m not at my computer.
I went back to searching the net for a package that would supply MMS capability using a cell phone attached to a computer, not a direct connection to a bulk messaging provider. There is project called Mbuni that is a fully functional MMS gateway and relaying service as run by the cell phone providers. Normally this would run on the providers network and or at a company providing paid for content via MMS. Hidden away in the CVS for the latest version there is a add on to one of the components which will allow the sending of MMS messages via a phone.
Kannel
In the last post I had discounted Kannel for sending SMS messages because of the complexity. But Mbuni prereqs it so it was time to have another look at the setup. Mbuni also request a specific level of Kannel (CVS 2008-07-28 download) so because I was planning on using some very new function in Mbuni I decided to build this Kannel version from source to make sure it all matched up.
tar -zxf kannel-snapshot.tar.gz cd kannel-snapshot ./configure make su -c "make install"
Kannel is made up of a number of separate programs that provide different bits of functionality
- bearerbox
- smsbox
- wapbox
In order to be able to send and receive SMS messages we are going to need the frist two on the list. Wapbox is only used if you want to provide a dial up WAPgateway.
Setting up Kannel is not hard, the docs are very good and can be found here and there is a copy of my config files as a guide in the resources section
Mbuni
There is some good documentation for setting up the full MMS gateway version of Mbuni, but because the cell phone plugin is stil only in the development stream there is only a small sample config file and the source code. I have tried to document what I have learned setting it up here.
Since this is a bleeding edge function you will need to build Mbuni from the src in cvs. There are instructions on how to do this on the web site here, but here is a short version
cvs -d:pserver:anonymous@mbuni.cvs.sourceforge.net:/cvsroot/mbuni login cvs -z3 -d:pserver:anonymous@mbuni.cvs.sourceforge.net:/cvsroot/mbuni co -P mbuni cd mbuni ./bootstrap ./configure make cd extras/mmsbox-mm1 make cd ../.. su -c "make install"
The change of directory to the extras/mmsbox-mm1 is to build the extra library needed to work with the phone. If you are running on a machine that has SELINUX enabled you will need to run the following command to allow the library to work
su -c "chcon -t texrel_shlib_t /usr/local/lib/libmmsbox_mm1.so"
Like Kannel, Mbuni is made up of a collection of applications
- mmsc
- mmsproxy
- mmsrelay
- mmsbox
To send MMS messages via a phone we only need mmsbox which is what is known as a VAS gateway. So we need to create a Mbuni config file, there is a sample file shipped with the src in the doc/examples directory. Here is my version modified to work with O2 UKs MMS service
group = core log-file = /var/log/kannel/mmsbox.log access-log = /var/log/kannel/mmsbox-access.log log-level = 0 group = mbuni storage-directory = /usr/local/var/spool/mbuni max-send-threads = 5 maximum-send-attempts = 50 default-message-expiry = 360000 queue-run-interval = 5 send-attempt-back-off = 300 sendmms-port = 10001 sendsms-url = http://localhost:13013/cgi-bin/sendsms sendsms-username = tester sendsms-password = foobar # Sample conf for MMSBox using a modem (MM1) group = mmsc id = modem type = custom custom-settings = "smsc-on=lynx -dump 'http://localhost:13000/start-smsc? password=bar&smsc=w880i'; smsc-off=lynx -dump 'http://localhost:13000/stop-smsc?password=bar&smsc=w880i'; gprs-on=/usr/bin/pon o2; gprs-pid=cat /var/run/ppp0.pid | head -1;port=13014; mmsc-url=http://mmsc.mms.o2.co.uk:8002;proxy=193.113.200.195:8080;msisdn=100" mmsc-library = /usr/local/lib/libmmsbox_mm1.so group = send-mms-user username = tester password = foobar faked-sender = 100
The interesting bits are the sendsms-url and the custom-settings lines. The sendsms-url points to the bearerbox/smsbox URL from setting up Kannel earlier which Mbuni uses to send the notification about the new mail.
The custom-settings line is a lot more complicated, it is basically a mini config file all of it’s own. The two entries that start with smsc-on and smsc-off are commands that the custom library built earlier uses to stop and start the sms gateway while the MMS message is sent. gprs-on is used to start a PPP session via the phone. This can be either gprs or 3G. The code implies that this command should not return until it’s killed at shutdown, but using /usr/bin/pon on Ubuntu seams to work.
The next few bits depend on which cell phone provider your using. The mmsc-url and proxy are the addresses for the machines on their network you need to use to
send MMS messages. I found the following page has a good list of the settings for UK provider http://www.filesaveas.com/mms.html
SMIL
So now we’ve got the set up working we need some content to send. MMS messages are defined using SMIL markup. The following is the simple SMIL file I am using to send a short video clip and text caption. The first half divides the display in half, with the video in the top half and the text in the lower. The second section contains the details of the links to where Mbuni can find the content to
fill those areas and how long to display them. This is a very simple example, much more complex messages can be assembled with
SMIL.
<smil> <head> <layout> <root-layout /> <region id="Image" top="0" left="0" height="50%" width="100%" fit="hidden" /> <region id="Text" top="50%" left="0" height="50%" width="100%" fit="hidden" /> </layout> </head> <body> <par dur="5000ms"> <video src="http://tiefighter.loc/cam1/intruder.3gp" region="Image"></ video> <text src="http://tiefighter.loc/cam1/message.txt" region="Text"></text> </par> </body> </smil>
ffmpeg
So far we have been just sending static images, next comes converting the avis created by Motion to mpeg4 in a 3gp container that should be playable on any MMS capable phones. The following ffmpeg command will convert the file to the right format.
ffmpeg -i 07-20090916100019.avi -s qcif -vcodec h263 -y intruder.3gp
Where “-i 07-20090916100019.avi” is the file created by motion, “-s qcif” tells ffmpeg to use an output file that is 176×144 and conforms to a standard that all phones should understand, “-vcodec h263” is the video codec to use. “-y intruder.3gp” tells ffmpeg to overwrite the file if it already exists.
Here is an example of the Motion output.
After transformation:
When viewed on a 2 inch screen the drop in quality is not noticeable and it is still possible to tell if it is somebody you know.
Actually sending the MMS
So now we have actually created the content for the MMS message we need to put it somewhere mbuni can find it. In this case I put the video and text files into the /cam1 directory being server up by http server. The URLs match the entries in the SMIL file created earlier.
Now we need to send the SMIL file to Mbuni along with the phone number to send it to. The following curl command will send the SMIL file and the rest of it.
curl --data "username=tester&password=foobar&to=07703xxxxxx&subject=Possible+Intruder&from=07543xxxxxx" --data-urlencode "smil@/var/www/html/cam1/intruder.smil" http://x-wing.loc:1000
In this case Mbuni is running on the a machine called x-wing and listening on port 10001 (as set with the sendmms-port in the config above). The frist half is the urlencoded version of the username, password, the senders and recipients numbers and the subject of the message. The second section, after the –data-urlencode loads the SMIL file and encodes it before sending it.
Putting it together
Now we need a to collect all of this up in a scrip to attach to the movie end action of motion. The following script first helps to prevent false alarms by ensuring that any video has at least 15 frames. Assuming that test is satisfied the orginal version of the video is emailed offsite for safe keeping, before converting the it to the 3gp format. It then adds the time and date to the message.txt before sending the SMIL to Mbuni.
#!/bin/sh FRAME_COUNT=`/home/hardillb/bin/frameCounter $1` if [ $FRAME_COUNT -gt 14 ]; then uuenview -a -m foobar@xxxxxx.xxx $1 <<EOF Subject: Movement detected video $2 $3 EOF /home/hardillb/bin/sendMessage SMS/Outbound "TO: +447703xxxxxx MESSAGE: possible intruder" ffmpeg -i $1 -s qcif -vcodec h263 -y /var/www/html/cam1/intruder.3gp echo "$2 $3" > /var/www/html/cam1/message.txt curl --data "username=tester&password=foobar&to=07703xxxxxx&subject=Possible+Intruder&from=07543xxxxxx" --data-urlencode "smil@/var/www/html/cam1/intruder.smil" http://x-wing.loc:10001 fi
The frameCounter was a script I had run up earlier for a different project, made sense to reuse it here.
#!/bin/sh mplayer -v $1 -nosound -vo null -frames 0 2> /dev/null | grep "frames t" | awk ' { print $3 } '
So that’s about it, I have a motion activated CCTV system that will log off site and send alerts to me anywhere in the world with enough detail to decided if it’s a false alarm
Resources
- Kannel – http://kannel.org/
- Mbuni – http://www.mbuni.org/
- Kannel Config – kannel.tgz
- ffmpeg – http://ffmpeg.org/
- SMIL – http://www.w3.org/TR/REC-smil/
Hello,
Thanks for the informative projects posted on you blog. I managed to cofigure mbuni so that when i excute the curl –data command it shows no error in the logs but i dont seem to receive the notification on the destined phone.
My question would be… im not using a modem but a short code SMPP connection from one of my local service providers, how should i configure the mmsc. This is part of the .conf that i have currently.
mmsc
——
group = mbuni
storage-directory = /var/spool/mbuni
max-send-threads = 5
maximum-send-attempts = 50
default-message-expiry = 360000
queue-run-interval = 5
send-attempt-back-off = 300
sendmms-port = 10001
group = mmsc
id = local
mmsc-url=http://mms.gprs.safaricom.com;proxy=172.022.002.038:8080;msisdn=3302″
incoming-username = user
incoming-password = pass
incoming-port = 12345
type = soap
group = send-mms-user
username = tester
password = foobar
faked-sender = 3302
im i forgeting anything.
Thanks in advance
Hi Jefkine,
I must admit I’ve not looked at this since I got it all working back at the start of the year and I was only interested in getting it to work with a modem.
If you’ve not found it yet there is a good mailing list linked to from the mbuni home page where I got a fair bit of help when I was working on this. The link to subscribe is here: http://lists.mbuni.org/mailman/listinfo/users
There will be somebody on the list who can help you.
Hello,
Im trying to get my modem to work with my linux susse 11.1 but im getting this error at the connect stage’
CONNECT
–> Carrier detected. Waiting for prompt.
–> Don’t know what to do! Starting pppd and hoping for the best.
–> Starting pppd at Fri Oct 15 00:25:49 2010
–> Pid of pppd: 30957
–> Disconnecting at Fri Oct 15 00:25:49 2010
–> The PPP daemon has died: pppd options error (exit code = 2)
–> man pppd explains pppd error codes in more detail.
–> I guess that’s it for now, exiting
–> The PPP daemon has died. (exit code = 2)
I just wanted to know was this a problem for u, could this be down to my linux version
My modem is Huwaei e160
Thanks
@jefkine
I’ve not seen that. Can you actually start the ppp connection by hand without mbuni?
Hi,
Can you note the type of modem you suse?
TIA
Sorry – “suse” = used 🙂 Also, did you use a special Linux version?
I’m currently using a Huawei E160 and no there is no “special Linux version”
Could you publish your ppp connecting script as I tried with wvdial without any luck. Would be much help.
/etc/ppp/peers
# This optionfile was generated by pppconfig 2.3.18.
#
#
#hide-password
noauth
connect “/usr/sbin/chat -v -f /etc/chatscripts/o2”
debug
/dev/ttyUSB0
115200
nodefaultroute
noipdefault
user “payandgo”
remotename payandgo
/etc/chatscripts/
# This chatfile was generated by pppconfig 2.3.18.
# Please do not delete any of the comments. Pppconfig needs them.
#
# ispauth PAP
# abortstring
ABORT BUSY ABORT ‘NO CARRIER’ ABORT VOICE ABORT ‘NO DIALTONE’ ABORT ‘NO DIAL TONE’ ABORT ‘NO ANSWER’ ABORT DELAYED
# modeminit
” ATZ
OK AT+CGDCONT=1,”IP”,”payandgo.o2.co.uk”
# ispnumber
OK-AT-OK “ATDT*99***1#”
# ispconnect
CONNECT dc
# prelogin
# ispname
# isppassword
# postlogin
# end of pppconfig stuff
I also have the following script which sets a fixed route to O2’s MMS proxy to ensure the traffic goes out over the PPP link
/etc/ppp/ip-up.local
#!/bin/sh
route add -host 193.113.200.195 dev ppp0
Hi Ben,
I am interested in replicating your project (https://www.hardill.me.uk/wordpress/2010/02/26/how-to-get-personal-cctv-mmsd-to-your-phone/) for personal use.
Just curious, which Linux version (distro and version) did you use for development?
Kind regards,
Roy
Motion ran on Fedora, probably v11 at the time, but motion will run just about anywhere. Mbuni was a pig to get to build, I think I needed to use a very old version of raspbian (wheezy iirc) to get it to work. I keep it firewalled off on my network since it doesn’t get security updates anymore
Thanks for your quick response. Actually, the genesis of this question was around getting Mbuni to build on my Centos 7. I am now building a new Centos 6.10 VM environment to test the setup. Just in case it doesn’t work, I’ll consider setting up another VM for Fedora to test it out.
Will reach out in case I get into more murky waters.
Cheers!
Hi Ben,
I am completely stuck at getting Mbuni to build and install.
I tried running the setup on Centos 7, openSUSE-Leap-42.3, Ubuntu 16, Ubuntu 18 with AutoMake v 1.8 (after having to add the m4_pattern_allow([^AC_]) line to the configure.ac file in Mbuni).
When I type “make install” I get the following output:
[root@localhost mbuni-1.5.0]# make install
Making install in autotools
make[1]: Entering directory `/home/roy/mbuni-1.5.0/autotools’
make[2]: Entering directory `/home/roy/mbuni-1.5.0/autotools’
make[2]: Nothing to be done for `install-exec-am’.
make[2]: Nothing to be done for `install-data-am’.
make[2]: Leaving directory `/home/roy/mbuni-1.5.0/autotools’
make[1]: Leaving directory `/home/roy/mbuni-1.5.0/autotools’
Making install in doc
make[1]: Entering directory `/home/roy/mbuni-1.5.0/doc’
Making install in examples
make[2]: Entering directory `/home/roy/mbuni-1.5.0/doc/examples’
make[3]: Entering directory `/home/roy/mbuni-1.5.0/doc/examples’
make[3]: Nothing to be done for `install-exec-am’.
make[3]: Nothing to be done for `install-data-am’.
make[3]: Leaving directory `/home/roy/mbuni-1.5.0/doc/examples’
make[2]: Leaving directory `/home/roy/mbuni-1.5.0/doc/examples’
Making install in images
make[2]: Entering directory `/home/roy/mbuni-1.5.0/doc/images’
make[3]: Entering directory `/home/roy/mbuni-1.5.0/doc/images’
make[3]: Nothing to be done for `install-exec-am’.
make[3]: Nothing to be done for `install-data-am’.
make[3]: Leaving directory `/home/roy/mbuni-1.5.0/doc/images’
make[2]: Leaving directory `/home/roy/mbuni-1.5.0/doc/images’
make[2]: Entering directory `/home/roy/mbuni-1.5.0/doc’
make[3]: Entering directory `/home/roy/mbuni-1.5.0/doc’
make[3]: Nothing to be done for `install-exec-am’.
make[3]: Nothing to be done for `install-data-am’.
make[3]: Leaving directory `/home/roy/mbuni-1.5.0/doc’
make[2]: Leaving directory `/home/roy/mbuni-1.5.0/doc’
make[1]: Leaving directory `/home/roy/mbuni-1.5.0/doc’
Making install in mmlib
make[1]: Entering directory `/home/roy/mbuni-1.5.0/mmlib’
rm -f libmms.a
make[1]: AR@: Command not found
make[1]: *** [libmms.a] Error 127
make[1]: Leaving directory `/home/roy/mbuni-1.5.0/mmlib’
make: *** [install-recursive] Error 1
[root@localhost mbuni-1.5.0]#
How can I go about to revolve these installation Errors?
Kind regards,
Roy
Not really, as I said earlier I have kept a version of Raspbian Wheezy around to run mbuni as I couldn’t get it to build on anything newer
Got a working solution Ben.
when running the ./configure command, simply run it as shown below and it works…
./configure –prefix=/usr/local/mbuni –with-kannel-dir=/usr/local/kannel –disable-shared
I have now successfully installed mbuni.
Hello,
Another “pre-historic” creature coming to this page for some possible help.
Ben – any chance you can tell which Raspbian image (date) you used?
I was kind of hoping to get it going on latest Buster but….have had some “challenges” even with the support of Roy and an avid Linux user friend of mine.
Some issues with getting Kannel – is the first halt. Installing the binary package available for Raspbian, does not give the /usr/-path, which means building mbuni also fails.
Any ideas/comments?
I never got it to build on anything newer than wheezy iirc
Hi,
Ok.
One more question – have you tried building mbuni, without also building kannel before (rather just install it from a binary packet like “apt-get”)?
Thanks again,
The old-school-guy.
No, I’ve always built the whole stack from source.
Hello,
Okidoki. Guess I have a bit of more exploring to do.
Cheers,
The Old-school-guy.
Hello Ben,
The pre-historic creature is back. 🙂
I believe I have managed to build mbuni 1.6.0 together with kannel 1.4.4 (did try kannel 1.4.5 but could not get past some issues with certificates) on 2021-03-04-raspios-buster-armhf-lite. Not sure if it actually will work, once built though. I have documented each step to do it. I’m not sure if you’re interested but, I would be happy to share with you once I have cleaned it up a bit. Just tell and we can find a way so you can get it. Sure, mbuni and kannel won’t be security patched, but, at least the rest of the OS on the device is updated. 🙂
Cheers,
The Old-school-guy.