modbusd
modbus master daemon
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
main.c File Reference

main flow with zmq related functions More...

#include <czmq.h>
#include "mb.h"
Include dependency graph for main.c:

Macros

#define VERSION   @MODBUSD_VERSION@
 
#define KEY_LOGGER   "syslog"
 
#define KEY_IPC_TYPE   "zmq"
 
#define KEY_IPC_PUB   "pub"
 
#define KEY_IPC_SUB   "sub"
 
#define KEY_MB_TYPE   "mbtcp"
 
#define KEY_MBTCP_CONN_TIMEOUT   "connect_timeout"
 

Enumerations

enum  cmd_s {
  FC1 = 1, FC2 = 2, FC3 = 3, FC4 = 4,
  FC5 = 5, FC6 = 6, FC15 = 15, FC16 = 16,
  SET_TCP_TIMEOUT = 50, GET_TCP_TIMEOUT = 51
}
 

Functions

int main (int argc, char *argv[])
 

Variables

long tcp_conn_timeout_usec
 
int enable_syslog = 0
 
void * zmq_pub = NULL
 

Detailed Description

main flow with zmq related functions

Author
Taka Wang

Macro Definition Documentation

#define KEY_IPC_PUB   "pub"
#define KEY_IPC_SUB   "sub"
#define KEY_IPC_TYPE   "zmq"
#define KEY_LOGGER   "syslog"
#define KEY_MB_TYPE   "mbtcp"
#define KEY_MBTCP_CONN_TIMEOUT   "connect_timeout"
#define VERSION   @MODBUSD_VERSION@

Referenced by main().

Enumeration Type Documentation

enum cmd_s
Enumerator
FC1 
FC2 
FC3 
FC4 
FC5 
FC6 
FC15 
FC16 
SET_TCP_TIMEOUT 
GET_TCP_TIMEOUT 
17 {
18  FC1 = 1,
19  FC2 = 2,
20  FC3 = 3,
21  FC4 = 4,
22  FC5 = 5,
23  FC6 = 6,
24  FC15 = 15,
25  FC16 = 16,
26  SET_TCP_TIMEOUT = 50,
27  GET_TCP_TIMEOUT = 51
28 } cmd_s;
Definition: main.c:18
Definition: main.c:26
Definition: main.c:27
Definition: main.c:22
Definition: main.c:24
Definition: main.c:20
Definition: main.c:19
Definition: main.c:21
Definition: main.c:23
Definition: main.c:25
cmd_s
Definition: main.c:16

Function Documentation

int main ( int  argc,
char *  argv[] 
)

References cJSON_Delete(), cJSON_Parse(), enable_syslog, FC1, FC15, FC16, FC2, FC3, FC4, FC5, FC6, GET_TCP_TIMEOUT, json_get_char(), json_get_int(), json_get_long(), LOG, mbtcp_cmd_hanlder(), mbtcp_get_response_timeout(), mbtcp_multi_write_req_fn(), mbtcp_read_bit_req_fn(), mbtcp_read_reg_req_fn(), mbtcp_set_response_timeout(), mbtcp_single_write_req_fn(), set_modbus_fail_resp_str(), SET_TCP_TIMEOUT, VERSION, and zmq_pub.

136 {
137  LOG (enable_syslog, "modbusd version: %s", VERSION);
138 
139  // @get environemnt variable; 12-Factor
140  char *env = getenv (env_conf_path);
141  if (env != NULL)
142  {
143  config_fname = env;
144  LOG (enable_syslog, "Get config path from environment variable: %s", env);
145  }
146  else
147  {
148  config_fname = argc > 1 ? argv[1] : "./modbusd.json";
149  LOG (enable_syslog, "Get config path from flag: %s", config_fname);
150  }
151 
152  // @load config
153  load_config (config_fname, &config_json);
154 
155  // @setup zmq
156  zctx_t *zmq_context = zctx_new (); // init zmq context
157  void *zmq_sub = zsocket_new (zmq_context, ZMQ_SUB); // init zmq subscriber: zmq_sub
158  zsocket_bind (zmq_sub, ipc_sub); // bind zmq subscriber
159  zsocket_set_subscribe (zmq_sub, ""); // set zmq subscriber filter
160 
161  zmq_pub = zsocket_new (zmq_context, ZMQ_PUB); // init zmq publisher: zmq_pub
162  zsocket_bind (zmq_pub, ipc_pub); // bind zmq publisher
163 
164  LOG (enable_syslog, "start request listener");
165 
166  while (!zctx_interrupted) // handle ctrl+c
167  {
168  zmsg_t *msg = zmsg_recv (zmq_sub); // recv zmsg
169  if (msg != NULL)
170  {
171  // get request mode (ex. tcp, rtu, others)
172  zframe_t *frame_mode = zmsg_pop (msg);
173  char *mode = zframe_strdup (frame_mode);
174 
175  // get request json string
176  zframe_t *frame_json = zmsg_pop (msg);
177  char *req_json_string = zframe_strdup (frame_json);
178 
179  // cleanup zmsg releated resources
180  zmsg_destroy (&msg);
181  zframe_destroy (&frame_mode);
182  zframe_destroy (&frame_json);
183 
184  LOG (enable_syslog, "recv msg: %s, %s\n", mode, req_json_string);
185 
186  // parse json string
187  cJSON *req_json_obj = cJSON_Parse (req_json_string);
188  char * tid = json_get_char (req_json_obj, "tid");
189 
190  if (req_json_obj != NULL)
191  {
192  cmd_s cmd = json_get_int (req_json_obj, "cmd");
193 
194  // @handle modbus tcp requests
195  if (strcmp (mode, "tcp") == 0)
196  {
197  LOG (enable_syslog, "@@@req: %d", cmd);
198 
199  switch (cmd)
200  {
201  case FC1:
202  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_read_bit_req_fn));
203  break;
204  case FC2:
205  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_read_bit_req_fn));
206  break;
207  case FC3:
208  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_read_reg_req_fn));
209  break;
210  case FC4:
211  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_read_reg_req_fn));
212  break;
213  case FC5:
214  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_single_write_req_fn));
215  break;
216  case FC6:
217  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_single_write_req_fn));
218  break;
219  case FC15:
220  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_multi_write_req_fn));
221  break;
222  case FC16:
223  send_modbus_resp (cmd, mbtcp_cmd_hanlder (cmd, req_json_obj, mbtcp_multi_write_req_fn));
224  break;
225  case SET_TCP_TIMEOUT:
226  send_modbus_resp (cmd, mbtcp_set_response_timeout (tid, json_get_long (req_json_obj, "timeout")));
227  break;
228  case GET_TCP_TIMEOUT:
229  send_modbus_resp (cmd, mbtcp_get_response_timeout (tid));
230  break;
231  default:
232  send_modbus_resp (cmd, set_modbus_fail_resp_str (tid, "unsupport request"));
233  break;
234  }
235  }
236  // @handle modbus rtu requests
237  else if (strcmp (mode, "rtu") == 0)
238  {
239  LOG (enable_syslog, "rtu:%d", cmd);
240  send_modbus_resp (-1, set_modbus_fail_resp_str (tid, "TODO"));
241  }
242  // @unkonw mode
243  else
244  {
245  send_modbus_resp (-1, set_modbus_fail_resp_str (tid, "unsupport mode"));
246  }
247  }
248  else
249  {
250  send_modbus_resp (-2, set_modbus_fail_resp_str (tid, "Fail to parse command string"));
251  }
252 
253  // @cleanup cJson object (auto mode)
254  cJSON_Delete (req_json_obj);
255  }
256  else
257  {
258  //ERR(enable_syslog, "Recv null message");
259  }
260  }
261 
262  // @resource clean up
263  LOG (enable_syslog, "housekeeping");
264  zctx_destroy (&zmq_context);
265  save_config (config_fname, config_json);
266 }
char * set_modbus_fail_resp_str(char *tid, const char *reason)
Set modbusd fail response string.
Definition: mb.c:41
char * mbtcp_read_bit_req_fn(uint8_t fc, mbtcp_handle_s *handle, cJSON *req)
Help function.
Definition: mbtcp.c:288
Definition: main.c:18
Definition: main.c:26
char * json_get_char(cJSON *inJson, const char *key)
Get char string via key from cJSON object.
Definition: json.c:11
Definition: main.c:27
long json_get_long(cJSON *inJson, const char *key)
Get long integer value via key from cJSON object.
Definition: json.c:36
Definition: main.c:22
void cJSON_Delete(cJSON *c)
Definition: cJSON.c:81
void * zmq_pub
Definition: main.c:53
#define VERSION
Definition: main.c:12
char * mbtcp_multi_write_req_fn(uint8_t fc, mbtcp_handle_s *handle, cJSON *req)
Help function.
Definition: mbtcp.c:417
int enable_syslog
Definition: main.c:46
char * mbtcp_read_reg_req_fn(uint8_t fc, mbtcp_handle_s *handle, cJSON *req)
Help function.
Definition: mbtcp.c:337
Definition: main.c:24
cJSON * cJSON_Parse(const char *value)
Definition: cJSON.c:343
Definition: main.c:20
Definition: main.c:19
char * mbtcp_get_response_timeout(char *tid)
Get mbtcp response timeout.
Definition: mbtcp.c:270
int json_get_int(cJSON *inJson, const char *key)
Get integer value via key from cJSON object.
Definition: json.c:16
char * mbtcp_cmd_hanlder(uint8_t fc, cJSON *req, mbtcp_fc ptr_handler)
Generic mbtcp command handler.
Definition: mbtcp.c:220
char * mbtcp_single_write_req_fn(uint8_t fc, mbtcp_handle_s *handle, cJSON *req)
Help function.
Definition: mbtcp.c:386
Definition: cJSON.h:47
Definition: main.c:21
char * mbtcp_set_response_timeout(char *tid, long timeout)
Set mbtcp response timeout in usec.
Definition: mbtcp.c:250
Definition: main.c:23
#define LOG(flag, fmt,...)
Definition: log.h:36
Definition: main.c:25
cmd_s
Definition: main.c:16

Here is the call graph for this function:

Variable Documentation

int enable_syslog = 0

Referenced by main().

long tcp_conn_timeout_usec
void* zmq_pub = NULL

Referenced by main().