endpointhash 1.0
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user