UniSet  2.7.0
ModbusTCPServer.h
1 // -------------------------------------------------------------------------
2 #ifndef ModbusTCPServer_H_
3 #define ModbusTCPServer_H_
4 // -------------------------------------------------------------------------
5 #include <string>
6 #include <queue>
7 #include <ev++.h>
8 #include <sigc++/sigc++.h>
9 #include "Mutex.h"
10 #include "Debug.h"
11 #include "Configuration.h"
12 #include "PassiveTimer.h"
13 #include "ModbusTypes.h"
14 #include "ModbusServer.h"
15 #include "ModbusTCPSession.h"
16 #include "UTCPSocket.h"
17 #include "EventLoopServer.h"
18 // -------------------------------------------------------------------------
19 namespace uniset
20 {
21  // -------------------------------------------------------------------------
30  public EventLoopServer,
31  public ModbusServer
32  {
33  public:
34  ModbusTCPServer( const std::string& addr, int port = 502 );
35  virtual ~ModbusTCPServer();
36 
41  bool run( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr );
42 
46  bool async_run( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr );
47 
49  virtual void terminate();
50 
51  virtual bool isActive() const override;
52 
53  void setMaxSessions( size_t num );
54  size_t getMaxSessions() const noexcept;
55 
57  void setSessionTimeout( timeout_t msec );
58  timeout_t getSessionTimeout() const noexcept;
59 
61  size_t getCountSessions() const noexcept;
62 
63  void setIgnoreAddrMode( bool st );
64  bool getIgnoreAddrMode() const noexcept;
65 
66  // Сбор статистики по соединениям...
67  struct SessionInfo
68  {
69  SessionInfo( const std::string& a, size_t ask ): iaddr(a), askCount(ask) {}
70 
71  std::string iaddr;
72  size_t askCount;
73  };
74 
75  typedef std::list<SessionInfo> Sessions;
76 
77  void getSessions( Sessions& lst );
78 
79  std::string getInetAddress() const noexcept;
80  int getInetPort() const noexcept;
81 
82  // статистика
83  size_t getConnectionCount() const noexcept;
84 
85  // -------------------------------------------------
86  // Таймер.
87  // Т.к. eventLoop() "бесконечный", то сделана возможность
88  // подключиться к сигналу "таймера", например для обновления статистики по сессиям
89  // \warning Следует иметь ввиду, что обработчик сигнала, должен быть максимально коротким
90  // т.к. на это время останавливается работа основного потока (eventLoop)
91  // -------------------------------------------------
92  typedef sigc::signal<void> TimerSignal;
93  TimerSignal signal_timer();
94 
95  void setTimer( timeout_t msec );
96  timeout_t getTimer() const noexcept;
97 
98  protected:
99 
100  // ожидание (при этом время отдаётся eventloop-у)
101  virtual void iowait( timeout_t msec ) override;
102 
103  // функция receive пока не поддерживается...
104  virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) override;
105 
106  virtual void evprepare() override;
107  virtual void evfinish() override;
108 
109  virtual void ioAccept(ev::io& watcher, int revents);
110  void onTimer( ev::timer& t, int revents );
111 
112  void sessionFinished( const ModbusTCPSession* s );
113 
114  virtual size_t getNextData( unsigned char* buf, int len ) override
115  {
116  return 0;
117  }
118 
119  virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) override
120  {
121  return ModbusRTU::erHardwareError;
122  }
123 
125  virtual void setChannelTimeout( timeout_t msec ) override {};
126 
127  int port = { 0 };
128  std::string iaddr;
129  std::string myname;
130  std::queue<unsigned char> qrecv;
131  ModbusRTU::MBAPHeader curQueryHeader;
132 
133  std::mutex sMutex;
134  typedef std::list<std::shared_ptr<ModbusTCPSession>> SessionList;
135  SessionList slist;
136 
137  bool ignoreAddr = { false };
138 
139  size_t maxSessions = { 100 };
140  size_t sessCount = { 0 };
141 
142  // Статистика
143  size_t connCount = { 0 }; // количество обработанных соединений
144 
145  timeout_t sessTimeout = { 10000 }; // msec
146 
147  ev::io io;
148  ev::timer ioTimer;
149  std::shared_ptr<UTCPSocket> sock;
150 
151  const std::unordered_set<ModbusRTU::ModbusAddr>* vmbaddr = { nullptr };
152  TimerSignal m_timer_signal;
153 
154  timeout_t tmTime_msec = { UniSetTimer::WaitUpTime }; // время по умолчанию для таймера (TimerSignal)
155  double tmTime = { 0.0 };
156 
157  PassiveTimer ptWait;
158 
159  private:
160  // транслирование сигналов от Sessions..
161  void postReceiveEvent( ModbusRTU::mbErrCode res );
162  ModbusRTU::mbErrCode preReceiveEvent( const std::unordered_set<ModbusRTU::ModbusAddr> vaddr, timeout_t tout );
163  };
164  // -------------------------------------------------------------------------
165 } // end of namespace uniset
166 // -------------------------------------------------------------------------
167 #endif // ModbusTCPServer_H_
168 // -------------------------------------------------------------------------
Пассивный таймер
Definition: PassiveTimer.h:92
bool run(const std::unordered_set< ModbusRTU::ModbusAddr > &vmbaddr)
Definition: ModbusTCPServer.cc:104
Definition: CallbackTimer.h:29
size_t getCountSessions() const noexcept
Definition: ModbusTCPServer.cc:79
Definition: ModbusTCPServer.h:67
virtual void setChannelTimeout(timeout_t msec) override
Definition: ModbusTCPServer.h:125
virtual void terminate()
Definition: ModbusTCPServer.cc:153
Definition: ModbusTypes.h:174
void setSessionTimeout(timeout_t msec)
Definition: ModbusTCPServer.cc:94
virtual ModbusRTU::mbErrCode realReceive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout) override
Definition: ModbusTCPServer.cc:364
The ModbusTCPSession class Класс рассчитан на совместную работу с ModbusTCPServer, т.к. построен на основе libev, и главный цикл (default_loop) находиться там.
Definition: ModbusTCPSession.h:33
Definition: ModbusServer.h:33
virtual size_t getNextData(unsigned char *buf, int len) override
Definition: ModbusTCPServer.h:114
The EventLoopServer class Реализация общей части всех процессов использующих libev. Содержит свой (динамический) eventloop;.
Definition: EventLoopServer.h:17
bool async_run(const std::unordered_set< ModbusRTU::ModbusAddr > &vmbaddr)
Definition: ModbusTCPServer.cc:110
Definition: ModbusTCPServer.h:29
static const timeout_t WaitUpTime
Definition: PassiveTimer.h:69