#include //#include <../packages/webclient-v2.2.0/inc/webclient.h> #include #define LOG_TAG "getinfo" #define LOG_LVL LOG_LVL_DBG #include //#define HTTP_GET_URL "http://www.rt-thread.com/service/rt-thread.txt" #ifndef TT_IP #define TT_IP "http://192.168.0.232:4005" #endif #define TT_SIM TT_IP "/action/webGetSIMState"//SIM #define TT_XH TT_IP "/action/webGetTDSignal"//信号值 #define TT_RW TT_IP "/action/webGetTdState"//入网 #define TT_JH TT_IP "/action/webGetPSState"//激活 #define TT_DW TT_IP "/action/webGetBDGPS"//定位 //http://192.168.0.232:4005/action/webGetSIMState webGetBDGPS #include #include #include #include //用于strtod函数 #include char *infoH[] = { TT_SIM, TT_XH, TT_RW, TT_JH, TT_DW}; typedef struct { rt_uint8_t cnt; rt_uint8_t s; } CFG; typedef struct { rt_uint8_t sim; // SIM rt_uint8_t xh; // 信号值 rt_uint8_t rw; // 入网 rt_uint8_t jh; // 激活 char *jd; // 经度 char *wd; // 纬度 char *ele; // 高度 } TT; static TT tmp; static TT *TTinfo=&tmp; /** * @description: 将TT结构体转换为数组 * @param {TT} *TTinfo TT结构体 * @param {rt_uint8_t} *buffer 存储转换结果 * @return {*} buffer大小 */ rt_uint8_t info2HEX(TT *TTinfo, rt_uint8_t *buffer) { // 功能:将tt数据转换为9字节HEX数据并返回,存在data // 第1节为高3位分别为sim、rw和jh,其余位为xh,xh值若大于31则为31(31=b0001 1111) // 第2-5字节为经度。114.410050= 0xF2 0xD1 0xE4 0x42 // 第6-9字节为纬度。30.426840= 0x2B 0x6A 0xF3 0x41 // 第10字节为高度,只保留整数。-31.5= 0x0A rt_uint8_t tmp = (atoi(TTinfo->sim) << 7) + (atoi(TTinfo->rw) << 6) + (atoi(TTinfo->jh) << 5) + (atoi(TTinfo->xh) > 31 ? 31 : atoi(TTinfo->xh)); // 位操作 char *jd_c = &TTinfo->jd[2]; // 从第二位开始取,去除非数字字符 char *wd_c = &TTinfo->wd[2]; float jd_f = strtod(jd_c, NULL); // 字符转浮点 float wd_f = strtod(wd_c, NULL); rt_int8_t ele_f = atoi(TTinfo->ele); // printf("jd--%f\nwd--%f\nele-- %d \n", jd_f, wd_f, ele_f); rt_uint8_t offset = 0; memcpy(buffer + offset, &tmp, 1); offset += 1; memcpy(buffer + offset, &jd_f, sizeof(float)); offset += sizeof(float); memcpy(buffer + offset, &wd_f, sizeof(float)); offset += sizeof(float); memcpy(buffer + offset, &ele_f, sizeof(rt_int8_t)); offset += sizeof(rt_int8_t); return offset; } //TT TTinfo; //TTinfo = (TT*)malloc(sizeof(TT)); //TTinfo = &tmp; /* 数据解析 */ static void tt_parse(rt_uint8_t *data) { extern TT *TTinfo; cJSON *root = RT_NULL, *object = RT_NULL, *item = RT_NULL; // rt_kprintf("%5s%5s%5s%5s%15s%15s%10s\n", TTinfo->sim, TTinfo->xh, TTinfo->rw, // TTinfo->jh, TTinfo->jd, TTinfo->wd,TTinfo->ele); root = cJSON_Parse((const char *) data); if (!root) { rt_kprintf("No memory for cJSON root!\n"); return; } object = cJSON_GetObjectItem(root, "data"); item = cJSON_GetObjectItem(object, "tdsignal"); if (item) { TTinfo->xh = atoi(item->valuestring); // tmp.xh = item->valuestring; // strcpy(TTinfo->xh,item->valuestring); // rt_kprintf("\nxh:%s ", item->valuestring); // rt_kprintf("\nxh:%s ", TTinfo->xh); cJSON_Delete(root); return RT_EOK; } item = cJSON_GetObjectItem(object, "tdnetregstate"); if (item) { TTinfo->rw = atoi(item->valuestring); // rt_kprintf("\nrw:%s ", TTinfo.rw); cJSON_Delete(root); return RT_EOK; } item = cJSON_GetObjectItem(object, "tdpsstate"); if (item) { TTinfo->jh = atoi(item->valuestring); // rt_kprintf("\njh:%s ", TTinfo.jh); cJSON_Delete(root); return RT_EOK; } item = cJSON_GetObjectItem(object, "latitude"); if (item) { TTinfo->wd = item->valuestring; item = cJSON_GetObjectItem(object, "longitude"); TTinfo->jd = item->valuestring; item = cJSON_GetObjectItem(object, "elevation"); TTinfo->ele = item->valuestring; // rt_kprintf("%5s%5s%5s%5s%15s%15s%10s\n", TTinfo->sim, TTinfo->xh, TTinfo->rw, // TTinfo->jh, TTinfo->jd, TTinfo->wd,TTinfo->ele); cJSON_Delete(root); return RT_EOK; } item = cJSON_GetObjectItem(object, "tdsimstate"); if (item) { TTinfo->sim = atoi(item->valuestring); // tmp.sim = item->valuestring; // strcpy(TTinfo.sim,item->valuestring) // rt_kprintf("\nSIM:%s \n", TTinfo->sim); cJSON_Delete(root); return RT_EOK; } if (root != RT_NULL) cJSON_Delete(root); } /* HTTP client download data by GET request */ static int webclient_get_data(const char *url) { unsigned char *buffer = RT_NULL; size_t length = 0; if (webclient_request(url, RT_NULL, RT_NULL, 0, (void **) &buffer, &length) < 0) { LOG_E("TT server is not ready."); return -RT_ERROR; } // LOG_D("webclient GET request response data :"); // LOG_D("%s", buffer); tt_parse(buffer); if (buffer) { web_free(buffer); } return RT_EOK; } void getTTinfo_thread_entry(void* parameter) { CFG* cfg = RT_NULL; cfg = (CFG*) parameter; // TT TTinfo; rt_uint8_t var = 0, isize = 0, i = 0; isize = sizeof(infoH) / sizeof(infoH[0]); rt_kprintf("\n%10s%s\n", " ", "↓---------getTT START.--------↓"); rt_kprintf("%5s%5s%5s%5s%15s%15s%10s\n", "SIM", "xh", "rw", "jh", "N", "E", "ele"); for (i = 0; i < cfg->cnt; ++i)//按指定次数轮询 { for (var = 0; var < isize; var++)//轮询每个参数 { char *url = RT_NULL; url = web_strdup(*(infoH + var)); if (url == RT_NULL) { rt_kprintf("no memory for create getTT url buffer.\n"); return -RT_ENOMEM; } webclient_get_data(url); web_free(url); } // rt_kprintf("%5d++%5d --%5d\n",TTinfo->xh,tmp.xh,TTinfo->sim); // rt_kprintf("%5d%5d%5d%5d%15s%15s%10s\n", TTinfo.sim, TTinfo.xh, TTinfo.rw, TTinfo.jh, TTinfo.jd, TTinfo.wd,TTinfo.ele); rt_kprintf("%5d%5d%5d%5d%15s%15s%10s\n", TTinfo->sim, TTinfo->xh, TTinfo->rw, TTinfo->jh, TTinfo->jd, TTinfo->wd,TTinfo->ele); if (i != cfg->cnt - 1)//最后一次采集不延时 { rt_thread_mdelay(cfg->s * 1000); } } rt_kprintf("%10s%s\n", " ", "↑---------getTT DONE.---------↑"); } void getTT(int argc, char **argv) { // size_t cnt = 0, s=3;//次数、间隔 static CFG cfg; memset(&cfg, 0, sizeof(CFG)); if (argc == 1) { cfg.cnt = 1; cfg.s = 3; } else if (argc == 2) { cfg.cnt = atoi(argv[1]); cfg.s = 3; } else if (argc == 3) { cfg.cnt = atoi(argv[1]); cfg.s = atoi(argv[2]); } // LOG_D("cnt-%d",cfg.cnt); // LOG_D("s-%d",cfg.s); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("getTT", getTTinfo_thread_entry, (void *) &cfg, 1024 * 3, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); // rt_kprintf("done"); } else { LOG_E("thread 'getTT' create failure."); return RT_ERROR; } } /* 导出到自动初始化 */ MSH_CMD_EXPORT(getTT, 获取天通信息,支持参数。 "getTT 3 1" means try 3 times with 1 second interval.); //MSH_CMD_EXPORT_ALIAS(webclient_get_data, gTTinfo, GET info of TT server.);