在本系统中网络转发是个什么功能含义呢,其实就是将本地采集设备的所有数据打包发送到指定的网络地址,默认采用UDP的形式,无连接开销小,我也是看到很多的组态软件有这个功能,其实现有的很多的气体探测公司、环境监测公司等,都在大量的使用组态软件来做一个简单的系统提供给客户使用。这个网络转发用处很大,比如可以转发到多个网络中的客户端,层层级联,一般来说都是设备采集端作为发送端,而另外的客户端作为接收端,消除了设备采集只能独占在一个客户端上的局限,层层转发出去,多个地方可以看到实时的数据。
网络转发的功能一般是做成单向的,发送端负责发送,接收端负责接收数据解析处理,只要把设备的处理的数据源改成网络即可,其实解析方法完全一致,都是公用一个解析类,抽象出来的公用的数据解析类,不管你的数据是从串口还是tcp还是udp,拿到数据以后只管解析处理并存储即可,如果后期增加其他特定的字段解析,只要更改一个类即可,而不是写成多个类分别解析,其实串口也好网络也是,都是数据流,唯一的区别就是管道不一样,把不一样的按照type去区分就可以了,数据的收到和解析,完全一致。最早2014年左右写过温湿度监测项目,那时候傻逼逼的串口写一个类,tcp客户端写一个类,tcp服务端写一个类,udp写一个类,后面发现,一旦增加了一个回控设置参数的功能,好多地方都要增加一样的函数功能,真是操蛋,完全没有必要。
皮肤开源:https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo
文件名称:styledemo
体验地址:https://gitee.com/feiyangqingyun/QWidgetExe https://github.com/feiyangqingyun/QWidgetExe
文件名称:bin_sams.zip
#include "udpsend.h"
#include "quiwidget.h"
#include "dbhelper.h"
QScopedPointer<UdpSend> UdpSend::self;
UdpSend *UdpSend::Instance()
{
if (self.isNull()) {
static QMutex mutex;
QMutexLocker locker(&mutex);
if (self.isNull()) {
self.reset(new UdpSend);
}
}
return self.data();
}
UdpSend::UdpSend(QObject *parent) : QObject(parent)
{
udpSocket = new QUdpSocket(this);
}
UdpSend::~UdpSend()
{
}
void UdpSend::sendData(const QString &portName, quint8 addr, const QByteArray &data)
{
if (!App::UseNetSend) {
return;
}
//取出ip和端口
QList<QString> ips;
QList<int> ports;
QStringList list = App::NetSendInfo.split(";");
foreach (QString str, list) {
if (str.contains(":")) {
QStringList temp = str.split(":");
ips << temp.at(0);
ports << temp.at(1).toInt();
}
}
//逐个发送
for (int i = 0; i < ips.count(); i++) {
if (data.size() > 0) {
QString buffer;
if (portName == "PortInfo" || portName == "DeviceInfo" || portName == "NodeInfo") {
buffer = QString("%1|%2").arg(portName).arg(QString(data));
} else {
buffer = QString("%1|%2").arg(portName).arg(QUIHelper::byteArrayToHexStr(data));
}
udpSocket->writeDatagram(buffer.toUtf8(), QHostAddress(ips.at(i)), ports.at(i));
udpSocket->flush();
}
}
}
void UdpSend::start()
{
DBHelper::addUserLog("设备上报", "网络转发启动服务");
}
void UdpSend::stop()
{
DBHelper::addUserLog("设备上报", "网络转发停止服务");
}
void UdpSend::sendInfo()
{
if (!App::UseNetSend) {
return;
}
//发送端口信息表+设备信息表+探测器信息表
QStringList portInfo, deviceInfo, nodeInfo;
for (int i = 0; i < DBData::PortInfo_Count; i++) {
QStringList list;
list << QString::number(DBData::PortInfo_PortID.at(i));
list << DBData::PortInfo_PortName.at(i);
list << DBData::PortInfo_ComName.at(i);
list << QString::number(DBData::PortInfo_BaudRate.at(i));
list << DBData::PortInfo_TcpIP.at(i);
list << QString::number(DBData::PortInfo_TcpPort.at(i));
list << QString::number(DBData::PortInfo_ReadInterval.at(i));
list << QString::number(DBData::PortInfo_ReadTimeout.at(i));
list << QString::number( DBData::PortInfo_ReadMaxtime.at(i));
portInfo << list.join(";");
}
for (int i = 0; i < DBData::DeviceInfo_Count; i++) {
QStringList list;
list << QString::number(DBData::DeviceInfo_DeviceID.at(i));
list << DBData::DeviceInfo_PortName.at(i);
list << DBData::DeviceInfo_DeviceName.at(i);
list << QString::number(DBData::DeviceInfo_DeviceAddr.at(i));
list << DBData::DeviceInfo_DeviceType.at(i);
list << QString::number(DBData::DeviceInfo_NodeNumber.at(i));
deviceInfo << list.join(";");
}
for (int i = 0; i < DBData::NodeInfo_Count; i++) {
QStringList list;
list << QString::number(DBData::NodeInfo_NodeID.at(i));
list << DBData::NodeInfo_PositionID.at(i);
list << DBData::NodeInfo_DeviceName.at(i);
list << DBData::NodeInfo_NodeName.at(i);
list << QString::number(DBData::NodeInfo_NodeAddr.at(i));
list << DBData::NodeInfo_NodeType.at(i);
list << DBData::NodeInfo_NodeClass.at(i);
list << DBData::NodeInfo_NodeSign.at(i);
list << QString::number(DBData::NodeInfo_NodeUpper.at(i));
list << QString::number(DBData::NodeInfo_NodeLimit.at(i));
list << QString::number(DBData::NodeInfo_NodeMax.at(i));
list << QString::number(DBData::NodeInfo_NodeMin.at(i));
list << QString::number(DBData::NodeInfo_NodeRange.at(i));
list << DBData::NodeInfo_NodeEnable.at(i);
list << DBData::NodeInfo_NodeSound.at(i);
list << DBData::NodeInfo_NodeImage.at(i);
list << QString::number(DBData::NodeInfo_SaveInterval.at(i));
list << QString::number(DBData::NodeInfo_DotCount.at(i));
list << QString::number(DBData::NodeInfo_AlarmDelay.at(i));
list << DBData::NodeInfo_AlarmType.at(i);
list << QString::number(DBData::NodeInfo_NodeX.at(i));
list << QString::number(DBData::NodeInfo_NodeY.at(i));
nodeInfo << list.join(";");
}
sendData("PortInfo", 255, QString(portInfo.join(" ")).toUtf8());
sendData("DeviceInfo", 255, QString(deviceInfo.join(" ")).toUtf8());
sendData("NodeInfo", 255, QString(nodeInfo.join(" ")).toUtf8());
}
原文:https://www.cnblogs.com/feiyangqingyun/p/11915569.html