chan_checking.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "chan.h"
  2. #include "plt.h"
  3. #include <arpa/inet.h>
  4. #include <assert.h>
  5. #include <netinet/in.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <sys/socket.h>
  10. #include <unistd.h>
  11. extern int channbr;
  12. extern struct chan_t chan[CHAN_NBR_MAX + 1];
  13. extern struct ctn_t ctn[CTN_NBR_MAX + 1];
  14. static int sockfd = -1;
  15. static bool bChecking = false;
  16. static struct sockaddr_in saddr, caddr;
  17. static void *chan_checking(void *param)
  18. {
  19. log_info("-------------------chan_checking run!!%d", sockfd);
  20. while (bChecking)
  21. {
  22. int iRet = -1;
  23. char buff[1024] = {0};
  24. int len = sizeof(caddr);
  25. int iRecv = recvfrom(sockfd, buff, 1024, 0, (struct sockaddr *)&caddr, &len);
  26. if (iRecv <= 0)
  27. {
  28. continue;
  29. }
  30. cJSON *root = cJSON_Parse(buff);
  31. if (NULL != root)
  32. {
  33. snprintf(buff, sizeof(buff), "error");
  34. cJSON *id = cJSON_GetObjectItem(root, "id");
  35. cJSON *mode = cJSON_GetObjectItem(root, "mode");
  36. cJSON *index = cJSON_GetObjectItem(root, "index");
  37. if (id && mode && index)
  38. {
  39. int iID = id->valueint;
  40. int iMode = chan_mode_str2nbr(mode->valuestring);
  41. int iIndex = index->valueint;
  42. switch (iMode)
  43. {
  44. case CHANMODE_SERIAL:
  45. iRet = chan[iIndex].fd > 0 ? 1 : -1;
  46. break;
  47. case CHANMODE_SOCKET_CAN:
  48. case CHANMODE_TCPSERV_CAN:
  49. iRet = chan[iIndex].sockfd > 0 ? 1 : -1;
  50. break;
  51. case CHANMODE_MODBUS_RTU:
  52. case CHANMODE_MODBUS_TCP:
  53. {
  54. cJSON *slave = cJSON_GetObjectItem(root, "slave");
  55. cJSON *reg = cJSON_GetObjectItem(root, "reg");
  56. cJSON *count = cJSON_GetObjectItem(root, "count");
  57. int iNum = 2;
  58. if (count)
  59. {
  60. iNum = count->valueint;
  61. }
  62. if (slave && reg)
  63. {
  64. unsigned short tab_us[256] = {0};
  65. int iSlave = slave->valueint;
  66. int iReg = reg->valueint;
  67. iRet = chan_read_holdingregisters_with_retry(iIndex, iSlave, iReg, iNum, tab_us);
  68. if (iRet >= 0)
  69. {
  70. iRet = abs(tab_us[0]);
  71. }
  72. }
  73. break;
  74. }
  75. case CHANMODE_DI:
  76. {
  77. char buf[64] = {0};
  78. sprintf(buf, "/sys/class/gpio/gpio%d/value", iIndex);
  79. int fd_value = open(buf, O_RDONLY);
  80. if (fd_value > -1)
  81. {
  82. memset(buf, 0, sizeof(buf));
  83. lseek(fd_value, 0, SEEK_SET);
  84. if (read(fd_value, buf, sizeof(buf)) > 0)
  85. {
  86. iRet = atoi(buf);
  87. }
  88. close(fd_value);
  89. }
  90. break;
  91. }
  92. case CHANMODE_DO:
  93. {
  94. char buf[64] = {0};
  95. sprintf(buf, "/sys/class/gpio/gpio%d/value", iIndex);
  96. int fd_value = open(buf, O_RDWR);
  97. if (fd_value > -1)
  98. {
  99. cJSON *value = cJSON_GetObjectItem(root, "value");
  100. if (value)
  101. {
  102. memset(buf, 0, sizeof(buf));
  103. sprintf(buf, "%d", value->valueint);
  104. if (write(fd_value, buf, sizeof(buf)) > 0)
  105. {
  106. iRet = atoi(buf);
  107. }
  108. }
  109. close(fd_value);
  110. }
  111. break;
  112. }
  113. }
  114. snprintf(buff, sizeof(buff), "{\"index\":%d,\"return\":%d}", iID, iRet);
  115. log_info("reps:%s", buff);
  116. // sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr));
  117. }
  118. else
  119. {
  120. cJSON *msg = cJSON_GetObjectItem(root, "msg");
  121. if (NULL != msg)
  122. {
  123. if (strcmp(msg->valuestring, "setCtnMqtt") == 0)
  124. {
  125. int rc = -1;
  126. char sql[1024] = {0};
  127. char *errmsg = NULL;
  128. sqlite3 *db = plt_get_projdb();
  129. sprintf(sql, "update mqtt_ctn set servip=%s, clientid=%s, usernam=%s, passwd=%s", cJSON_GetObjectItem(root, "mqttServer")->valuestring, cJSON_GetObjectItem(root, "mqttClientID")->valuestring, cJSON_GetObjectItem(root, "mqttUserName")->valuestring, cJSON_GetObjectItem(root, "mqttPassword")->valuestring);
  130. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  131. if (rc == SQLITE_OK)
  132. {
  133. sprintf(mqtt.szservip, "%s", cJSON_GetObjectItem(root, "mqttServer")->valuestring);
  134. sprintf(mqtt.szclientid, "%s", cJSON_GetObjectItem(root, "mqttClientID")->valuestring);
  135. sprintf(mqtt.szusername, "%s", cJSON_GetObjectItem(root, "mqttUserName")->valuestring);
  136. sprintf(mqtt.szpasswd, "%s", cJSON_GetObjectItem(root, "mqttPassword")->valuestring);
  137. }
  138. sprintf(sql, "update tbmqtt_ctn set servip=%s, clientid=%s, accesstoken=%s,usernam=%s, passwd=%s", cJSON_GetObjectItem(root, "mqttServer")->valuestring, cJSON_GetObjectItem(root, "mqttClientID")->valuestring, cJSON_GetObjectItem(root, "mqttUserName")->valuestring, cJSON_GetObjectItem(root, "mqttUserName")->valuestring, cJSON_GetObjectItem(root, "mqttPassword")->valuestring);
  139. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  140. if (rc == SQLITE_OK)
  141. {
  142. sprintf(mqtt.szservip, "%s", cJSON_GetObjectItem(root, "mqttServer")->valuestring);
  143. sprintf(mqtt.szclientid, "%s", cJSON_GetObjectItem(root, "mqttClientID")->valuestring);
  144. sprintf(mqtt.szusername, "%s", cJSON_GetObjectItem(root, "mqttUserName")->valuestring);
  145. sprintf(mqtt.szaccesstoken, "%s", cJSON_GetObjectItem(root, "mqttUserName")->valuestring);
  146. sprintf(mqtt.szpasswd, "%s", cJSON_GetObjectItem(root, "mqttPassword")->valuestring);
  147. }
  148. sprintf(sql, "update ctn set prj_id=%s", cJSON_GetObjectItem(root, "projectID")->valuestring);
  149. rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
  150. if (rc == SQLITE_OK)
  151. {
  152. sprintf(ctn[1].szprojId, "%s", cJSON_GetObjectItem(root, "projectID")->valuestring);
  153. }
  154. snprintf(buff, sizeof(buff), "{\"projectID\":\"%s\",\"mqttServer\":\"%s\",\"mqttClientID\":\"%s\",\"mqttUserName\":\"%s\" \
  155. ,\"mqttPassword\":\"%s\",\"tbmqttServer\":\"%s\",\"tbmqttClientID\":\"%s\",\"tbmqttUserName\":\"%s\",\"tbmqttPassword\":\"%s\"}",
  156. ctn[1].szprojId, mqtt.szservip, mqtt.szclientid, mqtt.szusername, mqtt.szpasswd, tbmqtt.szservip, tbmqtt.szclientid, tbmqtt.szusername, tbmqtt.szpasswd);
  157. // sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr));
  158. }
  159. if (strcmp(msg->valuestring, "getCtnMqtt") == 0)
  160. {
  161. struct mqtt_t *dev = &mqtt;
  162. snprintf(buff, sizeof(buff), "{\"projectID\":\"%s\",\"mqttServer\":\"%s\",\"mqttClientID\":\"%s\",\"mqttUserName\":\"%s\" \
  163. ,\"mqttPassword\":\"%s\",\"tbmqttServer\":\"%s\",\"tbmqttClientID\":\"%s\",\"tbmqttUserName\":\"%s\",\"tbmqttPassword\":\"%s\"}",
  164. ctn[1].szprojId, mqtt.szservip, mqtt.szclientid, mqtt.szusername, mqtt.szpasswd, tbmqtt.szservip, tbmqtt.szclientid, tbmqtt.szusername, tbmqtt.szpasswd);
  165. // sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr));
  166. }
  167. }
  168. }
  169. cJSON_Delete(root);
  170. sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr));
  171. }
  172. }
  173. pthread_exit((void *)1);
  174. return NULL;
  175. }
  176. static void SetMqtt(cJSON root)
  177. {
  178. }
  179. static void GetMqtt(cJSON root)
  180. {
  181. }
  182. int chan_check_start()
  183. {
  184. pthread_t thrd;
  185. sockfd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP);
  186. memset(&saddr, 0, sizeof(saddr));
  187. saddr.sin_family = AF_INET;
  188. saddr.sin_port = htons(8001);
  189. saddr.sin_addr.s_addr = 0;
  190. int res = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
  191. // struct timeval TimeOut;
  192. // TimeOut.tv_sec = 5;
  193. // TimeOut.tv_usec = 0;
  194. // setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&TimeOut, sizeof(TimeOut));
  195. bChecking = true;
  196. pthread_create(&thrd, NULL, chan_checking, NULL);
  197. pthread_detach(thrd);
  198. }
  199. int chan_check_stop()
  200. {
  201. bChecking = false;
  202. close(sockfd);
  203. }