-
Notifications
You must be signed in to change notification settings - Fork 104
/
Copy pathMessageRouter.cpp
85 lines (66 loc) · 2.54 KB
/
MessageRouter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//
// Created by Aleksey Timin on 11/16/19.
//
#include <cassert>
#include "eip/EncapsPacketFactory.h"
#include "utils/Buffer.h"
#include "MessageRouter.h"
#include "cip/MessageRouterRequest.h"
#include "cip/MessageRouterResponse.h"
#include "eip/CommonPacketItemFactory.h"
#include "eip/CommonPacket.h"
#include "utils/Buffer.h"
#include "utils/Logger.h"
namespace eipScanner {
using namespace cip;
using namespace utils;
using eip::CommonPacketItemFactory;
using eip::CommonPacket;
using eip::CommonPacketItem;
using eip::EncapsPacket;
using eip::EncapsPacketFactory;
MessageRouter::MessageRouter() {};
MessageRouter::~MessageRouter() = default;
MessageRouterResponse
MessageRouter::sendRequest(SessionInfoIf::SPtr si, CipUsint service, const EPath &path,
const std::vector<uint8_t> &data) const {
return this->sendRequest(si, service, path, data, {});
}
MessageRouterResponse
MessageRouter::sendRequest(SessionInfoIf::SPtr si, CipUsint service, const EPath &path,
const std::vector<uint8_t> &data,
const std::vector<eip::CommonPacketItem>& additionalPacketItems) const {
assert(si);
Logger(LogLevel::INFO) << "Send request: service=0x" << std::hex << static_cast<int>(service)
<< " epath=" << path.toString();
MessageRouterRequest request{service, path, data, si->getUse8BitPathSegments()};
CommonPacketItemFactory commonPacketItemFactory;
CommonPacket commonPacket;
commonPacket << commonPacketItemFactory.createNullAddressItem();
commonPacket << commonPacketItemFactory.createUnconnectedDataItem(request.pack());
for(auto& item : additionalPacketItems) {
commonPacket << item;
}
auto packetToSend = EncapsPacketFactory()
.createSendRRDataPacket(si->getSessionHandle(), 0, commonPacket.pack());
auto receivedPacket = si->sendAndReceive(packetToSend);
Buffer buffer(receivedPacket.getData());
cip::CipUdint interfaceHandle = 0;
cip::CipUint timeout = 0;
std::vector<uint8_t> receivedData(receivedPacket.getData().size() - 6);
buffer >> interfaceHandle >> timeout >> receivedData;
commonPacket.expand(receivedData);
MessageRouterResponse response;
const CommonPacketItem::Vec &items = commonPacket.getItems();
response.expand(items.at(1).getData());
if (items.size() > 2) {
response.setAdditionalPacketItems(
CommonPacketItem::Vec(items.begin() + 2, items.end()));
}
return response;
}
MessageRouterResponse
MessageRouter::sendRequest(SessionInfoIf::SPtr si, CipUsint service, const EPath &path) const {
return this->sendRequest(si, service, path, {}, {});
}
}