封装消息协议,未完成

This commit is contained in:
Stone 2014-09-25 04:13:29 +00:00
parent b7d44401b6
commit 6d611f30e4
3 changed files with 121 additions and 1 deletions

58
TinyNet/Message.cpp Normal file
View File

@ -0,0 +1,58 @@
#include "Message.h"
// 初始化消息各字段为0
void Message::Init()
{
memset(this, 0, sizeof(Message));
}
// 分析数据,转为消息。负载数据部分将指向数据区,外部不要提前释放内存
void Message::Parse(byte* buf, uint len)
{
assert_ptr(buf);
assert_param(len > 0);
// 消息至少4个头部字节和2个校验字节没有负载数据的情况下
const int headerSize = 4 + 2;
if(len < headerSize) return NULL;
Message* msg = (Message*)buf;
if(len > headerSize)
{
msg->Length = len - headerSize;
msg->Data = buf + headerSize;
}
return msg;
}
// 验证消息校验和是否有效
bool Verify()
{
if(!data) len == 0;
return Length == len;
}
// 构造控制器
Controller::Controller(ITransport* port)
{
assert_ptr(port);
// 注册收到数据事件
port->Register(OnReceive, this);
_port = port;
}
void Controller::OnReceive(ITransport* transport, byte* buf, uint len, void* param)
{
assert_ptr(param);
Controller* control = (Controller*)param;
control->Process(byte* buf, uint len);
}
void Controller::Process(byte* buf, uint len)
{
}

57
TinyNet/Message.h Normal file
View File

@ -0,0 +1,57 @@
#ifndef __Message_H__
#define __Message_H__
#include "Sys.h"
#include "ITransport.h"
// 消息
// 头部按照内存布局,但是数据和校验部分不是
class Message
{
private:
// 标准头部符合内存布局。注意凑够4字节否则会有很头疼的对齐问题
byte Dest; // 目的地址
byte Src; // 源地址
byte Code; // 代码
byte Reply:1; // 是否响应
byte Error:1; // 是否错误
byte Flags:6; // 标识位
// 负载数据及校验部分,并非内存布局。
ushort Checksum;// 16位检验和
ushort Length; // 数据长度
byte* Data; // 数据部分
public:
// 初始化消息各字段为0
void Init();
// 分析数据,转为消息。负载数据部分将指向数据区,外部不要提前释放内存
void Parse(byte* buf, uint len);
// 验证消息校验和是否有效
bool Verify();
public: // 静态部分
//static
};
class Controller
{
private:
ITransport* _port; // 数据传输口
void OnReceive(ITransport* transport, byte* buf, uint len, void* param);
public:
Controller(ITransport* port);
protected:
void Process(byte* buf, uint len);
}
class DiscoverMessage : public Message
{
public:
//const
}
#endif

View File

@ -7,9 +7,14 @@
4通过学习获得ID和4字节密码之后使用1字节ID进行通讯此时为工作模式校验值附加密码参与运算
指令格式:
ID FUN DATA CRC16
目标标识ID广播地址为0
1字节功能码FUN第一位表示异常第二位表示响应
多字节数据DATA
CRC16为前面数据加上随机密码的校验码
1学习请求
从机广播用于寻找网关以获取ID和密码。从机位于学习模式时不停发送学习请求知道收到应答进入工作模式为止。
从机广播用于寻找网关以获取ID和密码。从机位于学习模式时不停发送学习请求直到收到应答进入工作模式为止。
00 00 00 00 00 HD1 HD2 HD3 HD4 CRC16
首字节00表示学习模式
紧接着4字节目标物理地址4个0表示广播。