Trying out the templates

In this section, we describe how to build the various templates, how to package them and finally how to deploy and run them on the target board.

Every template is stored in a single directory and is independent of the rest of the tree: each template can be used as a foundation for a fresh new application.

For deployment, we assume that the target board is booted with an AGL image and available on the network. Let us use the BOARDIP variable for the board IP address (replace by appropriate address or hostname) and test the SSH connection:

$ export BOARDIP=
$ ssh root@$BOARDIP cat /etc/os-release
NAME="Automotive Grade Linux"
VERSION="1.0+snapshot-20160717 (master)"
PRETTY_NAME="Automotive Grade Linux 1.0+snapshot-20160717 (master)"


All operations are executed inside the Docker “Devkit” container. For convenience, a build script named autobuild can build template and package at once.

Compile the service:

$ cd ~/helloworld-service/
$ ./conf.d/autobuild/agl/autobuild package
-- The C compiler identification is GNU 6.3.1
-- The CXX compiler identification is GNU 6.3.1
[100%] Generating helloworld-service.wgt
NOTICE: -- PACKING widget helloworld-service.wgt from directory /home/claneys/Workspace/Sources/IOTbzh/helloworld-service/build/package
++ Install widget file using in the target : afm-util install helloworld-service.wgt

This produced a helloworld-service.wgt package. Let us copy it to the target:

$ scp helloworld-service.wgt root@$BOARDIP:~/
helloworld-service.wgt                           100%   24KB   24.3KB/s   00:00

Installing on the target

And then, in a separate window, log in to the target board:

ssh root@$BOARDIP

and install our packages:

$ afm-util install helloworld-service.wgt
{ "added": "helloworld-service@1.0" }

We can verify that they were correctly installed by listing all available applications:

$ afm-util list
[ { "description": "The name says it all!", "name": "helloworld-service", "shortname": "", "id": "helloworld-service@1.0", "version": "1.0", "author": "Stephane Desneux <>", "author-email": "", "width": "", "height": "" } ]

Running the template

Even if the template is mostly skeleton application, we can still start them and see them in action.

Once installed Application Framework created appropriate systemD unit file to get able to manage the application. You can directly connect to the unix socket to get connected to the application template, it will be launched automatically if not already started.

when systemD receives a connection to an existing socket that it handles, it launch the associated application using its service unit. Service unit is generated by wgtpkg-unit at installation, its content depends of the config.xml configuration file located in its specific directory (/var/local/lib/afm/applications/<appname>/<version>/config.xml).

Generation is controlled by the global /etc/afm/afm-unit.conf config file.

This file defines how various applications types are handled by the system and application framework.

Run and connect to the service

Let us first run the Service:

$ afm-util run helloworld-service@1.0

Then confirm it is running:

$ afm-util ps
[ { "runid": 20091, "pids": [ 20091 ], "state": "running", "id": "helloworld-service@1.0" } ]
$ ps -ef | grep afb
ps -ef|grep afb
root      5764  3876  0 15:34 ?        00:00:00 /usr/bin/afb-daemon --rootdir=/var/local/lib/afm/applications/helloworld-service/1.0 --workdir=/home/root/app-data/helloworld-service --roothttp=htdocs --binding=/var/local/lib/afm/applications/helloworld-service/1.0/lib/ --ws-server=sd:helloworld --no-httpd

We can see that an afb-daemon (Binder) process for this Service started and get a websocket server up, meaning that an unix socket is available from directory /var/run/user/<uid>/apis/ws named as the api name. We also see that the shared library as been loaded as binding using binding flag.

A Service has no user interface, but we can still try the binding API. Looking at the Service source code, we see that the Service implements an API named ‘helloworld’ providing a ping verb. Let us try to launch a websocket client connected to that service invoking the ping verb.

First as we don’t know security token used to launch the service, we still can connect to through the unix socket and use the websocket client demo:

$ afb-daemon --ws-client=/var/run/user/0/apis/ws/helloworld --port=12345 --token='' --roothttp=.
$ afb-client-demo ws://localhost:12345/api?token= helloworld ping
ON-REPLY 1:helloworld/ping: {"response":"Make the World great again!","jtype":"afb-reply","request":{"status":"success","info":"Ping Binder Daemon tag=pingSample count=2 query=\"null\"","uuid":"2edcfee9-943b-40d7-a0c6-08a31141f045"}}