Dart ffi bindings to the tinydtls library. Provides wrappers for both a DTLS client and server.
The library provides a high level API for accessing tinyDTLS functionality.
Both client and server APIs are exposed through the DtlsClient
and DtlsServer
classes. These allow users to connect to a peer or wait for incoming connections,
respectively.
A basic example for the use of the DtlsClient
class can be seen below. As tinyDTLS
only supports ciphers using either a Pre-Shared Key (PSK) or an ECDSA key, at least
one of these types of credentials have to be provided (in this case, a PSK).
Once the connection has been established, a DtlsConnection
object is returned which
can be used for sending data to the peer. The DtlsConnection
also allows listening
for incoming application data (in the form of Datagram
objects). This and other
use cases are demonstrated more thoroughly in the example.dart
file.
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:dart_tinydtls/dart_tinydtls.dart';
PskCredentials _pskCallback(Uint8List identityHint) {
final identity = Uint8List.fromList(utf8.encode("Client_identity"));
final preSharedKey = Uint8List.fromList(utf8.encode("secretPSK"));
return PskCredentials(identity: identity, preSharedKey: preSharedKey);
}
Future<void> main() async {
final address =
(await InternetAddress.lookup("californium.eclipseprojects.io"))[0];
const port = 5684;
final client = await DtlsClient.bind(InternetAddress.anyIPv6, 0);
final connection = await client.connect(address, port,
pskCallback: _pskCallback, eventListener: print);
final data = utf8.encode('Hello World!');
connection.send(data);
client.close();
}
- Clone the repository and initialize its submodules
(i.e.
git submodule update --init --recursive
). - Generate the bindings using
dart run ffigen
.- If you encounter a
SEVERE
error regarding a missing header file (e.g.stddef.h
), please consult the Troubleshooting section below.
- If you encounter a
- There are exactly two warnings which can be ignored:
Removed All Struct Members from dtls_handshake_parameters_t(dtls_handshake_parameters_t), Bit Field members not supported.
- The struct
dtls_handshake_parameters_t
won't be used by library clients, so the fact that it's opaque in the bindings can safely be ignored.
- The struct
Generated declaration '__socklen_t' start's with '_' and therefore will be private.
- Similarly, it won't cause any problems for
__socklen_t
to be private.
- Similarly, it won't cause any problems for
It may be that you'll encounter the following error (maybe with another header
file in place of stddef.h
) when generating the bindings using dart run ffigen
:
[SEVERE] : Header third_party/tinydtls/dtls.h: Total errors/warnings: 1.
[SEVERE] : /usr/include/sys/types.h:144:10: fatal error: 'stddef.h' file not found [Lexical or Preprocessor Issue]
To fix this, ffigen
needs to know where it can find this header file using the
CPATH
environment variable, which should point to the location of the header files.
To set this environment variable automatically by detecting the location using clang
,
run the following command1:
export CPATH="$(clang -v 2>&1 | grep "Selected GCC installation" | rev | cut -d' ' -f1 | rev)/include"
Simply execute this before running dart run ffigen
and the headers should be correctly detected.
Matching the license of the tinydtls C library, this library is made available both under the terms of the Eclipse Public License v1.0 and 3-Clause BSD License (which the Eclipse Distribution License v1.0 that is used for tinydtls is based on). Additionally, the tinydtls C library contains third party code that might be included in compiled binaries that link to tinydtls. For information on third-party code and its licenses, see https://github.com/eclipse/tinydtls/blob/develop/ABOUT.md. See https://github.com/eclipse/tinydtls/blob/develop/LICENSE for more information on the tinydtls licensing terms and https://www.eclipse.org/legal/eplfaq.php for more information on the EPL 1.0.
Note: This binding is neither supported nor endorsed by the Eclipse Foundation.
This project is currently maintained by the following developers:
Name | Email Address | GitHub Username |
---|---|---|
Jan Romann | [email protected] | JKRhb |
Falko Galperin | [email protected] | falko17 |
Footnotes
-
From this GitHub comment. Of course, you can also set the path manually. ↩