/************************************************************************************** * Copyright (c) 2018, Tomoaki Yamaguchi * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Tomoaki Yamaguchi - initial API and implementation and/or initial documentation **************************************************************************************/ #include "MQTTSNGWPacket.h" #include "MQTTSNGWEncapsulatedPacket.h" #include "MQTTSNPacket.h" #include using namespace MQTTSNGW; using namespace std; WirelessNodeId::WirelessNodeId() : _len{0}, _nodeId{0} { } WirelessNodeId::~WirelessNodeId() { if ( _nodeId ) { free(_nodeId); } } void WirelessNodeId::setId(uint8_t* id, uint8_t len) { if ( _nodeId ) { free(_nodeId); } uint8_t* buf = (uint8_t*)malloc(len); if ( buf ) { memcpy(buf, id, len); _len = len; _nodeId = buf; } else { _nodeId = nullptr; _len = 0; } } void WirelessNodeId::setId(WirelessNodeId* id) { setId(id->_nodeId, id->_len); } bool WirelessNodeId::operator ==(WirelessNodeId& id) { if ( _len == id._len ) { return memcmp(_nodeId, id._nodeId, _len) == 0; } else { return false; } } /* * Class MQTTSNGWEncapsulatedPacket */ MQTTSNGWEncapsulatedPacket::MQTTSNGWEncapsulatedPacket() : _mqttsn{0}, _ctrl{0} { } MQTTSNGWEncapsulatedPacket::MQTTSNGWEncapsulatedPacket(MQTTSNPacket* packet) : _mqttsn{packet}, _ctrl{0} { } MQTTSNGWEncapsulatedPacket::~MQTTSNGWEncapsulatedPacket() { /* Do not delete the MQTTSNPacket. MQTTSNPacket is deleted by delete Event */ } int MQTTSNGWEncapsulatedPacket::unicast(SensorNetwork* network, SensorNetAddress* sendTo) { uint8_t buf[MQTTSNGW_MAX_PACKET_SIZE]; int len = serialize(buf); return network->unicast(buf, len, sendTo); } int MQTTSNGWEncapsulatedPacket::serialize(uint8_t* buf) { int len = 0; buf[0] = _id._len + 3; buf[1] = MQTTSN_ENCAPSULATED; buf[2] = _ctrl; memcpy( buf + 3, _id._nodeId, _id._len); if ( _mqttsn ) { len = _mqttsn->getPacketLength(); memcpy(buf + buf[0], _mqttsn->getPacketData(), len); } return buf[0] + len; } int MQTTSNGWEncapsulatedPacket::desirialize(unsigned char* buf, unsigned short len) { if ( _mqttsn ) { delete _mqttsn; _mqttsn = nullptr; } _ctrl = buf[2]; _id.setId(buf + 3, buf[0] - 3); _mqttsn = new MQTTSNPacket; _mqttsn->desirialize(buf + buf[0], len - buf[0]); return buf[0]; } int MQTTSNGWEncapsulatedPacket::getType(void) { return MQTTSN_ENCAPSULATED; } const char* MQTTSNGWEncapsulatedPacket::getName() { return MQTTSNPacket_name(MQTTSN_ENCAPSULATED); } MQTTSNPacket* MQTTSNGWEncapsulatedPacket::getMQTTSNPacket(void) { return _mqttsn; } WirelessNodeId* MQTTSNGWEncapsulatedPacket::getWirelessNodeId(void) { return &_id; } void MQTTSNGWEncapsulatedPacket::setWirelessNodeId(WirelessNodeId* id) { _id.setId(id); } char* MQTTSNGWEncapsulatedPacket::print(char* pbuf) { char* ptr = pbuf; char** pptr = &pbuf; uint8_t buf[MQTTSNGW_MAX_PACKET_SIZE]; int len = serialize(buf); int size = len > SIZE_OF_LOG_PACKET ? SIZE_OF_LOG_PACKET : len; for (int i = 1; i < size; i++) { sprintf(*pptr, " %02X", *(buf + i)); *pptr += 3; } **pptr = 0; return ptr; }