Skip to content

Instantly share code, notes, and snippets.

@manifest
Last active December 9, 2020 13:03
Show Gist options
  • Save manifest/aa2cfb19b596669b710bbc0f8885d64f to your computer and use it in GitHub Desktop.
Save manifest/aa2cfb19b596669b710bbc0f8885d64f to your computer and use it in GitHub Desktop.
Setting up development environment for MQTT transport of Janus Gateway

How To Use

To enable Janus and Admin API of MQTT transport and change a log level, execute those commands from the project's directory (you must copy Dockerfile and run-docker.sh files there):

$ perl -pi -e 's/(enable = )no/${1}yes/' conf/janus.transport.mqtt.cfg.sample
$ perl -pi -e 's/(admin_enable = )no/${1}yes/' conf/janus.transport.mqtt.cfg.sample
$ perl -pi -e 's/(debug_level = )4/${1}6/' conf/janus.cfg.sample.in

Build and run the docker container

$ ./run-docker.sh

We could now build and run Janus Gateway in container's shell:

$ ./autogen.sh \
	&& ./configure --prefix=/opt/janus --disable-rabbitmq \
	&& make || true \
	&& make -j $(nproc) \
	&& make install \
	&& make configs \
	&& /opt/janus/bin/janus

Then, we could execute one more container's shell and publish MQTT message:

$ mosquitto_pub -h $(docker-machine ip) -t to-janus -m '{"janus": "create", "transaction": "1"}'

We would see the message in the log now:

MQTT client has been successfully connected to the broker
MQTT client has been successfully subscribed to MQTT topic: to-janus
Receiving Janus API message over MQTT: {"janus": "create", "transaction": "1"}
Got a Janus API request from janus.transport.mqtt (0x1d83320)
Transport task pool, serving request
Creating new session: 4788723488430663
Sending Janus API response to janus.transport.mqtt (0x1d83320)
Sending Janus API message via MQTT: {
   "janus": "success",
   "transaction": "1",
   "data": {
      "id": 4788723488430663
   }
}

SSL/TLS

Update confugurations

## /etc/vernemq/vernemq.conf 
listener.ssl.default = 0.0.0.0:8883
listener.ssl.cafile = /path/to/ssl/ex-ca.crt
listener.ssl.certfile = /path/to/ssl/ex.crt
listener.ssl.keyfile = /path/to/ssl/ex.key
  
## /opt/janus/etc/janus/janus.transport.mqtt.cfg
url = ssl://localhost:8883
ssl_enable = yes
cacertfile = /path/to/ex-ca.crt
certfile = /path/to/ex.crt
keyfile = /path/to/ex.key

Publish the message

$ mosquitto_pub -d -h $(docker-machine ip) -t to-janus -m '{"janus": "create", "transaction": "1"}' --cafile ssl/ex-ca.crt -p 8883 --insecure
FROM ubuntu:16.04
## -----------------------------------------------------------------------------
## Installing dependencies
## -----------------------------------------------------------------------------
RUN set -xe \
&& apt-get update \
&& apt-get -y --no-install-recommends install \
software-properties-common \
apt-transport-https \
ca-certificates \
lsb-release \
curl \
&& add-apt-repository -y "deb https://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) multiverse" \
&& add-apt-repository -y "deb https://archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-updates multiverse" \
&& add-apt-repository -y "deb https://archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-security multiverse" \
&& apt-get update \
&& apt-get -y --no-install-recommends install \
libmicrohttpd-dev \
libjansson-dev \
libnice-dev \
libssl-dev \
libsofia-sip-ua-dev \
libglib2.0-dev \
libopus-dev \
libogg-dev \
gengetopt \
libtool \
automake \
cmake \
vim-nox \
less \
git \
&& WEBSOCKETS_BUILD_DIR='/tmp/websockets' \
&& mkdir "${WEBSOCKETS_BUILD_DIR}" \
&& cd "${WEBSOCKETS_BUILD_DIR}" \
&& git clone git://git.libwebsockets.org/libwebsockets . \
&& mkdir build \
&& cd build \
&& cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" .. \
&& make \
&& make install \
&& rm -vfr "{WEBSOCKETS_BUILD_DIR}" \
&& SRTP_BUILD_DIR='/tmp/srtp' \
&& mkdir "${SRTP_BUILD_DIR}" \
&& cd "${SRTP_BUILD_DIR}" \
&& curl -fsSL -o libsrtp.tar.gz "https://github.com/cisco/libsrtp/archive/v2.1.0.tar.gz" \
&& tar xf libsrtp.tar.gz \
&& cd libsrtp* \
&& ./configure --prefix=/usr --enable-openssl \
&& make shared_library && make install \
&& rm -fr "${SRTP_BUILD_DIR}" \
&& USRSCTP_BUILD_DIR='/tmp/usrsctp' \
&& mkdir "${USRSCTP_BUILD_DIR}" \
&& cd "${USRSCTP_BUILD_DIR}" \
&& git clone https://github.com/sctplab/usrsctp . \
&& ./bootstrap \
&& ./configure --prefix=/usr \
&& make -j $(nproc) \
&& make install \
&& rm -fr "${USRSCTP_BUILD_DIR}" \
&& PAHO_CLIENT_BUILD_DIR='/tmp/paho' \
&& mkdir "${PAHO_CLIENT_BUILD_DIR}" \
&& cd "${PAHO_CLIENT_BUILD_DIR}" \
&& git clone https://github.com/eclipse/paho.mqtt.c.git . \
&& git checkout v1.1.0 \
&& make -j $(nproc) \
&& make install \
&& rm -fr "${PAHO_CLIENT_BUILD_DIR}"
## -----------------------------------------------------------------------------
## Installing VerneMQ
## -----------------------------------------------------------------------------
RUN set -xe \
&& apt-get -y --no-install-recommends install \
mosquitto-clients \
&& VERNEMQ_URI='https://bintray.com/artifact/download/erlio/vernemq/deb/xenial/vernemq_1.2.0-1_amd64.deb' \
&& VERNEMQ_SHA='84437c31821b8e490fa9da302625580edce33c7a' \
&& curl -fSL -o vernemq.deb "${VERNEMQ_URI}" \
&& echo "${VERNEMQ_SHA} vernemq.deb" | sha1sum -c - \
&& set +e; dpkg -i vernemq.deb || apt-get -y -f --no-install-recommends install; set -e \
&& rm vernemq.deb
#!/bin/sh
PROJECT_DIR=/opt/sandbox/janus-gateway
read -r DOCKER_RUN_COMMAND <<-EOF
perl -pi -e 's/(allow_anonymous = )off/\${1}on/' /etc/vernemq/vernemq.conf \
&& vernemq start
EOF
docker build -t sandbox/janus-gateway .
docker run -ti --rm \
-v $(pwd):${PROJECT_DIR} \
-p 8080:8080 \
-p 8088:8088 \
-p 8089:8089 \
-p 5002:5002/udp \
-p 5004:5004/udp \
-p 1883:1883 \
-p 8883:8883 \
sandbox/janus-gateway \
/bin/bash -c "set -x && ${DOCKER_RUN_COMMAND} && set +x && cd ${PROJECT_DIR} && /bin/bash"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment