endpointhash 1.0

This commit is contained in:
flower_linux
2026-04-16 10:39:56 +08:00
parent 11bd86063d
commit 11bc015444
17 changed files with 885 additions and 38 deletions

View File

@@ -1,6 +1,8 @@
#include "plugins/protocols/modbus_rtu/mapper/ModbusRtuProtocolMapperPlugin.h"
#include "plugins/protocols/modbus_rtu/framer/ModbusRtuFraming.h"
#include <QHash>
#include <utility>
namespace softbus::message_bus::pipeline::protocol::modbusrtu
{
@@ -11,6 +13,22 @@ namespace
class ModbusRtuMapperSession final : public softbus::core::plugin_system::IProtocolMapperSession
{
public:
explicit ModbusRtuMapperSession(softbus::core::plugin_system::MapperSessionContext context)
: m_context(std::move(context))
{
}
static std::uint64_t buildCompositeKey(std::uint32_t endpointHash,
softbus::core::models::ProtocolType protocol,
std::uint8_t slaveId,
std::uint16_t address)
{
return (static_cast<std::uint64_t>(endpointHash) << 32)
| (static_cast<std::uint64_t>(static_cast<std::uint16_t>(protocol)) << 24)
| (static_cast<std::uint64_t>(slaveId) << 16)
| static_cast<std::uint64_t>(address);
}
std::vector<softbus::core::models::DOMMessage> map(
const softbus::core::models::RawBusMessage& rawContext,
const softbus::message_bus::pipeline::protocol::ProtocolEnvelope& envelope) override
@@ -27,17 +45,39 @@ public:
if (const auto* resp =
std::get_if<softbus::message_bus::pipeline::protocol::ReadHoldingRegistersResponse>(pdu)) {
out.reserve(static_cast<std::size_t>(resp->registers.size()));
const std::uint16_t baseAddress = m_lastReadHoldingStartAddress.value(resp->unitId, 0);
for (int i = 0; i < resp->registers.size(); ++i) {
const auto addr = static_cast<std::uint16_t>(baseAddress + static_cast<std::uint16_t>(i));
const auto compKey = buildCompositeKey(
rawContext.endpointHash, rawContext.protocol, resp->unitId, addr);
const auto mapRule = m_context.mappingLookup ? m_context.mappingLookup->find(compKey) : std::nullopt;
const double rawValue = static_cast<double>(resp->registers[static_cast<qsizetype>(i)]);
if (!mapRule.has_value()) {
if (m_context.discoverySink) {
softbus::core::plugin_system::DiscoveryRecord rec;
rec.compositeKey = compKey;
rec.endpointHash = rawContext.endpointHash;
rec.protocol = rawContext.protocol;
rec.slaveId = resp->unitId;
rec.registerAddress = addr;
rec.rawValue = rawValue;
rec.lastSeenMs = rawContext.timestampMs;
m_context.discoverySink->reportUnmapped(rec);
}
continue;
}
softbus::core::models::DOMMessage msg;
msg.messageId = QStringLiteral("%1.reg.%2")
.arg(rawContext.routingKey == 0
? QString::number(rawContext.deviceId)
: QString::number(rawContext.routingKey))
.arg(i);
msg.messageId = mapRule->domPath;
msg.timestamp = rawContext.timestampMs;
msg.value = static_cast<std::uint32_t>(resp->registers[static_cast<qsizetype>(i)]);
msg.value = (rawValue * mapRule->scale) + mapRule->offset;
msg.quality = softbus::core::models::DataQuality::GOOD;
msg.attributes.insert(QStringLiteral("sourceEndpoint"), QString::number(rawContext.endpointHash));
msg.attributes.insert(QStringLiteral("compositeKey"), QString::number(compKey));
msg.attributes.insert(QStringLiteral("slaveId"), static_cast<int>(resp->unitId));
msg.attributes.insert(QStringLiteral("registerAddress"), static_cast<int>(addr));
if (!mapRule->unit.isEmpty()) {
msg.attributes.insert(QStringLiteral("unit"), mapRule->unit);
}
out.push_back(std::move(msg));
}
return out;
@@ -45,24 +85,16 @@ public:
if (const auto* req =
std::get_if<softbus::message_bus::pipeline::protocol::ReadHoldingRegistersRequest>(pdu)) {
softbus::core::models::DOMMessage msg;
msg.messageId = QStringLiteral("%1.req.read_holding")
.arg(rawContext.routingKey == 0
? QString::number(rawContext.deviceId)
: QString::number(rawContext.routingKey));
msg.timestamp = rawContext.timestampMs;
msg.value = static_cast<std::uint32_t>(req->quantity);
msg.quality = softbus::core::models::DataQuality::GOOD;
msg.attributes.insert(QStringLiteral("sourceEndpoint"), QString::number(rawContext.endpointHash));
msg.attributes.insert(QStringLiteral("frameType"), QStringLiteral("request"));
msg.attributes.insert(QStringLiteral("startAddress"), static_cast<int>(req->startAddress));
msg.attributes.insert(QStringLiteral("quantity"), static_cast<int>(req->quantity));
out.push_back(std::move(msg));
m_lastReadHoldingStartAddress.insert(req->unitId, req->startAddress);
}
return out;
}
void reset() override {}
private:
softbus::core::plugin_system::MapperSessionContext m_context;
QHash<std::uint8_t, std::uint16_t> m_lastReadHoldingStartAddress;
};
class ModbusRtuProtocolMapperPlugin final : public softbus::core::plugin_system::IProtocolMapperPlugin
@@ -75,7 +107,12 @@ public:
}
std::unique_ptr<softbus::core::plugin_system::IProtocolMapperSession> createMapperSession() override
{
return std::make_unique<ModbusRtuMapperSession>();
return std::make_unique<ModbusRtuMapperSession>(softbus::core::plugin_system::MapperSessionContext{});
}
std::unique_ptr<softbus::core::plugin_system::IProtocolMapperSession> createMapperSession(
const softbus::core::plugin_system::MapperSessionContext& ctx) override
{
return std::make_unique<ModbusRtuMapperSession>(ctx);
}
};