/* find a specific device, or use -1 for limit if you want unlimited */ void Send_I_Have( uint32_t device_id, BACNET_OBJECT_TYPE object_type, uint32_t object_instance, char *object_name) { int len = 0; int pdu_len = 0; BACNET_ADDRESS dest; int bytes_sent = 0; BACNET_I_HAVE_DATA data; BACNET_NPDU_DATA npdu_data; /* if we are forbidden to send, don't send! */ if (!dcc_communication_enabled()) return; /* Who-Has is a global broadcast */ datalink_get_broadcast_address(&dest); /* encode the NPDU portion of the packet */ npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL); pdu_len = npdu_encode_pdu(&Handler_Transmit_Buffer[0], &dest, NULL, &npdu_data); /* encode the APDU portion of the packet */ data.device_id.type = OBJECT_DEVICE; data.device_id.instance = device_id; data.object_id.type = object_type; data.object_id.instance = object_instance; characterstring_init_ansi(&data.object_name, object_name); len = ihave_encode_apdu(&Handler_Transmit_Buffer[pdu_len], &data); pdu_len += len; /* send the data */ bytes_sent = datalink_send_pdu(&dest, &npdu_data, &Handler_Transmit_Buffer[0], pdu_len); #if PRINT_ENABLED if (bytes_sent <= 0) fprintf(stderr, "Failed to Send I-Have Reply (%s)!\n", strerror(errno)); #endif }
void testIHaveData( Test * pTest, BACNET_I_HAVE_DATA * data) { uint8_t apdu[480] = { 0 }; int len = 0; int apdu_len = 0; BACNET_I_HAVE_DATA test_data; len = ihave_encode_apdu(&apdu[0], data); ct_test(pTest, len != 0); apdu_len = len; len = ihave_decode_apdu(&apdu[0], apdu_len, &test_data); ct_test(pTest, len != -1); ct_test(pTest, test_data.device_id.type == data->device_id.type); ct_test(pTest, test_data.device_id.instance == data->device_id.instance); ct_test(pTest, test_data.object_id.type == data->object_id.type); ct_test(pTest, test_data.object_id.instance == data->object_id.instance); ct_test(pTest, characterstring_same(&test_data.object_name, &data->object_name)); }