1

我的问题很难说,但我试试。

我有一个模块 ztc_config,它从我的网络中的一些传感器读取响应。为了阅读这个响应,我编写了一个 C 类 query.c,它是这样的:

#include <stdio.h>
#include <time.h>
#include <sys/time.h>

#include "data.h"
#include "modules.h"

void query(hash_t* params) {
    record_t* rec;
    timestamp_t ts;
    timestamp_t rec_ts;
    uint32_t sec;
    uint32_t usec;
    timestamp_t now;
    timestamp_t start;
    timestamp_t end;
    char* startime;
    char* endtime;
    // Coordinator, opgroup and  Opcode  specified by the client
    uint64_t netid = 0;
    uint8_t opcode_group = 0;
    uint8_t opcode = 0;
    char* par;
    now = mdl_now();
    /* set the start and end time based on query parameters */
    startime = hash_get(params, "start");
    if(startime != NULL) 
        start = mdl_parse_timestr(startime, now);
    else
        start = now;
    endtime = hash_get(params, "end");
    if(endtime != NULL) 
        end = mdl_parse_timestr(endtime, now);
    else 
        end = ~0;
    // Network id is required
    par = hash_get(params, "netid");
    if(par == NULL) {
        mdl_print("netid required\n");
        exit(1);
    }
    netid = strtoull(par, NULL, 10);
    par = hash_get(params, "opcode_group");
    if(par == NULL) {
        mdl_print("opcode_group required\n");
        exit(1);
    }
    opcode_group = strtoul(par, NULL, 10);
    par = hash_get(params, "opcode");
    if(par == NULL) {
        mdl_print("opcode required\n");
        exit(1);
    }
    opcode = strtoul(par, NULL, 10);
    /* seek in the bytestream */
    mdl_seek(start);
    while((rec = (record_t* ) mdl_next(&ts)) != NULL) {
        uint64_t val;
        //float fval;
        /* reached end time ? */
        if(ts > end) break;
        rec_ts = NTOHLL(rec->ts);
        sec = TS2SEC(rec_ts);
        usec = TS2USEC(rec_ts);
        // Only print records with the wanted net and opcodes
        if((netid != 0) && (netid != NTOHLL(rec->net_id))) 
            continue;
        if((opcode_group != 0) && (opcode_group != ntohl(rec->opcode_group))) 
            continue;
        if((opcode != 0) && (opcode != ntohl(rec->opcode)))
            continue;
        val = NTOHLL(rec->payload);
        mdl_print("%u %llu %u %u %u %d\n", sec, NTOHLL(rec->net_id), rec->op_code_group, rec->op_code, rec->payloadlength, val);
    }
}

例如,当我访问此链接时,我会这样做:

http://localhost:44444/ztc_config?netid=2459546910990453036&opcode_group=164&opcode=224&start=-5m&end=-1s

在页面中,我只看到最后 5 分钟内来自 netid 2459546910990453036 和 opcode_group 164(十六进制 A4)和操作码 224(十六进制 E0)的记录。

但是我的 query.c 类有问题。所以如果我访问这个链接

http://localhost:44444/ztc_config?netid=0&opcode_group=0&opcode=0&start=-5m&end=-1s

我有最后 5 分钟内的所有记录。

但是,如果我更改任何 opcode_group 或 opcode 值,我什么也得不到……

有什么建议么?错误在哪里?

非常感谢。

编辑

我尝试像这样更改两个变量 opcode_group 和 opcode 的名称:

....
uint8_t op_code_group =0;
uint8_t op_code =0;
....
....
op_code_group = strtoul(par, NULL, 10);
....
op_code = strtoul(par, NULL, 10);

这样我写:

if ((op_code_group != 0) && (op_code_group != ntohl(rec->opcode_group))) continue;
if ((op_code != 0) && (op_code != ntohl(rec->opcode))) continue;

这应该是一个过滤器。在另一种情况下,具有相同的变量名称,条件为真,但值始终是初始化值 = 0。或者不是?

这个解决方案无论如何都不起作用...... :(请帮助我!

4

0 回答 0