kdriveExpress SDK 23.2.0
kdrive_express_data_secure.c
//
// Copyright (c) 2002-2023 WEINZIERL ENGINEERING GmbH
// All rights reserved.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY,
// WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
//
#include <kdrive_express.h>
#include <stdio.h>
#include <stdlib.h>
#define ERROR_MESSAGE_LEN (128)
#define MAX_USB_INTERFACES (10)
/*******************************
** Private Functions
********************************/
static void on_telegram_callback(const uint8_t* telegram, uint32_t telegram_len, void* user_data);
static void on_sec_telegram_callback(const uint8_t* telegram, uint32_t telegram_len, void* user_data);
static void error_callback(error_t e, void* user_data);
static void event_callback(int32_t ap, uint32_t e, void* user_data);
/*******************************
** Private Variables
********************************/
/*
Is the usb interface a RF-Interface.
For Twisted Pair and Powerline:
Set to 0
For RF:
Set to 1
*/
static bool_t is_rf = 0;
/*******************************
** Main
********************************/
int main(int argc, char* argv[])
{
int32_t ap = 0;
ip_tunn_dev_t iface_items[MAX_USB_INTERFACES];
uint32_t iface_items_length = MAX_USB_INTERFACES;
int32_t keyring = 0;
const char* keyring_file = "data/keyring.knxkeys";
const char* keyring_password = "123";
uint32_t key = 0;
int32_t sp = 0;
uint16_t individual_addr = 0xAA1F;
uint16_t mask_version = 0;
uint8_t data[255];
uint32_t data_length = 255;
uint16_t group_addr = 0x2D06;
uint8_t value = 1;
/*
Configure the logging level and console logger
*/
/*
We register an error callback as a convenience logger function to
print out the error message when an error occurs.
*/
kdrive_register_error_callback(&error_callback, NULL);
/*
We create a Access Port descriptor. This descriptor is then used for
all calls to that specific access port.
*/
/*
We check that we were able to allocate a new descriptor
This should always happen, unless a bad_alloc exception is internally thrown
which means the memory couldn't be allocated.
*/
{
kdrive_logger(KDRIVE_LOGGER_FATAL, "Unable to create access port. This is a terminal failure");
return -1;
}
/*
We register an event callback to notify of the Access Port Events
For example: KDRIVE_EVENT_TERMINATED
*/
kdrive_set_event_callback(ap, &event_callback, NULL);
kdrive_ap_enum_ip_tunn(ap, iface_items, &iface_items_length);
kdrive_logger_ex(KDRIVE_LOGGER_INFORMATION, "Found %d KNX IP Tunn Interfaces", iface_items_length);
/*
Import the ETS keyring project
*/
if (kdrive_keyring_import_knxkeys(keyring_file, keyring_password, &keyring) != KDRIVE_ERROR_NONE)
{
kdrive_logger(KDRIVE_LOGGER_FATAL, "Unable to import the keyring file");
return -1;
}
/* Use the keyring in the access port */
kdrive_ap_set_keyring(ap, keyring);
/* Send telegrams secure when the keyring contains a key */
/* If we found at least 1 interface we simply open the first one (i.e. index 0) */
if ((iface_items_length > 0) && kdrive_ap_open_ip_tunn(ap, "192.168.1.42", 0, NULL) == KDRIVE_ERROR_NONE)
{
/*
Connect the Packet Trace logging mechanism
to see the Rx and Tx packets
*/
/* now we simply go into bus monitor mode, and display received telegrams */
kdrive_ap_register_telegram_callback(ap, &on_telegram_callback, NULL, &key);
/* and received secure telegrams */
kdrive_ap_register_sec_telegram_callback(ap, &on_sec_telegram_callback, NULL, &key);
/* create a service port */
sp = kdrive_sp_create(ap);
/* read the device descriptor */
kdrive_sp_device_descriptor_type0_read(sp, individual_addr, &mask_version);
/* read the programming mode state */
kdrive_sp_prop_value_read(sp, individual_addr, 0, 54, 1, 1, data, &data_length);
/* send a 1-Bit boolean GroupValueWrite telegram */
kdrive_ap_group_write(ap, group_addr, &value, 1);
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Entering BusMonitor Mode");
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Press [Enter] to exit the application ...");
getchar();
/* close the access port */
}
/* releases the access port */
return 0;
}
/*******************************
** Private Functions
********************************/
void on_telegram_callback(const uint8_t* telegram, uint32_t telegram_len, void* user_data)
{
kdrive_logger_dump(KDRIVE_LOGGER_INFORMATION, "Data :", telegram, telegram_len);
}
void on_sec_telegram_callback(const uint8_t* telegram, uint32_t telegram_len, void* user_data)
{
kdrive_logger_dump(KDRIVE_LOGGER_INFORMATION, "SecData :", telegram, telegram_len);
}
void error_callback(error_t e, void* user_data)
{
{
static char error_message[ERROR_MESSAGE_LEN];
kdrive_get_error_message(e, error_message, ERROR_MESSAGE_LEN);
kdrive_logger_ex(KDRIVE_LOGGER_ERROR, "kdrive error: %s", error_message);
}
}
void event_callback(int32_t ap, uint32_t e, void* user_data)
{
switch (e)
{
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Access Port Opening");
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Access Port Opened");
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Access Port Closed");
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Access Port Closing");
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Access Port Terminated");
break;
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "KNX Bus Disconnected");
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Local Device Reset");
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Telegram Indication");
break;
break;
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Telegram Confirm Timeout");
break;
break;
default:
kdrive_logger(KDRIVE_LOGGER_INFORMATION, "Unknown kdrive event");
break;
}
}
kdriveExpress_API error_t kdrive_ap_register_sec_telegram_callback(int32_t ap, kdrive_ap_telegram_callback c, void *user_data, uint32_t *key)
Registers a callback function.
kdriveExpress_API error_t kdrive_ap_packet_trace_connect(int32_t ap)
Starts the Packet Trace, for a specific access port.
kdriveExpress_API error_t kdrive_ap_group_write(int32_t ap, uint16_t address, const uint8_t *value, uint32_t bits)
Sends a GroupValue_Write Telegram The length is specified in bits to enable values less than one byte...
kdriveExpress_API bool_t kdrive_ap_release(int32_t ap)
Releases the AccessPort interface.
kdriveExpress_API int32_t kdrive_ap_create(void)
Creates an internal AccessPort interface This should be the first function called when working with t...
kdriveExpress_API error_t kdrive_ap_close(int32_t ap)
Closes the access port If the access port is not open nothing happens.
kdriveExpress_API error_t kdrive_ap_set_keyring(int32_t ap, int32_t keyring)
Sets the used knx keyring project.
kdriveExpress_API error_t kdrive_ap_open_ip_tunn(int32_t ap, const char *ip_address, uint16_t port, const char *iface_address)
Opens a connection to a KNX IP Tunneling Interface device on a specific network interface or default ...
kdriveExpress_API error_t kdrive_ap_register_telegram_callback(int32_t ap, kdrive_ap_telegram_callback c, void *user_data, uint32_t *key)
Registers a callback function.
kdriveExpress_API error_t kdrive_ap_enum_ip_tunn(int32_t ap, ip_tunn_dev_t items[], uint32_t *items_length)
Scans for all KNX IP Tunneling Interface devices The items array must exist (should be pre-allocated ...
kdriveExpress_API error_t kdrive_ap_set_data_sec(int32_t ap, enum data_sec_t dataSec)
Set the Data Security of the access point.
kdriveExpress_API error_t kdrive_keyring_import_knxkeys(const char *filename, const char *password, int32_t *keyring)
Imports an ETS keyring project file (*.knxkeys)
kdriveExpress_API void kdrive_logger(uint8_t level, const char *message)
Writes to the kdrive express logger.
kdriveExpress_API void kdrive_logger_dump(uint8_t level, const char *message, const void *buffer, uint32_t buffer_len)
Logs the given message, followed by the data in buffer.
kdriveExpress_API void kdrive_logger_console(void)
Sets the logger to write to the console.
kdriveExpress_API void kdrive_logger_ex(uint8_t level, const char *fmt,...)
Writes to the kdrive express logger.
kdriveExpress_API void kdrive_logger_set_level(uint8_t level)
Sets the root logger level This is once of:
kdriveExpress_API error_t kdrive_sp_device_descriptor_type0_read(int32_t sp, uint16_t ind_addr, uint16_t *mask_version)
Reads device descriptor 0 (mask version) from a device.
kdriveExpress_API error_t kdrive_sp_prop_value_read(int32_t sp, uint16_t ind_addr, uint8_t object_index, uint8_t prop_id, uint8_t nr_of_elems, uint16_t start_index, uint8_t data[], uint32_t *data_length)
Reads a property value from a device The data buffer must exist (should be pre-allocated by the user)...
kdriveExpress_API int32_t kdrive_sp_create(int32_t ap)
Creates an internal ServicePort interface This should be the first function called when working with ...
@ Auto
numbered in the order that the hid driver enumerates the devices
Definition: kdrive_express_access.h:817
unsigned short uint16_t
16 bit unsigned char
Definition: kdrive_express_config.h:31
bool bool_t
Definition: kdrive_express_config.h:58
int int32_t
32 bit signed int
Definition: kdrive_express_config.h:35
unsigned int uint32_t
32 bit unsigned char
Definition: kdrive_express_config.h:32
int32_t error_t
Definition: kdrive_express_config.h:47
unsigned char uint8_t
8 bit unsigned char
Definition: kdrive_express_config.h:30
#define KDRIVE_INVALID_DESCRIPTOR
Indicates an invalid descriptor.
Definition: kdrive_express_defs.h:39
kdriveExpress_API void kdrive_register_error_callback(kdrive_error_callback c, void *user_data)
Registers the error callback function.
#define KDRIVE_TIMEOUT_ERROR
Timeout.
Definition: kdrive_express_error.h:26
#define KDRIVE_ERROR_NONE
No Error, Everything OK.
Definition: kdrive_express_error.h:22
kdriveExpress_API void kdrive_get_error_message(error_t e, char *str, uint32_t str_len)
Gets the error message.
#define KDRIVE_EVENT_CLOSING
The closing signal is emitted when the port is about to be closed.
Definition: kdrive_express_event.h:26
kdriveExpress_API error_t kdrive_set_event_callback(int32_t ap, kdrive_event_callback c, void *user_data)
Sets the event callback, for a specific access port.
#define KDRIVE_EVENT_OPENING
The opening signal is emitted when the port is about to be opened.
Definition: kdrive_express_event.h:24
#define KDRIVE_EVENT_TELEGRAM_INDICATION
Definition: kdrive_express_event.h:34
#define KDRIVE_EVENT_TERMINATED
The terminated signal is emitted when the port was closed (internally) on error.
Definition: kdrive_express_event.h:28
#define KDRIVE_EVENT_CLOSED
The closed signal is emitted when the port was closed.
Definition: kdrive_express_event.h:27
#define KDRIVE_EVENT_INTERNAL_01
Definition: kdrive_express_event.h:38
#define KDRIVE_EVENT_KNX_BUS_DISCONNECTED
The knx bus disconnected signal is emitted when the KNX bus was disconnected.
Definition: kdrive_express_event.h:31
#define KDRIVE_EVENT_ERROR
The error signal is emitted when an error was occurred.
Definition: kdrive_express_event.h:22
#define KDRIVE_EVENT_LOCAL_DEVICE_RESET
The local device reset signal is emitted when a KNX reset.ind was received.
Definition: kdrive_express_event.h:32
#define KDRIVE_EVENT_TELEGRAM_CONFIRM_TIMEOUT
Definition: kdrive_express_event.h:36
#define KDRIVE_EVENT_KNX_BUS_CONNECTED
The knx bus connected signal is emitted when the KNX bus was connected.
Definition: kdrive_express_event.h:30
#define KDRIVE_EVENT_OPENED
The opened signal is emitted when the port was opened.
Definition: kdrive_express_event.h:25
#define KDRIVE_EVENT_TELEGRAM_CONFIRM
Definition: kdrive_express_event.h:35
#define KDRIVE_LOGGER_FATAL
A fatal error.
Definition: kdrive_express_logger.h:26
#define KDRIVE_LOGGER_ERROR
An error.
Definition: kdrive_express_logger.h:28
#define KDRIVE_LOGGER_INFORMATION
An informational message, usually denoting the successful completion of an operation.
Definition: kdrive_express_logger.h:31
Structure holding ip tunneling device information.
Definition: kdrive_express_access.h:176