added I-Am reception to the linux port.
This commit is contained in:
+28
-10
@@ -72,7 +72,7 @@ int iam_encode_apdu(
|
|||||||
return apdu_len;
|
return apdu_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iam_decode_apdu(
|
int iam_decode_service_request(
|
||||||
uint8_t *apdu,
|
uint8_t *apdu,
|
||||||
uint32_t *pDevice_id,
|
uint32_t *pDevice_id,
|
||||||
unsigned *pMax_apdu,
|
unsigned *pMax_apdu,
|
||||||
@@ -88,16 +88,7 @@ int iam_decode_apdu(
|
|||||||
unsigned int decoded_value = 0;
|
unsigned int decoded_value = 0;
|
||||||
int decoded_integer = 0;
|
int decoded_integer = 0;
|
||||||
|
|
||||||
// valid data?
|
|
||||||
if (!apdu)
|
|
||||||
return -1;
|
|
||||||
// optional checking - most likely was already done prior to this call
|
|
||||||
if (apdu[0] != PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST)
|
|
||||||
return -1;
|
|
||||||
if (apdu[1] != SERVICE_UNCONFIRMED_I_AM)
|
|
||||||
return -1;
|
|
||||||
// OBJECT ID - object id
|
// OBJECT ID - object id
|
||||||
apdu_len = 2;
|
|
||||||
len = decode_tag_number_and_value(&apdu[apdu_len], &tag_number, &len_value);
|
len = decode_tag_number_and_value(&apdu[apdu_len], &tag_number, &len_value);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
if (tag_number != BACNET_APPLICATION_TAG_OBJECT_ID)
|
if (tag_number != BACNET_APPLICATION_TAG_OBJECT_ID)
|
||||||
@@ -143,6 +134,33 @@ int iam_decode_apdu(
|
|||||||
return apdu_len;
|
return apdu_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iam_decode_apdu(
|
||||||
|
uint8_t *apdu,
|
||||||
|
uint32_t *pDevice_id,
|
||||||
|
unsigned *pMax_apdu,
|
||||||
|
int *pSegmentation,
|
||||||
|
uint16_t *pVendor_id)
|
||||||
|
{
|
||||||
|
int apdu_len = 0; // total length of the apdu, return value
|
||||||
|
|
||||||
|
// valid data?
|
||||||
|
if (!apdu)
|
||||||
|
return -1;
|
||||||
|
// optional checking - most likely was already done prior to this call
|
||||||
|
if (apdu[0] != PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST)
|
||||||
|
return -1;
|
||||||
|
if (apdu[1] != SERVICE_UNCONFIRMED_I_AM)
|
||||||
|
return -1;
|
||||||
|
apdu_len = iam_decode_service_request(
|
||||||
|
&apdu[2],
|
||||||
|
pDevice_id,
|
||||||
|
pMax_apdu,
|
||||||
|
pSegmentation,
|
||||||
|
pVendor_id);
|
||||||
|
|
||||||
|
return apdu_len;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|||||||
@@ -44,6 +44,13 @@ int iam_encode_apdu(
|
|||||||
int segmentation,
|
int segmentation,
|
||||||
uint16_t vendor_id);
|
uint16_t vendor_id);
|
||||||
|
|
||||||
|
int iam_decode_service_request(
|
||||||
|
uint8_t *apdu,
|
||||||
|
uint32_t *pDevice_id,
|
||||||
|
unsigned *pMax_apdu,
|
||||||
|
int *pSegmentation,
|
||||||
|
uint16_t *pVendor_id);
|
||||||
|
|
||||||
int iam_decode_apdu(
|
int iam_decode_apdu(
|
||||||
uint8_t *apdu,
|
uint8_t *apdu,
|
||||||
uint32_t *pDevice_id,
|
uint32_t *pDevice_id,
|
||||||
|
|||||||
@@ -120,6 +120,29 @@ void WhoIsHandler(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IAmHandler(
|
||||||
|
uint8_t *service_request,
|
||||||
|
uint16_t service_len,
|
||||||
|
BACNET_ADDRESS *src)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
uint32_t device_id = 0;
|
||||||
|
unsigned max_apdu = 0;
|
||||||
|
int segmentation = 0;
|
||||||
|
uint16_t vendor_id = 0;
|
||||||
|
|
||||||
|
len = iam_decode_service_request(
|
||||||
|
service_request,
|
||||||
|
&device_id,
|
||||||
|
&max_apdu,
|
||||||
|
&segmentation,
|
||||||
|
&vendor_id);
|
||||||
|
if (len != -1)
|
||||||
|
fprintf(stderr,"Received I-Am Request from %u!\n",device_id);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void ReadPropertyHandler(
|
void ReadPropertyHandler(
|
||||||
uint8_t *service_request,
|
uint8_t *service_request,
|
||||||
uint16_t service_len,
|
uint16_t service_len,
|
||||||
@@ -261,6 +284,9 @@ static void Init_Service_Handlers(void)
|
|||||||
apdu_set_unconfirmed_handler(
|
apdu_set_unconfirmed_handler(
|
||||||
SERVICE_UNCONFIRMED_WHO_IS,
|
SERVICE_UNCONFIRMED_WHO_IS,
|
||||||
WhoIsHandler);
|
WhoIsHandler);
|
||||||
|
apdu_set_unconfirmed_handler(
|
||||||
|
SERVICE_UNCONFIRMED_I_AM,
|
||||||
|
IAmHandler);
|
||||||
|
|
||||||
// set the handler for all the services we don't implement
|
// set the handler for all the services we don't implement
|
||||||
// It is required to send the proper reject message...
|
// It is required to send the proper reject message...
|
||||||
|
|||||||
Reference in New Issue
Block a user