2675 lines
100 KiB
C
2675 lines
100 KiB
C
#include "sock_api/sock_api.h"
|
||
#include "lwip.h"
|
||
#include <string.h>
|
||
#include "stdlib.h"
|
||
#include "time.h"
|
||
#include "json_c/json_object.h"
|
||
#include "json_c/json_tokener.h"
|
||
#include "server/ai_server.h"
|
||
#include "system/includes.h"
|
||
#include "asm/crc16.h"
|
||
#include "common/base64.h"
|
||
#include "common/aes.h"
|
||
#include "fs/fs.h"
|
||
#include "asm/sfc_norflash_api.h"
|
||
|
||
#ifdef TELECOM_MC_SDK_VERSION
|
||
MODULE_VERSION_EXPORT(telecom_mc_sdk, TELECOM_MC_SDK_VERSION);
|
||
#endif
|
||
|
||
#if 1
|
||
#define log_info(x, ...) printf("\n>>>>>>[mc_device]\n" x " ", ## __VA_ARGS__)
|
||
#else
|
||
#define log_info(...)
|
||
#endif
|
||
|
||
#define DEV_CTEI_LOGIN_ENABLE
|
||
|
||
#define CT_LOGIN_HOST "smarthome.ctdevice.ott4china.com:9012"
|
||
#define CT_DEVICE_VERSION "11111.222.333.444"
|
||
#define CT_PARENT_DEV_MAC "000000000000"
|
||
#define CT_VERSION "000.000.000.001"
|
||
#define CT_SUB_DEVICE_ID "123123123123112312"
|
||
#define CT_SUB_DEVICE_CTEI "123123123312312312"
|
||
#define CT_SUB_DEVICE_MAC "123312312312312"
|
||
|
||
#define FLASH_BUF_LEN 1024
|
||
#define FLASH_BUF_START 12 * 1024
|
||
|
||
//定时器ID
|
||
static int heartbeat_timeout_id;
|
||
static int heartbeat_id;
|
||
static int device_status_id;
|
||
//线程PID
|
||
static int server_func_id;
|
||
static int dev_login_pid;
|
||
|
||
static int recv_sequence_num; //接收随机数
|
||
static u8 report_all; //发送完整状态成功标志位
|
||
static u8 CT_connect_flag; //SDK可连接标志位
|
||
static u8 heart_send; //心跳已发送标志,处理了心跳包发送但先收到非心跳包的情况
|
||
|
||
static int tcp_device_init(char *tcp_host);
|
||
static void tcp_send_function(int code);
|
||
static void tcp_recv_handler(void *priv);
|
||
static void device_status_init();
|
||
static void info_init();
|
||
static void timeout_func(void *priv);
|
||
static void device_status_func(void *priv);
|
||
static void heartbeat_ctl_func(void *priv);
|
||
static void status_set_func(int serial, char *name, char *param);
|
||
|
||
enum SEVER_TO_DEVICE_EVENT {
|
||
RECV_MSG,
|
||
CONNECT_CLOSE,
|
||
};
|
||
|
||
struct CT_Mc_device_info {
|
||
struct sockaddr_in local;
|
||
struct sockaddr_in dest;
|
||
void *tcp_sock;
|
||
void *udp_sock;
|
||
|
||
char ipaddr[20];
|
||
|
||
char tcpHost[64];
|
||
char tcp_port[10];
|
||
|
||
char udpHost[64];
|
||
char udp_port[10];
|
||
|
||
u16 serial_num;
|
||
char deviceId[50];
|
||
char sessionKey[20];
|
||
char pin[20];
|
||
char iv[20];
|
||
char mac[20];
|
||
char ctei[20];
|
||
char model[20];
|
||
|
||
char token[40];
|
||
|
||
int heartBeat;
|
||
int authInterval;
|
||
|
||
u8 login_flag;
|
||
};
|
||
static struct CT_Mc_device_info device = {0};
|
||
|
||
const struct ai_sdk_api CT_MC_api;
|
||
|
||
/************************************************/
|
||
//statusSerials
|
||
struct extraStatusParam {
|
||
int test; //#测试使用
|
||
};
|
||
|
||
struct dev_status {
|
||
struct list_head entry;
|
||
char statusName[20];
|
||
int statusValue;
|
||
|
||
u8 total; //共有同类型设备数量
|
||
u8 id_num; //设备单/多路序号
|
||
u8 upload_flag; //设备状态上报标志
|
||
|
||
u8 param_vaild; //是否有扩展项
|
||
struct extraStatusParam param;
|
||
};
|
||
static struct dev_status status_head;
|
||
|
||
/***********************************************/
|
||
//resourceSerials
|
||
struct resourceInfoParam {
|
||
int consum_ID;
|
||
int remain_life;
|
||
char consum_name[20];
|
||
};
|
||
|
||
struct dev_res {
|
||
struct list_head entry;
|
||
struct resourceInfoParam param;
|
||
char resourceName[20];
|
||
|
||
u8 total; //共有同类型设备数量
|
||
u8 id_num; //设备单/多路序号
|
||
u8 upload_flag; //设备状态上报标志
|
||
};
|
||
static struct dev_res res_head;
|
||
|
||
/************************************************/
|
||
//event //#没测试到
|
||
struct eventInfoParam {
|
||
char ID_name[20];
|
||
int ID_value;
|
||
char TYPE_name[20];
|
||
int TYPE_value;
|
||
};
|
||
|
||
struct device_eventInfo {
|
||
struct list_head entry;
|
||
char eventName[20];
|
||
struct eventInfoParam param;
|
||
};
|
||
static struct device_eventInfo event_head;
|
||
/************************************************/
|
||
|
||
|
||
static struct dev_status *get_alarm_info()
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
#define PROFILE_PATH "mnt/sdfile/EXT_RESERVED/telecom"
|
||
|
||
//设备信息读取
|
||
static int device_read_flash()
|
||
{
|
||
printf("%s", __func__);
|
||
int ret = -1;
|
||
|
||
struct list_head *pos = NULL;
|
||
struct dev_status *status_info = NULL;
|
||
struct dev_res *res_info = NULL;
|
||
|
||
u8 *device_data = (u8 *)calloc(1, FLASH_BUF_LEN);
|
||
if (!device_data) {
|
||
return ret;
|
||
}
|
||
|
||
u32 profile_addr;
|
||
FILE *profile_fp = fopen(PROFILE_PATH, "r");
|
||
if (profile_fp == NULL) {
|
||
free(device_data);
|
||
return ret;
|
||
}
|
||
|
||
struct vfs_attr file_attr;
|
||
fget_attrs(profile_fp, &file_attr);
|
||
profile_addr = file_attr.sclust;
|
||
fclose(profile_fp);
|
||
|
||
sdfile_reserve_zone_read(device_data, profile_addr, FLASH_BUF_LEN, 0);
|
||
|
||
u16 *device_crc = (u16 *)&device_data[0];
|
||
u16 *device_len = (u16 *)&device_data[2];
|
||
if (*device_len > FLASH_BUF_LEN) {
|
||
printf("------%s------%d, no data ,device_len = %d\r\n", __func__, __LINE__, *device_len);
|
||
goto read_exit;
|
||
}
|
||
|
||
//CRC校验比较
|
||
if (*device_crc != CRC16((const void *)&device_data[4], (u32)*device_len)) {
|
||
printf("-----%s--------%d, CRC16 failed\r\n", __func__, __LINE__);
|
||
goto read_exit;
|
||
}
|
||
|
||
u16 *status_num = (u16 *)&device_data[4];
|
||
u16 *resource_num = (u16 *)&device_data[6];
|
||
u8 *device_buffer = &device_data[8];
|
||
|
||
for (int i = 0; i < (u32)*status_num; i++) {
|
||
status_info = (struct dev_status *)calloc(1, sizeof(struct dev_status));
|
||
if (status_info == NULL) {
|
||
goto read_exit;
|
||
}
|
||
memcpy(status_info, device_buffer, sizeof(struct dev_status));
|
||
device_buffer += sizeof(struct dev_status);
|
||
list_add_tail(&status_info->entry, &status_head.entry);
|
||
}
|
||
|
||
for (int i = 0; i < (u32)*resource_num; i++) {
|
||
res_info = (struct dev_res *)calloc(1, sizeof(struct dev_res));
|
||
if (res_info == NULL) {
|
||
goto read_exit;
|
||
}
|
||
memcpy(res_info, device_buffer, sizeof(struct dev_res));
|
||
device_buffer += sizeof(struct dev_res);
|
||
list_add_tail(&res_info->entry, &res_head.entry);
|
||
}
|
||
|
||
ret = 0;
|
||
|
||
read_exit:
|
||
//关闭flash
|
||
free(device_data);
|
||
device_data = NULL;
|
||
return ret;
|
||
}
|
||
|
||
//擦除flash函数,测试使用
|
||
void device_erase_flash()
|
||
{
|
||
printf("%s", __func__);
|
||
|
||
u32 profile_addr;
|
||
FILE *profile_fp = fopen(PROFILE_PATH, "r");
|
||
if (profile_fp == NULL) {
|
||
return;
|
||
}
|
||
|
||
struct vfs_attr file_attr;
|
||
fget_attrs(profile_fp, &file_attr);
|
||
profile_addr = file_attr.sclust;
|
||
fclose(profile_fp);
|
||
|
||
sdfile_reserve_zone_erase(profile_addr, SDFILE_SECTOR_SIZE, 0);
|
||
}
|
||
|
||
//设备信息存储
|
||
void device_write_flash()
|
||
{
|
||
printf("%s", __func__);
|
||
|
||
struct list_head *pos = NULL;
|
||
struct dev_status *status_info = NULL;
|
||
struct dev_res *res_info = NULL;
|
||
|
||
u8 *device_data = (u8 *)calloc(1, FLASH_BUF_LEN);
|
||
if (!device_data) {
|
||
return;
|
||
}
|
||
|
||
u32 profile_addr;
|
||
FILE *profile_fp = fopen(PROFILE_PATH, "r");
|
||
if (profile_fp == NULL) {
|
||
free(device_data);
|
||
return;
|
||
}
|
||
|
||
struct vfs_attr file_attr;
|
||
fget_attrs(profile_fp, &file_attr);
|
||
profile_addr = file_attr.sclust;
|
||
fclose(profile_fp);
|
||
|
||
u16 *device_crc = (u16 *)&device_data[0];
|
||
u16 *device_len = (u16 *)&device_data[2];
|
||
u16 *status_num = (u16 *)&device_data[4];
|
||
u16 *resource_num = (u16 *)&device_data[6];
|
||
|
||
list_for_each(pos, &status_head.entry) {
|
||
(*status_num)++;
|
||
}
|
||
list_for_each(pos, &res_head.entry) {
|
||
(*resource_num)++;
|
||
}
|
||
|
||
u8 *device_buffer = &device_data[8];
|
||
*device_len = 4;
|
||
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
memcpy(device_buffer, status_info, sizeof(struct dev_status));
|
||
device_buffer += sizeof(struct dev_status);
|
||
*device_len += sizeof(struct dev_status);
|
||
}
|
||
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
memcpy(device_buffer, res_info, sizeof(struct dev_res));
|
||
device_buffer += sizeof(struct dev_res);
|
||
*device_len += sizeof(struct dev_res);
|
||
}
|
||
|
||
*device_crc = CRC16((const void *)&device_data[4], (u32) * device_len);
|
||
|
||
sdfile_reserve_zone_erase(profile_addr, SDFILE_SECTOR_SIZE, 0);
|
||
sdfile_reserve_zone_write(device_data, profile_addr, *device_len + 4, 0);
|
||
free(device_data);
|
||
device_data = NULL;
|
||
}
|
||
|
||
//设备信息初始化
|
||
static void device_status_init()
|
||
{
|
||
struct list_head *pos = NULL;
|
||
int total = 0;
|
||
char tmp_buf[32];
|
||
struct dev_status *status_info = NULL;
|
||
struct dev_res *res_info = NULL;
|
||
|
||
//-----------------------设备状态初始化-------------------------------//
|
||
/************************************/
|
||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||
strcpy(tmp_buf, "POWER");
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
if (!strcmp(status_info->statusName, tmp_buf)) {
|
||
status_info->total += 1;
|
||
|
||
if (status_info->id_num == 0) {
|
||
status_info->id_num = 1;
|
||
}
|
||
}
|
||
}
|
||
//获取同类别设备状态总数
|
||
if (status_info != NULL) {
|
||
total = status_info->total;
|
||
} else {
|
||
total = 0;
|
||
}
|
||
|
||
status_info = (struct dev_status *)calloc(1, sizeof(struct dev_status));
|
||
if (status_info == NULL) {
|
||
printf("%s---%dcalloc failed \r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
|
||
strcpy(status_info->statusName, tmp_buf);
|
||
status_info->statusValue = 0;
|
||
|
||
status_info->total = (total == 0) ? 1 : total;
|
||
status_info->id_num = (total == 0) ? 0 : total;
|
||
status_info->upload_flag = 1; //创建时默认要上传给服务器端
|
||
list_add_tail(&status_info->entry, &status_head.entry);
|
||
status_info = NULL;
|
||
total = 0;
|
||
/************************************/
|
||
|
||
/************************************/
|
||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||
strcpy(tmp_buf, "LIGHT_TEMP");
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
if (!strcmp(status_info->statusName, tmp_buf)) {
|
||
status_info->total += 1;
|
||
total = status_info->total;
|
||
|
||
if (status_info->id_num == 0) {
|
||
status_info->id_num = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
status_info = (struct dev_status *)calloc(1, sizeof(struct dev_status));
|
||
if (status_info == NULL) {
|
||
printf("%s---%dcalloc failed \r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
|
||
strcpy(status_info->statusName, tmp_buf);
|
||
status_info->statusValue = 12000;
|
||
|
||
status_info->total = (total == 0) ? 1 : total;
|
||
status_info->id_num = (total == 0) ? 0 : total;
|
||
status_info->upload_flag = 1; //创建时默认要上传给服务器端
|
||
list_add_tail(&status_info->entry, &status_head.entry);
|
||
status_info = NULL;
|
||
total = 0;
|
||
/************************************/
|
||
|
||
/************************************/
|
||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||
strcpy(tmp_buf, "LIGHTNESS");
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
if (!strcmp(status_info->statusName, tmp_buf)) {
|
||
status_info->total += 1;
|
||
total = status_info->total;
|
||
|
||
if (status_info->id_num == 0) {
|
||
status_info->id_num = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
status_info = (struct dev_status *)calloc(1, sizeof(struct dev_status));
|
||
if (status_info == NULL) {
|
||
printf("%s---%dcalloc failed \r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
|
||
strcpy(status_info->statusName, tmp_buf);
|
||
status_info->statusValue = 100;
|
||
|
||
status_info->total = (total == 0) ? 1 : total;
|
||
status_info->id_num = (total == 0) ? 0 : total;
|
||
status_info->upload_flag = 1; //创建时默认要上传给服务器端
|
||
list_add_tail(&status_info->entry, &status_head.entry);
|
||
status_info = NULL;
|
||
total = 0;
|
||
/************************************/
|
||
|
||
/************************************/
|
||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||
strcpy(tmp_buf, "LIGHTNESS");
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
if (!strcmp(status_info->statusName, tmp_buf)) {
|
||
status_info->total += 1;
|
||
total = status_info->total;
|
||
|
||
if (status_info->id_num == 0) {
|
||
status_info->id_num = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
status_info = (struct dev_status *)calloc(1, sizeof(struct dev_status));
|
||
if (status_info == NULL) {
|
||
printf("%s---%dcalloc failed \r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
|
||
strcpy(status_info->statusName, tmp_buf);
|
||
status_info->statusValue = 50;
|
||
|
||
status_info->total = (total == 0) ? 1 : total;
|
||
status_info->id_num = (total == 0) ? 0 : total;
|
||
status_info->upload_flag = 1; //创建时默认要上传给服务器端
|
||
list_add_tail(&status_info->entry, &status_head.entry);
|
||
status_info = NULL;
|
||
total = 0;
|
||
/************************************/
|
||
|
||
//-----------------------资源状态初始化-------------------------------//
|
||
/************************************/
|
||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||
strcpy(tmp_buf, "Electricity");
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
if (!strcmp(res_info->resourceName, tmp_buf)) {
|
||
res_info->total += 1;
|
||
total = res_info->total;
|
||
|
||
if (res_info->id_num == 0) {
|
||
res_info->id_num = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
res_info = (struct dev_res *)calloc(1, sizeof(struct dev_res));
|
||
if (res_info == NULL) {
|
||
printf("%s---%dcalloc failed \r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
|
||
strcpy(res_info->resourceName, tmp_buf);
|
||
res_info->param.consum_ID = 123456;
|
||
strcpy(res_info->param.consum_name, "temperature");
|
||
res_info->param.remain_life = 30;
|
||
|
||
res_info->total = (total == 0) ? 1 : total;
|
||
res_info->id_num = (total == 0) ? 0 : total;
|
||
res_info->upload_flag = 1; //创建时默认要上传给服务器端
|
||
list_add_tail(&res_info->entry, &res_head.entry);
|
||
res_info = NULL;
|
||
total = 0;
|
||
/************************************/
|
||
|
||
|
||
|
||
/************************************/
|
||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||
strcpy(tmp_buf, "Electricity");
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
if (!strcmp(res_info->resourceName, tmp_buf)) {
|
||
res_info->total += 1;
|
||
total = res_info->total;
|
||
|
||
if (res_info->id_num == 0) {
|
||
res_info->id_num = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
res_info = (struct dev_res *)calloc(1, sizeof(struct dev_res));
|
||
if (res_info == NULL) {
|
||
printf("%s---%dcalloc failed \r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
|
||
strcpy(res_info->resourceName, tmp_buf);
|
||
res_info->param.consum_ID = 123456;
|
||
strcpy(res_info->param.consum_name, "temperature");
|
||
res_info->param.remain_life = 20;
|
||
|
||
res_info->total = (total == 0) ? 1 : total;
|
||
res_info->id_num = (total == 0) ? 0 : total;
|
||
res_info->upload_flag = 1; //创建时默认要上传给服务器端
|
||
list_add_tail(&res_info->entry, &res_head.entry);
|
||
res_info = NULL;
|
||
total = 0;
|
||
/************************************/
|
||
|
||
/************************************/
|
||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||
strcpy(tmp_buf, "Water");
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
if (!strcmp(res_info->resourceName, tmp_buf)) {
|
||
res_info->total += 1;
|
||
total = res_info->total;
|
||
|
||
if (res_info->id_num == 0) {
|
||
res_info->id_num = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
res_info = (struct dev_res *)calloc(1, sizeof(struct dev_res));
|
||
if (res_info == NULL) {
|
||
printf("%s---%dcalloc failed \r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
|
||
strcpy(res_info->resourceName, tmp_buf);
|
||
res_info->param.consum_ID = 1122;
|
||
strcpy(res_info->param.consum_name, "LEVEL");
|
||
res_info->param.remain_life = 10;
|
||
|
||
res_info->total = (total == 0) ? 1 : total;
|
||
res_info->id_num = (total == 0) ? 0 : total;
|
||
res_info->upload_flag = 1; //创建时默认要上传给服务器端
|
||
list_add_tail(&res_info->entry, &res_head.entry);
|
||
res_info = NULL;
|
||
total = 0;
|
||
/************************************/
|
||
}
|
||
|
||
//错误信息处理
|
||
static void CT_error_fun(int error)
|
||
{
|
||
switch (error) {
|
||
case 1001:
|
||
log_info("Token invalid...");
|
||
break;
|
||
case 1002:
|
||
log_info("Request parameter error...");
|
||
break;
|
||
case 1003:
|
||
log_info("Device does not exist...");
|
||
case 9999:
|
||
log_info("Failed, System abnormality...");
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
//初始化上报信息标志位
|
||
static void init_upload_flag()
|
||
{
|
||
struct dev_status *status_info = NULL;
|
||
struct dev_res *res_info = NULL;
|
||
struct list_head *pos = NULL;
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
status_info->upload_flag = 1;
|
||
}
|
||
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
res_info->upload_flag = 1;
|
||
}
|
||
|
||
}
|
||
|
||
//deviceID登录请求
|
||
static char *CT_dev_login_ID_request(void)
|
||
{
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node = NULL;
|
||
first_node = json_object_new_object();
|
||
device.serial_num = rand32();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(++device.serial_num));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "devMac", json_object_new_string(device.mac));
|
||
json_object_object_add(first_node, "devCTEI", json_object_new_string(device.ctei));
|
||
json_object_object_add(first_node, "devVersion", json_object_new_string(CT_DEVICE_VERSION));
|
||
#if 0 //存在父设备开启
|
||
|
||
json_object_object_add(first_node, "parentDevMac", json_object_new_string(CT_PARENT_DEV_MAC));
|
||
|
||
#endif
|
||
if (device.ipaddr[0] != '\0') {
|
||
json_object_object_add(first_node, "ip", json_object_new_string(device.ipaddr));
|
||
}
|
||
json_object_object_add(first_node, "version", json_object_new_string(CT_VERSION));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
|
||
//encrypt
|
||
char *encrypt_buf = NULL, *encode_buf = NULL;
|
||
int encrypt_len;
|
||
encrypt_buf = (char *)calloc(1, strlen(json_object_get_string(first_node)) + 16);
|
||
if (!encrypt_buf) {
|
||
json_object_put(first_node);
|
||
return NULL;
|
||
}
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.pin, 16, device.iv, 16, encrypt_buf, &encrypt_len);
|
||
|
||
encode_buf = base64_encode(encrypt_buf, encrypt_len, NULL);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(1002));
|
||
json_object_object_add(root_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encode_buf));
|
||
|
||
char *send_buf = (char *)calloc(1, strlen(json_object_get_string(root_node)) + 4);
|
||
strcpy(send_buf, "CTS");
|
||
strcat(send_buf, json_object_to_json_string_ext(root_node, JSON_C_TO_STRING_NOSLASHESCAPE));
|
||
strcat(send_buf, "\r\n");
|
||
|
||
if (encrypt_buf) {
|
||
free(encrypt_buf);
|
||
}
|
||
if (encode_buf) {
|
||
free(encode_buf);
|
||
}
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
|
||
return send_buf;
|
||
}
|
||
|
||
//CTEI登录请求
|
||
static char *CT_dev_login_CTEI_request(void)
|
||
{
|
||
json_object *root_node = NULL, *first_node = NULL;
|
||
first_node = json_object_new_object();
|
||
device.serial_num = rand32();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(++device.serial_num));
|
||
json_object_object_add(first_node, "devCTEI", json_object_new_string(device.ctei));
|
||
json_object_object_add(first_node, "devMac", json_object_new_string(device.mac));
|
||
json_object_object_add(first_node, "devVersion", json_object_new_string(CT_DEVICE_VERSION));
|
||
#if 0 //存在父设备开启
|
||
|
||
json_object_object_add(first_node, "parentDevMac", json_object_new_string(CT_PARENT_DEV_MAC));
|
||
|
||
#endif
|
||
if (*device.ipaddr) {
|
||
json_object_object_add(first_node, "ip", json_object_new_string(device.ipaddr));
|
||
}
|
||
json_object_object_add(first_node, "version", json_object_new_string(CT_VERSION));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
char *encrypt_buf = NULL, *encode_buf = NULL;
|
||
int encrypt_len;
|
||
encrypt_buf = (char *)calloc(1, strlen(json_object_get_string(first_node)) + 16);
|
||
if (!encrypt_buf) {
|
||
printf("encrypt_buf malloc failed ----%s-----%d\r\n", __func__, __LINE__);
|
||
json_object_put(first_node);
|
||
return NULL;
|
||
}
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.pin, 16, device.iv, 16, encrypt_buf, &encrypt_len);
|
||
|
||
encode_buf = base64_encode(encrypt_buf, encrypt_len, NULL);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(1102));
|
||
json_object_object_add(root_node, "devCTEI", json_object_new_string(device.ctei));
|
||
|
||
json_object_object_add(root_node, "data", json_object_new_string(encode_buf));
|
||
|
||
char *send_buf = (char *)calloc(1, strlen(json_object_get_string(root_node)) + 4);
|
||
strcpy(send_buf, "CTS");
|
||
strcat(send_buf, json_object_to_json_string_ext(root_node, JSON_C_TO_STRING_NOSLASHESCAPE));
|
||
strcat(send_buf, "\r\n");
|
||
|
||
if (encrypt_buf) {
|
||
free(encrypt_buf);
|
||
}
|
||
if (encode_buf) {
|
||
free(encode_buf);
|
||
}
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
|
||
return send_buf;
|
||
}
|
||
|
||
//业务服务器连接请求
|
||
static char *CT_dev_connect_request(void)
|
||
{
|
||
json_object *root_node = NULL, *first_node = NULL;
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(++device.serial_num));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(first_node, "devVersion", json_object_new_string(CT_DEVICE_VERSION));
|
||
json_object_object_add(first_node, "model", json_object_new_string(device.model));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
char *encrypt_buf = NULL, *encode_buf = NULL;
|
||
int encrypt_len;
|
||
encrypt_buf = (char *)calloc(1, strlen(json_object_get_string(first_node)) + 16);
|
||
if (!encrypt_buf) {
|
||
printf("encrypt_buf malloc failed ----%s-----%d\r\n", __func__, __LINE__);
|
||
json_object_put(first_node);
|
||
return NULL;
|
||
}
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, 16, device.sessionKey, 16, encrypt_buf, &encrypt_len);
|
||
|
||
encode_buf = base64_encode(encrypt_buf, encrypt_len, NULL);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(1004));
|
||
json_object_object_add(root_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encode_buf));
|
||
|
||
|
||
char *send_buf = (char *)calloc(1, strlen(json_object_get_string(root_node)) + 4);
|
||
strcpy(send_buf, "CTS");
|
||
strcat(send_buf, json_object_to_json_string_ext(root_node, JSON_C_TO_STRING_NOSLASHESCAPE));
|
||
strcat(send_buf, "\r\n");
|
||
|
||
if (encrypt_buf) {
|
||
free(encrypt_buf);
|
||
}
|
||
if (encode_buf) {
|
||
free(encode_buf);
|
||
}
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
|
||
return send_buf;
|
||
}
|
||
|
||
//心跳请求
|
||
static char *CT_dev_heartbeat_request(void)
|
||
{
|
||
json_object *root_node = NULL, *first_node = NULL;
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(++device.serial_num));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
heart_send = 1; //心跳包创建发送
|
||
|
||
//encrypt
|
||
char *encrypt_buf = NULL, *encode_buf = NULL;
|
||
int encrypt_len;
|
||
encrypt_buf = (char *)calloc(1, strlen(json_object_get_string(first_node)) + 16);
|
||
if (!encrypt_buf) {
|
||
printf("encrypt_buf malloc failed ----%s-----%d\r\n", __func__, __LINE__);
|
||
json_object_put(first_node);
|
||
return NULL;
|
||
}
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, 16, device.sessionKey, 16, encrypt_buf, &encrypt_len);
|
||
|
||
encode_buf = base64_encode(encrypt_buf, encrypt_len, NULL);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(1000));
|
||
json_object_object_add(root_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encode_buf));
|
||
|
||
char *send_buf = (char *)calloc(1, strlen(json_object_get_string(root_node)) + 4);
|
||
strcpy(send_buf, "CTS");
|
||
strcat(send_buf, json_object_to_json_string_ext(root_node, JSON_C_TO_STRING_NOSLASHESCAPE));
|
||
strcat(send_buf, "\r\n");
|
||
|
||
if (encrypt_buf) {
|
||
free(encrypt_buf);
|
||
}
|
||
if (encode_buf) {
|
||
free(encode_buf);
|
||
}
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
|
||
return send_buf;
|
||
}
|
||
|
||
//设备控制回复
|
||
static char *CT_dev_control_reply(void) //device->server
|
||
{
|
||
json_object *root_node = NULL, *first_node = NULL;
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "result", json_object_new_int(0));
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(recv_sequence_num));
|
||
json_object_object_add(first_node, "dscp", json_object_new_string("操作成功"));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
char *encrypt_buf = NULL, *encode_buf = NULL;
|
||
int encrypt_len;
|
||
encrypt_buf = (char *)calloc(1, strlen(json_object_get_string(first_node)) + 16);
|
||
if (!encrypt_buf) {
|
||
printf("encrypt_buf malloc failed ----%s-----%d\r\n", __func__, __LINE__);
|
||
json_object_put(first_node);
|
||
return NULL;
|
||
}
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, 16, device.sessionKey, 16, encrypt_buf, &encrypt_len);
|
||
|
||
encode_buf = base64_encode(encrypt_buf, encrypt_len, NULL);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2004));
|
||
json_object_object_add(root_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encode_buf));
|
||
|
||
char *send_buf = (char *)calloc(1, strlen(json_object_get_string(root_node)) + 4);
|
||
strcpy(send_buf, "CTS");
|
||
strcat(send_buf, json_object_to_json_string_ext(root_node, JSON_C_TO_STRING_NOSLASHESCAPE));
|
||
strcat(send_buf, "\r\n");
|
||
|
||
if (encrypt_buf) {
|
||
free(encrypt_buf);
|
||
}
|
||
if (encode_buf) {
|
||
free(encode_buf);
|
||
}
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
|
||
return send_buf;
|
||
}
|
||
|
||
//设备信息上报
|
||
static char *CT_dev_report_request(void)
|
||
{
|
||
int status_serialId_num = 0, resource_serialId_num = 0;
|
||
int total ;
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[6] = {0}, *third_node[6] = {0};
|
||
struct list_head *pos = NULL;
|
||
struct dev_status *status_info = NULL;
|
||
struct dev_res *res_info = NULL;
|
||
|
||
if (!report_all) {
|
||
init_upload_flag();
|
||
}
|
||
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(++device.serial_num));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
|
||
//statusSerials
|
||
status_info = list_first_entry(&status_head.entry, struct dev_status, entry);
|
||
if (*(status_info->statusName)) {
|
||
second_node[0] = json_object_new_array();
|
||
total = 1;
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
//先统计要上报的状态总数
|
||
if (status_info->upload_flag == 1) {
|
||
total = status_info->total > total ? status_info->total + 1 : total;
|
||
}
|
||
}
|
||
for (int i = 0; i < total; i++) {
|
||
second_node[3] = NULL;
|
||
second_node[1] = json_object_new_object();
|
||
second_node[2] = json_object_new_array();
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
if (status_info->id_num == i && status_info->upload_flag == 1) {
|
||
status_info->upload_flag = 0;
|
||
second_node[3] = json_object_new_object();
|
||
json_object_object_add(second_node[3], "statusName", json_object_new_string(status_info->statusName));
|
||
json_object_object_add(second_node[3], "curStatusValue", json_object_new_int(status_info->statusValue));
|
||
if (status_info->param_vaild) {
|
||
printf("%s into param\r\n", status_info->statusName);
|
||
second_node[4] = json_object_new_array();
|
||
|
||
//if multple , use list_head -- 1
|
||
second_node[5] = json_object_new_object();
|
||
json_object_object_add(second_node[5], "param1", json_object_new_string("123"));
|
||
json_object_object_add(second_node[5], "param2", json_object_new_string("456"));
|
||
|
||
json_object_array_add(second_node[4], second_node[5]);
|
||
//if multple , use list_head--end -- 1
|
||
json_object_object_add(second_node[3], "extraStatusParam", second_node[4]);
|
||
}
|
||
json_object_array_add(second_node[2], second_node[3]);
|
||
}
|
||
}
|
||
if (!second_node[3]) {
|
||
json_object_put(second_node[1]);
|
||
second_node[1] = NULL;
|
||
json_object_put(second_node[2]);
|
||
second_node[2] = NULL;
|
||
} else {
|
||
json_object_object_add(second_node[1], "serialId", json_object_new_int(i));
|
||
json_object_object_add(second_node[1], "statusSerial", second_node[2]);
|
||
json_object_array_add(second_node[0], second_node[1]);
|
||
}
|
||
}
|
||
if (!second_node[3]) {
|
||
json_object_put(second_node[0]);
|
||
second_node[0] = NULL;
|
||
} else {
|
||
json_object_object_add(first_node, "statusSerials", second_node[0]);
|
||
}
|
||
}
|
||
|
||
//resourceSerials
|
||
res_info = list_first_entry(&res_head.entry, struct dev_res, entry);
|
||
if (*(res_info->resourceName)) {
|
||
third_node[0] = json_object_new_array();
|
||
total = 1;
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
//先统计要上报的资源总数
|
||
if (res_info->upload_flag == 1) {
|
||
total = res_info->total > total ? res_info->total + 1 : total;
|
||
}
|
||
}
|
||
for (int i = 0; i < total; i++) {
|
||
third_node[3] = NULL;
|
||
third_node[1] = json_object_new_object();
|
||
third_node[2] = json_object_new_array();
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
if (res_info->id_num == i && res_info->upload_flag == 1) {
|
||
res_info->upload_flag = 0;
|
||
third_node[3] = json_object_new_object();
|
||
json_object_object_add(third_node[3], "resourceName", json_object_new_string(res_info->resourceName));
|
||
third_node[4] = json_object_new_array();
|
||
|
||
//if multple , use list_head -- 2
|
||
third_node[5] = json_object_new_object();
|
||
json_object_object_add(third_node[5], "CONSUM_ID", json_object_new_int(res_info->param.consum_ID));
|
||
json_object_object_add(third_node[5], "CONSUM_NAME", json_object_new_string(res_info->param.consum_name));
|
||
json_object_object_add(third_node[5], "REMAIN_LIFE", json_object_new_int(res_info->param.remain_life));
|
||
json_object_array_add(third_node[4], third_node[5]);
|
||
//if multple , use list_head --end -- 2
|
||
|
||
json_object_object_add(third_node[3], "resourceInfo", third_node[4]);
|
||
json_object_array_add(third_node[2], third_node[3]);
|
||
}
|
||
}
|
||
if (!third_node[3]) {
|
||
json_object_put(third_node[1]);
|
||
third_node[1] = NULL;
|
||
json_object_put(third_node[2]);
|
||
third_node[2] = NULL;
|
||
} else {
|
||
json_object_object_add(third_node[1], "serialId", json_object_new_int(i));
|
||
json_object_object_add(third_node[1], "resourceSerial", third_node[2]);
|
||
json_object_array_add(third_node[0], third_node[1]);
|
||
}
|
||
|
||
}
|
||
if (!third_node[3]) {
|
||
json_object_put(third_node[0]);
|
||
third_node[0] = NULL;
|
||
} else {
|
||
json_object_object_add(first_node, "resourceSerials", third_node[0]);
|
||
}
|
||
}
|
||
//time
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
char *encrypt_buf = NULL, *encode_buf = NULL;
|
||
int encrypt_len;
|
||
encrypt_buf = (char *)calloc(1, strlen(json_object_get_string(first_node)) + 16);
|
||
if (!encrypt_buf) {
|
||
printf("encrypt_buf malloc failed ----%s-----%d\r\n", __func__, __LINE__);
|
||
json_object_put(first_node);
|
||
return NULL;
|
||
}
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, 16, device.sessionKey, 16, encrypt_buf, &encrypt_len);
|
||
|
||
encode_buf = base64_encode(encrypt_buf, encrypt_len, NULL);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2006));
|
||
json_object_object_add(root_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encode_buf));
|
||
char *send_buf = (char *)calloc(1, strlen(json_object_get_string(root_node)) + 4);
|
||
strcpy(send_buf, "CTS");
|
||
strcat(send_buf, json_object_to_json_string_ext(root_node, JSON_C_TO_STRING_NOSLASHESCAPE));
|
||
strcat(send_buf, "\r\n");
|
||
|
||
/* printf("\nlen = %d\nbuf = %s\r\n", strlen(json_object_get_string(first_node)), json_object_get_string(first_node)); */
|
||
|
||
if (encrypt_buf) {
|
||
free(encrypt_buf);
|
||
}
|
||
if (encode_buf) {
|
||
free(encode_buf);
|
||
}
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
|
||
return send_buf;
|
||
}
|
||
|
||
#if 0 //#没测试到,待修改
|
||
|
||
static void CT_dev_status_reply(void) //device->server
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL;
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "result", json_object_new_int(0));
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2002));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
return;
|
||
}
|
||
|
||
static void CT_dev_manage_reply(void) //device->server
|
||
{
|
||
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL;
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "result", json_object_new_int(0));
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2030));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
static void CT_dev_resource_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
int resource_serialId_num = 0;
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5], *third_node[5];
|
||
struct list_head *pos = NULL;
|
||
struct dev_res *res_info = NULL;
|
||
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
|
||
//resourceSerials
|
||
res_info = list_first_entry(&res_head.entry, struct dev_res, entry);
|
||
if (res_info != &res_head) {
|
||
third_node[0] = json_object_new_array();
|
||
if (list_first_entry(&res_info->entry, struct dev_res, entry) != &res_head) {
|
||
resource_serialId_num = 1;
|
||
} else {
|
||
resource_serialId_num = 0;
|
||
}
|
||
list_for_each(pos, &res_head.entry) {
|
||
res_info = list_entry(pos, struct dev_res, entry);
|
||
third_node[1] = json_object_new_object();
|
||
json_object_object_add(third_node[1], "serialId", json_object_new_int(resource_serialId_num++));
|
||
third_node[2] = json_object_new_array();
|
||
|
||
//if multple , use list_head -- 1
|
||
third_node[3] = json_object_new_object();
|
||
json_object_object_add(second_node[3], "resourceName", json_object_new_string(res_info->resourceName));
|
||
third_node[4] = json_object_new_array();
|
||
|
||
|
||
//if multple , use list_head -- 2
|
||
third_node[5] = json_object_new_object();
|
||
json_object_object_add(third_node[5], "CONSUM_ID", json_object_new_int(res_info->param.consum_ID));
|
||
json_object_object_add(third_node[5], "CONSUM_NAME", json_object_new_string(res_info->param.consum_name));
|
||
json_object_object_add(third_node[5], "REMAIN_LIFE", json_object_new_int(res_info->param.remain_life));
|
||
json_object_array_add(third_node[4], third_node[5]);
|
||
//if multple , use list_head --end -- 2
|
||
|
||
json_object_object_add(third_node[3], "resourceInfo", third_node[4]);
|
||
json_object_array_add(third_node[2], third_node[3]);
|
||
//if multple , use list_head --end -- 1
|
||
|
||
json_object_object_add(third_node[1], "resourceSerial", third_node[2]);
|
||
json_object_array_add(third_node[0], third_node[1]);
|
||
}
|
||
json_object_object_add(first_node, "resourceSerials", third_node[0]);
|
||
}
|
||
//time
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
printf("%s %d\r\n", device.sessionKey, strlen(device.sessionKey));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2028));
|
||
json_object_object_add(root_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(first_node));
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
printf("***********************\r\n");
|
||
|
||
free(encode_buf);
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
}
|
||
|
||
void CT_dev_message_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
int event_num = 0, event_serialId_num = 0;
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5], *third_node[5];
|
||
struct list_head *pos = NULL;
|
||
struct device_eventInfo *event_info = NULL;
|
||
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
|
||
//event
|
||
second_node[0] = json_object_new_array();
|
||
list_for_each(pos, &event_head.entry) {
|
||
event_info = list_entry(pos, struct device_eventInfo, entry);
|
||
second_node[1] = json_object_new_object();
|
||
json_object_object_add(second_node[1], "eventId", json_object_new_int(event_num++));
|
||
json_object_object_add(second_node[1], "serialId", json_object_new_int(event_serialId_num++));
|
||
json_object_object_add(second_node[1], "eventNmame", json_object_new_string(event_info->eventName));
|
||
second_node[2] = json_object_new_array();
|
||
|
||
//if multple , use list_head -- 1
|
||
second_node[3] = json_object_new_object();
|
||
json_object_object_add(second_node[3], event_info->param.ID_name, json_object_new_int(event_info->param.ID_value));
|
||
json_object_object_add(second_node[3], event_info->param.TYPE_name, json_object_new_int(event_info->param.TYPE_value));
|
||
json_object_object_add(second_node[3], "TIME", json_object_new_int(time(NULL)));
|
||
|
||
|
||
json_object_array_add(second_node[2], second_node[3]);
|
||
//if multple , use list_head --end -- 1
|
||
|
||
json_object_object_add(second_node[1], "eventInfo", second_node[2]);
|
||
json_object_array_add(second_node[0], second_node[1]);
|
||
}
|
||
json_object_object_add(first_node, "event", second_node[0]);
|
||
|
||
//time
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2032));
|
||
json_object_object_add(root_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(first_node));
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
printf("***********************\r\n");
|
||
|
||
free(encode_buf);
|
||
json_object_put(root_node);
|
||
json_object_put(first_node);
|
||
}
|
||
|
||
void CT_dev_alarm_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
int alarm_serialId_num = 0;
|
||
struct dev_status *alarm_info = NULL;
|
||
alarm_info = get_alarm_info();
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
|
||
//alarm
|
||
second_node[0] = json_object_new_object();
|
||
json_object_object_add(second_node[0], "serialId", json_object_new_int(alarm_serialId_num++));
|
||
json_object_object_add(second_node[0], "statusName", json_object_new_string(alarm_info->statusName));
|
||
json_object_object_add(second_node[0], "curStatusValue", json_object_new_int(alarm_info->statusValue));
|
||
json_object_object_add(second_node[0], "dscp", json_object_new_string("qwasdsadasdas"));
|
||
json_object_object_add(second_node[0], "alarmtime", json_object_new_int(time(NULL)));
|
||
|
||
json_object_object_add(first_node, "alarm", second_node[0]);
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2008));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_dev_fault_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
int error_serialId_num = 0;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
|
||
//error
|
||
second_node[0] = json_object_new_object();
|
||
json_object_object_add(second_node[0], "serialId", json_object_new_int(error_serialId_num++));
|
||
json_object_object_add(second_node[0], "errorCode", json_object_new_int(100001));
|
||
json_object_object_add(second_node[0], "errorInfo", json_object_new_string("qwasdsadasdas"));
|
||
json_object_object_add(second_node[0], "errortime", json_object_new_int(time(NULL)));
|
||
|
||
json_object_object_add(first_node, "error", second_node[0]);
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2010));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_sub_dev_ID_auth_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "subDeviceId", json_object_new_string(CT_SUB_DEVICE_ID));
|
||
json_object_object_add(first_node, "pin", json_object_new_string(device.pin));
|
||
#if (defined CT_SUB_DEVICE_MAC)
|
||
json_object_object_add(first_node, "subDevMac", json_object_new_string(CT_SUB_DEVICE_MAC));
|
||
#endif
|
||
|
||
#if (defined CT_SUB_DEVICE_CTEI)
|
||
json_object_object_add(first_node, "subDevCTEI", json_object_new_string(CT_SUB_DEVICE_CTEI));
|
||
#endif
|
||
|
||
#if (defined CT_PARENT_DEV_MAC)
|
||
json_object_object_add(first_node, "parentDevMac", json_object_new_string(CT_PARENT_DEV_MAC));
|
||
#endif
|
||
|
||
#if (defined CT_SUB_DEVICE_IP)
|
||
json_object_object_add(first_node, "subDevIp", json_object_new_string(CT_SUB_DEVICE_IP));
|
||
#endif
|
||
|
||
#if (defined CT_SUB_DEVICE_VERSION)
|
||
json_object_object_add(first_node, "subVersion", json_object_new_string(CT_SUB_DEVICE_VERSION));
|
||
#endif
|
||
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2012));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_sub_dev_CTEI_auth_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
#if (defined CT_SUB_DEVICE_MAC)
|
||
json_object_object_add(first_node, "subDevMac", json_object_new_string(CT_SUB_DEVICE_MAC));
|
||
#endif
|
||
#if (defined CT_SUB_DEVICE_VERSION)
|
||
json_object_object_add(first_node, "subVersion", json_object_new_string(CT_SUB_DEVICE_VERSION));
|
||
#endif
|
||
json_object_object_add(first_node, "pin", json_object_new_string(device.pin));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2112));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_sub_dev_unbind_reply(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "result", json_object_new_int(0));
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "subDeviceId", json_object_new_string(CT_SUB_DEVICE_ID));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2014));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_sub_dev_bind_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "subDeviceId", json_object_new_string(CT_SUB_DEVICE_ID));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2016));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_sub_dev_unbind_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "subDeviceId", json_object_new_string(CT_SUB_DEVICE_ID));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2018));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_sub_dev_online_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "subDeviceId", json_object_new_string(CT_SUB_DEVICE_ID));
|
||
json_object_object_add(first_node, "onLine", json_object_new_int(1));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2020));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_dev_version_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "model", json_object_new_string(device.model));
|
||
|
||
second_node[0] = json_object_new_object();
|
||
json_object_object_add(second_node[0], "version", json_object_new_string(CT_DEVICE_VERSION));
|
||
json_object_object_add(first_node, "device", second_node[0]);
|
||
|
||
if (0) { //have modules
|
||
second_node[1] = json_object_new_array();
|
||
|
||
//if multple , use list_head
|
||
second_node[2] = json_object_new_object();
|
||
json_object_object_add(second_node[2], "name", json_object_new_string("123"));
|
||
json_object_object_add(second_node[2], "version", json_object_new_string("1.2.3"));
|
||
json_object_array_add(second_node[1], second_node[2]);
|
||
//if multple , use list_head --end
|
||
json_object_object_add(first_node, "modules", second_node[1]);
|
||
|
||
}
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2022));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_dev_upgrade_reply(void) //device->server
|
||
{
|
||
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL;
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "result", json_object_new_int(0));
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2024));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_dev_upgrade_result_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
int type = 0, upgrade_status = 0;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "type", json_object_new_int(type));
|
||
if (type == 1) {
|
||
json_object_object_add(first_node, "moduleName", json_object_new_string("1asdas"));
|
||
}
|
||
json_object_object_add(first_node, "status", json_object_new_int(upgrade_status));
|
||
json_object_object_add(first_node, "version", json_object_new_string(CT_DEVICE_VERSION));
|
||
json_object_object_add(first_node, "percent", json_object_new_string("20\%"));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(2026));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_voice_control_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
int extensions = 0;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
//需要配合sn,islast判断是否加1
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
|
||
second_node[0] = json_object_new_object();
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "format", json_object_new_string("amr"));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "rate", json_object_new_int(8000));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "channel", json_object_new_int(1));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "vocieId", json_object_new_string("12312321"));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "sn", json_object_new_int(1));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "isLast", json_object_new_int(0));
|
||
}
|
||
json_object_object_add(second_node[0], "audioData", json_object_new_string(" "));
|
||
if (extensions == 1) {
|
||
second_node[1] = json_object_new_array();
|
||
//if multple , use list_head
|
||
second_node[2] = json_object_new_object();
|
||
json_object_object_add(second_node[2], "key", json_object_new_string("213"));
|
||
json_object_object_add(second_node[2], "value", json_object_new_int(1));
|
||
json_object_array_add(second_node[1], second_node[2]);
|
||
//if multple , use list_head --end
|
||
|
||
json_object_object_add(second_node[0], "extensions", second_node[1]);
|
||
}
|
||
json_object_object_add(first_node, "CtrlParam", second_node[0]);
|
||
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(3002));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_speech_synthesis_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
int extensions = 0;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
|
||
second_node[0] = json_object_new_object();
|
||
json_object_object_add(second_node[0], "content", json_object_new_string("已经为你打开空调!"));
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "anchor", json_object_new_string("xiaoyan"));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "speed", json_object_new_int(123));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "volume", json_object_new_int(123));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "pitch", json_object_new_int(123));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "format", json_object_new_string("amr"));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "rate", json_object_new_int(8000));
|
||
}
|
||
if (1) {
|
||
json_object_object_add(second_node[0], "channel", json_object_new_int(1));
|
||
}
|
||
json_object_object_add(first_node, "ttsParam", second_node[0]);
|
||
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(3000));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_dev_data_download_reply(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
int error_serialId_num = 0;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "result", json_object_new_int(0));
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
json_object_object_add(first_node, "downDataResp", json_object_new_string("1232132131"));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(9000));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
void CT_dev_data_upload_request(void)
|
||
{
|
||
char encrypt_buf[512];
|
||
char *encode_buf;
|
||
unsigned int encode_len;
|
||
int encrypt_len;
|
||
|
||
int error_serialId_num = 0;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node[5];
|
||
first_node = json_object_new_object();
|
||
json_object_object_add(first_node, "sequence", json_object_new_int(device.serial_num++));
|
||
json_object_object_add(first_node, "deviceId", json_object_new_string(device.deviceId));
|
||
json_object_object_add(first_node, "time", json_object_new_int(time(NULL)));
|
||
json_object_object_add(first_node, "upData", json_object_new_string("1232132131"));
|
||
|
||
//encrypt
|
||
CT_AES_CBC_Encrypt((u8 *)json_object_get_string(first_node), strlen(json_object_get_string(first_node)), device.sessionKey, strlen(device.sessionKey), device.iv, strlen(device.iv), encrypt_buf, &encrypt_len);
|
||
|
||
root_node = json_object_new_object();
|
||
json_object_object_add(root_node, "code", json_object_new_int(9002));
|
||
json_object_object_add(first_node, "token", json_object_new_string(device.token));
|
||
json_object_object_add(root_node, "data", json_object_new_string(encrypt_buf));
|
||
|
||
printf("***********************\r\n");
|
||
printf("*********%s**************\r\n", __func__);
|
||
printf("%s\r\n", json_object_get_string(root_node));
|
||
|
||
encode_buf = base64_encode(json_object_get_string(root_node), strlen(json_object_get_string(root_node)), &encode_len);
|
||
|
||
printf("%s\r\n", encode_buf);
|
||
|
||
free(encode_buf);
|
||
}
|
||
|
||
#endif
|
||
|
||
static void CT_server_to_device_fun(void *priv)
|
||
{
|
||
u8 connecting = 1;
|
||
char cmdName[32] = {0}, cmdParam[128] = {0}, parse_buf[64] = {0};
|
||
unsigned int decrypt_len;
|
||
int parse_len, decode_len, code, msg[32], err, serial_num;
|
||
char *decode_buf = NULL, *decrypt_buf = NULL;
|
||
|
||
json_object *root_node = NULL, *first_node = NULL, *second_node = NULL;
|
||
|
||
while (connecting) {
|
||
err = os_taskq_pend("taskq", msg, ARRAY_SIZE(msg));
|
||
if (err != OS_TASKQ || msg[0] != Q_USER) {
|
||
continue;
|
||
}
|
||
|
||
switch (msg[1]) {
|
||
case RECV_MSG:
|
||
|
||
root_node = json_tokener_parse(strstr((char *)msg[2], "{"));
|
||
if (!root_node) {
|
||
log_info("%d buf1 root_node error", __LINE__);
|
||
goto exit;
|
||
}
|
||
free((char *)msg[2]);
|
||
|
||
code = json_object_get_int(json_object_object_get(root_node, "code"));
|
||
|
||
if (!json_object_object_get_ex(root_node, "data", &first_node)) {
|
||
goto exit;
|
||
}
|
||
json_object_get(first_node);
|
||
json_object_put(root_node);
|
||
root_node = NULL;
|
||
|
||
decode_buf = base64_decode(json_object_get_string(first_node), strlen(json_object_get_string(first_node)), &decode_len);
|
||
decrypt_buf = (char *)calloc(1, decode_len + 1);
|
||
if (!decrypt_buf) {
|
||
log_info("------%s-----------%d------malloc failed", __func__, __LINE__);
|
||
goto exit;
|
||
}
|
||
if ((code == 1003) || (code == 1103)) {
|
||
CT_AES_CBC_Decrypt(decode_buf, decode_len, device.pin, 16, device.iv, 16, decrypt_buf, &decrypt_len);
|
||
} else {
|
||
CT_AES_CBC_Decrypt(decode_buf, decode_len, device.sessionKey, 16, device.sessionKey, 16, decrypt_buf, &decrypt_len);
|
||
}
|
||
|
||
log_info("code = %d\nbuf = %s", code, decrypt_buf);
|
||
//json
|
||
root_node = json_tokener_parse(decrypt_buf);
|
||
if (!root_node) {
|
||
log_info("%d root_node NULL", __LINE__);
|
||
goto exit;
|
||
}
|
||
if (decode_buf) {
|
||
free(decode_buf);
|
||
decode_buf = NULL;
|
||
}
|
||
if (decrypt_buf) {
|
||
free(decrypt_buf);
|
||
decrypt_buf = NULL;
|
||
}
|
||
|
||
if (code == 2003 || code == 2005 || code == 2031 || code == 2015 || code == 2025 || code == 9001) {
|
||
recv_sequence_num = json_object_get_int(json_object_object_get(root_node, "sequence"));
|
||
} else {
|
||
if (0 != json_object_get_int(json_object_object_get(root_node, "result"))) {
|
||
log_info("%s------%d result not 0", __func__, __LINE__);
|
||
if (code == 2007) {
|
||
init_upload_flag();
|
||
}
|
||
CT_error_fun(json_object_get_int(json_object_object_get(root_node, "result")));
|
||
goto exit;
|
||
}
|
||
|
||
serial_num = json_object_get_int(json_object_object_get(root_node, "sequence"));
|
||
if (code == 1001) {
|
||
heart_send = 0;
|
||
}
|
||
if ((device.serial_num - heart_send) != serial_num) {
|
||
log_info("%d serial_num not match\n\n\n", __LINE__);
|
||
goto exit;
|
||
}
|
||
}
|
||
|
||
switch (code) {
|
||
//-----------设备通道层接口
|
||
case 1003: //设备ID登录响应
|
||
if (*json_object_get_string(json_object_object_get(root_node, "sessionKey"))) {
|
||
strcpy(device.sessionKey, json_object_get_string(json_object_object_get(root_node, "sessionKey")));
|
||
}
|
||
|
||
|
||
if (*json_object_get_string(json_object_object_get(root_node, "tcpHost"))) {
|
||
strcpy(parse_buf, json_object_get_string(json_object_object_get(root_node, "tcpHost")));
|
||
parse_len = strchr(parse_buf, ':') - parse_buf + 1;
|
||
strncpy(device.tcpHost, parse_buf, parse_len - 1);
|
||
strcpy(device.tcp_port, parse_buf + parse_len);
|
||
memset(parse_buf, 0, sizeof(parse_buf));
|
||
}
|
||
|
||
if (*json_object_get_string(json_object_object_get(root_node, "udpHost"))) {
|
||
strcpy(parse_buf, json_object_get_string(json_object_object_get(root_node, "udpHost")));
|
||
parse_len = strchr(parse_buf, ':') - parse_buf + 1;
|
||
strncpy(device.udpHost, parse_buf, parse_len - 1);
|
||
strcpy(device.udp_port, parse_buf + parse_len);
|
||
memset(parse_buf, 0, sizeof(parse_buf));
|
||
}
|
||
|
||
if (*json_object_get_string(json_object_object_get(root_node, "token"))) {
|
||
strcpy(device.token, json_object_get_string(json_object_object_get(root_node, "token")));
|
||
}
|
||
|
||
log_info("sessionkey = %s, tcpHost = %s, tcp_port = %s,udpHost = %s,udp_port = %s, token = %s\r\n", device.sessionKey, device.tcpHost, device.tcp_port, device.udpHost, device.udp_port, device.token);
|
||
|
||
for (int i = 0; i < 3; i++) {
|
||
if (0 == tcp_device_init(NULL)) { //连接业务服务器
|
||
thread_fork("msg_recv_handler", 8, 2048, 0, NULL, tcp_recv_handler, NULL);
|
||
//发送信息
|
||
tcp_send_function(1004);
|
||
break;
|
||
} else {
|
||
printf("------%s-----%d connect server failed ,i = %d\r\n", __func__, __LINE__, i);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case 1005: //设备连接响应
|
||
device.login_flag = 1; //设备登录标志位置1
|
||
//heatBeat
|
||
if (*json_object_get_string(json_object_object_get(root_node, "heartBeat"))) {
|
||
device.heartBeat = json_object_get_int(json_object_object_get(root_node, "heartBeat"));
|
||
} else {
|
||
device.heartBeat = 30;
|
||
}
|
||
|
||
//authInterval 如果不设置就默认为0, 前3次60s 后续600s
|
||
if (*json_object_get_string(json_object_object_get(root_node, "authInterval"))) {
|
||
device.authInterval = json_object_get_int(json_object_object_get(root_node, "authInterval"));
|
||
}
|
||
//上报设备状态跟资源信息 code:2006
|
||
tcp_send_function(2006);
|
||
if (!heartbeat_id) {
|
||
heartbeat_id = sys_timer_add_to_task("app_core", NULL, heartbeat_ctl_func, device.heartBeat * 1000);
|
||
}
|
||
|
||
if (heartbeat_timeout_id) {
|
||
sys_timer_modify(heartbeat_timeout_id, (device.heartBeat * 3 + 10) * 1000);
|
||
} else {
|
||
heartbeat_timeout_id = sys_timeout_add_to_task("app_core", NULL, timeout_func, (device.heartBeat * 3 + 10) * 1000);
|
||
}
|
||
|
||
break;
|
||
|
||
case 1001: //设备心跳响应
|
||
//将心跳计数标志位清零 重新计数超时
|
||
if (heartbeat_timeout_id) {
|
||
sys_timer_re_run(heartbeat_timeout_id);
|
||
}
|
||
|
||
break;
|
||
|
||
case 1103: //设备ctei登录响应
|
||
if (*json_object_get_string(json_object_object_get(root_node, "sessionKey"))) {
|
||
strcpy(device.sessionKey, json_object_get_string(json_object_object_get(root_node, "sessionKey")));
|
||
}
|
||
|
||
if (*json_object_get_string(json_object_object_get(root_node, "tcpHost"))) {
|
||
strcpy(parse_buf, json_object_get_string(json_object_object_get(root_node, "tcpHost")));
|
||
parse_len = strchr(parse_buf, ':') - parse_buf + 1;
|
||
strncpy(device.tcpHost, parse_buf, parse_len - 1);
|
||
strcpy(device.tcp_port, parse_buf + parse_len);
|
||
memset(parse_buf, 0, sizeof(parse_buf));
|
||
}
|
||
|
||
if (*json_object_get_string(json_object_object_get(root_node, "udpHost"))) {
|
||
strcpy(parse_buf, json_object_get_string(json_object_object_get(root_node, "udpHost")));
|
||
parse_len = strchr(parse_buf, ':') - parse_buf + 1;
|
||
strncpy(device.udpHost, parse_buf, parse_len - 1);
|
||
strcpy(device.udp_port, parse_buf + parse_len);
|
||
memset(parse_buf, 0, sizeof(parse_buf));
|
||
}
|
||
if (*json_object_get_string(json_object_object_get(root_node, "deviceId"))) {
|
||
strcpy(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")));
|
||
}
|
||
|
||
if (*json_object_get_string(json_object_object_get(root_node, "token"))) {
|
||
strcpy(device.token, json_object_get_string(json_object_object_get(root_node, "token")));
|
||
}
|
||
|
||
log_info("sessionkey = %s, tcpHost = %s, tcp_port = %s,udpHost = %s,udp_port = %s,deviceId = %s token = %s\r\n", device.sessionKey, device.tcpHost, device.tcp_port, device.udpHost, device.udp_port, device.deviceId, device.token);
|
||
|
||
for (int i = 0; i < 3; i++) {
|
||
if (0 == tcp_device_init(NULL)) { //连接业务服务器
|
||
thread_fork("msg_recv_handler", 8, 2048, 0, NULL, tcp_recv_handler, NULL);
|
||
//发送信息
|
||
tcp_send_function(1004);
|
||
break;
|
||
} else {
|
||
printf(" %d connect server failed\r\n", i);
|
||
}
|
||
}
|
||
break;
|
||
|
||
//------------设备业务层接口
|
||
case 2003: //设备状态查询请求 #
|
||
if (device.deviceId == json_object_get_string(json_object_object_get(root_node, "deviceId"))) {
|
||
//服务器是查找本设备,10s内上报设备最新状态
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来查询对应的子设备
|
||
}
|
||
break;
|
||
|
||
case 2005: //设备状态控制请求 #
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//服务器是查找本设备,10s内上报设备最新状态
|
||
log_info("into deviceid\r\n");
|
||
|
||
int tmp_serial = json_object_get_int(json_object_object_get(root_node, "serialId"));
|
||
|
||
for (int i = 0;; i++) {
|
||
second_node = json_object_array_get_idx(json_object_object_get(root_node, "cmd"), i);
|
||
if (second_node == NULL) {
|
||
break;
|
||
}
|
||
strcpy(cmdName, json_object_get_string(json_object_object_get(second_node, "cmdName")));
|
||
strcpy(cmdParam, json_object_get_string(json_object_object_get(second_node, "cmdParam")));
|
||
status_set_func(tmp_serial, cmdName, cmdParam);
|
||
memset(cmdName, 0, sizeof(cmdName));
|
||
memset(cmdParam, 0, sizeof(cmdParam));
|
||
|
||
}
|
||
|
||
tcp_send_function(2004);
|
||
if (device_status_id) {
|
||
sys_timer_re_run(device_status_id);
|
||
} else {
|
||
//延迟5S后汇报
|
||
device_status_id = sys_timeout_add(NULL, device_status_func, 5000);
|
||
}
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来查询对应的子设备
|
||
}
|
||
break;
|
||
|
||
case 2007: //设备状态/资源上报响应
|
||
report_all = 1;
|
||
//可选择性的在此处进行flash更新
|
||
thread_fork("write_flash", 20, 1024, 0, NULL, device_write_flash, NULL);
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//服务器是查找本设备
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来响应对应的子设备
|
||
}
|
||
break;
|
||
#if 0 //#没测试到,待修改
|
||
case 2031: //设备资源管理请求 #
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//服务器是查找本设备,10s内上报设备最新状态
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来查询对应的子设备
|
||
}
|
||
break;
|
||
|
||
case 2029: //设备资源变化上报响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//服务器是查找本设备,10s内上报设备最新状态
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来查询对应的子设备
|
||
}
|
||
break;
|
||
|
||
case 2033: //设备信息上报响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//服务器是查找本设备,10s内上报设备最新状态
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来查询对应的子设备
|
||
}
|
||
break;
|
||
|
||
case 2009: //设备状态告警响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//服务器是查找本设备,10s内上报设备最新状态
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来查询对应的子设备
|
||
}
|
||
break;
|
||
|
||
case 2011: //设备故障反馈响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//服务器是查找本设备,10s内上报设备最新状态
|
||
} else {
|
||
//查询设备绑定的子设备是否存在ID与deviceId相同,若存在则将该命令转换来查询对应的子设备
|
||
}
|
||
break;
|
||
|
||
case 2013: //子设备ID鉴权响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//看对应子设备ID authResult 为0 则鉴权成功
|
||
}
|
||
|
||
break;
|
||
|
||
case 2015: //子设备解绑请求 #
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//看对应子设备ID 进行下线解绑操作
|
||
}
|
||
break;
|
||
|
||
case 2017: //子设备绑定上报响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//看对应子设备ID
|
||
}
|
||
|
||
break;
|
||
|
||
case 2019: //子设备解绑上报响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//看对应子设备ID
|
||
}
|
||
|
||
break;
|
||
|
||
case 2021: //子设备在线状态上报响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//看对应子设备ID
|
||
}
|
||
|
||
break;
|
||
|
||
case 2023: //设备版本上报响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//
|
||
}
|
||
|
||
break;
|
||
|
||
case 2025: //设备版本升级通知请求 #
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//
|
||
}
|
||
|
||
break;
|
||
|
||
case 2027: //设备版本升级结果上报响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//
|
||
}
|
||
|
||
break;
|
||
|
||
case 3003: //语音控制响应
|
||
if ((400002 || 0) != atoi(json_object_get_string(json_object_object_get(root_node, "result")))) {
|
||
log_info("%d result not 0", __LINE__);
|
||
CT_error_fun(atoi(json_object_get_string(json_object_object_get(root_node, "result"))));
|
||
break;
|
||
}
|
||
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//
|
||
}
|
||
if (json_object_object_get_ex(root_node, "ctrlResult", &first_node)) {
|
||
char ctrl_buf[512] = {0};
|
||
strcpy(ctrl_buf, json_object_get_string(first_node));
|
||
//进行后续操作
|
||
}
|
||
|
||
break;
|
||
|
||
case 3001: //语音合成响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//
|
||
}
|
||
if (json_object_object_get_ex(root_node, "ttsResult", &first_node)) {
|
||
char tts_buf[512] = {0};
|
||
strcpy(tts_buf, json_object_get_string(first_node));
|
||
//进行后续操作
|
||
}
|
||
|
||
break;
|
||
|
||
case 2113: //子设备ctei鉴权
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
//看对应子设备ID authResult 为0 则鉴权成功
|
||
}
|
||
|
||
break;
|
||
|
||
case 9001: //设备数据下行请求 #
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
|
||
}
|
||
|
||
//downData
|
||
|
||
break;
|
||
|
||
case 9003: //设备数据上行响应
|
||
if (!strcmp(device.deviceId, json_object_get_string(json_object_object_get(root_node, "deviceId")))) {
|
||
|
||
}
|
||
|
||
//upData
|
||
|
||
break;
|
||
#endif
|
||
|
||
deault:
|
||
break;
|
||
|
||
}
|
||
exit:
|
||
json_object_put(second_node);
|
||
second_node = NULL;
|
||
json_object_put(first_node);
|
||
first_node = NULL;
|
||
json_object_put(root_node);
|
||
root_node = NULL;
|
||
if (decode_buf) {
|
||
free(decode_buf);
|
||
decode_buf = NULL;
|
||
}
|
||
if (decrypt_buf) {
|
||
free(decrypt_buf);
|
||
decrypt_buf = NULL;
|
||
}
|
||
break;
|
||
|
||
case CONNECT_CLOSE:
|
||
connecting = 0;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//recv
|
||
static void tcp_recv_handler(void *priv)
|
||
{
|
||
int recv_len = 0;
|
||
char *ptr;
|
||
char recv_buf[1024] = {0};
|
||
|
||
for (;;) {
|
||
recv_len = sock_recvfrom(device.tcp_sock, recv_buf + recv_len, sizeof(recv_buf), 0, NULL, NULL);
|
||
if (recv_len > 0) {
|
||
ptr = strstr(recv_buf, "\r\n");
|
||
|
||
if (ptr != NULL) {
|
||
printf("recv completed!\r\n");
|
||
char *tmp_buf = (char *)calloc(1, strlen(recv_buf) + 1);
|
||
strcpy(tmp_buf, recv_buf);
|
||
os_taskq_post("server_to_device", 2, RECV_MSG, (int *)tmp_buf);
|
||
recv_len = 0;
|
||
memset(recv_buf, 0, sizeof(recv_buf));
|
||
}
|
||
} else {
|
||
printf("tcp recv len = %d\r\n", recv_len);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
static int tcp_device_init(char *tcp_host)
|
||
{
|
||
char ipaddr[20];
|
||
if (device.tcp_sock) {
|
||
sock_unreg(device.tcp_sock);
|
||
device.tcp_sock = NULL;
|
||
}
|
||
|
||
if (tcp_host != NULL) {
|
||
memset(&device.dest, 0, sizeof(device.dest));
|
||
struct hostent *hent = NULL;
|
||
int cnt = 0;
|
||
char tmp_host[50] = {0}, *pA = NULL;
|
||
strcpy(tmp_host, tcp_host);
|
||
pA = strpbrk(tmp_host, ":/");
|
||
if (NULL == pA) {
|
||
cnt = strlen(tmp_host);
|
||
} else {
|
||
cnt = pA - tmp_host;
|
||
}
|
||
tmp_host[cnt] = '\0';
|
||
pA = strstr(tcp_host, tmp_host) + strlen(tmp_host);
|
||
if (':' == *pA) {
|
||
pA++;
|
||
device.dest.sin_port = htons(atoi(pA));
|
||
} else {
|
||
device.dest.sin_port = htons(80);
|
||
}
|
||
hent = gethostbyname(tmp_host);
|
||
if (hent == NULL) {
|
||
printf("hent NULL\r\n");
|
||
return -1;
|
||
}
|
||
memcpy(&device.dest.sin_addr, hent->h_addr, sizeof(struct in_addr));
|
||
} else {
|
||
memset(&device.dest, 0, sizeof(device.dest));
|
||
device.dest.sin_addr.s_addr = inet_addr(device.tcpHost);
|
||
device.dest.sin_port = htons(atoi(device.tcp_port));
|
||
}
|
||
|
||
device.tcp_sock = sock_reg(AF_INET, SOCK_STREAM, 0, NULL, NULL);
|
||
if (device.tcp_sock == NULL) {
|
||
log_info("%s tcp: sock_reg fail\n", __func__);
|
||
return -1;
|
||
}
|
||
if (0 != sock_set_reuseaddr(device.tcp_sock)) {
|
||
sock_unreg(device.tcp_sock);
|
||
return -1;
|
||
}
|
||
sock_set_connect_to(device.tcp_sock, 10000);
|
||
/* sock_set_recv_timeout(device.tcp_sock, 40000); */
|
||
sock_set_send_timeout(device.tcp_sock, 10000);
|
||
|
||
device.local.sin_addr.s_addr = htonl(INADDR_ANY);
|
||
device.local.sin_port = htons(0);
|
||
device.local.sin_family = AF_INET;
|
||
if (0 != sock_bind(device.tcp_sock, (struct sockaddr *)&device.local, sizeof(struct sockaddr_in))) {
|
||
sock_unreg(device.tcp_sock);
|
||
log_info("%s sock_bind fail\n", __func__);
|
||
return -1;
|
||
}
|
||
|
||
|
||
device.dest.sin_family = AF_INET;
|
||
if (0 != sock_connect(device.tcp_sock, (struct sockaddr *)&device.dest, sizeof(struct sockaddr_in))) {
|
||
log_info("sock_connect fail.\n");
|
||
printf("ip addr = 0x%x,port = 0x%x\r\n", device.dest.sin_addr.s_addr, device.dest.sin_port);
|
||
sock_unreg(device.tcp_sock);
|
||
return -1;
|
||
}
|
||
|
||
|
||
return 0;
|
||
}
|
||
|
||
static void device_login_func(void *priv)
|
||
{
|
||
u8 i = 0;
|
||
while (1) {
|
||
if (!CT_connect_flag) {
|
||
printf("-------%s-------%d\r\n", __func__, __LINE__);
|
||
return;
|
||
}
|
||
for (int cnt = 0; cnt < 3; cnt++) {
|
||
if (!tcp_device_init(CT_LOGIN_HOST)) {
|
||
goto _login;
|
||
}
|
||
}
|
||
if (device.authInterval) {
|
||
os_time_dly(device.authInterval * 100);
|
||
} else {
|
||
if (i < 3) {
|
||
os_time_dly(60 * 100);
|
||
i++;
|
||
} else {
|
||
os_time_dly(600 * 100);
|
||
}
|
||
}
|
||
}
|
||
_login:
|
||
//创建线程,用于接收tcp_server的数据
|
||
thread_fork("login_recv_handler", 8, 2048, 20, NULL, tcp_recv_handler, NULL);
|
||
|
||
if (!server_func_id) {
|
||
thread_fork("server_to_device", 8, 8192, 20, &server_func_id, CT_server_to_device_fun, NULL);
|
||
}
|
||
|
||
tcp_send_function(1102);
|
||
|
||
if (!heartbeat_timeout_id) {
|
||
heartbeat_timeout_id = sys_timeout_add_to_task("app_core", NULL, timeout_func, 20 * 1000);
|
||
}
|
||
return ;
|
||
|
||
}
|
||
|
||
static void timeout_func(void *priv)
|
||
{
|
||
printf("into timeout\r\n");
|
||
device.login_flag = 0;
|
||
report_all = 0;
|
||
heart_send = 0;
|
||
if (device.tcp_sock) {
|
||
sock_set_quit(device.tcp_sock);
|
||
sock_unreg(device.tcp_sock); //断开服务器socket
|
||
device.tcp_sock = NULL;
|
||
}
|
||
|
||
if (heartbeat_id) {
|
||
sys_timer_del(heartbeat_id);
|
||
heartbeat_id = 0;
|
||
}
|
||
|
||
if (heartbeat_timeout_id) {
|
||
sys_timer_del(heartbeat_timeout_id);
|
||
heartbeat_timeout_id = 0;
|
||
}
|
||
|
||
if (!dev_login_pid) {
|
||
thread_fork("device_login", 8, 4096, 0, &dev_login_pid, device_login_func, NULL);
|
||
}
|
||
}
|
||
|
||
static void device_status_func(void *priv)
|
||
{
|
||
tcp_send_function(2006);
|
||
}
|
||
static void heartbeat_ctl_func(void *priv)
|
||
{
|
||
tcp_send_function(1000);
|
||
}
|
||
|
||
static void status_set_func(int serial, char *name, char *param)
|
||
{
|
||
int type = 0, power_status = 0;
|
||
struct dev_status *status_info = NULL;
|
||
struct list_head *pos = NULL;
|
||
if (!strcmp(name, "SET_POWER")) {
|
||
type = 1;
|
||
} else if (!strcmp(name, "SET_LIGHT_TEMP")) {
|
||
type = 2;
|
||
} else if (!strcmp(name, "SET_LIGHTNESS")) {
|
||
type = 3;
|
||
} else if (!strcmp(name, "SET_SOUND")) {
|
||
type = 4;
|
||
}
|
||
|
||
list_for_each(pos, &status_head.entry) {
|
||
status_info = list_entry(pos, struct dev_status, entry);
|
||
if (type == 1) {
|
||
if (!strcmp(status_info->statusName, "POWER") && status_info->id_num == serial) {
|
||
printf("into power\r\n");
|
||
power_status = atoi(param);
|
||
if (power_status == 2) {
|
||
power_status = status_info->statusValue ? 0 : 1;
|
||
}
|
||
status_info->statusValue = power_status;
|
||
status_info->upload_flag = 1;
|
||
break;
|
||
}
|
||
} else if (type == 2) {
|
||
if (!strcmp(status_info->statusName, "LIGHT_TEMP") && status_info->id_num == serial) {
|
||
printf("into light temp\r\n");
|
||
status_info->statusValue = atoi(param);
|
||
status_info->upload_flag = 1;
|
||
break;
|
||
}
|
||
} else if (type == 3) {
|
||
if (!strcmp(status_info->statusName, "LIGHTNESS") && status_info->id_num == serial) {
|
||
printf("into lightness\r\n");
|
||
status_info->statusValue = atoi(param);
|
||
status_info->upload_flag = 1;
|
||
break;
|
||
}
|
||
} else if (type == 4) {
|
||
if (!strcmp(status_info->statusName, "SOUND") && status_info->id_num == serial) {
|
||
printf("into sound\r\n");
|
||
status_info->statusValue = 0; //待解决
|
||
status_info->upload_flag = 1;
|
||
printf("sound = %s\r\n", param);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
static void tcp_send_function(int code)
|
||
{
|
||
int len = 0, s_len = 0;
|
||
char *data = NULL;
|
||
printf("code = %d\r\n", code);
|
||
switch (code) {
|
||
case 1004:
|
||
data = CT_dev_connect_request();
|
||
break;
|
||
case 1102:
|
||
data = CT_dev_login_CTEI_request();
|
||
break;
|
||
case 2006:
|
||
data = CT_dev_report_request();
|
||
break;
|
||
case 1000:
|
||
data = CT_dev_heartbeat_request();
|
||
break;
|
||
case 2004:
|
||
data = CT_dev_control_reply();
|
||
break;
|
||
default:
|
||
break;
|
||
|
||
}
|
||
|
||
int ret = sock_send(device.tcp_sock, data, strlen(data), 0);
|
||
|
||
if (data) {
|
||
free(data);
|
||
}
|
||
}
|
||
|
||
static int CT_state_check(void)
|
||
{
|
||
if (device.login_flag) {
|
||
return AI_STAT_CONNECTED;
|
||
}
|
||
return AI_STAT_DISCONNECTED;
|
||
|
||
}
|
||
|
||
static int CT_connect(void)
|
||
{
|
||
CT_connect_flag = 1;
|
||
if (!status_head.entry.next) {
|
||
info_init();
|
||
}
|
||
if (list_empty(&status_head.entry)) {
|
||
if (device_read_flash()) {
|
||
printf("no flash save,goto init------%s-----%d\r\n", __func__, __LINE__);
|
||
device_status_init();
|
||
}
|
||
}
|
||
device.login_flag = 0;
|
||
if (!dev_login_pid) {
|
||
thread_fork("device_login", 8, 2048, 0, &dev_login_pid, device_login_func, NULL);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
static int CT_do_event(int event, int arg)
|
||
{
|
||
log_info("do_event : %d", event);
|
||
return 0;
|
||
}
|
||
|
||
static int CT_disconnect(void)
|
||
{
|
||
CT_connect_flag = 0;
|
||
report_all = 0;
|
||
device.login_flag = 0;
|
||
sock_unreg(device.tcp_sock);
|
||
device.tcp_sock = NULL;
|
||
if (heartbeat_id) {
|
||
sys_timer_del(heartbeat_id);
|
||
heartbeat_id = 0;
|
||
}
|
||
if (heartbeat_timeout_id) {
|
||
sys_timeout_del(heartbeat_timeout_id);
|
||
heartbeat_timeout_id = 0;
|
||
}
|
||
os_taskq_post("server_to_device", 1, CONNECT_CLOSE);
|
||
return 0;
|
||
}
|
||
|
||
static void info_init()
|
||
{
|
||
INIT_LIST_HEAD(&status_head.entry); //初始化状态节点头
|
||
INIT_LIST_HEAD(&res_head.entry); //初始化资源节点头
|
||
/* INIT_LIST_HEAD(&event_head.entry); //初始化事件节点头 */
|
||
|
||
//设备信息请向电信方获取
|
||
char pin_iv[] = "G8NT7SQWC5JT67IJ4LW62S0YUCVD6YR3";
|
||
strcpy(device.model, "ZD18");
|
||
strncpy(device.pin, pin_iv, 16);
|
||
strncpy(device.iv, pin_iv + 16, 16);
|
||
printf("pin = %s \niv = %s\r\n", device.pin, device.iv);
|
||
strcpy(device.mac, "38C3DEFE1AA8"); //12
|
||
strcpy(device.ctei, "184579850000003"); //15
|
||
strcpy(device.deviceId, "00A1140101080210037376982606879673"); //34
|
||
|
||
}
|
||
|
||
REGISTER_AI_SDK(CT_MC_api) = {
|
||
.name = "China_Telecom_Mc",
|
||
.connect = CT_connect,
|
||
.state_check = CT_state_check,
|
||
.do_event = CT_do_event,
|
||
.disconnect = CT_disconnect,
|
||
};
|