Translations of this page:

CoAP on PC/RaspberryPi/Server

Copper (Cu) Mozilla Browser

Get add-on

After installing Copper, Firefox supports coap: urls. Browse to one of your nodes, e.g. coap:[2001:0db8::221:2eff:ff00:264e]:5683

Use DISCOVER to fetch all resource information.

Set CoAP-Version to 13 (right upper corner)

Or go directly to the well-known core


Click on GET to list all resources, select any of them and use GET to load the content of the resource.

Use POST/PUT to send the content of the Outgoing tab to the resource.

SMCP CoAP client

Command line tool written in C


libcoap contains an command line client called coap-client in the example folder.

Current version of Contiki-OS uses CoAP-13.

Build libcoap

  tar -xzf libcoap-4.0.3.tar.gz
  rm libcoap-4.0.3.tar.gz
  cd libcoap-4.0.3
  sudo cp examples/coap-client /usr/local/bin/ # or copy to ~/bin and set it to your syspath

Get battery voltage:

coap-client -m Get coap://[2001:db8:c001:f00d:221:2eff:ff00:3372]:5683/sensors/battery

Toggle LED:

echo -n "mode=on"  | coap-client -m put coap://[2001:db8:c001:f00d:221:2eff:ff00:2704]:5683/actuators/leds?color=r -f -
# same with text option for pingtheplug
coap-client -m put coap://[2001:db8:c001:f00d:221:2eff:ff00:2704]:5683/actuators/led1 -e "mode=on"
echo -n "mode=off" | coap-client -m put coap://[2001:db8:c001:f00d:221:2eff:ff00:2704]:5683/actuators/leds?color=r -f -
coap-client -m put coap://[2001:db8:c001:f00d:221:2eff:ff00:2704]:5683/actuators/led1 -e "mode=off"

CoAP using NodeJS

CoAP using Python


outdated, only supports CoAP-08


Python3 lib using asyncio for coap support without hard dependencies


  • based on twisted
  • asyncio version in near future
  • server and client
  • define own CoAP resources easily
  • not python3 compatible (yet)
  1. install twisted from repository or pip
  git clone



To accept commands from a node we need a CoAP server providing resources.

txThings provides a example, create a copy to avoid conflicts.

In the current version only listens to IPv4. To change it to IPv6 change the line on the bottom to:

  reactor.listenUDP(coap.COAP_PORT, coap.Coap(endpoint), '::')

Afterwards just start the file.

Get your IPv6 address:

  ip addr

You should see two IPv6 addresses, one fe80:: and one with our prefix provided by the border router (e.g. abbb::) Use this address to test your server with copper or libcoap.

Short description of the server
class TestResource (resource.CoAPResource):
    def __init__(self):
        # init stuff
        self.visible = True
        # some description shown in core
        self.addParam(resource.LinkParam("title", "Test resource"))
    def render_GET(self, request):
        # build response message
        response = coap.Message(code=coap.CONTENT, payload='response msg')
        # send it back as success
        return defer.succeed(response)
    def render_POST(self, request):
        # like GET
        # Get payload message from request (e.g. mode=on)
        req = request.payload
        # do some magic with the command
        # or just echo it
        response = coap.Message(code=coap.CONTENT, payload=req)
        return defer.succeed(response)
# create a / resource
root = resource.CoAPResource()
# subdirectory
well_known = resource.CoAPResource()
# add subdirectory to /
root.putChild('.well-known', well_known)
# magically create core info resource from your tree
core = CoreResource(root)
well_known.putChild('core', core)

# create own subdirectory /other/
other = resource.CoAPResource()
root.putChild('other', other)

# add our test resource as echo to /other/
test = TestResource()
other.putChild('echo', test)

# start server
endpoint = resource.Endpoint(root)
reactor.listenUDP(coap.COAP_PORT, coap.Coap(endpoint), '::')
  • quite some hacks
  • no warranty ;)


from subprocess import Popen

class WOLResource(resource.CoAPResource):
    def __init__(self):
        self.visible = True

    def render_POST(self, request):
        query = request.payload
        Popen(('wol', query))
        response = coap.Message(code=coap.CONTENT)
        return defer.succeed(response)

Weather forecast

import requests

class WeatherResource (resource.CoAPResource):
    def __init__(self):
        self.visible = True
        self.addParam(resource.LinkParam("title", "Weather resource"))

    def render_GET(self, request):
        # payload used as location name
        query = request.payload
        response = coap.Message(code=coap.CONTENT)
        # Get forecast from openweatherservice
        r = requests.get('' % query)
        # extract temperature from response and convert it from Kelvin to Celsius
        response.payload = str(float(r.json()['main']['temp'])-273.15)
        return defer.succeed(response)

en/projekte/coaponpc.txt · Last modified: 2016/11/22 19:13 by kelvan