我们需要上传大型固件文件到打印机来升级设备的固件。打印机设备与我的服务器在同一网络中,我们试图上传的固件大小约为 200-500 MB。我们选择的方法是将固件(.bin文件)加载到内存流中,并使用
根据网络流的响应,我们向客户端显示固件升级的状态。以下是我们用于固件升级的代码片段。我想知道是否这是最佳方法,因为错误的方法可能会损坏设备。 编辑:
任何帮助都将不胜感激。
TcpClient
按块通过网络进行写入。根据网络流的响应,我们向客户端显示固件升级的状态。以下是我们用于固件升级的代码片段。我想知道是否这是最佳方法,因为错误的方法可能会损坏设备。 编辑:
class MyClass
{
int port = 9100;
string _deviceip;
byte[] m_ReadBuffer = null;
TcpClient _tcpclient;
NetworkStream m_NetworkStream;
static string CRLF = "\r\n";
public event EventHandler<DeviceStatus> onReceiveUpdate;
public async Task<bool> UploadFirmware(Stream _stream)
{
bool success = false;
try
{
_tcpclient = new TcpClient();
_tcpclient.Connect(_deviceip, port);
_stream.Seek(0, SeekOrigin.Begin);
m_NetworkStream = _tcpclient.GetStream();
byte[] buffer = new byte[1024];
m_ReadBuffer = new byte[1024];
int readcount = 0;
m_NetworkStream.BeginRead(m_ReadBuffer, 0, m_ReadBuffer.Length,
new AsyncCallback(EndReceive), null);
await Task.Run(() =>
{
while ((readcount = _stream.Read(buffer, 0, buffer.Length)) > 0)
{
m_NetworkStream.Write(buffer, 0, readcount);
m_NetworkStream.Flush();
}
});
success = true;
}
catch (Exception ex)
{
upgradeStatus = false;
}
return success;
}
private void EndReceive(IAsyncResult ar)
{
try
{
int nBytes;
nBytes = m_NetworkStream.EndRead(ar);
if (nBytes > 0)
{
string res = Encoding.UTF8.GetString(m_ReadBuffer, 0, nBytes);
DeviceStatus status = new DeviceStatus();
string[] readlines = res.Split(new string[] { CRLF },
StringSplitOptions.RemoveEmptyEntries);
foreach (string readline in readlines)
{
if (readline.StartsWith("CODE"))
{
//read readline string here
break;
}
}
}
if (m_NetworkStream.CanRead)
{
do
{
m_NetworkStream.BeginRead(m_ReadBuffer, 0, m_ReadBuffer.Length, new
AsyncCallback(EndReceive), null);
} while (m_NetworkStream.DataAvailable);
}
}
catch (ObjectDisposedException ods)
{
return;
}
catch (System.IO.IOException ex)
{
}
}
}
任何帮助都将不胜感激。
Task.Run(() => { while(true) var line = myStreamReader.ReadLine(); if (IsEnd(line)) break; else ProcessLine(line); });
。这就是想法,请看看您是否可以为自己工作。您可以删除所有的Begin/End垃圾。APM模式已经过时且难以处理。 - usrIsEnd
可以是return line == null || line.StartsWith("CODE")
。 - usr