封装消息协议,未完成
This commit is contained in:
parent
b7d44401b6
commit
6d611f30e4
|
@ -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)
|
||||
{
|
||||
}
|
|
@ -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
|
|
@ -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表示广播。
|
||||
|
|
Loading…
Reference in New Issue