From 819a40ca9cf86ae9f579bee5beb3310b8a008799 Mon Sep 17 00:00:00 2001 From: bagyenda <> Date: Fri, 1 Apr 2005 08:51:26 +0000 Subject: [PATCH] Added documentation to CVS. --- mbuni/doc/images/empty.gif | Bin 0 -> 43 bytes mbuni/doc/images/logo.jpg | Bin 0 -> 1642 bytes mbuni/doc/images/mmsgw.png | Bin 0 -> 31991 bytes mbuni/doc/userguide.shtml | 1627 ++++++++++++++++++++++++++++++++++++ 4 files changed, 1627 insertions(+) create mode 100644 mbuni/doc/images/empty.gif create mode 100644 mbuni/doc/images/logo.jpg create mode 100644 mbuni/doc/images/mmsgw.png create mode 100644 mbuni/doc/userguide.shtml diff --git a/mbuni/doc/images/empty.gif b/mbuni/doc/images/empty.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/mbuni/doc/images/logo.jpg b/mbuni/doc/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1cdf83cba254b560004cdf1aaee2e2cae43913f GIT binary patch literal 1642 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 literal 0 HcmV?d00001 diff --git a/mbuni/doc/userguide.shtml b/mbuni/doc/userguide.shtml new file mode 100644 index 0000000..ed5405f --- /dev/null +++ b/mbuni/doc/userguide.shtml @@ -0,0 +1,1627 @@ + + + + + +Mbuni: Open Source MMS Gateway - User documentation + + + + + + + + + + + +

Mbuni: Open Source MMS Gateway

+ + + +

User Guide

+ +This document describes the installation and usage of the MMS Gateway. + +

Table of Contents

+ + + + + +
+ +

Chapter 1: Introduction

+ +

+ This chapter provides an overview of MMS +(short for Multimedia Messaging Service) and the Mbuni MMS Gateway. +

+ +

MMS offers mobile +users enhanced messaging capabilities like the ability to send pictures and +sound from a cell phone. It is generally considered the natural successor to +the very popular SMS service.

+ +

MMS usage has +continued to grow since introduction, and it is expected that projects +such as Mbuni should further boost the adoption of MMS and its +explosion. +

+

+The Mbuni Project attempts to provide that +little bit of boost to MMS adoption/growth, by providing a crucial part of the +MMS infrastructure in the form of a fully-fledged Open Source MMS Gateway (more +commonly called a MMS Centre).

+ +

Mbuni aims to +support all the major MMS interfaces, including phone-to-phone (so-called MM1 +interface), phone-to-email (MM3), inter-MMSC (MM4) and MMS VAS (MM7). The +initial release fully supports the MM1 and MM3 interfaces, and provides +rudimentary support for the MM4 interface. This version also supports +network-side MMBox storage and transactions as specified in the OMA +MMS v1.2 specification.

+ +

Mbuni is +inspired, in part by the Kannel project, and utilises Kannel's GWLIB and WAP +libraries. Kannel provides +well-designed, simple interfaces for management of octet strings, lists, +threads, servers, etc, and a certified WAP implementation. This made +it a natural choice for Mbuni, rather than re-inventing the wheel.

+ +

Overview of MMS

+ +

The Multimedia +Messaging Service (MMS), is intended to provide a rich set of content to +subscribers (pictures, audio, games, etc). It supports both sending +and receiving of rich content by +properly enabled client devices. MMS is a non-real-time delivery service, much +like SMS or email. The service utilises a store-and-forward usage model.

+ + +

MMS is designed to be transported +largely over IP rather than traditional GSM (SS7) networks. It is also designed +to interoperate with other IP services such as email and WAP. In fact, MMS +messages are typically transported over WAP, and are encoded using WAP MIME +formats.

+ + +

The MMS Gateway acts as the +message-switching device in the MMS architecture. The general architecture is +shown below.

+ +
+ +
+

The elements +shown in the figure can be summarised as follows:

+ +
    +
  • MMS +Client: A device through +which the user receives or sends multimedia messages. This might be a phone or +a PC-based MMS client. The Client sends messages to and receives messages from +the Gateway using WAP/HTTP as transport. +
  • MMS +Gateway: Switches +messages between different MMS clients and between MMS and Email. The Gateway +may also interface with other gateways to exchange messages destined for +foreign networks. +
  • MMS +Server: This component +typically providers persistent storage of messages on the network. Typically +users can access stored messages via a web interface. +
  • Other MMS +Systems:Other systems, +such as Third Party MMS systems (e.g. MMS VAS providers) can interface to the +Gateway to receive and send MMS content. The Interface used is termed +MM7. +
  • SMSC: The MMS Gateway utilises WAP Push to send +notifications to MMS Clients. These are typically sent using SMS as the bearer +service, hence the need for a link to a Short Message Service Centre. +
+ + +

Typically, the +message cycle begins with a user sending a multimedia message (MM) via the MMS +client. The client must be configured for MMS, which includes bearer settings +(i.e. GPRS or GSM/CSD settings), WAP gateway address and MMS Gateway address (a +URL).

+ + +

An MM is typically a multi-part message +with pictures, sound, text and other media. Each part of the message is +identified by media (MIME) type, name and/or Content ID. When submitting a +message, the MMS client indicates the intended recipient list, but usually not +the sender address, which the MMS Gateway retrieves from the WAP +gateway. Like Email, a single MMS can specify +multiple recipients (MSISDNs and Email addresses), and it is up to the Gateway +to ensure correct delivery to each of the recipients.

+ + +

When the gateway +receives a message destined for an email address, it typically re-codes the +message as standard MIME and passes it on to an SMTP server for delivery. Email +messages received are similarly re-coded as MMS and forwarded to the relevant +MMS Client.

+ +

When the gateway receives a message +destined to MMS Clients in the area served by the gateway, the message is +stored and an MMS notification sent to the recipient via WAP Push. On receipt +of the notification, the client typically fetches the message via a URL +provided in the notification.

+ + + +

When a recipient requests an incoming MM +from the server, it indicates to the server its capabilities for a User Agent +Profile URL. The profile data includes such things as supported media types, +screen size, supported character sets, etc. Typically, the gateway will re-code +the MM to suit the client's capabilities before returning the message. Messages +destined to email may also be re-coded to make them more suitable for email +readers.

+ +

 

+ +

The gateway may also interface with a +subscriber database, which controls message delivery and billing. The +subscriber database will provide such information as which subscribers are +provisioned for MMS, tariffs, etc.

+ + + +

Features

+ + +

Mbuni MMS gateway is a modular software system, designed to +be full-featured, efficient and simple, supporting current generation two-way +multimedia messaging. Feature highlights include:

+ +
    +
  • Phone-to-phone messaging + +
  • Automatic content adaptation: The server modifies message +content depending on the capabilities of the receiving terminal + +
  • Integrated Email-to-MMS and MMS-to-Email gateway + +
  • Support for persistent storage of messages for subscribers (MMbox). + +
  • Inter-MMSC message exchange (MM4 interface) + +
  • Support for integration with subscriber database to enable smart handling of handsets that do not support MMS, handsets not provisioned, etc. + +
  • Support for flexible billing structure through billing/CDR plug-in architecture + +
  • Bearer (data) technology neutral: Works with GSM/CSD or GPRS. + +
+ + +

+Currently there is no support for VAS via MM7 protocols (SOAP or +EIAF), but this is planned and should be available soon. +
+The Gateway is designed and tested to conform to Open Mobile Alliance +(OMA), WAP and 3rd Generation Partnership Project (3GPP) MMS standards +including: + +

    +
  • WAP: 209 +
  • OMA: MMS v1.1, UAProf v1.1 +
  • 3GPP: TS 23.140 +
+ +

+ +

Requirements

+ +

+Mbuni is being developed on MacOS X and Linux systems using the C programming language. It should compile and run on any similar system. +

+ +

+Mbuni utilises some libraries that are part of the Kannel source, + specifically GWLIB and WAP libraries. In order to install Mbuni you + will need to install (a patched) Kannel (and therefore fulfil those + dependencies Mbuni shares with it). +

+ + The following additional components are required: +
    +
  • Libiconv v2.0 or higher is required for character set conversions +
  • Audio conversion tools required by the content adaptation module: + +
  • Image conversion tools required by the content adaptation +module: + +
  • Mail server such as Postfix (www.postfix.org) +
  • You will also need to be running a WAP gateway (we recommend Kannel). +
  • You may optionally need to run an HTTP proxy such as Squid +(squid-cache.org), since some +newer phones (e.g. Nokia 6600) do +not send MMS over WAP but directly over HTTP via an HTTP Proxy. +
+ +Hardware requirements will depend on amount of traffic, required +response times, etc. Keep in mind however that the gateway performs a +lot of heavy media re-coding tasks, particularly during content +adaptation, so you should always err on the side of more rather than +less power. + + +

Chapter 2: Installing The Gateway

+ +

This section +explains the steps required to install the gateway. Currently only installation +from source is provided (binary option coming soon).

+ +

+In brief, to install Mbuni, you need to: +

    +
  • Download and install required packages (such as libXML, libiconv) +
  • Download, patch and install Kannel v1.4.0 +
  • Download and install Mbuni +
  • Download, patch and install the AMR encoder/decoder +
  • Download and install additional requried packages +
+

+ +

The source code +for Mbuni is available for download from the download area of the website +

+ + + +

Patching and Installing Kannel

+ +

In order to compile the software, you +will first need to download, patch, compile and install Kannel v1.4.0 from kannel.org:

+ + + +

Unpack the kannel +source files using a command like:

+ +

bzip2 -cd +gateway-1.4.0.tar.bz2 | tar xf -

+ + +

The kannel +sources need to be patched for Mbuni using one of the supplied patch files from +the Mbuni downloads section given above. You can use either one of the patch +files:

+ +
    +
  • mbuni-kannel-patch-minimal has minimal patches to Kannel + for: +
      +
    • Support of configuration directives + required by the MMS Gateway in the configuration file format used by + kannel. This is patch to gwlib +
    • Makefile patch so that WAP library + and header files are installed as part of Kannel installation
    • +
    +
  • mbuni-kannel-patch-full has all the patches above and + patches to Kannel itself to enable it support sending of Over-The-Air + settings using OMA + Client Provisioning (v1.1) specifications. The + changes have been tested but may of course contain a bug or + two. Since newer phones only support sending of MMS OTA settings + using OMA format, we thought this would be a useful addition.
  • +
+ + +

Which patch you +choose is a matter of taste. Apply the patch like this

+ + +

cd gateway-1.4.0 +
+patch -p1 < ../mbuni-kannel-patch-full + +

+ +

Then proceed to +compile and install Kannel normally:

+ +

+ +./configure +
+make install +

+ +

Installing Mbuni MMS Gateway

+ + +

Download and +unzip/tar Mbuni sources in a directory of your choice:

+ + +tar xzf mbuni-version.tgz + + +

Where version is the verion of Mbuni (e.g. 0.9.8). Compile and +install mbuni as follows:

+ +

cd +mbuni-version
+ + +./configure
+make insall +

+ +

If you installed +Kannel in a non-standard location, you will need to supply the location to configure using --with-kannel=kannel_directory

+ +
Installing from CVS
+

If you want to try out the development version of Mbuni, you can + download it from the CVS on sourceforge.net:

+ +cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mbuni login
+ + followed by
+ + cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mbuni co -P mbuni
+ + you can then cd mbuni and use the ./configure and + make install as above. + + +

Mbuni consists of +4 programs: +

    +
  • mmsc/mmsglobalsender +
  • mmsc/mmsmobilesender +
  • mmsc/mmsproxy +
  • mmsc/mmsfromemail +
+which are by +default installed in /usr/local/bin +

+ +

mmsglobalsender is the main relay server. It routes +incoming messages to email, other MMS gateways, MMS clients/handsets, +etc. mmsmobilesender manages routing messages to MMS clients +using WAP Push, sending of delivery reports, etc. mmsproxy +provides the HTTP interface via which messages are +sent and received by MMS clients. mmsfromemail Is +the email2MMS gateway module. All programs must be configured, and the first +three running for the gateway to function smoothly.

+ + +

Installing Required Components

+ +

Be sure to install all other required +components as detailed above, otherwise parts of the MMS gateway may not +function correctly.

+ + + +

Mbuni expects that an AMR decoder is installed and can be invoked +as:
+amrdecoder infile outfile +
+ +to decode an AMR +file to header-less (raw), 16-bit signed, mono, 8kHz audio samples in +the output file. (Input and output files may be '-' for standard input +or output respectively.)

+ +

Similarly, it is expected that an AMR encoder +called amrencoder exists and can be executed as follows: +
+amrencoder mode infile outfile +
and convert raw, 16-bit signed, 8kHz + mono audio samples in the input file to AMR using the supplied + encoding mode. + +
+
+For the AMR encoder/decoder, we have adapted the sample provided on the 3GPP +website. Follow the instructions below to install it:
+ +

    +
  • Download the AMR encoder/decoder source from here + +
  • unzip/unpack the zip file, and unpack the source within:
    + +unzip 26104-520.zip
    + +mkdir amr
    + +cd amr
    +unzip ../26104-520_ANSI_C_source_code.zip
    + +
  • Download the AMR code patch from the mbuni.org download section and apply as follows:
    + +patch -p1 < ../mbuni-amr-patch +
  • You should then compile and install the AMR encoder/decoder as follows:
    + + make -f makefile.gcc
    +cp -f amrdecoder amrencoder /usr/local/bin +
+This AMR encoder +is not very efficient but it works (which is important!)

+ +

Chapter 3: Running the Gateway

+ +

To run the gateway, you must run the +three programs listed above (mmsglobalsender, +mmsmobilsender, mmsproxy). mmsfromemail +should be called from your MTA (SMTP Mailer) to convert +and deliver an MMS from an email sender. The order in which they are started +is unimportant. They expect the configuration file to be passed as the last +argument on the command line (default is mmsc.conf). The +configuration file controls most aspects of +the operation of the gateway.

+ +

Configuration File

+ +

The configuration file format is the same as that used +by Kannel. The configuration file consists of groups of configuration +variables. Groups are separated by empty lines, each variable is defined on its +own line. Each group begins with the group name. Comments are lines that begin +with a hash (#) and are ignored. +

+A +variable definition line has the name of the variable, an equals sign (=) and +the value of the variable. The name of the variable can contain any characters +except white space and equals. The value of the variable is a string, with or +without quotation marks (") around it. Quotation marks are needed if the value +begins or ends with white space or contains special characters. Normal C escape +character syntax works inside quotation marks.

+ +

The variable group marks the +beginning of a new group with the given name.

+ +

The core group is +core and defines the log file location, log level (amount of debugging +information – the lower the number the more debugging +information) and the location of the access log. + +
+
+ + +group = +core
+log-file += log/mmsgw.log
+log-level += 0 +
+access-log = log/access.log
+
+

+

+This should be +followed by the main MMS gateway configuration group (mmsbox). +
+
+ + +group = +mmsbox
+ +name = +"My MMSC"
+ +hostname += ds.co.ug
+ +host-alias += mmsc
+ +local-mmsc-domains= +mbuni.org,service.com
+ +local-prefixes += 075;+25675;25675
+ +send-queue-directory += spool/global
+ +mm1-queue-directory += spool/mm1
+ +mm4-queue-directory += spool/mm4
+ +max-send-threads += 5
+ +send-mail-prog += /usr/sbin/sendmail -f '%f' '%t'
+ + ...
+
+

+

The table below +lists all the configuration directives

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Variable + Name +     + Type +     + Description +    
group +     + mmsbox +     + Mandatory + variable +    
name +     + string +     + User-friendly + name for the Gateway, used in notices, etc +    
hostname + +     + string +     + Local hostname. + This is added as a qualifier to the sender address when MMS is forwarded to + Email or to a foreign MMSC via SMTP. Defaults to localhost +    
host-alias + +     + string +     + Short form of + hostname. This is used in generating message IDs. It is also used to + generate the message retrieval URL (sent as part of the MMS + notification): For instance if you have this as mmsc then + the retrieval URL will have the form + http://mmsc/msgtoken (no port is added). Be sure to + keep this value short as some handsets do not like long URLs in MMS + notifications. If you do not supply a host alias, the gateway will create a long form URL (http://hostname:port/msgtoken) when it sends notifications +    
+ local-mmsc-domains + +     + List of + Internet domains (comma separated) +     + A list of + internet domains that should be considered local to this MMS gateway. Email + or MMS messages received destined to these domains should be treated as local +    
local-prefixes +     + Number + prefix list +     + Number prefixes + that should be considered local. Messages to numbers that match these + prefixes will be delivered locally (via mmsmobilesender) +    
+ send-queue-directory + +     + Directory name + (string) +     + Global Queue directory: + Used by mmsglobalsender to store out-going messages. + All messages will be stored here until they can be delivered +    
+ mm1-queue-directory + +     + Directory name + (string) +     + Queue directory + for messages destined to (local) MMS clients. Used by mmsmobilesender +    
+ mm4-queue-directory + +     + Directory name + (string) +     + Queue directory + for messages destined to or coming from foreign MMS + gateways. mmsglobalsenderfromemail manages this queue +    
+ mmbox-root-directory + +     + Directory name + (string) +     + Directory where all user/subscriber MMboxes will be stored. This + directory will contain a set of sub-directories under which user + MMboxes will be stored. Each user MMbox has a maildir-like structure    
+ max-send-threads +     + Number +     + How many queue + processing threads to start. A higher value means messages get delivered + faster. +    
+ send-mail-prog +     + String +     + Command to use for sending email messages + (MMS-to-email or to foreign MMS gateways via SMTP). This command can include variables: %f + – replaced with the message from address, %t – replaced with the + recipient address (RFC 822 compliant), %s – the message subject, %m + – the message ID +    
+ unified-prefix + +     + Number list +     + A string to + unify received phone numbers, so that routing works correctly. Format is that + first comes the unified prefix, + then all prefixes which are replaced by the unified prefix, separated with + comma (','). For example "+256,000256,0;+,000" should + ensure correct UG prefixes. If + there are several unified prefixes, separate their rules with semicolon (';') +    
+ maximum-send-attempts + +     + integer +     + Maximum number + of attempts gateway must make to deliver message before giving up (e.g. + mobile phone is off, email domain is unavailable) +    
+ default-message-expiry + +     + Integer +     + Default number + of seconds in which message expires and is purged from queue (if not yet + delivered). This figure is overridden by whatever is in the message. +    
+ queue-run-interval + +     + Real +     + How many + seconds between each queue run +    
+ send-attempt-back-off + +     + Integer +     + mmsmobilesender uses a form of exponential back-off + when sending notifications to phones. This figure provides the starting + back-off value (in seconds). +    
+ sendsms-url +     + String +     + URL of the + service through which SMS can be sent to a mobile subscriber (e.g. for WAP + Push). It is expected that this url expects/supports Kannel-style send-sms + parameters (udh, from, to, text, etc.) +    
+ sendsms-username + +     + String +     + Username to + pass (for authentication) to send-sms URL +    
+ sendsms-password +     + String +     + Password to + pass (for authentication) to send-sms URL +    
+ sendsms-global-sender +     + String +     + Optional sender + (to field) to use in send sms url +    
+ mms-port + +     + Integer +     + Port on which mmsproxy listens for MMS messages from MMS + clients (Default + is 8191). +    
+ allow-ip +     + List of IP + addresses +     + List of IP + addresses of hosts allowed to use/access the MMS Port (above). You can use + this for instance to insist that only connections coming via a known/trusted + WAP gateway are serviced. Leave out to allow all machines to connect. +    
+ mms-client-msisdn-header +     + String +     + Name of HTTP + Header sent/inserted by WAP gateway as part of MMS request to indicate MSISDN + of sender. Note that typically the MMS client does not indicate its MSISDN in + the MMS message, it is up to the gateway to discover this and insert it. We + rely on the WAP gateway to provide the MSISDN as an HTTP request header + (default header name is X-WAP-Network-Client-MSISDN) +    
+ mms-client-ip-header +     + String +     + Name of HTTP + Header sent/inserted by WAP gateway as part of MMS request to + indicate IP Address + of sender. Similar to the above, if the MSISDN is not set, then we + assume that the client is identified by IP address, which we extract + from the request headers (using this header). Default header name + is X-WAP-Network-Client-Address. If the header is not + found, we assume the IP address as seen by Mbuni's MM1 interface. +    
+ allow-ip-type +     + Boolean +     + Set this to false to prevent Mbuni accepting and processing messages from + senders identified by IP address (i.e. not by MSISDN). Default: True. +    
+ optimize-notification-size +     + Boolean +     + Set this to true make Mbuni attempt to squeeze MMS notifications + in one WAP Push SMS, by leaving out subject and sender + fields. Default: false +    
+ email2mms-relay-prefixes +     + Number list +     + When MMS is received + via SMTP, the gateway needs to determine whether it is for a local or a + foreign recipient. To determine if the recipient is local recipient, we use + the local-prefixes setting. If the recipient is not local, + the message should be forwarded on to the relevant foreign MMS gateway, only + if the recipient number matches one of the prefixes in this comma-separated + list. +    
+ ua-profile-cache-directory + +     + Directory name + (string) +     + User Agent + Profile Cache: When an MMS client requests (via HTTP GET command) a message + about which it has been notified, it sends its profile URL (such as + http://nds.nokia.com/uaprof/N3650r100.xml + for the Nokia 3650) as part + of the HTTP request headers. The gateway should fetch the URL presented and + parse it to figure out the client's capabilities (so-called User Agent + Profile). It would be inefficient to fetch the profile data each time from + an external server, therefore the gateway caches fetched profile data in the + directory specified here. Cache entries are never expired (which is unlikely + to be a problem). Some badly behaved MMS clients to do not submit a profile + URL. In this case, the gateway relies on the HTTP + Accept request headers to determine its + capabilities. +    
+ billing-library +     + String +     + Optional + library containing billing and CDR functions. This library is loaded at + runtime and should contain functions to be called to effect billing and CDR + generation. See mms_billing.h for details. +    
+ billing-module-parameters +     + String +     + Parameters to + pass to the billing module specified above when it is loaded. This is a + generic string whose interpretation is entirely up to the module. +    
+ resolver-library +     + String +     + Optional + library containing functions for resolving recipient MSISDN to hostname + of Proxy-Relay that should handle the message. Supplying this libary + over-rides the local-prefixes setting given above. If the + Proxy-Relay hostname returned by the module is the hostname of the + local MMSC, then the recipient is considered local. See + mms_resolve.h for details. +    
+ resolver-module-parameters +     + String +     + Parameters to + pass to the Resolver module specified above when it is loaded. This is a + generic string whose interpretation is entirely up to the module. +    
+ detokenizer-library +     + String +     + Optional + library containing functions for finding MSISDN from request URL + sent by client. The last part of URL is treated as a string that is + interpreted by the library and transformed into an MSISDN. This libary + is only a fall-back in case the default sender address resolution + fails. See + mms_detokenize.h for details. +    
+ detokenizer-module-parameters +     + String +     + Parameters to + pass to the De-tokenizer module specified above when it is loaded. This is a + generic string whose interpretation is entirely up to the module. +    
+ prov-server-notify-script +     + String +     + Subscriber + database interface script 1: This script will be called by the gateway to + notify the subscriber database of per-subscriber events such as when a + subscriber sends a message, successfully fetches a message, etc. This script + is called with 2-3 arguments. Argument 1 is one of fetched, sent, + failedfetch; argument 2 is the subscriber MSISDN; argument 3, in case of a + failed fetch provides a description of the error (e.g. message expired). +    
+ prov-server-sub-status-script +     + string +     + Subscriber + database interface script 2: This script is called + by mmsmobilesender to determine whether the recipient's + device supports MMS. The script should exit with a value of 0 to indicate + that the device does not support receipt of MMS notifications; 1 to indicate + that the device supports MMS; -1 if the subscriber is not known or not + provisioned for MMS. The return value determines how + mmsmobilesender will deliver the message (see below). +    
+ notify-unprovisioned +     + Boolean +     + Whether + subscribers who are not provisioned for MMS should receive any notifications + (e.g. SMS) when an MMS message is received for them. +    
+ mms-notify-text +     + String +     + Message to send + to device that does not support MMS, when a message is received for the user. + This message is sent as plain SMS via the Send SMS URL specified above. +    
+ mms-notify-unprovisioned-text +     + String +     + Message to send + to devices that are not provisioned for MMS (only if + notify-unprovisioned is true). +    
+ mms-message-too-large-txt +     + String +     + If a device + tries to fetch a message, which during content adaptation is determined to be + too large for the target device (based on capabilities data supplied by the + device), the message is discarded, this text is sent to the device instead as + part of an MMS message. +    
+ mms-to-email-html +     + string +     + When an MM is + destined for email, we must format it to make it more suitable for email + readers. (For instance, the SMIL part of the MM will make no sense to most email + readers.) The gateway formats + the message as follows: It generates a multi-part MIME message with the main + part being an HTML entity in which MM parts are embedded. The text given here + is tagged at the bottom of the HTML. +    
+ mms-to-email-txt +     + String +     + This string is + placed in the MMS converted to email as an alternative to the HTML part, for + email clients that do not support HTML. +    
+
+ +

Foreign MMS +Gateways are configured using one or more mmsproxy groups:

+ +
+ +group = +mmsproxy
+ +name = +"A test mms proxy"
+ +host = +test.com
+ +allowed-prefix += "075"
+ +denied-prefix += "077"
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Variable + + Type + + Description +
+ group + + + String + + Mandatory: + mmsproxy +
+ name + + String + + User friendly + name +
+ host + + String + + Fully qualified + domain name +
+ allowed-prefix + + Number list + + List of + recipient number prefixes that can be delivered via this Proxy +
+ denied-prefix + + Number list + + List of + recipient number prefixes that cannot be delivered via this proxy +
+ +

+When an MM destined to an MSISDN cannot be delivered locally, the +gateway searches the list of Proxies to see if one of them can handle +the message. If one is found, the message is formatted as MIME and +sent via SMTP to the proxy. +

+ +

Chapter 4: Gateway Architecture

+ +

+ In this section we provide an overview of the gateway architecture. + +
+
+As indicated, there are four components to the gateway: The Global +Sender (mmsglobalsender), Mobile Sender (mmsmobilesender), Proxy +(mmsproxy) and SMTP/Email Interface (mmsfromemail). We describe the +function of each of these in turn. +

+ +

MMS Proxy

+ +

+ +This component (mmsproxy) is the main point of interaction between the +gateway and MMS clients. It provides an HTTP interface through which +clients can send MMS messages. The message types expected on this +interface are typically: +

    +
  • Send Request: Used by client to submit an MM to the +gateway. When received, the message is placed in the global queue. If +the client has requested that a copy by saved to the MMbox, this is done. +
  • Forward Request: Used by the client to request the MM to +forward an MM. In this case the MM is resident on the gateway +(e.g. pending fetch by client) and is identified by its URL. The +message is retrieved and placed in the global queue for processing. If +a request to place a copy in the MMbox is indicated, this is done. +
  • Notify Response: Is sent by client as a response to an MM +notification via Wap Push. This message indicates status information +such as whether the client wishes to defer fetching of the message, +etc. If the notification indicates that the message has been fetched, +the message is removed from the queue. If the notification indicates +that retrieval has been deferred, the message is marked so that no +further notifications are sent to the client about this message. +
  • Read receipt: If requested by the sender, a read receipt can +be forwarded via this interface. This is queued for delivery to the +recipient +
  • MMbox Upload/Delete/Search: Upload and deletion to/from the user +MMbox are supported. +
  • MMbox search: A message search request when received is +processed. The proxy takes care to return only as much data as the +client can handle (as indicated by UA profile). +
+All the above messages are sent to the proxy as the body of an HTTP POST request. +Messages are retrieved by supplying the message URL in an HTTP GET +request. When such a request is received, the proxy: + +

+Currently, no MMbox quotas are imposed. +

+
    + +
  1. Locates the message: From the URL, the proxy can tell if this +is a message in the MMbox or in the in the queue for client-destined messages. +
  2. Extracts the User Agent profile URL from the (HTTP) request +headers. If that is missing, the profile information is built out of +the HTTP Accept headers. The profile URL is passed to the content +adaptation module, which performs various modifications to the MM such +as: +
      +
    • Converting images in the MM to a format supported by the client +
    • Scaling images to fit the screen size of the client +
    • Converting audio in the MM to a format supported by the client +
    • Converting text to a supported character set +
    • Removing unsupported content from the MM +
    +
  3. The message is then packed and returned to the client as the +result of the HTTP request. + +
+This component must always be running. + + +

+ +

MMS Mobile Sender

+ +

+ +This component handles +

    +
  1. Notification of MMS clients of received message via WAP Push +
  2. Delivery of other notifications such as delivery and read +reports to MMS clients via WAP Push +
+SMS is used as the transport for WAP Push messages, if the recipient +is an MSISDN, otherwise TCP/IP is used. +
+The mobile sender maintains a queue of messages pending delivery. At +set intervals (see configuration section), it sends notifications to +the recipients. It keeps sending notifications until the message is +fetched or the client indicates that it wishes to defer message +retrieval. A back-off mechanism is utilised to prevent flooding of +notifications. + A message will be removed from the queue if: +
    +
  • It expires, either due to expiry period set within the message +being reached or system wide expiry time is reached. (The sender is +notified of expiry if they requested a delivery report) +
  • If the recipient retrieves the message +
+ +

+ +

+

MMS Global Sender

+This is the master message switch. It consists largely of a queue +runner that monitors the global queue. For each message that arrives +in the queue, the global sender: +
    +
  1. Determines if the message is due for delivery attempt. An +attempt is made to deliver the message as soon as it is received, with +exponential back-off in case of failure. +
  2. At the first delivery attempt, a call is made to the billing +module to effect billing and CDR generation. If the billing module +indicates that the sender does not have sufficient credit, the message +is discarded and the sender notified via delivery report. +
  3. If the message is due for delivery attempt, the global sender +determines, for each recipient, how to deliver the message: +
      +
    1. If the message is destined for a local MMS client, the message +is transferred to the mobile sender queue. A copy of the message is +sent (as MIME) to the MMBox host (if one is configured) +
    2. If the message is destined for an email user, the message is +re-formatted as MIME, sender and recipient addresses normalised as RFC +822 addresses, and the message passed to the mailer. +
    3. If the message is destined for a foreign gateway, it is coded +as MIME and passed to the mailer for delivery via SMTP +
    4. If the message cannot be delivered, the sender is notified. +
    +
+
+A word about queue management: A simple queue management scheme is +used. Each queue entry consists of two files: The 'q' file (which is +plain text) contains the entry control data +(list of recipients, next delivery attempt time, etc), the 'd' file +contains the message data. This scheme is similar to that used by +popular MTAs. Queue processors mostly operate on the 'q' file, and +use file locking to guard against duplicate delivery, file corruption, +etc. +
+See mms_queue.h for details. + +

+ +

+

SMTP/Mail Interface

+ +The SMTP/Mail interface receives MMS from the MTA and routes them +depending on recipient or sending proxy. Specifically: +
    +
  1. If the +message is a send request, it is queued to the global queue for +delivery as long as the recipient is permitted via the interface (see +configs) +
  2. If the message is a notification (e.g. delivery +report), the interface carries out the necessary action +(e.g. forwarding of receipt or deletion of message from local +queue) +
+
+Note that no IP-based security is provided at this +interface. It is expected that security measures (e.g. firewalls, etc) +will have been setup to ensure that messages can only reach the MTA +and be handed over to this interface if they are legitimate. +

+ +

+

Utilities

+ + We plan to add a number of utilities to the gateway. The first of + these is mmssend. +
+
+mmsssend can be used to submit (inject) a message into the + global queue. It should be invoked as follows:
+ + +mmssend -f from_address -t recipient_list -m +mmsfile [-b] -- conf_file + +
+Notes: +
    +
  • the recipient list can be a colon-separated list of multiple +recipients +
  • The MMS file may be binary coded, or MIME. The utility tries to +guess which by inspecting the first byte of the file. +
  • From/To addresses are only used for delivery purposes (so internal +message headers may not be updated +
  • The -b flag, if specified, causes a copy of the message +to be saved in the recipients MMbox. (No check is made to confirm that +recipient is local!) +
+The message is placed in he global queue with expiry set to the system +maximum, and the queue entry ID is printed to standard output. +

+

+

Chapter 5: Tips & Tricks

+ + This section is a compilation of tips and tricks on making Mbuni work + better for you + +

Passing MSISDNs to Mbuni

+ As indicated earlier, Mbuni expects the MSISDN to be sent to it as a + special HTTP request header. There are however times when it is + either not possible, or not practical to insert the header into the + MMS request. For such cases, Mbuni provides another way to specify + the sender MSISDN: The last part of the URL passed in the HTTP + transaction is passed to the De-tokenizer module (if specified), + which should return an MSISDN. So for instance + you can configure a clients to use a URL like http://mmsc/xYz12R2 + + as the MMSC address, and Mbuni will pass xYz12R2 to the + de-tokenizer module, which must return the sender + MSISDN. Mbuni will only do this it has failed to find the MISDN request header. +
+ If no MSISDN is found, Mbuni assumes that the MMS client is + identified by IP address, and attempts to look up the IP address of + the sender (see config section) and use that as the sender + address. You can block this by specifying allow-ip-type = false +
+
+ Note that because of the above feature, you need to configure your + WAP gateway and Mbuni IP security to ensure the system is not easily + spoofed. +

+ +

Sample Kannel WAP configuration

+

+We provide a sample Kannel wapbox config below, with some explanation +
+ +group = wapbox
+bearerbox-host = localhost
+log-file = "/tmp/wapbox.log"
+syslog-level = none
+access-log = "/tmp/wapaccess.log"
+timer-freq = 10
+map-url = "http://mmsc/* http://localhost:1981/*"
+
+
+This is a live example that was used in tests. In the example we use: +

    +
  • wapbox URL mapping to convert incoming MMS request URLs +into the long form. Note that the MMS gateway always sends short form +URLs so you need something like this +
  • We increase the timer-freq (essentially +slowing the timer) because over +slow bearer (such as CSD), the WAP gateway tends timeout on large +messages. Not sure if it is wise to do this. Although clearly whoever put this parameter in the config file expected it to be used! +
+ +

+ +

Chapter 6: Log Files

+ +The gateway writes a log file of important actions to the log file +configured. Message traffic is written to the access log in a standard +format. +
+
+ + + + + + + \ No newline at end of file