VisionaryAutoIPScan.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 SICK AG, Waldkirch
3 //
4 // SPDX-License-Identifier: Unlicense
5 
6 #include "VisionaryAutoIPScan.h"
7 
8 #include <bitset>
9 #include <chrono>
10 #include <cstddef> // for size_t
11 #include <cstdint>
12 #include <iostream>
13 #include <limits>
14 #include <memory>
15 #include <random>
16 #include <sstream>
17 #include <string>
18 
19 #include "VisionaryEndian.h"
20 
21 // Boost library used for parseXML function
22 #if defined(__GNUC__) // GCC compiler
23 # pragma GCC diagnostic push // Save warning levels for later restoration
24 # pragma GCC diagnostic ignored "-Wpragmas"
25 # pragma GCC diagnostic ignored "-Wsign-conversion"
26 # pragma GCC diagnostic ignored "-Wold-style-cast"
27 # pragma GCC diagnostic ignored "-Wdeprecated-copy"
28 # pragma GCC diagnostic ignored "-Wshadow"
29 # pragma GCC diagnostic ignored "-Wparentheses"
30 # pragma GCC diagnostic ignored "-Wcast-align"
31 # pragma GCC diagnostic ignored "-Wstrict-overflow"
32 # pragma GCC diagnostic ignored "-Wdeprecated-declarations"
33 #endif
34 
37 
38 #if defined(__GNUC__) // GCC compiler
39 # pragma GCC diagnostic pop // Restore previous warning levels
40 #endif
41 
42 #include "UdpSocket.h"
43 
44 namespace visionary {
45 
46 namespace pt = boost::property_tree;
47 
48 const std::string VisionaryAutoIPScan::DEFAULT_BROADCAST_ADDR{"255.255.255.255"};
49 const std::string VisionaryAutoIPScan::DEFAULT_IP_MASK{"255.255.255.0"};
50 const std::string VisionaryAutoIPScan::DEFAULT_GATEWAY{"0.0.0.0"};
51 const std::uint8_t kRplIpconfig = 0x91; // replied by sensor; confirmation to IP change
52 const std::uint8_t kRplNetscan = 0x95; // replied by sensors; with information like device name, serial number, IP,...
53 const std::uint8_t kRplScanColaB = 0x90; // replied by sensors; with information like device name, serial number, IP,...
54 
55 std::vector<VisionaryAutoIPScan::DeviceInfo> VisionaryAutoIPScan::doScan(unsigned int timeOut, std::uint16_t port)
56 {
57  // Init Random generator
58  std::random_device rd;
59  std::default_random_engine mt(rd());
60  std::uint32_t teleIdCounter = mt();
61  std::vector<VisionaryAutoIPScan::DeviceInfo> deviceList;
62 
63  std::unique_ptr<UdpSocket> pTransport(new UdpSocket());
64 
65  // serverIP
66  std::vector<std::uint8_t> ipAddrVector = convertIpToBinary(m_serverIP);
67  // server net mask
68  std::vector<std::uint8_t> maskVector = convertIpToBinary(m_serverNetMask);
69 
70  // generate broadcast address according to the IP and the mask
71  std::string broadcastAddress{};
72  // As the definition of IPv4, ipAddrVector and maskVector have 4 elements correspondingly.
73  constexpr std::size_t kIpAddrVectorSize{4u};
74  for (std::size_t i = 0; i < kIpAddrVectorSize; ++i)
75  {
76  broadcastAddress +=
77  std::to_string((~maskVector[i] & 0xff) | ipAddrVector[i]) + (i + 1u == kIpAddrVectorSize ? "" : ".");
78  }
79  if (pTransport->connect(broadcastAddress, port) != 0)
80  {
81  return deviceList;
82  }
83 
84  // AutoIP Discover Packet
85  ByteBuffer autoIpPacket;
86  autoIpPacket.push_back(0x10); // CMD
87  autoIpPacket.push_back(0x00); // reserved
88  // length of datablock
89  autoIpPacket.push_back(0x00);
90  autoIpPacket.push_back(0x08);
91  // Mac address
92  autoIpPacket.push_back(0xFF);
93  autoIpPacket.push_back(0xFF);
94  autoIpPacket.push_back(0xFF);
95  autoIpPacket.push_back(0xFF);
96  autoIpPacket.push_back(0xFF);
97  autoIpPacket.push_back(0xFF);
98  // telegram id
99  autoIpPacket.push_back(0x0);
100  autoIpPacket.push_back(0x0);
101  autoIpPacket.push_back(0x0);
102  autoIpPacket.push_back(0x0);
103 
104  // Additional UCP Scan information
105  autoIpPacket.push_back(0x01); // Indicates that telegram is a CoLa Scan telegram
106  autoIpPacket.push_back(0x0);
107 
108  // server ip
109  autoIpPacket.insert(autoIpPacket.end(), ipAddrVector.begin(), ipAddrVector.end());
110 
111  // server net mask
112  autoIpPacket.insert(autoIpPacket.end(), maskVector.begin(), maskVector.end());
113 
114  // Replace telegram id in packet
115  std::uint32_t curtelegramID = teleIdCounter++;
116  writeUnalignBigEndian<std::uint32_t>(autoIpPacket.data() + 10u, sizeof(curtelegramID), curtelegramID);
117 
118  // Send Packet
119  pTransport->send(autoIpPacket);
120 
121  // Check for answers to Discover Packet
122  const std::chrono::steady_clock::time_point startTime(std::chrono::steady_clock::now());
123  while (true)
124  {
125  ByteBuffer receiveBuffer;
126  const std::chrono::steady_clock::time_point now(std::chrono::steady_clock::now());
127  if ((now - startTime) > std::chrono::milliseconds(timeOut))
128  {
129  std::cout << __FUNCTION__ << " Timeout" << '\n';
130  break;
131  }
132  if (pTransport->recv(receiveBuffer, 1400) > 16) // 16 bytes minsize
133  {
134  unsigned int pos = 0;
135  if (receiveBuffer[0] == kRplNetscan)
136  {
137  DeviceInfo dI = parseAutoIPBinary(receiveBuffer);
138  deviceList.push_back(dI);
139  continue;
140  }
141  if (receiveBuffer[0] == kRplScanColaB)
142  {
143  pos++;
144  pos += 1; // unused byte
145  std::uint16_t payLoadSize = readUnalignBigEndian<std::uint16_t>(receiveBuffer.data() + pos);
146  pos += 2;
147  pos += 6; // Skip mac address(part of xml)
148  std::uint32_t recvTelegramID = readUnalignBigEndian<std::uint32_t>(receiveBuffer.data() + pos);
149  pos += 4;
150  // check if it is a response to our scan
151  if (recvTelegramID != curtelegramID)
152  {
153  continue;
154  }
155  pos += 2; // unused
156  // Get XML Payload
157  if (receiveBuffer.size() >= pos + payLoadSize)
158  {
159  std::stringstream stringStream(std::string(reinterpret_cast<char*>(&receiveBuffer[pos]), payLoadSize));
160  try
161  {
162  DeviceInfo dI = parseAutoIPXml(stringStream);
163  deviceList.push_back(dI);
164  }
165  catch (...)
166  {
167  }
168  }
169  else
170  {
171  std::cout << __FUNCTION__ << "Received invalid AutoIP Packet" << '\n';
172  }
173  }
174  }
175  }
176  return deviceList;
177 }
178 
180 {
181  pt::ptree tree;
182  pt::read_xml(rStringStream, tree);
183  const std::string& macAddress = tree.get_child("NetScanResult.<xmlattr>.MACAddr").get_value<std::string>();
184  std::string ipAddress;
185  std::string subNet;
186  std::string port;
187  std::string deviceType;
188 
189  for (const auto& it : tree.get_child("NetScanResult"))
190  {
191  if (it.first != "<xmlattr>")
192  {
193  const std::string& key = it.second.get<std::string>("<xmlattr>.key");
194  const std::string& value = it.second.get<std::string>("<xmlattr>.value");
195  if (key == "IPAddress")
196  {
197  ipAddress = value;
198  }
199 
200  if (key == "IPMask")
201  {
202  subNet = value;
203  }
204 
205  if (key == "HostPortNo")
206  {
207  port = value;
208  }
209 
210  if (key == "DeviceType")
211  {
212  deviceType = value;
213  }
214  }
215  }
216  DeviceInfo dI;
217  dI.deviceName = deviceType;
218  dI.ipAddress = ipAddress;
219  dI.macAddress = convertMacToStruct(macAddress);
220  std::size_t idx = 0u;
221  unsigned long portul = std::stoul(port, &idx);
222  if ((idx < port.length()) || (portul > std::numeric_limits<std::uint16_t>::max()) || (portul == 0u))
223  {
224  // invalid port number or range
225  std::cerr << "invalid port number '" << port << "' (must be an unsigned number in range 1..65535) for "
226  << deviceType << " device at ip " << ipAddress << std::endl;
227  dI.port = 0u;
228  }
229  else
230  {
231  dI.port = static_cast<std::uint16_t>(portul);
232  }
233  dI.subNet = subNet;
234 
235  return dI;
236 }
237 
239 {
240  DeviceInfo deviceInfo;
241 
242  deviceInfo.subNet = "";
243  deviceInfo.port = 0;
244  deviceInfo.protocolType = COLA_2;
245 
246  int offset = 16;
247  // auto deviceInfoVersion = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
248  offset += 2;
249 
250  auto cidNameLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
251  offset += 2;
252  std::string cidName;
253  for (int i = 0; i < cidNameLen; ++i)
254  {
255  cidName += readUnalignBigEndian<char>(buffer.data() + offset);
256  offset++;
257  }
258  deviceInfo.deviceName = cidName;
259 
260  // auto cidMajorVersion = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
261  offset += 2;
262  // auto cidMinorVersion = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
263  offset += 2;
264  // auto cidPatchVersion = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
265  offset += 2;
266  // auto cidBuildVersion = readUnalignBigEndian<std::uint32_t>(buffer.data() + offset);
267  offset += 4;
268  // auto cidVersionClassifier = readUnalignBigEndian<std::uint8_t>(buffer.data() + offset);
269  offset += 1;
270 
271  // auto deviceState = readUnalignBigEndian<char>(buffer.data() + offset);
272  offset += 1;
273 
274  // auto reqUserAction = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
275  offset += 2;
276 
277  // Device name
278  auto deviceNameLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
279  offset += 2;
280  std::string deviceName(reinterpret_cast<const char*>(buffer.data() + offset), deviceNameLen);
281  offset += deviceNameLen;
282 
283  // App name
284  auto appNameLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
285  offset += 2;
286  std::string appName(reinterpret_cast<const char*>(buffer.data() + offset), appNameLen);
287  offset += appNameLen;
288 
289  // Project name
290  auto projNameLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
291  offset += 2;
292  std::string projName(reinterpret_cast<const char*>(buffer.data() + offset), projNameLen);
293  offset += projNameLen;
294 
295  // Serial number
296  auto serialNumLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
297  offset += 2;
298  std::string serialNum(reinterpret_cast<const char*>(buffer.data() + offset), serialNumLen);
299  offset += serialNumLen;
300 
301  // Type code
302  auto typeCodeLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
303  offset += 2;
304  std::string typeCode(reinterpret_cast<const char*>(buffer.data() + offset), typeCodeLen);
305  offset += typeCodeLen;
306 
307  // Firmware version
308  auto firmwareVersionLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
309  offset += 2;
310  std::string firmwareVersion(reinterpret_cast<const char*>(buffer.data() + offset), firmwareVersionLen);
311  offset += firmwareVersionLen;
312 
313  // Order number
314  auto orderNumberLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
315  offset += 2;
316  std::string orderNumber(reinterpret_cast<const char*>(buffer.data() + offset), orderNumberLen);
317  offset += orderNumberLen;
318 
319  // # unused: flags, = struct.unpack('>B', rpl[offset:offset + 1])
320  offset += 1;
321 
322  auto auxArrayLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
323  offset += 2;
324 
325  for (int i = 0; i < auxArrayLen; ++i)
326  {
327  std::string key;
328  for (int k = 0; k < 4; ++k)
329  {
330  key += readUnalignBigEndian<char>(buffer.data() + offset);
331  offset++;
332  }
333  auto innerArrayLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
334  offset += 2;
335  for (int j = 0; j < innerArrayLen; ++j)
336  {
337  // auto v = readUnalignBigEndian<std::uint8_t>(buffer.data() + offset);
338  offset += 1;
339  }
340  }
341  auto scanIfLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
342  offset += 2;
343  for (int i = 0; i < scanIfLen; ++i)
344  {
345  // auto ifaceNum = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
346  offset += 2;
347  auto ifaceNameLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
348  offset += 2;
349  std::string ifaceName(reinterpret_cast<const char*>(buffer.data() + offset), ifaceNameLen);
350  offset += ifaceNameLen;
351  }
352  auto comSettingsLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
353  offset += 2;
354 
355  for (int i = 0; i < comSettingsLen; ++i)
356  {
357  std::string key;
358  for (int k = 0; k < 4; ++k)
359  {
360  key += readUnalignBigEndian<char>(buffer.data() + offset);
361  offset++;
362  }
363  auto innerArrayLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
364  offset += 2;
365  if (key == "EMAC")
366  {
367  std::memcpy(deviceInfo.macAddress.macAddress, buffer.data() + offset, sizeof(deviceInfo.macAddress.macAddress));
368  offset += 6;
369  continue;
370  }
371  if (key == "EIPa")
372  {
373  std::string ipAddr;
374  for (int k = 0; k < 4; ++k)
375  {
376  ipAddr += std::to_string(static_cast<unsigned>(readUnalignBigEndian<uint8_t>(buffer.data() + offset)));
377  if (k < 3)
378  {
379  ipAddr += ".";
380  }
381  offset++;
382  }
383  deviceInfo.ipAddress = ipAddr;
384  continue;
385  }
386  if (key == "ENMa")
387  {
388  std::string subNet;
389  for (int k = 0; k < 4; ++k)
390  {
391  subNet += std::to_string(static_cast<unsigned>(readUnalignBigEndian<uint8_t>(buffer.data() + offset)));
392  if (k < 3)
393  {
394  subNet += ".";
395  }
396  offset++;
397  }
398  deviceInfo.subNet = subNet;
399  continue;
400  }
401  if (key == "EDGa")
402  {
403  std::string stdGw;
404  for (int k = 0; k < 4; ++k)
405  {
406  stdGw += std::to_string(static_cast<unsigned>(readUnalignBigEndian<char>(buffer.data() + offset)));
407  if (k < 3)
408  {
409  stdGw += ".";
410  }
411  offset++;
412  }
413  continue;
414  }
415  if (key == "EDhc")
416  {
417  // dhcp = readUnalignBigEndian<std::uint8_t>(buffer.data() + offset);
418  offset += 1;
419  continue;
420  }
421  if (key == "ECDu")
422  {
423  // auto configTime = readUnalignBigEndian<std::uint32_t>(buffer.data() + offset);
424  offset += 4;
425  continue;
426  }
427  for (int j = 0; j < innerArrayLen; ++j)
428  {
429  // auto v = readUnalignBigEndian<std::uint8_t>(buffer.data() + offset);
430  offset += 1;
431  }
432  }
433  auto endPointsLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
434  offset += 2;
435 
436  std::vector<std::uint16_t> ports;
437  for (int i = 0; i < endPointsLen; ++i)
438  {
439  // auto colaVersion = readUnalignBigEndian<std::uint8_t>(buffer.data() + offset);
440  offset += 1;
441  auto innerArrayLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
442  offset += 2;
443  for (int j = 0; j < innerArrayLen; ++j)
444  {
445  std::string key(reinterpret_cast<const char*>(buffer.data() + offset), 4u);
446  offset += 4;
447 
448  auto mostInnerArrayLen = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
449  offset += 2;
450 
451  if (key == "DPNo") // PortNumber [UInt]
452  {
453  auto port = readUnalignBigEndian<std::uint16_t>(buffer.data() + offset);
454  offset += 2;
455  ports.push_back(port);
456  }
457  else
458  {
459  for (int k = 0; k < mostInnerArrayLen; ++k)
460  {
461  // auto v = readUnalignBigEndian<std::uint8_t>(buffer.data() + offset);
462  offset += 1;
463  }
464  }
465  }
466  }
467  if (!ports.empty())
468  {
469  deviceInfo.port = ports[0];
470  }
471  return deviceInfo;
472 }
473 
474 VisionaryAutoIPScan::VisionaryAutoIPScan(const std::string& serverIP, std::uint8_t prefixLength) : m_serverIP(serverIP)
475 {
476  m_serverNetMask = networkPrefixToMask(prefixLength);
477 }
478 
479 std::string VisionaryAutoIPScan::networkPrefixToMask(std::uint8_t prefixLength)
480 {
481  // For unsigned a, the value of a << b is the value of a * 2b , reduced modulo 2N where N is the number of bits in the
482  // return type (that is, bitwise left shift is performed and the bits that get shifted out of the destination type are
483  // discarded)
484  std::bitset<32> hostPrefix(0xffffffffull << (32u - prefixLength));
485  std::bitset<32> mask(0xff000000);
486 
487  std::string hostMask{};
488 
489  constexpr std::size_t kIpAddressLength{32u};
490  for (std::size_t i = 0; i < kIpAddressLength; i += 8u)
491  {
492  hostMask +=
493  std::to_string((((hostPrefix << i & mask) >> 24u).to_ulong())) + (i + 8u == kIpAddressLength ? "" : ".");
494  }
495 
496  return hostMask;
497 }
498 
499 std::vector<std::uint8_t> VisionaryAutoIPScan::convertIpToBinary(const std::string& address)
500 {
501  std::vector<std::uint8_t> ipInts;
502  std::istringstream ss(address);
503  while (ss)
504  {
505  std::string token;
506  if (!getline(ss, token, '.'))
507  break;
508  ipInts.push_back(static_cast<uint8_t>(std::stoi(token)));
509  }
510  return ipInts;
511 }
512 
513 bool VisionaryAutoIPScan::assign(const MacAddress& destinationMac,
515  const std::string& ipAddr,
516  std::uint8_t prefixLength,
517  const std::string& ipGateway,
518  bool dhcp,
519  unsigned int timeout)
520 {
521  if (colaVer != ProtocolType::COLA_B && colaVer != ProtocolType::COLA_2)
522  {
523  return false;
524  }
525 
526  std::string ipMask{networkPrefixToMask(prefixLength)};
527 
528  ByteBuffer payload;
529  if (colaVer == ProtocolType::COLA_B)
530  {
531  std::string dhcpString = "FALSE";
532  if (dhcp)
533  {
534  dhcpString = "TRUE";
535  }
536  std::string request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
537  "<IPconfig MACAddr=\"" + convertMacToString(destinationMac) + "\">"
538  "<Item key=\"IPAddress\" value=\"" + ipAddr + "\" />"
539  "<Item key=\"IPMask\" value=\"" + ipMask + "\" />"
540  "<Item key=\"IPGateway\" value=\"" + ipGateway + "\" />"
541  "<Item key=\"DHCPClientEnabled\" value=\"" + dhcpString +"\" /></IPconfig>";
542 
543  payload.insert(payload.end(), request.c_str(), request.c_str() + request.size());
544  }
545  else if (colaVer == COLA_2)
546  {
547  std::vector<uint8_t> ipAddrVector = convertIpToBinary(ipAddr);
548  payload.insert(payload.end(), ipAddrVector.begin(), ipAddrVector.end());
549 
550  std::vector<uint8_t> ipMaskVector = convertIpToBinary(ipMask);
551  payload.insert(payload.end(), ipMaskVector.begin(), ipMaskVector.end());
552 
553  std::vector<uint8_t> ipGatewayVector = convertIpToBinary(ipGateway);
554  payload.insert(payload.end(), ipGatewayVector.begin(), ipGatewayVector.end());
555 
556  payload.push_back(dhcp);
557  }
558 
559  // Init Random generator
560  std::random_device rd;
561  std::default_random_engine mt(rd());
562  unsigned int teleIdCounter = mt();
563 
564  std::unique_ptr<UdpSocket> pTransport(new UdpSocket());
565 
566  std::vector<std::uint8_t> addrVector = convertIpToBinary(m_serverIP);
567  std::vector<std::uint8_t> maskVector = convertIpToBinary(m_serverNetMask);
568  // generate broadcast address according to the IP and the mask
569  std::string broadcastAddress{};
570  // As the definition of IPv4, ipAddrVector and maskVector have 4 elements correspondingly.
571  constexpr std::size_t kIpAddrVectorSize{4u};
572  for (std::size_t i = 0; i < kIpAddrVectorSize; ++i)
573  {
574  broadcastAddress +=
575  std::to_string((~maskVector[i] & 0xff) | addrVector[i]) + (i + 1u == kIpAddrVectorSize ? "" : ".");
576  }
577 
578  if (pTransport->connect(broadcastAddress, DEFAULT_PORT) != 0)
579  {
580  return false;
581  }
582 
583  // AutoIP Discover Packet
584  ByteBuffer autoIpPacket;
585  autoIpPacket.push_back(0x11); // CMD ip config
586  autoIpPacket.push_back(0x0); // not defined rfu
587 
588  // length of datablock
589  std::uint8_t blockLenght[2];
590  writeUnalignBigEndian(blockLenght, sizeof(blockLenght), static_cast<std::uint16_t>(payload.size()));
591  autoIpPacket.insert(autoIpPacket.end(), blockLenght, blockLenght + 2u);
592 
593  // Mac address
594  autoIpPacket.insert(autoIpPacket.end(), destinationMac.macAddress, destinationMac.macAddress + 6u);
595 
596  // telegram id
597  unsigned int curtelegramID = teleIdCounter++;
598  std::uint8_t b[4];
599  writeUnalignBigEndian(b, sizeof(b), static_cast<std::uint32_t>(curtelegramID));
600  autoIpPacket.insert(autoIpPacket.end(), b, b + 4u);
601 
602  // reserved
603  autoIpPacket.push_back(0x01); // Indicates that telegram is a CoLa Scan telegram
604  autoIpPacket.push_back(0x00);
605 
606  // payload
607  autoIpPacket.insert(autoIpPacket.end(), payload.begin(), payload.end());
608 
609  pTransport->send(autoIpPacket);
610 
611  const std::chrono::steady_clock::time_point startTime(std::chrono::steady_clock::now());
612  while (true)
613  {
614  ByteBuffer receiveBuffer;
615  const std::chrono::steady_clock::time_point now(std::chrono::steady_clock::now());
616  if ((now - startTime) > std::chrono::milliseconds(timeout))
617  {
618  std::cout << __FUNCTION__ << " Timeout" << '\n';
619  break;
620  }
621  if (pTransport->recv(receiveBuffer, 1400) > 16) // 16 bytes minsize
622  {
623  if (receiveBuffer[0] == kRplIpconfig)
624  {
625  return true;
626  }
627  }
628  }
629 
630  return false;
631 }
632 
634 {
635  std::vector<std::uint8_t> ipInts;
636  std::istringstream ss(basicString);
637  MacAddress macAddress{};
638  int i = 0;
639  while (ss)
640  {
641  std::string token;
642  size_t pos;
643  if (!getline(ss, token, ':'))
644  break;
645  macAddress.macAddress[i] = static_cast<std::uint8_t>(std::stoi(token, &pos, 16));
646  i++;
647  }
648  return macAddress;
649 }
650 
652 {
653  std::string macAddrString;
654  for (int k = 0; k < 6; ++k)
655  {
656  std::stringstream ss;
657  ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned>(macAddress.macAddress[k]);
658 
659  macAddrString += ss.str();
660  if (k < 5)
661  {
662  macAddrString += ":";
663  }
664  }
665  return macAddrString;
666 }
667 
668 } // namespace visionary
visionary::VisionaryAutoIPScan::DeviceInfo::macAddress
MacAddress macAddress
Definition: VisionaryAutoIPScan.h:43
visionary::VisionaryAutoIPScan::DeviceInfo
Definition: VisionaryAutoIPScan.h:40
VisionaryEndian.h
visionary::VisionaryAutoIPScan::DEFAULT_GATEWAY
static const std::string DEFAULT_GATEWAY
Definition: VisionaryAutoIPScan.h:23
visionary::VisionaryAutoIPScan::ByteBuffer
std::vector< std::uint8_t > ByteBuffer
Definition: VisionaryAutoIPScan.h:88
visionary
Definition: MD5.cpp:44
visionary::VisionaryAutoIPScan::assign
bool assign(const MacAddress &destinationMac, ProtocolType colaVer, const std::string &ipAddr, std::uint8_t prefixLength, const std::string &ipGateway=DEFAULT_GATEWAY, bool dhcp=DEFAULT_DHCP, unsigned int timout=DEFAULT_TIMEOUT)
Definition: VisionaryAutoIPScan.cpp:513
UdpSocket.h
boost::property_tree
Definition: exception_implementation.hpp:14
visionary::VisionaryAutoIPScan::DeviceInfo::protocolType
ProtocolType protocolType
Definition: VisionaryAutoIPScan.h:47
xml_parser.hpp
VisionaryAutoIPScan.h
boost::property_tree::basic_ptree::get_value
boost::enable_if< detail::is_translator< Translator >, Type >::type get_value(Translator tr) const
Definition: ptree_implementation.hpp:665
visionary::VisionaryAutoIPScan::m_serverNetMask
std::string m_serverNetMask
Definition: VisionaryAutoIPScan.h:90
visionary::VisionaryAutoIPScan::doScan
std::vector< DeviceInfo > doScan(unsigned int timeOut, std::uint16_t port=DEFAULT_PORT)
Definition: VisionaryAutoIPScan.cpp:55
visionary::kRplNetscan
const std::uint8_t kRplNetscan
Definition: VisionaryAutoIPScan.cpp:52
visionary::VisionaryAutoIPScan::parseAutoIPBinary
DeviceInfo parseAutoIPBinary(const ByteBuffer &receivedBuffer)
Definition: VisionaryAutoIPScan.cpp:238
visionary::UdpSocket
Definition: UdpSocket.h:19
ptree.hpp
visionary::kRplScanColaB
const std::uint8_t kRplScanColaB
Definition: VisionaryAutoIPScan.cpp:53
visionary::kRplIpconfig
const std::uint8_t kRplIpconfig
Definition: VisionaryAutoIPScan.cpp:51
visionary::VisionaryAutoIPScan::DEFAULT_IP_MASK
static const std::string DEFAULT_IP_MASK
Definition: VisionaryAutoIPScan.h:22
visionary::VisionaryAutoIPScan::VisionaryAutoIPScan
VisionaryAutoIPScan(const std::string &serverIP, std::uint8_t prefixLength)
Definition: VisionaryAutoIPScan.cpp:474
visionary::VisionaryAutoIPScan::DEFAULT_BROADCAST_ADDR
static const std::string DEFAULT_BROADCAST_ADDR
Definition: VisionaryAutoIPScan.h:21
visionary::VisionaryAutoIPScan::MacAddress::macAddress
std::uint8_t macAddress[6]
Definition: VisionaryAutoIPScan.h:37
visionary::VisionaryAutoIPScan::m_serverIP
std::string m_serverIP
Definition: VisionaryAutoIPScan.h:89
visionary::VisionaryAutoIPScan::networkPrefixToMask
static std::string networkPrefixToMask(std::uint8_t prefixLength)
Definition: VisionaryAutoIPScan.cpp:479
visionary::VisionaryAutoIPScan::convertMacToString
static std::string convertMacToString(const MacAddress &macAddress)
Definition: VisionaryAutoIPScan.cpp:651
visionary::VisionaryAutoIPScan::DEFAULT_PORT
static constexpr std::uint16_t DEFAULT_PORT
Definition: VisionaryAutoIPScan.h:20
boost::iterators::i
D const & i
Definition: iterator_facade.hpp:956
visionary::VisionaryAutoIPScan::convertMacToStruct
static MacAddress convertMacToStruct(const std::string &basicString)
Definition: VisionaryAutoIPScan.cpp:633
visionary::VisionaryAutoIPScan::DeviceInfo::deviceName
std::string deviceName
Definition: VisionaryAutoIPScan.h:42
visionary::VisionaryAutoIPScan::COLA_2
@ COLA_2
Definition: VisionaryAutoIPScan.h:32
boost::property_tree::xml_parser::read_xml
void read_xml(std::basic_istream< typename Ptree::key_type::value_type > &stream, Ptree &pt, int flags=0)
Definition: xml_parser.hpp:46
boost::property_tree::basic_ptree
Definition: ptree.hpp:48
visionary::VisionaryAutoIPScan::DeviceInfo::port
std::uint16_t port
Definition: VisionaryAutoIPScan.h:46
visionary::VisionaryAutoIPScan::ProtocolType
ProtocolType
Definition: VisionaryAutoIPScan.h:27
boost::property_tree::basic_ptree::get_child
self_type & get_child(const path_type &path)
Definition: ptree_implementation.hpp:571
visionary::VisionaryAutoIPScan::DeviceInfo::ipAddress
std::string ipAddress
Definition: VisionaryAutoIPScan.h:44
visionary::writeUnalignBigEndian
void writeUnalignBigEndian(void *ptr, std::size_t nBytes, const T &value)
Definition: VisionaryEndian.h:310
visionary::VisionaryAutoIPScan::MacAddress
Definition: VisionaryAutoIPScan.h:35
visionary::VisionaryAutoIPScan::convertIpToBinary
static std::vector< std::uint8_t > convertIpToBinary(const std::string &address)
Definition: VisionaryAutoIPScan.cpp:499
visionary::VisionaryAutoIPScan::parseAutoIPXml
DeviceInfo parseAutoIPXml(std::stringstream &rStringStream)
Definition: VisionaryAutoIPScan.cpp:179
visionary::VisionaryAutoIPScan::DeviceInfo::subNet
std::string subNet
Definition: VisionaryAutoIPScan.h:45


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:56:19