#include "chan.h" #include "plt.h" #include #include #include #include #include #include #include #include extern int channbr; extern struct chan_t chan[CHAN_NBR_MAX + 1]; extern struct ctn_t ctn[CTN_NBR_MAX + 1]; static int sockfd = -1; static bool bChecking = false; static struct sockaddr_in saddr, caddr; static void *chan_checking(void *param) { log_info("-------------------chan_checking run!!%d", sockfd); while (bChecking) { int iRet = -1; char buff[1024] = {0}; int len = sizeof(caddr); int iRecv = recvfrom(sockfd, buff, 1024, 0, (struct sockaddr *)&caddr, &len); if (iRecv <= 0) { continue; } cJSON *root = cJSON_Parse(buff); if (NULL != root) { snprintf(buff, sizeof(buff), "error"); cJSON *id = cJSON_GetObjectItem(root, "id"); cJSON *mode = cJSON_GetObjectItem(root, "mode"); cJSON *index = cJSON_GetObjectItem(root, "index"); if (id && mode && index) { int iID = id->valueint; int iMode = chan_mode_str2nbr(mode->valuestring); int iIndex = index->valueint; switch (iMode) { case CHANMODE_SERIAL: iRet = chan[iIndex].fd > 0 ? 1 : -1; break; case CHANMODE_SOCKET_CAN: case CHANMODE_TCPSERV_CAN: iRet = chan[iIndex].sockfd > 0 ? 1 : -1; break; case CHANMODE_MODBUS_RTU: case CHANMODE_MODBUS_TCP: { cJSON *slave = cJSON_GetObjectItem(root, "slave"); cJSON *reg = cJSON_GetObjectItem(root, "reg"); cJSON *count = cJSON_GetObjectItem(root, "count"); int iNum = 2; if (count) { iNum = count->valueint; } if (slave && reg) { unsigned short tab_us[256] = {0}; int iSlave = slave->valueint; int iReg = reg->valueint; iRet = chan_read_holdingregisters_with_retry(iIndex, iSlave, iReg, iNum, tab_us); if (iRet >= 0) { iRet = abs(tab_us[0]); } } break; } case CHANMODE_DI: { char buf[64] = {0}; sprintf(buf, "/sys/class/gpio/gpio%d/value", iIndex); int fd_value = open(buf, O_RDONLY); if (fd_value > -1) { memset(buf, 0, sizeof(buf)); lseek(fd_value, 0, SEEK_SET); if (read(fd_value, buf, sizeof(buf)) > 0) { iRet = atoi(buf); } close(fd_value); } break; } case CHANMODE_DO: { char buf[64] = {0}; sprintf(buf, "/sys/class/gpio/gpio%d/value", iIndex); int fd_value = open(buf, O_RDWR); if (fd_value > -1) { cJSON *value = cJSON_GetObjectItem(root, "value"); if (value) { memset(buf, 0, sizeof(buf)); sprintf(buf, "%d", value->valueint); if (write(fd_value, buf, sizeof(buf)) > 0) { iRet = atoi(buf); } } close(fd_value); } break; } } snprintf(buff, sizeof(buff), "{\"index\":%d,\"return\":%d}", iID, iRet); log_info("reps:%s", buff); // sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr)); } else { cJSON *msg = cJSON_GetObjectItem(root, "msg"); if (NULL != msg) { if (strcmp(msg->valuestring, "setCtnMqtt") == 0) { int rc = -1; char sql[1024] = {0}; char *errmsg = NULL; sqlite3 *db = plt_get_projdb(); 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); rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg); if (rc == SQLITE_OK) { sprintf(mqtt.szservip, "%s", cJSON_GetObjectItem(root, "mqttServer")->valuestring); sprintf(mqtt.szclientid, "%s", cJSON_GetObjectItem(root, "mqttClientID")->valuestring); sprintf(mqtt.szusername, "%s", cJSON_GetObjectItem(root, "mqttUserName")->valuestring); sprintf(mqtt.szpasswd, "%s", cJSON_GetObjectItem(root, "mqttPassword")->valuestring); } 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); rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg); if (rc == SQLITE_OK) { sprintf(mqtt.szservip, "%s", cJSON_GetObjectItem(root, "mqttServer")->valuestring); sprintf(mqtt.szclientid, "%s", cJSON_GetObjectItem(root, "mqttClientID")->valuestring); sprintf(mqtt.szusername, "%s", cJSON_GetObjectItem(root, "mqttUserName")->valuestring); sprintf(mqtt.szaccesstoken, "%s", cJSON_GetObjectItem(root, "mqttUserName")->valuestring); sprintf(mqtt.szpasswd, "%s", cJSON_GetObjectItem(root, "mqttPassword")->valuestring); } sprintf(sql, "update ctn set prj_id=%s", cJSON_GetObjectItem(root, "projectID")->valuestring); rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg); if (rc == SQLITE_OK) { sprintf(ctn[1].szprojId, "%s", cJSON_GetObjectItem(root, "projectID")->valuestring); } snprintf(buff, sizeof(buff), "{\"projectID\":\"%s\",\"mqttServer\":\"%s\",\"mqttClientID\":\"%s\",\"mqttUserName\":\"%s\" \ ,\"mqttPassword\":\"%s\",\"tbmqttServer\":\"%s\",\"tbmqttClientID\":\"%s\",\"tbmqttUserName\":\"%s\",\"tbmqttPassword\":\"%s\"}", ctn[1].szprojId, mqtt.szservip, mqtt.szclientid, mqtt.szusername, mqtt.szpasswd, tbmqtt.szservip, tbmqtt.szclientid, tbmqtt.szusername, tbmqtt.szpasswd); // sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr)); } if (strcmp(msg->valuestring, "getCtnMqtt") == 0) { struct mqtt_t *dev = &mqtt; snprintf(buff, sizeof(buff), "{\"projectID\":\"%s\",\"mqttServer\":\"%s\",\"mqttClientID\":\"%s\",\"mqttUserName\":\"%s\" \ ,\"mqttPassword\":\"%s\",\"tbmqttServer\":\"%s\",\"tbmqttClientID\":\"%s\",\"tbmqttUserName\":\"%s\",\"tbmqttPassword\":\"%s\"}", ctn[1].szprojId, mqtt.szservip, mqtt.szclientid, mqtt.szusername, mqtt.szpasswd, tbmqtt.szservip, tbmqtt.szclientid, tbmqtt.szusername, tbmqtt.szpasswd); // sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr)); } } } cJSON_Delete(root); sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&caddr, sizeof(caddr)); } } pthread_exit((void *)1); return NULL; } static void SetMqtt(cJSON root) { } static void GetMqtt(cJSON root) { } int chan_check_start() { pthread_t thrd; sockfd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP); memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(8001); saddr.sin_addr.s_addr = 0; int res = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)); // struct timeval TimeOut; // TimeOut.tv_sec = 5; // TimeOut.tv_usec = 0; // setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&TimeOut, sizeof(TimeOut)); bChecking = true; pthread_create(&thrd, NULL, chan_checking, NULL); pthread_detach(thrd); } int chan_check_stop() { bChecking = false; close(sockfd); }