/* encode service */ int rd_encode_apdu( uint8_t * apdu, uint8_t invoke_id, BACNET_REINITIALIZED_STATE state, BACNET_CHARACTER_STRING * password) { int len = 0; /* length of each encoding */ int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_REINITIALIZE_DEVICE; apdu_len = 4; len = encode_context_enumerated(&apdu[apdu_len], 0, state); apdu_len += len; /* optional password */ if (password) { /* FIXME: must be at least 1 character, limited to 20 characters */ len = encode_context_character_string(&apdu[apdu_len], 1, password); apdu_len += len; } } return apdu_len; }
/* encode service */ int wp_encode_apdu( uint8_t * apdu, uint8_t invoke_id, BACNET_WRITE_PROPERTY_DATA * wpdata) { int apdu_len = 0; /* total length of the apdu, return value */ int len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_WRITE_PROPERTY; /* service choice */ apdu_len = 4; len = encode_context_object_id(&apdu[apdu_len], 0, wpdata->object_type, wpdata->object_instance); apdu_len += len; len = encode_context_enumerated(&apdu[apdu_len], 1, wpdata->object_property); apdu_len += len; /* optional array index; ALL is -1 which is assumed when missing */ if (wpdata->array_index != BACNET_ARRAY_ALL) { len = encode_context_unsigned(&apdu[apdu_len], 2, wpdata->array_index); apdu_len += len; } /* propertyValue */ len = encode_opening_tag(&apdu[apdu_len], 3); apdu_len += len; for (len = 0; len < wpdata->application_data_len; len++) { apdu[apdu_len + len] = wpdata->application_data[len]; } apdu_len += wpdata->application_data_len; len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* optional priority - 0 if not set, 1..16 if set */ if (wpdata->priority != BACNET_NO_PRIORITY) { len = encode_context_unsigned(&apdu[apdu_len], 4, wpdata->priority); apdu_len += len; } } return apdu_len; }
/* encode service */ int get_alarm_summary_encode_apdu( uint8_t * apdu, uint8_t invoke_id ) { int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_GET_ALARM_SUMMARY; apdu_len = 4; } return apdu_len; }
/* encode the initial portion of the service */ int rpm_encode_apdu_init( uint8_t * apdu, uint8_t invoke_id) { int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_READ_PROP_MULTIPLE; /* service choice */ apdu_len = 4; } return apdu_len; }
/* encode service */ int awf_encode_apdu( uint8_t * apdu, uint8_t invoke_id, BACNET_ATOMIC_WRITE_FILE_DATA * data) { int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; /* service choice */ apdu_len = 4; apdu_len += encode_application_object_id(&apdu[apdu_len], data->object_type, data->object_instance); switch (data->access) { case FILE_STREAM_ACCESS: apdu_len += encode_opening_tag(&apdu[apdu_len], 0); apdu_len += encode_application_signed(&apdu[apdu_len], data->type.stream.fileStartPosition); apdu_len += encode_application_octet_string(&apdu[apdu_len], &data->fileData); apdu_len += encode_closing_tag(&apdu[apdu_len], 0); break; case FILE_RECORD_ACCESS: apdu_len += encode_opening_tag(&apdu[apdu_len], 1); apdu_len += encode_application_signed(&apdu[apdu_len], data->type.record.fileStartRecord); apdu_len += encode_application_unsigned(&apdu[apdu_len], data->type.record.returnedRecordCount); apdu_len += encode_application_octet_string(&apdu[apdu_len], &data->fileData); apdu_len += encode_closing_tag(&apdu[apdu_len], 1); break; default: break; } } return apdu_len; }
int ptransfer_encode_apdu( uint8_t * apdu, uint8_t invoke_id, BACNET_PRIVATE_TRANSFER_DATA * private_data) { int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_PRIVATE_TRANSFER; apdu_len = 4; apdu_len = pt_encode_apdu(&apdu[apdu_len], MAX_APDU - apdu_len, private_data); } return apdu_len; }
/* encode service */ int rp_encode_apdu( uint8_t * apdu, uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * rpdata) { int len = 0; /* length of each encoding */ int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ apdu_len = 4; if (rpdata->object_type <= BACNET_MAX_OBJECT) { /* check bounds so that we could create malformed messages for testing */ len = encode_context_object_id(&apdu[apdu_len], 0, rpdata->object_type, rpdata->object_instance); apdu_len += len; } if (rpdata->object_property <= 4194303) { /* check bounds so that we could create malformed messages for testing */ len = encode_context_enumerated(&apdu[apdu_len], 1, rpdata->object_property); apdu_len += len; } /* optional array index */ if (rpdata->array_index != BACNET_ARRAY_ALL) { len = encode_context_unsigned(&apdu[apdu_len], 2, rpdata->array_index); apdu_len += len; } } return apdu_len; }
/*************************************************** ** ** Creates an Unconfirmed Event Notification APDU ** ****************************************************/ int alarm_ack_encode_apdu( uint8_t * apdu, uint8_t invoke_id, BACNET_ALARM_ACK_DATA * data) { int len = 0; /* length of each encoding */ int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM; /* service choice */ apdu_len = 4; len = alarm_ack_encode_service_request(&apdu[apdu_len], data); apdu_len += len; } return apdu_len; }
int lso_encode_apdu( uint8_t * apdu, uint8_t invoke_id, BACNET_LSO_DATA * data) { int len = 0; /* length of each encoding */ int apdu_len = 0; /* total length of the apdu, return value */ if (apdu && data) { apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); apdu[2] = invoke_id; apdu[3] = SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION; apdu_len = 4; /* tag 0 - requestingProcessId */ len = encode_context_unsigned(&apdu[apdu_len], 0, data->processId); apdu_len += len; /* tag 1 - requestingSource */ len = encode_context_character_string(&apdu[apdu_len], 1, &data->requestingSrc); apdu_len += len; /* Operation */ len = encode_context_enumerated(&apdu[apdu_len], 2, data->operation); apdu_len += len; /* Object ID */ len = encode_context_object_id(&apdu[apdu_len], 3, (int) data->targetObject.type, data->targetObject.instance); apdu_len += len; } return apdu_len; }