全面升级数据传输接口,使用安全的字节数据来传递数据。

回调函数中增加额外的参数,用于传递会话参数,比如UDP中的远程地址
This commit is contained in:
nnhy 2015-09-17 10:08:22 +00:00
parent 129f084572
commit f11eb549c6
25 changed files with 166 additions and 238 deletions

View File

@ -704,8 +704,9 @@ byte Enc28j60::GetRevision()
return ReadReg(EREVID);
}
bool Enc28j60::OnWrite(const byte* packet, uint len)
bool Enc28j60::OnWrite(const ByteArray& bs)
{
uint len = bs.Length();
assert_param2(len <= MAX_FRAMELEN, "以太网数据帧超大");
if(!Linked())
@ -735,7 +736,7 @@ bool Enc28j60::OnWrite(const byte* packet, uint len)
WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);
// 复制数据包到传输缓冲区
WriteBuffer(packet, len);
WriteBuffer(bs.GetBuffer(), len);
/*
SPI接口向ECON1寄存器的 TXRST 1
@ -804,6 +805,7 @@ bool Enc28j60::OnWrite(const byte* packet, uint len)
ReadBuffer((byte*)&TXStatus, sizeof(TXStatus));
#if NET_DEBUG
byte* packet = bs.GetBuffer();
MacAddress dest = packet;
MacAddress src = packet + 6;
dest.Show();
@ -925,7 +927,7 @@ bool Enc28j60::OnWrite(const byte* packet, uint len)
// 从网络接收缓冲区获取一个数据包,该包开头是以太网头
// packet该包应该存储到的缓冲区maxlen可接受的最大数据长度
uint Enc28j60::OnRead(byte* packet, uint maxlen)
uint Enc28j60::OnRead(ByteArray& bs)
{
uint rxstat;
uint len;
@ -965,7 +967,7 @@ uint Enc28j60::OnRead(byte* packet, uint maxlen)
rxstat = ReadOp(ENC28J60_READ_BUF_MEM, 0);
rxstat |= ReadOp(ENC28J60_READ_BUF_MEM, 0) << 8;
// 限制获取的长度。有些例程这里不用减一
if (len > maxlen - 1) len = maxlen - 1;
if (len > bs.Length() - 1) len = bs.Length() - 1;
// 检查CRC和符号错误
// ERXFCON.CRCEN是默认设置。通常我们不需要检查
@ -977,8 +979,9 @@ uint Enc28j60::OnRead(byte* packet, uint maxlen)
else
{
// 从缓冲区中将数据包复制到packet中
ReadBuffer(packet, len);
ReadBuffer(bs.GetBuffer(), len);
}
bs.SetLength(len);
// 移动接收缓冲区 读指针
WriteReg(ERXRDPTL, (NextPacketPtr));
WriteReg(ERXRDPTH, (NextPacketPtr) >> 8);

View File

@ -58,8 +58,8 @@ protected:
virtual bool OnOpen();
virtual void OnClose() { }
virtual bool OnWrite(const byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len);
virtual bool OnWrite(const ByteArray& bs);
virtual uint OnRead(ByteArray& bs);
};
#endif

View File

@ -834,7 +834,7 @@ void NRF24L01::OnClose()
}
// 从NRF的接收缓冲区中读出数据
uint NRF24L01::OnRead(byte *data, uint len)
uint NRF24L01::OnRead(ByteArray& bs)
{
// 亮灯。离开时自动熄灯
//PortScope ps(LedRx);
@ -871,12 +871,13 @@ uint NRF24L01::OnRead(byte *data, uint len)
else
rs = ReadReg(RX_PL_WID);
uint len = bs.Capacity();
if(rs > len)
{
debug_printf("NRF24L01::Read 实际负载%d缓冲区大小%d为了稳定使用缓冲区大小\r\n", rs, len);
rs = len;
}
ReadBuf(RD_RX_PLOAD, data, rs); // 读取数据
ReadBuf(RD_RX_PLOAD, bs.GetBuffer(), rs); // 读取数据
}
}
@ -890,11 +891,13 @@ uint NRF24L01::OnRead(byte *data, uint len)
//_CE = true;
if(rs && LedRx) *LedRx = !*LedRx;
bs.SetLength(rs);
return rs;
}
// 向NRF的发送缓冲区中写入数据
bool NRF24L01::OnWrite(const byte* data, uint len)
bool NRF24L01::OnWrite(const ByteArray& bs)
{
// 亮灯。离开时自动熄灯
//PortScope ps(LedTx);
@ -923,9 +926,10 @@ bool NRF24L01::OnWrite(const byte* data, uint len)
byte cmd = AutoAnswer ? WR_TX_PLOAD : TX_NOACK;
// 检查要发送数据的长度
uint len = bs.Length();
assert_param(PayloadWidth == 0 || len <= PayloadWidth);
if(PayloadWidth > 0) len = PayloadWidth;
WriteBuf(cmd, data, len);
WriteBuf(cmd, bs.GetBuffer(), len);
// 进入TX维持一段时间
_CE = true;
@ -1042,15 +1046,20 @@ void NRF24L01::OnIRQ()
if(st.RX_DR)
{
byte buf[64];
uint len = Read(buf, ArrayLength(buf));
ByteArray bs;
uint len = Read(bs);
//ClearStatus(false, true);
if(len)
{
len = OnReceive(buf, len);
uint addr = st.RX_P_NO;
len = OnReceive(bs, (void*)addr);
// 如果有返回,说明有数据要回复出去
if(len) Write(buf, len);
if(len)
{
bs.SetLength(len, true);
Write(bs);
}
}
return;
}

View File

@ -1,21 +1,12 @@
#include "ShunCom.h"
ShunCom::ShunCom()
{
Port = NULL;
}
ShunCom::~ShunCom()
{
delete Port;
Port = NULL;
}
ShunCom::ShunCom() { }
void ShunCom::Init(ITransport* port, Pin rst)
{
assert_ptr(port);
Port = port;
Set(port);
if(rst != P0) Reset.Set(rst);
}
@ -37,7 +28,7 @@ bool ShunCom::OnOpen()
Sys.Delay(100);
Reset = true;
return Port->Open();
return PackPort::OnOpen();
}
void ShunCom::OnClose()
@ -48,27 +39,5 @@ void ShunCom::OnClose()
Reset.Close();
Port->Close();
}
bool ShunCom::OnWrite(const byte* buf, uint len) { return Port->Write(buf, len); }
uint ShunCom::OnRead(byte* buf, uint len) { return Port->Read(buf, len); }
// 注册回调函数
void ShunCom::Register(TransportHandler handler, void* param)
{
ITransport::Register(handler, param);
if(handler)
Port->Register(OnPortReceive, this);
else
Port->Register(NULL);
}
uint ShunCom::OnPortReceive(ITransport* sender, byte* buf, uint len, void* param)
{
assert_ptr(param);
ShunCom* zb = (ShunCom*)param;
return zb->OnReceive(buf, len);
PackPort::OnClose();
}

View File

@ -7,12 +7,11 @@
// 上海顺舟Zigbee协议
// 主站发送所有从站收到,从站发送只有主站收到
class ShunCom : public ITransport
class ShunCom : public PackPort
{
private:
public:
ITransport* Port; // 传输口
OutputPort Reset; // 复位
OutputPort Power; // 电源
@ -24,23 +23,14 @@ public:
InputPort Alarm; // 警告错误
ShunCom();
virtual ~ShunCom();
void Init(ITransport* port, Pin rst = P0);
// 注册回调函数
virtual void Register(TransportHandler handler, void* param = NULL);
virtual string ToString() { return "ShunCom"; }
protected:
virtual bool OnOpen();
virtual void OnClose();
virtual bool OnWrite(const byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len);
static uint OnPortReceive(ITransport* sender, byte* buf, uint len, void* param);
};
#endif

View File

@ -1077,17 +1077,13 @@ bool HardSocket::Send(const ByteArray& bs)
return true;
}
bool HardSocket::OnWrite(const byte* buf, uint len)
bool HardSocket::OnWrite(const ByteArray& bs)
{
ByteArray bs(buf,len);
return Send(bs);
}
uint HardSocket::OnRead(byte* buf, uint len)
uint HardSocket::OnRead(ByteArray& bs)
{
ByteArray bs(buf, len);
// 不容 ByteArray 偷梁换柱把buf换掉
return Receive(bs);
}
@ -1286,7 +1282,7 @@ void TcpClient::RaiseReceive()
if(size > 1500)return;
// 回调中断
OnReceive(bs.GetBuffer(), size);
OnReceive(bs, NULL);
}
/****************************** UdpClient ************************************/
@ -1352,6 +1348,7 @@ void UdpClient::RaiseReceive()
IPEndPoint ep(bs2);
ep.Port = __REV16(ep.Port);
// 回调中断
OnReceive(ms.ReadBytes(len), len);
ByteArray bs3(ms.ReadBytes(len), len);
OnReceive(bs3, NULL);
};
}

View File

@ -117,8 +117,8 @@ public:
virtual bool OnOpen();
virtual void OnClose();
virtual bool OnWrite(const byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len);
virtual bool OnWrite(const ByteArray& bs);
virtual uint OnRead(ByteArray& bs);
// 发送数据
virtual bool Send(const ByteArray& bs);

View File

@ -78,8 +78,8 @@ protected:
virtual bool OnOpen();
virtual void OnClose();
virtual bool OnWrite(const byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len);
virtual bool OnWrite(const ByteArray& bs);
virtual uint OnRead(ByteArray& bs);
};
#endif

View File

@ -50,8 +50,11 @@ void Controller::Close()
Opened = false;
}
uint Controller::Dispatch(ITransport* port, byte* buf, uint len, void* param)
uint Controller::Dispatch(ITransport* port, ByteArray& bs, void* param, void* param2)
{
byte* buf = bs.GetBuffer();
uint len = bs.Length();
assert_ptr(buf);
assert_ptr(param);
@ -137,11 +140,12 @@ bool Controller::Send(Message& msg)
// 带有负载数据,需要合并成为一段连续的内存
msg.Write(ms);
//assert_param2(len == ms.Position(), "消息标称大小和实际大小不符");
uint len = ms.Position();
/*uint len = ms.Position();
// 内存流扩容以后,指针会改变
byte* p = ms.GetBuffer();
byte* p = ms.GetBuffer();*/
return Port->Write(p, len);
ByteArray bs(ms.GetBuffer(), ms.Position());
return Port->Write(bs);
}
bool Controller::Reply(Message& msg)

View File

@ -14,7 +14,7 @@ typedef bool (*MessageHandler)(Message& msg, void* param);
class Controller
{
private:
static uint Dispatch(ITransport* port, byte* buf, uint len, void* param);
static uint Dispatch(ITransport* port, ByteArray& bs, void* param, void* param2);
protected:

View File

@ -193,9 +193,8 @@ void Dhcp::PareOption(Stream& ms)
}
}
uint Dhcp::OnReceive(ITransport* port, byte* buf, uint len, void* param)
uint Dhcp::OnReceive(ITransport* port, ByteArray& bs, void* param, void* param2)
{
ByteArray bs(buf, len);
((Dhcp*)param)->Process(bs);
return 0;

View File

@ -35,7 +35,7 @@ public:
EventHandler OnStop;
private:
static uint OnReceive(ITransport* port, byte* buf, uint len, void* param);
static uint OnReceive(ITransport* port, ByteArray& bs, void* param, void* param2);
void Process(ByteArray& bs);
};

View File

@ -6,7 +6,7 @@
class ITransport;
// 传输口数据到达委托。传入数据缓冲区地址和长度,如有反馈,仍使用该缓冲区,返回数据长度
typedef uint (*TransportHandler)(ITransport* transport, byte* buf, uint len, void* param);
typedef uint (*TransportHandler)(ITransport* port, ByteArray& bs, void* param, void* param2);
// 帧数据传输接口
// 实现者确保数据以包的形式传输,屏蔽数据的粘包和拆包
@ -66,17 +66,6 @@ public:
Opened = false;
}
// 发送数据
bool Write(const byte* buf, uint len)
{
// 特别是接口要检查this指针
assert_ptr(this);
if(!Opened && !Open()) return false;
return OnWrite(buf, len);
}
// 发送数据
bool Write(const ByteArray& bs)
{
@ -85,18 +74,7 @@ public:
if(!Opened && !Open()) return false;
return OnWrite(bs.GetBuffer(), bs.Length());
}
// 接收数据
uint Read(byte* buf, uint len)
{
// 特别是接口要检查this指针
assert_ptr(this);
if(!Opened && !Open()) return 0;
return OnRead(buf, len);
return OnWrite(bs);
}
// 接收数据
@ -107,7 +85,7 @@ public:
if(!Opened && !Open()) return 0;
return OnRead(bs.GetBuffer(), bs.Length());
return OnRead(bs);
}
// 注册回调函数
@ -116,18 +94,8 @@ public:
// 特别是接口要检查this指针
assert_ptr(this);
if(handler)
{
_handler = handler;
_param = param;
//if(!Opened) Open();
}
else
{
_handler = NULL;
_param = NULL;
}
_handler = handler;
_param = param;
}
#if DEBUG
@ -139,19 +107,62 @@ public:
protected:
virtual bool OnOpen() { return true; }
virtual void OnClose() { }
virtual bool OnWrite(const byte* buf, uint len) = 0;
virtual uint OnRead(byte* buf, uint len) = 0;
virtual bool OnWrite(const ByteArray& bs) = 0;
virtual uint OnRead(ByteArray& bs) = 0;
// 是否有回调函数
bool HasHandler() { return _handler != NULL; }
// 引发数据到达事件
virtual uint OnReceive(byte* buf, uint len)
virtual uint OnReceive(ByteArray& bs, void* param)
{
if(_handler) return _handler(this, buf, len, _param);
if(_handler) return _handler(this, bs, _param, param);
return 0;
}
};
// 数据口包装
class PackPort : public ITransport
{
private:
//ITransport* _port;
public:
ITransport* Port; // 传输口
virtual ~PackPort()
{
if(Port) Port->Register(NULL);
delete Port;
}
virtual void Set(ITransport* port)
{
if(Port) Port->Register(NULL);
Port = port;
if(Port) Port->Register(OnPortReceive, this);
}
virtual string ToString() { return "PackPort"; }
protected:
virtual bool OnOpen() { return Port->Open(); }
virtual void OnClose() { Port->Close(); }
virtual bool OnWrite(const ByteArray& bs) { return Port->Write(bs); }
virtual uint OnRead(ByteArray& bs) { return Port->Read(bs); }
static uint OnPortReceive(ITransport* sender, ByteArray& bs, void* param, void* param2)
{
assert_ptr(param);
//PackPort* pp = (PackPort*)param;
PackPort* pp = dynamic_cast<PackPort*>((PackPort*)param);
return pp->OnReceive(bs, param2);
}
};
#endif

View File

@ -1,34 +1,20 @@
#include "Zigbee.h"
Zigbee::Zigbee()
{
_port = NULL;
}
Zigbee::Zigbee() { }
Zigbee::Zigbee(ITransport* port, Pin rst)
{
Init(port);
}
Zigbee::~Zigbee()
{
delete _port;
_port = NULL;
/*if(_rst) delete _rst;
_rst = NULL;*/
}
void Zigbee::Init(ITransport* port, Pin rst)
{
assert_ptr(port);
_port = port;
Set(port);
//_rst = NULL;
if(rst != P0)
{
//_rst = new OutputPort(rst);
_rst.Set(rst).Open();
Reset();
}
@ -44,22 +30,3 @@ void Zigbee::Reset(void)
Sys.Delay(100);
_rst = true;
}
// 注册回调函数
void Zigbee::Register(TransportHandler handler, void* param)
{
ITransport::Register(handler, param);
if(handler)
_port->Register(OnPortReceive, this);
else
_port->Register(NULL);
}
uint Zigbee::OnPortReceive(ITransport* sender, byte* buf, uint len, void* param)
{
assert_ptr(param);
Zigbee* zb = (Zigbee*)param;
return zb->OnReceive(buf, len);
}

View File

@ -7,33 +7,19 @@
// Zigbee协议
// 主站发送所有从站收到,从站发送只有主站收到
class Zigbee : public ITransport
class Zigbee : public PackPort
{
private:
ITransport* _port;
OutputPort _rst;
public:
Zigbee();
Zigbee(ITransport* port, Pin rst = P0);
virtual ~Zigbee();
void Init(ITransport* port, Pin rst = P0);
// 注册回调函数
virtual void Register(TransportHandler handler, void* param = NULL);
virtual void Reset(void);
virtual string ToString() { return "Zigbee"; }
protected:
virtual bool OnOpen() { return _port->Open(); }
virtual void OnClose() { _port->Close(); }
virtual bool OnWrite(const byte* buf, uint len) { return _port->Write(buf, len); }
virtual uint OnRead(byte* buf, uint len) { return _port->Read(buf, len); }
static uint OnPortReceive(ITransport* sender, byte* buf, uint len, void* param);
};
#endif

View File

@ -7,13 +7,10 @@ Queue::Queue(uint len)
}
// 使用缓冲区初始化缓冲区。注意此时指针位于0而内容长度为缓冲区长度
Queue::Queue(byte* buf, uint len)
Queue::Queue(ByteArray& bs)
{
assert_ptr(buf);
//assert_param2(len > 0, "不能用0长度缓冲区来初始化缓冲区");
_Buffer = buf;
_Capacity = len;
_Buffer = bs.GetBuffer();
_Capacity = bs.Length();
_size = 0;
_head = 0;
_tail = 0;
@ -96,8 +93,11 @@ byte Queue::Peek() const
return _Buffer[_tail];
}
uint Queue::Write(const byte* buf, uint len, bool safe)
uint Queue::Write(const ByteArray& bs, bool safe)
{
byte* buf = bs.GetBuffer();
uint len = bs.Length();
uint rs = 0;
while(true)
{
@ -135,10 +135,13 @@ uint Queue::Write(const byte* buf, uint len, bool safe)
return rs;
}
uint Queue::Read(byte* buf, uint len, bool safe)
uint Queue::Read(ByteArray& bs, bool safe)
{
if(_size == 0) return 0;
byte* buf = bs.GetBuffer();
uint len = bs.Length();
if(len > _size) len = _size;
uint rs = 0;
@ -177,5 +180,7 @@ uint Queue::Read(byte* buf, uint len, bool safe)
if(_size == 0) _tail = _head;
}
bs.SetLength(rs, true);
return rs;
}

View File

@ -24,7 +24,7 @@ public:
// 分配指定大小的缓冲区
Queue(uint len = 0);
// 使用缓冲区初始化缓冲区。注意此时指针位于0而内容长度为缓冲区长度
Queue(byte* buf, uint len);
Queue(ByteArray& bs);
// 销毁缓冲区
~Queue();
@ -41,8 +41,8 @@ public:
byte Pop();
byte Peek() const;
uint Write(const byte* buf, uint len, bool safe = false); // 批量写入
uint Read(byte* buf, uint len, bool safe = false); // 批量读取
uint Write(const ByteArray& bs, bool safe = false); // 批量写入
uint Read(ByteArray& bs, bool safe = false); // 批量读取
};
#endif

View File

@ -241,19 +241,19 @@ uint SerialPort::SendData(byte data, uint times)
}
// 向某个端口写入数据。如果size为0则把data当作字符串一直发送直到遇到\0为止
bool SerialPort::OnWrite(const byte* buf, uint size)
bool SerialPort::OnWrite(const ByteArray& bs)
{
if(!size) return true;
if(!bs.Length()) return true;
// 如果队列已满,则强制刷出
if(Tx.Length() + size > Tx.Capacity()) Flush(Sys.Clock / 40000);
if(Tx.Length() + bs.Length() > Tx.Capacity()) Flush(Sys.Clock / 40000);
if(size == 0)
/*if(size == 0)
{
const byte* p = buf;
while(*p++) size++;
}
Tx.Write(buf, size, true);
}*/
Tx.Write(bs, true);
// 打开串口发送
if(RS485) *RS485 = true;
@ -296,14 +296,8 @@ void SerialPort::OnTxHandler()
}
// 从某个端口读取数据
uint SerialPort::OnRead(byte* buf, uint size)
uint SerialPort::OnRead(ByteArray& bs)
{
/*SmartIRQ irq;
uint count = Rx.Length(); // 收到的字节数
if(count > size) count = size;
for(int i=0; i<count; i++)
*buf++ = Rx.Pop();*/
// 如果有数据变化,等一会
uint count = 0;
uint len = Rx.Length();
@ -316,7 +310,8 @@ uint SerialPort::OnRead(byte* buf, uint size)
}
// 从接收队列读取
count = Rx.Read(buf, size);
count = Rx.Read(bs);
bs.SetLength(count);
// 如果还有数据,打开任务
if(!Rx.Empty()) Sys.SetTask(_taskidRx, true);
@ -344,14 +339,14 @@ void SerialPort::ReceiveTask(void* param)
assert_param2(sp, "串口参数不能为空 ReceiveTask");
// 从栈分配,节省内存
byte buf[64];
uint len = sp->Read(buf, ArrayLength(buf));
ByteArray bs;
uint len = sp->Read(bs);
if(len)
{
len = sp->OnReceive(buf, len);
assert_param(len <= ArrayLength(buf));
len = sp->OnReceive(bs, NULL);
//assert_param(len <= ArrayLength(buf));
// 如果有数据,则反馈回去
if(len) sp->Write(buf, len);
if(len) sp->Write(bs);
}
}
@ -438,8 +433,10 @@ extern "C"
if(_printf_sp)
{
//_printf_sp->SendData((byte)ch);
byte bt = (byte)ch;
_printf_sp->Write(&bt, 1);
//byte bt = (byte)ch;
//_printf_sp->Write(&bt, 1);
ByteArray bs(ch, 1);
_printf_sp->Write(bs);
}
isInFPutc = false;

View File

@ -81,8 +81,8 @@ protected:
virtual bool OnOpen();
virtual void OnClose();
virtual bool OnWrite(const byte* buf, uint size);
virtual uint OnRead(byte* buf, uint size);
virtual bool OnWrite(const ByteArray& bs);
virtual uint OnRead(ByteArray& bs);
private:
static void OnHandler(ushort num, void* param);

View File

@ -203,7 +203,8 @@ void TcpSocket::OnDataReceive(TCP_HEADER& tcp, uint len)
byte* data = tcp.Next();
// 触发ITransport接口事件
uint len2 = OnReceive(data, len);
ByteArray bs(data, len);
uint len2 = OnReceive(bs, NULL);
// 如果有返回,说明有数据要回复出去
if(len2)
{
@ -492,14 +493,12 @@ bool TcpSocket::Connect(IPAddress& ip, ushort port)
return false;
}
bool TcpSocket::OnWrite(const byte* buf, uint len)
bool TcpSocket::OnWrite(const ByteArray& bs)
{
ByteArray bs(buf, len);
Send(bs);
return len;
return Send(bs);
}
uint TcpSocket::OnRead(byte* buf, uint len)
uint TcpSocket::OnRead(ByteArray& bs)
{
// 暂时不支持
return 0;

View File

@ -67,16 +67,8 @@ protected:
virtual bool OnOpen();
virtual void OnClose();
virtual bool OnWrite(const byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len);
virtual bool OnWrite(const ByteArray& bs);
virtual uint OnRead(ByteArray& bs);
};
// Tcp客户端
/*class TcpClient : public TcpSocket
{
public:
TcpClient(TinyIP* tip);
};*/
#endif

View File

@ -66,8 +66,8 @@ void TinyIP::Init(ITransport* port)
uint TinyIP::Fetch(Stream& ms)
{
// 获取缓冲区的包
//int len = _port->Read(ms);
int len = _port->Read(ms.Current(), ms.Remain());
ByteArray bs(ms.Current(), ms.Remain());
int len = _port->Read(bs);
// 如果缓冲器里面没有数据则转入下一次循环
if(len < sizeof(ETH_HEADER)) return 0;
@ -288,7 +288,8 @@ bool TinyIP::SendEthernet(ETH_TYPE type, const MacAddress& remote, const byte* b
/*Sys.ShowHex((byte*)eth->Next(), len, '-');
debug_printf("\r\n");*/
return _port->Write((byte*)eth, len);
ByteArray bs((byte*)eth, len);
return _port->Write(bs);
}
bool TinyIP::SendIP(IP_TYPE type, const IPAddress& remote, const byte* buf, uint len)

View File

@ -72,13 +72,13 @@ void UdpSocket::OnProcess(IP_HEADER& ip, UDP_HEADER& udp, Stream& ms)
assert_param2(len <= ms.Remain(), "UDP数据包不完整");
// 触发ITransport接口事件
uint len2 = OnReceive(data, len);
ByteArray bs(data, len);
uint len2 = OnReceive(bs, &CurRemote);
// 如果有返回,说明有数据要回复出去
//if(len2) Write(data, len2);
if(len2)
{
Remote = CurRemote;
ByteArray bs(data, len2);
Send(bs);
}
@ -149,11 +149,9 @@ bool UdpSocket::Send(const ByteArray& bs)
return true;
}
bool UdpSocket::OnWrite(const byte* buf, uint len)
bool UdpSocket::OnWrite(const ByteArray& bs)
{
ByteArray bs(buf, len);
Send(bs);
return len;
return Send(bs);
}
uint UdpSocket::Receive(ByteArray& bs)
@ -161,7 +159,7 @@ uint UdpSocket::Receive(ByteArray& bs)
return 0;
}
uint UdpSocket::OnRead(byte* buf, uint len)
uint UdpSocket::OnRead(ByteArray& bs)
{
// 暂时不支持
return 0;

View File

@ -38,8 +38,8 @@ protected:
virtual bool OnOpen();
virtual void OnClose();
virtual bool OnWrite(const byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len);
virtual bool OnWrite(const ByteArray& bs);
virtual uint OnRead(ByteArray& bs);
};
#endif

View File

@ -486,7 +486,8 @@ void TinyController::Loop()
#endif
// 发送消息
Port->Write(node.Data, node.Length);
ByteArray bs(node.Data, node.Length);
Port->Write(bs);
// 增加发送次数统计
Total.Send++;