Skip to main content
Python Software Foundation 20th Year Anniversary Fundraiser  Donate today!

pyDiameter is created by George Zhao, who is working for NOKIA, 2010-2012, 2014-2018. This lib is used for encoding and decoding Diameter protocol message(an AAA protocol replace the RADIUS).

Project description


pyDiameter is a library which is used to decoding and encoding Diameter protocol message.

Diameter protocol is an AAA protocol and defined in RFC6733 (RFC3588 is obsoleted by RFC6733).

Decoding a diameter protocol message means, the library will help application decode protolcol bytes to the library object, which is more simple to handle.

Encoding a diameter protocol message means, the library will help application encode the library object(usually a DiaMessage object in pyDiameter library) into a bytes variable.

pyDiameter is written by python purely.

pyDiameter is written on python 3.6.5, python 2 is not supported.


George Zhao who is working for Nokia in 2010-2012, 2014-2018.


How to get it

pip install pyDiameter

Getting start

To get a start for decoding or encoding a diameter message with pyDiameter, you can read the example after pip installing.

The example folder is located in pyDiameter folder in your site-packages of your Python.

Please refer to to get start for the Diameter protocol AVP dictionary.


This dictionary contains more than 2000 AVP definitions, as well as including several popular vendors definitions (Base, 3GPP, Nokia, Ericsson, Cisco etc.)

Please note that, decoding is depending on the dictionary defined in pyDiameter.pyDiaAVPDict, if you have some special AVP definition which is not contained in this dictionary, could help you to know how to add new AVP definition in the dictionary, and how to update it.

Please make sure that there are all definitions you need defined in the dictionary before decoding the diameter message.

AVP and Message

Please refer to to get start for the Diameter protolcol AVP handling.

And refer to to get start for the Diameter protocol message handling.

If you want an example just like a ‘Hello, world’, please refer to code below.

from pyDiameter.pyDiaMessage import DiaMessage
from pyDiameter.pyDiaAVPTypes import DiaAVPStr
from pyDiameter.pyDiaAVPPath import DiaAVPPath

msg = DiaMessage()
avp = DiaAVPStr()
avp.setAVPValue(b'Hello, world.')
dap = DiaAVPPath()
msg.addAVPByPath(dap, avp)

pyDiameter supports only basic types defined in RFC6733.

Please refer to following table for supported types list. (import them from pyDiameter.pyDiaAVPTypes)

pyDiameter RFC6733
DiaAVPStr OctectString
DiaAVPInt32 Integer32
DiaAVPUInt32 Unsigned32
DiaAVPInt64 Integer64
DiaAVPUInt64 Unsigned64
DiaAVPFloat32 Float32
DiaAVPFloat64 Float64
DiaAVPGroup Grouped

All DiaAVPxxx classes are derived from DiaAVP which is defined in pyDiameter.pyDiaAVPBase. And users could not initialize a DiaAVP object since it is an abstract class.

All Sub-classes of DiaAVP have method called getAVPType().

It return a Python string which describes the type of the object.

The returned value could be one of values of following. (import them from pyDiameter.pyDiaAVPConst)

Const Value
AVP_TYPE_INT32 int32
AVP_TYPE_UINT32 uint32
AVP_TYPE_INT64 int64
AVP_TYPE_UINT64 uint64
AVP_TYPE_FLOAT32 float32
AVP_TYPE_FLOAT64 float64

AVP Path

When you operate DiaMessage object in pyDiameter.pyDiaMessage, sometimes, you need visit, add or remove some AVPs from the message.

You can use DiaAVPPath object to locate the AVP in the message.

DiaAVPPath could be imported from pyDiameter.pyDiaAVPPath.

And DiaAVPPath object uses a diameter avp path language to describe the AVP path. (Defined by George Zhao, not a well-known language.)

The AVP path is described as:


e.g. 10415/628[1]->10415/630[0] means I want to visit the AVP, the location is: the first AVP 630(vendor 10415) under the second AVP 628(vendor 10415).

sameCodeIndex means if there are several same AVPs with same AVP code and vendor, which index is target to be visited.

Note that, sameCodeIndex is counted from zero.


In pyDiameter.pyDiaAVPTools, we provide four functions to help you treat some special AVP types.

The address type, and the time type are both derived from OctectString basic type according to RFC6733.

Functions Examples
address_to_bytes address_to_bytes((‘ipv4’,’’)); address_to_bytes((‘ipv6’,’2000:1234:ac12:abcd:abcd:abcd:abcd:abc1’))
bytes_to_address bytes_to_address(diameter_address_avp_bytes_buff)
time_to_bytes time_to_bytes(year=1980, month=7 , day=8, hour=20, minute=0, second=0)
bytes_to_time bytes_to_time(bytes_buff)

Note that, time is counted from Year 1968 Jan 20, 03:14:08 to Year 2104, Feb 26, 09:42:23, according to RFC6733 and an even obsoleted RFC4330.

Only ipv4 and ipv6 are supported by tools, other protocols should be handled by user as an ordinary OctectString.

When you set ipv6 value, the compress ipv6 value could be supported by tools, like 2000::1 or ::1.

Any other problem, please refer to ‘Any problem’ section below.

Any problem

Please contact

Author will check mail irregularly, support is not guaranteed.

Author will answer question as immediately as author can.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for pyDiameter, version
Filename, size File type Python version Upload date Hashes
Filename, size pyDiameter- (39.6 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page