コード例 #1
0
ファイル: Messages.cpp プロジェクト: jpfy/MQTT-SN
uint16_t MQTTMessage::serialize(uint8_t* buf){
	RemainingLength remLen;
	remLen.encode(_remainLength);

	*buf++ = _type | _flags;
	remLen.serialize(buf);
	buf += remLen.getSize();

	if(remLen.decode() > 0){
		setUint16(buf, _messageId);
	}
	return 1 + remLen.getSize() + remLen.decode();
}
コード例 #2
0
ファイル: Messages.cpp プロジェクト: jpfy/MQTT-SN
bool MQTTPublish::deserialize(uint8_t* buf){
	uint8_t pos = 2;

	_type = *buf & 0xf0;
	if(_type != MQTT_TYPE_PUBLISH){
		return false;
	}
	RemainingLength remLen;

	_flags = *buf & 0x0f;
	remLen.deserialize(buf + 1);
	_remainLength = remLen.decode();

	buf += 1 + remLen.getSize();
	_topic = string((char*)buf + 2, getUint16(buf));

	buf += _topic.size() + 2;
	if(getQos()){
		_messageId = getUint16(buf);
		buf += 2;
		pos += 2;
	}
	_len = _remainLength - _topic.size() - pos;
	_payload = mqcalloc(_len);
	memcpy(_payload, buf, _len);
	return true;
}
コード例 #3
0
ファイル: Messages.cpp プロジェクト: jpfy/MQTT-SN
uint16_t MQTTConnect::serialize(uint8_t* buf){
	uint16_t len;
	string protocol;
	if(_protocol == MQTT_PROTOCOL_VER4){
		protocol = MQTT_PROTOCOL_NAME4;
		len = 10;
	}else{
		protocol = MQTT_PROTOCOL_NAME3;
		len = 12;
	}

	len += _clientId.size() + 2;

	if(_connectFlags & 0x0c){  // Will Topic & Message
		len += _willTopic.size() + 2;
		len += _willMessage.size() + 2;
	}
	if(_connectFlags & 0x80){  // User Name
		len += _userName.size() + 2;
	}
	if(_connectFlags & 0x40){  // Password
		len += _password.size() + 2;
	}
	RemainingLength remLen;
	remLen.encode(len);
	_remainLength = len;

	*buf++ = _type | _flags;
	remLen.serialize(buf);
	buf += remLen.getSize();

	utfSerialize(buf, protocol);
	buf += protocol.size() + 2;
	*buf++ = _protocol;
	*buf++ = _connectFlags;
	setUint16(buf++, _keepAliveTime);

	utfSerialize(++buf,_clientId); // copy clienId
	buf += _clientId.size() + 2;

	if(_connectFlags & 0x0c){  // Will Topic & Message
		utfSerialize(buf,_willTopic);
		buf += _willTopic.size() + 2;
		utfSerialize(buf,_willMessage);
		buf += _willMessage.size() + 2;
	}
	if(_connectFlags & 0x80){  // User Name
		utfSerialize(buf,_userName);
		buf += _userName.size() + 2;
	}
	if(_connectFlags & 0x40){  // Password
		utfSerialize(buf,_password);
	}

	return 1 + remLen.getSize() + remLen.decode();

}
コード例 #4
0
ファイル: Messages.cpp プロジェクト: jpfy/MQTT-SN
uint16_t MQTTUnsubscribe::serialize(uint8_t* buf){
	RemainingLength remLen;
	_remainLength = _topic.size() + 4;
	remLen.encode(_remainLength);

	*buf++ = _type | 0x02;
	remLen.serialize(buf);
	buf += remLen.getSize();
	setUint16(buf, _messageId);
	buf += 2;
	utfSerialize(buf,_topic);
	return 1 + remLen.getSize() + remLen.decode();
}
コード例 #5
0
ファイル: Messages.cpp プロジェクト: jpfy/MQTT-SN
uint16_t MQTTSubscribe::serialize(uint8_t* buf){
	RemainingLength remLen;
	_remainLength = _topic.size() + 5; //length:2, Topic:n, QoS:1
	remLen.encode(_remainLength);

	*buf++ = _type | 0x02;   //SUBSCRIBE QoS1
	remLen.serialize(buf);
	buf += remLen.getSize();
	setUint16(buf, _messageId);
	buf += 2;
	utfSerialize(buf,_topic);
	buf += 2 + _topic.size();
	*buf = _qos;
	return 1 + remLen.getSize() + remLen.decode();
}
コード例 #6
0
ファイル: Messages.cpp プロジェクト: cxcco/MQTT-S-Gateway
uint16_t MQTTPublish::serialize(uint8_t* buf){
	RemainingLength remLen;
	_remainLength = _topic.size() + 2 + 2 + _len; // topic,MessageID,Payload
	remLen.encode(_remainLength);

	*buf++ = (_type & 0xf0) | (_flags & 0x0f);
	remLen.serialize(buf);
	buf += remLen.getSize();
	utfSerialize(buf, _topic);
	buf += _topic.size() + 2;
	setUint16(buf, _messageId);
	memcpy(buf + 2, _payload, _len);

	return 1 + remLen.getSize() + remLen.decode();
}
コード例 #7
0
ファイル: Messages.cpp プロジェクト: cxcco/MQTT-S-Gateway
bool MQTTMessage::deserialize(uint8_t* buf){
	RemainingLength remLen;

	_type = *buf & 0xf0;
	_flags = *buf & 0x0f;
	remLen.deserialize(buf + 1);
	_remainLength = remLen.decode();

	switch(_type){
		case MQTT_TYPE_PINGRESP:
			return true;
			break;
		case MQTT_TYPE_UNSUBACK:
		case MQTT_TYPE_PUBACK:
			_messageId = getUint16(buf + 2);
			break;
		default:
			return false;
	}
	return true;
}