Commit cd1c0c55 authored by 尹佳钦's avatar 尹佳钦
parents bd0a912a 3ec489ba
......@@ -4,7 +4,7 @@
#define ADDRESS "tcp://172.25.240.31:1983"
#define CLIENTID "1234"
#define TOPIC "/sys/a1OYuSBt23u/aIqEbWno8yDdsjCX15iq/#"
#define TOPIC "/sys/a1OYuSBt23u/aIqEbWno8yDdsjCX15iq/thing/service/property/set"
#define PAYLOAD "Hello cwc World!"
#define QOS 2
......
......@@ -5,54 +5,60 @@
#include "com_api.h"
#include "cJSON.h"
static char * _kk_data_create(const char *topic,const char *data)
{
cJSON *root;
char *out;
root=cJSON_CreateObject();
cJSON_AddStringToObject(root,"topic",topic);
cJSON_AddStringToObject(root,"payload",data);
out=cJSON_Print(root);
cJSON_Delete(root);
printf("[%s][%d]%s\n",__FUNCTION__,__LINE__,out);
return out;
//free(out); /* Print to text, Delete the cJSON, print it, release the string. */
#define KK_FILTER_ADD_TOPIC "/thing/topo/add"
#define KK_FILTER_ADD_TOPIC_REPLY "/thing/topo/add_reply"
#define KK_FILTER_DELETE_TOPIC "/thing/topo/delete"
#define KK_FILTER_DELETE_TOPIC_REPLY "/thing/topo/delete_reply"
#define KK_FILTER_REGISTER_TOPIC "/thing/sub/register"
#define KK_FILTER_REGISTER_TOPIC_REPLY "/thing/sub/register_reply"
#define KK_FILTER_LOGIN_TOPIC "/thing/combine/login"
#define KK_FILTER_LOGIN_TOPIC_REPLY "/thing/combine/login_reply"
#define KK_FILTER_SET_TOPIC "/thing/service/property/set"
#define KK_FILTER_SET_TOPIC_REPLY "/thing/service/property/set_reply"
#define KK_FILTER_EVENT_POST_TOPIC "/thing/event/property/post"
#define KK_FILTER_EVENT_POST_REPLY "/thing/event/property/post_reply"
}
void KK_Sendto_CloudData(void *data,int len)
int _kk_sendto_cloud(cJSON *root)
{
cJSON *root,*pTopic,*pData;
cJSON *pTopic,*pData;
char *topic = NULL;
char *payload = NULL;
root=cJSON_Parse((char*)data);
if(root == NULL)
{
return;
}
pTopic = cJSON_GetObjectItem(root, "topic");
if(pTopic == NULL)
{
if(pTopic == NULL){
return;
}
pData = cJSON_GetObjectItem(root, "payload");
if(pData == NULL)
{
if(pData == NULL){
return;
}
printf("[%s][%d] topic:%s\n",__FUNCTION__,__LINE__,pTopic->valuestring);
printf("[%s][%d] payload:%s\n",__FUNCTION__,__LINE__,pData->valuestring);
KK_MQTT_SendMsg(pTopic->valuestring,(const char*)pData->valuestring);
}
#define KK_FILTER_ADD_TOPIC "/thing/topo/add"
#define KK_FILTER_ADD_TOPIC_REPLY "/thing/topo/add_reply"
#define KK_FILTER_DELETE_TOPIC "/thing/topo/delete"
#define KK_FILTER_DELETE_TOPIC_REPLY "/thing/topo/delete_reply"
#define KK_FILTER_REGISTER_TOPIC "/thing/sub/register"
#define KK_FILTER_REGISTER_TOPIC_REPLY "/thing/sub/register_reply"
#define KK_FILTER_LOGIN_TOPIC "/thing/combine/login"
#define KK_FILTER_LOGIN_TOPIC_REPLY "/thing/combine/login_reply"
static int _check_invalid_topic(char* topic)
void KK_Data_FromDev(void* str,int len)
{
cJSON *root,*cmd;
if(str == NULL){
return;
}
root=cJSON_Parse((char*)str);
if(root == NULL){
return;
}
cmd = cJSON_GetObjectItem(root, "cmd");
if(cmd == NULL){
_kk_sendto_cloud(root);
}
else{
KK_Subdev_Subscribe(root);
}
cJSON_Delete(root);
}
static int _check_invalid_topic(const char* topic)
{
if(strstr(topic, KK_FILTER_ADD_TOPIC) != NULL && \
strstr(topic,KK_FILTER_ADD_TOPIC_REPLY) == NULL){
......@@ -69,9 +75,30 @@ static int _check_invalid_topic(char* topic)
else if(strstr(topic, KK_FILTER_LOGIN_TOPIC) != NULL && \
strstr(topic,KK_FILTER_LOGIN_TOPIC_REPLY) == NULL){
return 1;
}
else if(strstr(topic, KK_FILTER_SET_TOPIC_REPLY) != NULL){
return 1;
}
else if(strstr(topic, KK_FILTER_EVENT_POST_TOPIC) != NULL && \
strstr(topic,KK_FILTER_LOGIN_TOPIC_REPLY) == NULL){
return 1;
}
return 0;
}
static char * _kk_data_create(const char *topic,const char *data)
{
cJSON *root;
char *out;
root=cJSON_CreateObject();
cJSON_AddStringToObject(root,"topic",topic);
cJSON_AddStringToObject(root,"payload",data);
out=cJSON_Print(root);
cJSON_Delete(root);
printf("[%s][%d]%s\n",__FUNCTION__,__LINE__,out);
return out;
//free(out); /* Print to text, Delete the cJSON, print it, release the string. */
}
void KK_Sendto_DevData(const char *topic,const char *data)
{
if(_check_invalid_topic(topic))
......
......@@ -67,7 +67,7 @@ int main(int argc, char* argv[])
/*set the callback to get the device date to cloud*/
HAL_SetProduct_Type(PRODUCT_TPYE);
HAL_SetProduct_Code(PRODUCT_CODE);
kk_ipc_init(IPC_APP2MID,KK_Sendto_CloudData);
kk_ipc_init(IPC_APP2MID,KK_Data_FromDev);
rc = mqtt_start();
return rc;
......
......@@ -3,11 +3,46 @@
#include <stdlib.h>
#include <string.h>
#include "kk_product.h"
#include "cJSON.h"
const char KK_URI_SYS_PREFIX[] = "/sys/%s/%s/#";
int KK_Subdev_Subscribe(const cJSON *root)
{
int res = 0;
cJSON *productType = NULL;
cJSON *productCode = NULL;
cJSON *data = NULL;
cJSON *cmd = NULL;
int url_len = 0;
data = cJSON_GetObjectItem(root, "data");
if(data == NULL){
return -1;
}
productType = cJSON_GetObjectItem(data,"productType");
if(productType == NULL){
return -1;
}
productCode = cJSON_GetObjectItem(data,"productCode");
if(productCode == NULL){
return -1;
}
url_len = strlen(KK_URI_SYS_PREFIX) + strlen(productType->valuestring) + strlen(productCode->valuestring) + 1;
char *url = malloc(url_len);
if (url == NULL) {
return -1;
}
memset(url, 0, url_len);
snprintf(url, url_len, KK_URI_SYS_PREFIX, productType->valuestring, productCode->valuestring);
printf("[%s][%d] URL:%s\n",__FUNCTION__,__LINE__,url);
res = KK_MQTT_SubTopic(url);
free(url);
return res;
}
int _kk_client_subscribe(char productType[PRODUCT_TYPE_LEN], char productCode[PRODUCT_CODE_LEN])
static int _kk_client_subscribe(char productType[PRODUCT_TYPE_LEN], char productCode[PRODUCT_CODE_LEN])
{
int res = 0, index = 0, fail_count = 0;
......@@ -26,7 +61,7 @@ int _kk_client_subscribe(char productType[PRODUCT_TYPE_LEN], char productCode[PR
res = KK_MQTT_SubTopic(url);
free(url);
return 0;
return res;
}
int KK_Client_Gateway_Subscribe(void)
......
......@@ -4,7 +4,7 @@
#include "kcloud_log.h"
#include "kcloud_config.h"
extern void KK_Sendto_CloudData(void *data,int len);
extern void KK_Data_FromDev(void* str,int len);
extern int KK_MQTT_SubTopic(char *topicName);
......
......@@ -3,6 +3,8 @@
#define APP2MID "ipc:///tmp/app2mid.ipc"
#define PLAT2MID "ipc:///tmp/plat2mid.ipc"
#define MAGIC "magic12"
typedef struct {
int n;//nanomsg socket
......@@ -14,6 +16,7 @@ typedef struct {
struct ev_io watcher;
ipc_cb* cb;
ipc_type type;
int isconnect;
}Bloop_ctrl_t;
Bloop_ctrl_t Bloop_ctrl;
......@@ -37,6 +40,16 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents)
return;
}
printf("watcher_cb:%s recived\r\n\r\n", (char *)dat);
//for test ipc connect or not
if (loop_ctrl->isconnect == 0 ){
loop_ctrl->isconnect =1;
if (strncmp(dat,MAGIC, strlen(MAGIC)) == 0){
kk_ipc_send(loop_ctrl->type, dat, bytes);
nn_freemsg(dat);
return;
}
}
if (loop_ctrl->cb != NULL){
loop_ctrl->cb((void *)dat, bytes);
}
......@@ -202,3 +215,28 @@ int kk_ipc_send(ipc_type type, void* data, int len)
return 0;
}
int kk_ipc_isconnect(ipc_type type){
Bloop_ctrl_t* loop_ctrl;
if (IPC_MID2PLAT == type){
loop_ctrl = &Mloop_ctrl;
}else {
loop_ctrl = &Bloop_ctrl;
}
if (loop_ctrl->isconnect == 1){
return 1;
}else{
for(int i =0; i<20;i++){
kk_ipc_send(type, MAGIC, strlen(MAGIC)+1);
usleep(500000);
if (loop_ctrl->isconnect == 1){
break;
}
}
return loop_ctrl->isconnect;
}
}
{
"schema":"https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json",
"productType":"gw",
"profile":{
"type":"KONKE_ZIGBEE_Gateway"
},
"properties":[
{
"identifier":"NetChannelState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"组网通道状态",
"accessMode":"rw",
"required":true
},
{
"identifier":"WhiteListState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"白名单状态",
"accessMode":"rw",
"required":false
},
{
"identifier":"OnlineDetectionState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"在线侦测开关状态",
"accessMode":"rw",
"required":false
},
{
"identifier":"SN",
"dataType":{
"specs":{
"length":"50"
},
"type":"text"
},
"name":"设备SN",
"accessMode":"r",
"required":false
},
{
"identifier":"IPAddress",
"dataType":{
"specs":{
"length":"255"
},
"type":"text"
},
"name":"IP地址",
"accessMode":"r",
"required":false
},
{
"identifier":"MACAddress",
"dataType":{
"specs":{
"length":"128"
},
"type":"text"
},
"name":"MAC地址",
"accessMode":"r",
"required":false
},
{
"identifier":"Port",
"dataType":{
"specs":{
"min":"0",
"max":"65535",
"step":"1"
},
"type":"int"
},
"name":"网关通信端口号",
"accessMode":"r",
"required":false
},
{
"identifier":"Version",
"dataType":{
"specs":{
"length":"255"
},
"type":"text"
},
"name":"版本",
"accessMode":"r",
"required":false
}],
"services":[
{
"outputData":[
],
"identifier":"set",
"inputData":[
{
"identifier":"NetChannelState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"组网通道状态"
},
{
"identifier":"WhiteListState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"白名单状态"
},
{
"identifier":"OnlineDetectionState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"在线侦测开关状态"
}],
"method":"thing.service.property.set",
"name":"set",
"required":true,
"callType":"async",
"desc":"属性设置"
},
{
"outputData":[
{
"identifier":"NetChannelState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"组网通道状态"
},
{
"identifier":"WhiteListState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"白名单状态"
},
{
"identifier":"OnlineDetectionState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"在线侦测开关状态"
},
{
"identifier":"SN",
"dataType":{
"specs":{
"length":"50"
},
"type":"text"
},
"name":"设备SN"
},
{
"identifier":"IPAddress",
"dataType":{
"specs":{
"length":"255"
},
"type":"text"
},
"name":"IP地址"
},
{
"identifier":"MACAddress",
"dataType":{
"specs":{
"length":"128"
},
"type":"text"
},
"name":"MAC地址"
},
{
"identifier":"Port",
"dataType":{
"specs":{
"min":"0",
"max":"65535",
"step":"1"
},
"type":"int"
},
"name":"网关通信端口号"
},
{
"identifier":"Version",
"dataType":{
"specs":{
"length":"255"
},
"type":"text"
},
"name":"版本",
"accessMode":"r"
}],
"identifier":"get",
"inputData":[
"NetChannelState",
"WhiteListState",
"OnlineDetectionState",
"SN",
"IPAddress",
"MACAddress",
"Port",
"Version"],
"method":"thing.service.property.get",
"name":"get",
"required":true,
"callType":"async",
"desc":"属性获取"
},
{
"outputData":[
],
"identifier":"restoreFactory",
"inputData":[
],
"method":"thing.service.restoreFactory",
"name":"restoreFactory",
"required":false,
"callType":"async",
"desc":"恢复出厂设置"
},
{
"outputData":[
],
"identifier":"addWhiteList",
"inputData":[
{
"identifier":"Devices",
"dataType":{
"specs":{
"item":{
"specs":[
{
"identifier":"MACAddress",
"dataType":{
"specs":{
"length":"128"
},
"type":"text"
},
"name":"MAC地址"
},
{
"identifier":"ProductId",
"dataType":{
"specs":{
"length":"2048"
},
"type":"text"
},
"name":"产品id"
}],
"type":"struct"
},
"size":"512"
},
"type":"array"
},
"name":"设备列表"
}],
"method":"thing.service.addWhiteList",
"name":"添加设备白名单",
"required":false,
"callType":"async"
},
{
"outputData":[
],
"identifier":"deleteWhiteList",
"inputData":[
{
"identifier":"Devices",
"dataType":{
"specs":{
"item":{
"specs":[
{
"identifier":"MACAddress",
"dataType":{
"specs":{
"length":"128"
},
"type":"text"
},
"name":"MAC地址"
}],
"type":"struct"
},
"size":"512"
},
"type":"array"
},
"name":"设备列表"
}],
"method":"thing.service.deleteWhiteList",
"name":"删除白名单",
"required":false,
"callType":"async"
},
{
"outputData":[
],
"inputData":[
],
"identifier":"getWhiteList",
"method":"thing.service.getWhiteList",
"name":"获取白名单列表",
"required":false,
"callType":"async"
}],
"events":[
{
"outputData":[
{
"identifier":"NetChannelState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"组网通道状态"
},
{
"identifier":"WhiteListState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"白名单状态"
},
{
"identifier":"OnlineDetectionState",
"dataType":{
"specs":{
"0":"关闭",
"1":"打开"
},
"type":"bool"
},
"name":"在线侦测开关状态"
},
{
"identifier":"SN",
"dataType":{
"specs":{
"length":"50"
},
"type":"text"
},
"name":"设备SN"
},
{
"identifier":"IPAddress",
"dataType":{
"specs":{
"length":"255"
},
"type":"text"
},
"name":"IP地址"
},
{
"identifier":"MACAddress",
"dataType":{
"specs":{
"length":"128"
},
"type":"text"
},
"name":"MAC地址"
},
{
"identifier":"Port",
"dataType":{
"specs":{
"min":"0",
"max":"65535",
"step":"1"
},
"type":"int"
},
"name":"网关通信端口号"
}],
"identifier":"property",
"method":"thing.event.property.post",
"name":"property",
"type":"info",
"required":true,
"desc":"属性上报"
},
{
"outputData":[
],
"identifier":"whiteListAddedNotification",
"method":"thing.event.whiteListAddedNotification.post",
"name":"添加设备白名单通知",
"type":"info",
"required":false
},
{
"outputData":[
],
"identifier":"whiteListDeletedNotification",
"method":"thing.event.whiteListDeletedNotification.post",
"name":"删除设备白名单通知",
"type":"info",
"required":false
},
{
"outputData":[
{
"identifier":"Devices",
"dataType":{
"specs":{
"item":{
"specs":[
{
"identifier":"SN",
"dataType":{
"specs":{
"length":"50"
},
"type":"text"
},
"name":"设备sn"
},
{
"identifier":"deviceId",
"dataType":{
"specs":{
"length":"128"
},
"type":"text"
},
"name":"设备ID"
},
{
"identifier":"MACAddress",
"dataType":{
"specs":{
"length":"128"
},
"type":"text"
},
"name":"MAC地址"
},
{
"identifier":"ProductId",
"dataType":{
"specs":{
"length":"2048"
},
"type":"text"
},
"name":"产品id"
}],
"type":"struct"
},
"size":"512"
},
"type":"array"
},
"name":"设备列表"
}],
"identifier":"getWhiteListNotification",
"method":"thing.event.getWhiteList.post",
"name":"getWhiteList",
"type":"info",
"required":false,
"desc":"获取白名单通知消息"
},
{
"outputData":[
],
"identifier":"restoreFactoryNotification",
"method":"thing.event.restoreFactoryNotification.post",
"name":"恢复出厂通知消息",
"type":"info",
"required":false
},
{
"outputData":[
{
"identifier":"ErrorCode",
"dataType":{
"specs":{
"0":"正常"
},
"type":"enum"
},
"name":"故障代码"
}],
"identifier":"error",
"method":"thing.event.error.post",
"name":"故障上报",
"type":"error",
"required":false
}]
}
......@@ -137,19 +137,6 @@ typedef struct {
iotx_dm_event_callback event_callback;
} iotx_dm_init_params_t;
typedef enum {
IOTX_DM_DEV_AVAIL_ENABLE,
IOTX_DM_DEV_AVAIL_DISABLE
} iotx_dm_dev_avail_t;
typedef enum {
IOTX_DM_DEV_STATUS_UNAUTHORIZED, /* Subdev Created */
IOTX_DM_DEV_STATUS_AUTHORIZED, /* Receive Topo Add Notify */
IOTX_DM_DEV_STATUS_REGISTERED, /* Receive Subdev Registered */
IOTX_DM_DEV_STATUS_ATTACHED, /* Receive Subdev Topo Add Reply */
IOTX_DM_DEV_STATUS_LOGINED, /* Receive Subdev Login Reply */
IOTX_DM_DEV_STATUS_ONLINE /* After All Topic Subscribed */
} iotx_dm_dev_status_t;
typedef enum {
DM_TSL_SERVICE_GET_FAILED = -13,
......@@ -183,7 +170,6 @@ int iotx_dm_get_opt(int opt, void *data);
#ifdef LOG_REPORT_TO_CLOUD
int iotx_dm_log_post(_IN_ int devid, _IN_ char *payload, _IN_ int payload_len);
#endif
int iotx_dm_post_property(_IN_ int devid, _IN_ char *payload, _IN_ int payload_len);
int iotx_dm_property_desired_get(_IN_ int devid, _IN_ char *payload, _IN_ int payload_len);
int iotx_dm_property_desired_delete(_IN_ int devid, _IN_ char *payload, _IN_ int payload_len);
int iotx_dm_post_event(_IN_ int devid, _IN_ char *identifier, _IN_ int identifier_len, _IN_ char *payload,
......
......@@ -7,7 +7,7 @@
#include "kk_dm_api.h"
#include "kk_tsl_common.h"
#include "kk_dm_mng.h"
#include "com_api.h"
static dm_api_ctx_t g_dm_api_ctx;
......@@ -32,52 +32,6 @@ static void _dm_api_unlock(void)
}
}
int iotx_dm_post_property(_IN_ int devid, _IN_ char *payload, _IN_ int payload_len)
{
int res = 0;
_dm_api_lock();
res = dm_mgr_upstream_thing_property_post(devid, payload, payload_len);
if (res < SUCCESS_RETURN) {
_dm_api_unlock();
return FAIL_RETURN;
}
_dm_api_unlock();
return res;
}
int iotx_dm_subdev_create(_IN_ char product_key[PRODUCT_KEY_MAXLEN],
_IN_ char device_name[DEVICE_NAME_MAXLEN],
_IN_ char device_secret[DEVICE_SECRET_MAXLEN], _OU_ int *devid)
{
int res = 0;
if (product_key == NULL || device_name == NULL ||
(strlen(product_key) >= PRODUCT_KEY_MAXLEN) ||
(strlen(device_name) >= DEVICE_NAME_MAXLEN) ||
devid == NULL) {
return INVALID_PARAMETER;
}
if (device_secret != NULL && strlen(device_secret) >= DEVICE_SECRET_MAXLEN) {
return INVALID_PARAMETER;
}
_dm_api_lock();
res = dm_mgr_device_create(IOTX_DM_DEVICE_SUBDEV, product_key, device_name, device_secret, devid);
if (res != SUCCESS_RETURN) {
_dm_api_unlock();
return FAIL_RETURN;
}
_dm_api_unlock();
return SUCCESS_RETURN;
}
int kk_dm_subdev_register(_IN_ int devid)
{
int res = 0;
......@@ -244,4 +198,47 @@ int iotx_dm_connect(_IN_ iotx_dm_event_callback cb)
return SUCCESS_RETURN;
}
int iotx_dm_subscribe(_IN_ int devid)
{
int res = 0, dev_type = 0;
char product_key[PRODUCT_KEY_MAXLEN] = {0};
char device_name[DEVICE_NAME_MAXLEN] = {0};
char device_secret[DEVICE_SECRET_MAXLEN] = {0};
if (devid < 0) {
return INVALID_PARAMETER;
}
dm_mgr_dev_node_t *node = NULL;
_dm_api_lock();
res = dm_mgr_search_dev_by_devid(devid, &node);
if (res != SUCCESS_RETURN) {
_dm_api_unlock();
return FAIL_RETURN;
}
_dm_api_unlock();
//send app to subscribe mqtt
const char subscribe_cmd[] =
"{\"cmd\":\"subscribe\",\"data\":{\"productType\":\"%s\",\"productCode\":\"%s\"}}";
int len = strlen(subscribe_cmd) + strlen(node->product_key) + strlen(node->device_name) + 1;
void* buf = malloc(len);
if (buf){
HAL_Snprintf(buf, len, subscribe_cmd, node->product_key, node->device_name);
kk_ipc_send(IPC_MID2APP, buf, len);
free(buf);
}else{
printf("\n [%d][%s] malloc faild kk_ipc_send \n", __LINE__, __FUNCTION__);
return FAIL_RETURN;
}
printf("\n [%d][%s] [%d] send app to subscribe mqtt \n", __LINE__, __FUNCTION__, HAL_UptimeMs());
return SUCCESS_RETURN;
}
......@@ -7,6 +7,8 @@
#include "kk_tsl_load.h"
#include "iot_export_linkkit.h"
#include "kk_product.h"
//const char DM_URI_SYS_PREFIX[] DM_READ_ONLY = "/sys/%s/%s/";
const char DM_URI_EXT_SESSION_PREFIX[] DM_READ_ONLY = "/ext/session/%s/%s/";
const char DM_URI_EXT_NTP_PREFIX[] DM_READ_ONLY = "/ext/ntp/%s/%s/";
......@@ -46,7 +48,6 @@ const char DM_URI_COMBINE_LOGOUT[] DM_READ_ONLY = "combine/lo
const char DM_URI_COMBINE_LOGOUT_REPLY[] DM_READ_ONLY = "combine/logout_reply";
static dm_mgr_ctx g_dm_mgr = {0};
static dm_mgr_ctx *_dm_mgr_get_ctx(void)
{
......@@ -166,7 +167,7 @@ static int _dm_init_tsl_params(int devId)
return res;
}
int dm_mgr_device_create(_IN_ int dev_type, _IN_ char product_key[PRODUCT_KEY_MAXLEN],
_IN_ char device_name[DEVICE_NAME_MAXLEN], _IN_ char device_secret[DEVICE_SECRET_MAXLEN], _OU_ int *devid)
_IN_ char device_name[DEVICE_NAME_MAXLEN], _IN_ char device_secret[DEVICE_SECRET_MAXLEN],_IN_ char device_mac[DEVICE_MAC_MAXLEN], _OU_ int *devid)
{
int res = 0;
dm_mgr_ctx *ctx = _dm_mgr_get_ctx();
......@@ -183,6 +184,9 @@ int dm_mgr_device_create(_IN_ int dev_type, _IN_ char product_key[PRODUCT_KEY_MA
if (device_secret != NULL && strlen(device_secret) >= DEVICE_SECRET_MAXLEN) {
return INVALID_PARAMETER;
}
if (device_mac != NULL && strlen(device_mac) >= DEVICE_MAC_MAXLEN) {
return INVALID_PARAMETER;
}
res = _dm_mgr_search_dev_by_pkdn(product_key, device_name, &node);
if (res == SUCCESS_RETURN) {
......@@ -209,6 +213,10 @@ int dm_mgr_device_create(_IN_ int dev_type, _IN_ char product_key[PRODUCT_KEY_MA
if (device_secret != NULL) {
memcpy(node->device_secret, device_secret, strlen(device_secret));
}
if (device_mac != NULL) {
memcpy(node->device_mac, device_mac, strlen(device_mac));
}
//node->dev_status = IOTX_DM_DEV_STATUS_AUTHORIZED;
memset(name,0x0,sizeof(name));
kk_get_tsl_by_productKey(product_key,name);
......@@ -254,6 +262,97 @@ int dm_mgr_search_device_by_pkdn(_IN_ char product_key[PRODUCT_KEY_MAXLEN], _IN_
return SUCCESS_RETURN;
}
int dm_mgr_search_mac_by_topic(_IN_ char* topic, _OU_ char mac[DEVICE_MAC_MAXLEN])
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
char product_key[PRODUCT_KEY_MAXLEN];
char device_name[DEVICE_NAME_MAXLEN];
if (topic == NULL) {
return INVALID_PARAMETER;
}
res =kk_msg_uri_parse_pkdn((char *)topic, strlen(topic), 2 + KK_URI_OFFSET, 4 + KK_URI_OFFSET, product_key,
device_name);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
res = _dm_mgr_search_dev_by_pkdn(product_key, device_name, &node);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
memcpy(mac, node->device_mac, DEVICE_MAC_MAXLEN);
return SUCCESS_RETURN;
}
int dm_mgr_search_mac_by_pkdn(_IN_ char product_key[PRODUCT_KEY_MAXLEN], _IN_ char device_name[DEVICE_NAME_MAXLEN],
_OU_ char mac[DEVICE_MAC_MAXLEN])
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
if (product_key == NULL || device_name == NULL) {
return INVALID_PARAMETER;
}
res = _dm_mgr_search_dev_by_pkdn(product_key, device_name, &node);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
memcpy(mac, node->device_mac, DEVICE_MAC_MAXLEN);
return SUCCESS_RETURN;
}
int dm_mgr_get_device_by_mac(_IN_ char device_mac[DEVICE_MAC_MAXLEN], _OU_ dm_mgr_dev_node_t **node)
{
dm_mgr_ctx *ctx = _dm_mgr_get_ctx();
dm_mgr_dev_node_t *search_node = NULL;
list_for_each_entry(search_node, &ctx->dev_list, linked_list, dm_mgr_dev_node_t) {
if ((strlen(search_node->device_mac) == strlen(device_mac)) &&
(memcmp(search_node->device_mac, device_mac, strlen(device_mac)) == 0)) {
/* dm_log_debug("Device Found, Product Key: %s, Device Name: %s", product_key, device_name); */
if (node) {
*node = search_node;
}
return SUCCESS_RETURN;
}
}
printf("Device Not Found, device_mac: %s\n", device_mac);
return FAIL_RETURN;
}
int dm_mgr_get_devId_by_mac(_IN_ char device_mac[DEVICE_MAC_MAXLEN],_OU_ int *devid)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
if (device_mac == NULL) {
return INVALID_PARAMETER;
}
res = dm_mgr_get_device_by_mac(device_mac, &node);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
if (devid) {
*devid = node->devid;
}
return SUCCESS_RETURN;
}
int dm_mgr_init(void)
{
int res = 0;
......@@ -283,7 +382,7 @@ int dm_mgr_init(void)
//memcpy(device_name,"aIqEbWno8yDdsjCX15iq",strlen("aIqEbWno8yDdsjCX15iq"));
//_dm_mgr_legacy_thing_created(IOTX_DM_LOCAL_NODE_DEVID);
res = dm_mgr_device_create(KK_DM_DEVICE_GATEWAY,product_key,device_name,device_secret,&devId);
res = dm_mgr_device_create(KK_DM_DEVICE_GATEWAY,product_key,device_name,device_secret,"aabbccddeeff1120",&devId);
if (res != SUCCESS_RETURN) {
goto ERROR;
}
......@@ -296,26 +395,43 @@ ERROR:
memset(ctx, 0, sizeof(dm_mgr_ctx));
return FAIL_RETURN;
}
const char DM_MSG_THING_UPSTREAM_REQUEST_PARAMS[] DM_READ_ONLY =
"{\"value\":%s,\"timestamp\":\"%s\"}";
static int _dm_mgr_upstream_request_assemble(_IN_ int msgid, _IN_ int devid, _IN_ const char *service_prefix,
_IN_ const char *service_name,
_IN_ char *params, _IN_ int params_len, _IN_ char *method, _OU_ dm_msg_request_t *request)
{
int res = 0;
char timestamp[DM_UTILS_UINT64_STRLEN] = {0};
dm_mgr_dev_node_t *node = NULL;
int paramLen = 0;
char *payload_param = NULL;
res = dm_mgr_search_dev_by_devid(devid, &node);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
/* TimeStamp */
HAL_Snprintf(timestamp, DM_UTILS_UINT64_STRLEN, "%llu", (unsigned long long)HAL_UptimeMs());
/* dm_log_debug("Time Stamp: %s", timestamp); */
paramLen = strlen(DM_MSG_THING_UPSTREAM_REQUEST_PARAMS) +
params_len + strlen(timestamp) + 1;
payload_param = malloc(paramLen);
if (payload_param == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(payload_param, 0, paramLen);
HAL_Snprintf(payload_param, paramLen, DM_MSG_THING_UPSTREAM_REQUEST_PARAMS, params,timestamp);
request->msgid = msgid;
request->devid = devid;
request->service_prefix = service_prefix;
request->service_name = service_name;
memcpy(request->product_key, node->product_key, strlen(node->product_key));
memcpy(request->device_name, node->device_name, strlen(node->device_name));
request->params = params;
request->params_len = params_len;
request->params = payload_param;
request->params_len = paramLen;
request->method = method;
return SUCCESS_RETURN;
......@@ -348,6 +464,7 @@ int dm_mgr_upstream_thing_property_post(_IN_ int devid, _IN_ char *payload, _IN_
/* Send Message To Cloud */
res = dm_msg_request(&request);
free(request.params);
return res;
}
int dm_mgr_upstream_thing_event_post(_IN_ int devid, _IN_ char *identifier, _IN_ int identifier_len, _IN_ char *method,
......@@ -602,15 +719,14 @@ int dm_mgr_upstream_thing_topo_add(_IN_ int devid)
return res;
}
int dm_mgr_upstream_combine_login(_IN_ int devid)
int dm_mgr_upstream_thing_topo_delete(_IN_ int devid)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
dm_msg_request_t request;
if (devid < 0) {
return INVALID_PARAMETER;
return DM_INVALID_PARAMETER;
}
res = dm_mgr_search_dev_by_devid(devid, &node);
......@@ -619,13 +735,13 @@ int dm_mgr_upstream_combine_login(_IN_ int devid)
}
memset(&request, 0, sizeof(dm_msg_request_t));
request.service_prefix = DM_URI_EXT_SESSION_PREFIX;
request.service_name = DM_URI_COMBINE_LOGIN;
request.service_prefix = DM_URI_SYS_PREFIX;
request.service_name = DM_URI_THING_TOPO_DELETE;
HAL_GetProduct_Type(request.product_key);
HAL_GetProduct_Code(request.device_name);
/* Get Params And Method */
res = dm_msg_combine_login(node->product_key, node->device_name, node->device_secret, &request);
res = dm_msg_thing_topo_delete(node->product_key, node->device_name, &request);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
......@@ -637,7 +753,7 @@ int dm_mgr_upstream_combine_login(_IN_ int devid)
request.devid = devid;
/* Callback */
//request.callback = dm_client_combine_login_reply;
//request.callback = dm_client_thing_topo_delete_reply;
/* Send Message To Cloud */
......@@ -651,7 +767,49 @@ int dm_mgr_upstream_combine_login(_IN_ int devid)
return res;
}
int dm_mgr_upstream_combine_logout(_IN_ int devid)
int dm_mgr_upstream_thing_topo_get(void)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
dm_msg_request_t request;
memset(&request, 0, sizeof(dm_msg_request_t));
request.service_prefix = DM_URI_SYS_PREFIX;
request.service_name = DM_URI_THING_TOPO_GET;
HAL_GetProduct_Type(request.product_key);
HAL_GetProduct_Code(request.device_name);
res = _dm_mgr_search_dev_by_pkdn(request.product_key, request.device_name, &node);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
/* Get Params And Method */
res = dm_msg_thing_topo_get(&request);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
/* Get Msg ID */
request.msgid = iotx_report_id();
/* Get Dev ID */
request.devid = node->devid;
/* Callback */
//request.callback = dm_client_thing_topo_get_reply;
/* Send Message To Cloud */
res = dm_msg_request(&request);
if (res == SUCCESS_RETURN) {
res = request.msgid;
}
free(request.params);
return res;
}
int dm_mgr_upstream_thing_list_found(_IN_ int devid)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
......@@ -666,18 +824,61 @@ int dm_mgr_upstream_combine_logout(_IN_ int devid)
return FAIL_RETURN;
}
if (node->dev_status < IOTX_DM_DEV_STATUS_LOGINED) {
memset(&request, 0, sizeof(dm_msg_request_t));
request.service_prefix = DM_URI_SYS_PREFIX;
request.service_name = DM_URI_THING_LIST_FOUND;
HAL_GetProduct_Type(request.product_key);
HAL_GetProduct_Code(request.device_name);
/* Get Params And Method */
res = dm_msg_thing_list_found(node->product_key, node->device_name, &request);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
/* Get Msg ID */
request.msgid = iotx_report_id();
/* Get Dev ID */
request.devid = devid;
/* Callback */
//request.callback = dm_client_thing_list_found_reply;
/* Send Message To Cloud */
res = dm_msg_request(&request);
if (res == SUCCESS_RETURN) {
res = request.msgid;
}
free(request.params);
return res;
}
int dm_mgr_upstream_combine_login(_IN_ int devid)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
dm_msg_request_t request;
if (devid < 0) {
return INVALID_PARAMETER;
}
res = dm_mgr_search_dev_by_devid(devid, &node);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
memset(&request, 0, sizeof(dm_msg_request_t));
request.service_prefix = DM_URI_EXT_SESSION_PREFIX;
request.service_name = DM_URI_COMBINE_LOGOUT;
request.service_name = DM_URI_COMBINE_LOGIN;
HAL_GetProduct_Type(request.product_key);
HAL_GetProduct_Code(request.device_name);
/* Get Params And Method */
res = dm_msg_combine_logout(node->product_key, node->device_name, &request);
res = dm_msg_combine_login(node->product_key, node->device_name, node->device_secret, &request);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
......@@ -689,9 +890,8 @@ int dm_mgr_upstream_combine_logout(_IN_ int devid)
request.devid = devid;
/* Callback */
//request.callback = dm_client_combine_logout_reply;
//request.callback = dm_client_combine_login_reply;
/* Send Message To Cloud */
/* Send Message To Cloud */
res = dm_msg_request(&request);
......@@ -704,7 +904,7 @@ int dm_mgr_upstream_combine_logout(_IN_ int devid)
return res;
}
int dm_mgr_upstream_thing_topo_delete(_IN_ int devid)
int dm_mgr_upstream_combine_logout(_IN_ int devid)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
......@@ -720,13 +920,13 @@ int dm_mgr_upstream_thing_topo_delete(_IN_ int devid)
}
memset(&request, 0, sizeof(dm_msg_request_t));
request.service_prefix = DM_URI_SYS_PREFIX;
request.service_name = DM_URI_THING_TOPO_DELETE;
request.service_prefix = DM_URI_EXT_SESSION_PREFIX;
request.service_name = DM_URI_COMBINE_LOGOUT;
HAL_GetProduct_Type(request.product_key);
HAL_GetProduct_Code(request.device_name);
/* Get Params And Method */
res = dm_msg_thing_topo_delete(node->product_key, node->device_name, &request);
res = dm_msg_combine_logout(node->product_key, node->device_name, &request);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
......@@ -738,8 +938,9 @@ int dm_mgr_upstream_thing_topo_delete(_IN_ int devid)
request.devid = devid;
/* Callback */
//request.callback = dm_client_thing_topo_delete_reply;
//request.callback = dm_client_combine_logout_reply;
/* Send Message To Cloud */
/* Send Message To Cloud */
res = dm_msg_request(&request);
......@@ -754,10 +955,10 @@ int dm_mgr_upstream_thing_topo_delete(_IN_ int devid)
int dm_mgr_subdev_create(_IN_ char product_key[PRODUCT_KEY_MAXLEN],
_IN_ char device_name[DEVICE_NAME_MAXLEN], _IN_ char device_secret[DEVICE_SECRET_MAXLEN], _OU_ int *devid){
_IN_ char device_name[DEVICE_NAME_MAXLEN], _IN_ char device_secret[DEVICE_SECRET_MAXLEN],_IN_ char device_mac[DEVICE_MAC_MAXLEN], _OU_ int *devid){
int res = 0;
res = dm_mgr_device_create(KK_DM_DEVICE_SUBDEV,product_key,device_name,device_secret, devid);
res = dm_mgr_device_create(KK_DM_DEVICE_SUBDEV,product_key,device_name,device_secret,device_mac, devid);
if (res != SUCCESS_RETURN) {
printf("subdev open Failed\n");
return FAIL_RETURN;
......
......@@ -17,8 +17,7 @@ typedef struct {
char product_key[PRODUCT_KEY_MAXLEN];
char device_name[DEVICE_NAME_MAXLEN];
char device_secret[DEVICE_SECRET_MAXLEN];
iotx_dm_dev_avail_t status;
iotx_dm_dev_status_t dev_status;
char device_mac[DEVICE_MAC_MAXLEN];
struct list_head linked_list;
} dm_mgr_dev_node_t;
......
......@@ -15,8 +15,7 @@ const char DM_URI_THING_SERVICE_RESPONSE[] DM_READ_ONLY = "thing/service/%.*
const char DM_URI_THING_EVENT_PROPERTY_POST_METHOD[] DM_READ_ONLY = "thing.event.property.post";
const char DM_MSG_REQUEST[] DM_READ_ONLY = "{\"id\":\"%d\",\"version\":\"%s\",\"params\":%.*s,\"method\":\"%s\"}";
const char DM_MSG_REQUEST[] DM_READ_ONLY = "{\"msgId\":\"%d\",\"version\":\"%s\",\"params\":%.*s,\"method\":\"%s\"}";
void kk_sendData2app(void *uri, void *payload){
cJSON *root=cJSON_CreateObject();
......@@ -184,6 +183,96 @@ int dm_msg_thing_topo_add(_IN_ char product_key[PRODUCT_KEY_MAXLEN],
return SUCCESS_RETURN;
}
const char DM_MSG_THING_TOPO_DELETE_METHOD[] DM_READ_ONLY = "thing.topo.delete";
const char DM_MSG_THING_TOPO_DELETE_PARAMS[] DM_READ_ONLY = "[{\"productKey\":\"%s\",\"deviceName\":\"%s\"}]";
int dm_msg_thing_topo_delete(_IN_ char product_key[PRODUCT_KEY_MAXLEN],
_IN_ char device_name[DEVICE_NAME_MAXLEN],
_OU_ dm_msg_request_t *request)
{
char *params = NULL;
int params_len = 0;
if (request == NULL || product_key == NULL ||
device_name == NULL ||
(strlen(product_key) >= PRODUCT_KEY_MAXLEN) ||
(strlen(device_name) >= DEVICE_NAME_MAXLEN) ||
(strlen(request->product_key) >= PRODUCT_KEY_MAXLEN) ||
(strlen(request->device_name) >= DEVICE_NAME_MAXLEN)) {
return INVALID_PARAMETER;
}
/* Params */
request->method = (char *)DM_MSG_THING_TOPO_DELETE_METHOD;
params_len = strlen(DM_MSG_THING_TOPO_DELETE_PARAMS) + strlen(product_key) + strlen(device_name) + 1;
params = malloc(params_len);
if (params == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(params, 0, params_len);
HAL_Snprintf(params, params_len, DM_MSG_THING_TOPO_DELETE_PARAMS, product_key, device_name);
request->params = params;
request->params_len = strlen(request->params);
return SUCCESS_RETURN;
}
const char DM_MSG_THING_TOPO_GET_METHOD[] DM_READ_ONLY = "thing.topo.get";
const char DM_MSG_THING_TOPO_GET_PARAMS[] DM_READ_ONLY = "{}";
int dm_msg_thing_topo_get(_OU_ dm_msg_request_t *request)
{
char *params = NULL;
int params_len = 0;
/* Params */
request->method = (char *)DM_MSG_THING_TOPO_GET_METHOD;
params_len = strlen(DM_MSG_THING_TOPO_GET_PARAMS) + 1;
params = malloc(params_len);
if (params == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(params, 0, params_len);
memcpy(params, DM_MSG_THING_TOPO_GET_PARAMS, strlen(DM_MSG_THING_TOPO_GET_PARAMS));
request->params = params;
request->params_len = strlen(request->params);
return SUCCESS_RETURN;
}
const char DM_MSG_THING_LIST_FOUND_METHOD[] DM_READ_ONLY = "thing.list.found";
const char DM_MSG_THING_LIST_FOUND_PARAMS[] DM_READ_ONLY = "[{\"productKey\":\"%s\",\"deviceName\":\"%s\"}]";
int dm_msg_thing_list_found(_IN_ char product_key[PRODUCT_KEY_MAXLEN],
_IN_ char device_name[DEVICE_NAME_MAXLEN],
_OU_ dm_msg_request_t *request)
{
char *params = NULL;
int params_len = 0;
if (product_key == NULL || device_name == NULL ||
(strlen(product_key) >= PRODUCT_KEY_MAXLEN) ||
(strlen(device_name) >= DEVICE_NAME_MAXLEN) ||
request == NULL) {
return INVALID_PARAMETER;
}
/* Params */
request->method = (char *)DM_MSG_THING_LIST_FOUND_METHOD;
params_len = strlen(DM_MSG_THING_LIST_FOUND_PARAMS) + strlen(product_key) + strlen(device_name) + 1;
params = malloc(params_len);
if (params == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(params, 0, params_len);
HAL_Snprintf(params, params_len, DM_MSG_THING_LIST_FOUND_PARAMS, product_key, device_name);
request->params = params;
request->params_len = strlen(request->params);
return SUCCESS_RETURN;
}
const char DM_MSG_COMBINE_LOGIN_SIGN_SOURCE[] DM_READ_ONLY = "clientId%sdeviceName%sproductKey%stimestamp%s";
const char DM_MSG_COMBINE_LOGIN_METHOD[] DM_READ_ONLY = "combine.login";
const char DM_MSG_COMBINE_LOGIN_PARAMS[] DM_READ_ONLY =
......@@ -303,41 +392,6 @@ int dm_msg_combine_logout(_IN_ char product_key[PRODUCT_KEY_MAXLEN],
}
const char DM_MSG_THING_TOPO_DELETE_METHOD[] DM_READ_ONLY = "thing.topo.delete";
const char DM_MSG_THING_TOPO_DELETE_PARAMS[] DM_READ_ONLY = "[{\"productKey\":\"%s\",\"deviceName\":\"%s\"}]";
int dm_msg_thing_topo_delete(_IN_ char product_key[PRODUCT_KEY_MAXLEN],
_IN_ char device_name[DEVICE_NAME_MAXLEN],
_OU_ dm_msg_request_t *request)
{
char *params = NULL;
int params_len = 0;
if (request == NULL || product_key == NULL ||
device_name == NULL ||
(strlen(product_key) >= PRODUCT_KEY_MAXLEN) ||
(strlen(device_name) >= DEVICE_NAME_MAXLEN) ||
(strlen(request->product_key) >= PRODUCT_KEY_MAXLEN) ||
(strlen(request->device_name) >= DEVICE_NAME_MAXLEN)) {
return INVALID_PARAMETER;
}
/* Params */
request->method = (char *)DM_MSG_THING_TOPO_DELETE_METHOD;
params_len = strlen(DM_MSG_THING_TOPO_DELETE_PARAMS) + strlen(product_key) + strlen(device_name) + 1;
params = malloc(params_len);
if (params == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(params, 0, params_len);
HAL_Snprintf(params, params_len, DM_MSG_THING_TOPO_DELETE_PARAMS, product_key, device_name);
request->params = params;
request->params_len = strlen(request->params);
return SUCCESS_RETURN;
}
int dm_msg_request (_IN_ dm_msg_request_t *request)
{
......@@ -388,7 +442,7 @@ int dm_msg_request (_IN_ dm_msg_request_t *request)
}
const char DM_MSG_RESPONSE_WITH_DATA[] DM_READ_ONLY = "{\"id\":\"%.*s\",\"code\":%d,\"data\":%.*s}";
const char DM_MSG_RESPONSE_WITH_DATA[] DM_READ_ONLY = "{\"msgId\":\"%.*s\",\"code\":%d,\"data\":%.*s}";
int dm_msg_response(_IN_ kk_msg_request_payload_t *request, _IN_ kk_msg_response_t *response,
_IN_ char *data, _IN_ int data_len, _IN_ void *user_data)
{
......@@ -469,4 +523,74 @@ int dm_msg_response_parse(_IN_ char *payload, _IN_ int payload_len, _OU_ dm_msg_
return SUCCESS_RETURN;
}
static int dm_msg_request_parse(_IN_ char *payload, _IN_ int payload_len, _OU_ kk_msg_request_payload_t *request)
{
lite_cjson_t lite;
if (payload == NULL || payload_len <= 0 || request == NULL) {
return INVALID_PARAMETER;
}
if (lite_cjson_parse(payload, payload_len, &lite) != SUCCESS_RETURN ||
lite_cjson_object_item(&lite, KK_MSG_KEY_ID, strlen(KK_MSG_KEY_ID), &request->id) != SUCCESS_RETURN ||
lite_cjson_object_item(&lite, KK_MSG_KEY_VERSION, strlen(KK_MSG_KEY_VERSION),
&request->version) != SUCCESS_RETURN ||
lite_cjson_object_item(&lite, KK_MSG_KEY_METHOD, strlen(KK_MSG_KEY_METHOD),
&request->method) != SUCCESS_RETURN ||
lite_cjson_object_item(&lite, KK_MSG_KEY_PARAMS, strlen(KK_MSG_KEY_PARAMS),
&request->params) != SUCCESS_RETURN) {
return FAIL_RETURN;
}
printf("Current Request Message ID: %.*s", request->id.value_length, request->id.value);
printf("Current Request Message Version: %.*s", request->version.value_length, request->version.value);
printf("Current Request Message Method: %.*s", request->method.value_length, request->method.value);
printf("Current Request Message Params: %.*s", request->params.value_length, request->params.value);
return SUCCESS_RETURN;
}
int dm_msg_thing_property_set_reply(const char *topic, const char *payload, unsigned int payload_len,
void *context){
kk_msg_request_payload_t request;
kk_msg_response_t response;
int res = 0, devid = 0;
char product_key[PRODUCT_KEY_MAXLEN] = {0};
char device_name[DEVICE_NAME_MAXLEN] = {0};
memset(&request, 0, sizeof(kk_msg_request_payload_t));
memset(&response, 0, sizeof(kk_msg_response_t));
/**************to do*******************/
//dm_log_info(DM_URI_THING_SERVICE_PROPERTY_SET);
/* Request */
/* Request */
res =kk_msg_uri_parse_pkdn((char *)topic, strlen(topic), 2 + KK_URI_OFFSET, 4 + KK_URI_OFFSET, product_key,
device_name);
res = dm_mgr_search_device_by_pkdn(product_key, device_name, &devid);
if (res < SUCCESS_RETURN) {
return res;
}
res = dm_msg_request_parse((char *)payload, payload_len, &request);
if (res < SUCCESS_RETURN) {
return res ;
}
/* Response */
response.service_prefix = DM_URI_SYS_PREFIX;
response.service_name = DM_URI_THING_SERVICE_PROPERTY_SET_REPLY;
memcpy(response.product_key, product_key, strlen(product_key));
memcpy(response.device_name, device_name, strlen(device_name));
response.code = (res == SUCCESS_RETURN) ? (IOTX_DM_ERR_CODE_SUCCESS) : (IOTX_DM_ERR_CODE_REQUEST_ERROR);
dm_msg_response(&request, &response, "{}", strlen("{}"), NULL);
}
#ifndef __KK_DM_MSG__
#define __KK_DM_MSG__
#include "kk_tsl_common.h"
#include "../tsl_handle/lite-cjson.h"
......@@ -26,53 +27,6 @@
#define DM_MSG_SIGN_METHOD_HMACSHA256 "hmacSha256"
/*typedef enum {
IOTX_DM_EVENT_CLOUD_CONNECTED = 0,
IOTX_DM_EVENT_CLOUD_DISCONNECT,
IOTX_DM_EVENT_CLOUD_RECONNECT,
IOTX_DM_EVENT_LOCAL_CONNECTED,
IOTX_DM_EVENT_LOCAL_DISCONNECT,
IOTX_DM_EVENT_LOCAL_RECONNECT,
IOTX_DM_EVENT_FOUND_DEVICE,
IOTX_DM_EVENT_REMOVE_DEVICE,
IOTX_DM_EVENT_REGISTER_RESULT,
IOTX_DM_EVENT_UNREGISTER_RESULT,
IOTX_DM_EVENT_INITIALIZED,
IOTX_DM_EVENT_SEND_RESULT,
IOTX_DM_EVENT_ADD_SERVICE_RESULT,
IOTX_DM_EVENT_REMOVE_SERVICE_RESULT,
IOTX_DM_EVENT_NEW_DATA_RECEIVED,
IOTX_DM_EVENT_PROPERTY_SET,
IOTX_DM_EVENT_PROPERTY_GET,
IOTX_DM_EVENT_TOPO_ADD_NOTIFY,
IOTX_DM_EVENT_THING_SERVICE_REQUEST,
IOTX_DM_EVENT_THING_DISABLE,
IOTX_DM_EVENT_THING_ENABLE,
IOTX_DM_EVENT_THING_DELETE,
IOTX_DM_EVENT_MODEL_DOWN_RAW,
IOTX_DM_EVENT_GATEWAY_PERMIT,
IOTX_DM_EVENT_SUBDEV_REGISTER_REPLY,
IOTX_DM_EVENT_SUBDEV_UNREGISTER_REPLY,
IOTX_DM_EVENT_TOPO_ADD_REPLY,
IOTX_DM_EVENT_TOPO_DELETE_REPLY,
IOTX_DM_EVENT_TOPO_GET_REPLY,
IOTX_DM_EVENT_TOPO_ADD_NOTIFY_REPLY,
IOTX_DM_EVENT_EVENT_PROPERTY_POST_REPLY,
IOTX_DM_EVENT_EVENT_SPECIFIC_POST_REPLY,
IOTX_DM_EVENT_DEVICEINFO_UPDATE_REPLY,
IOTX_DM_EVENT_DEVICEINFO_DELETE_REPLY,
IOTX_DM_EVENT_DSLTEMPLATE_GET_REPLY,
IOTX_DM_EVENT_COMBINE_LOGIN_REPLY,
IOTX_DM_EVENT_COMBINE_LOGOUT_REPLY,
IOTX_DM_EVENT_MODEL_UP_RAW_REPLY,
IOTX_DM_EVENT_LEGACY_THING_CREATED,
IOTX_DM_EVENT_COTA_NEW_CONFIG,
IOTX_DM_EVENT_FOTA_NEW_FIRMWARE,
IOTX_DM_EVENT_NTP_RESPONSE,
IOTX_DM_EVENT_RRPC_REQUEST,
IOTX_DM_EVENT_MAX
} iotx_dm_event_types_t;*/
typedef struct {
lite_cjson_t id;
lite_cjson_t code;
......@@ -92,6 +46,7 @@ const char DM_URI_THING_SERVICE_PROPERTY_SET_REPLY[] DM_READ_ONLY;
const char DM_URI_THING_EVENT_POST[] DM_READ_ONLY;
const char DM_URI_THING_SERVICE_RESPONSE[] DM_READ_ONLY;
const char DM_URI_THING_EVENT_PROPERTY_POST_METHOD[] DM_READ_ONLY;
//const char DM_URI_SYS_PREFIX[] DM_READ_ONLY = "/sys/%s/%s/";
#endif
......@@ -23,6 +23,15 @@ static void _dm_queue_lock(void)
}
}
static void _dm_queue_lock2(void)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
if (ctx->mutex2) {
HAL_MutexLock(ctx->mutex2);
}
}
static void _dm_queue_unlock(void)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
......@@ -30,6 +39,14 @@ static void _dm_queue_unlock(void)
HAL_MutexUnlock(ctx->mutex);
}
}
static void _dm_queue_unlock2(void)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
if (ctx->mutex2) {
HAL_MutexUnlock(ctx->mutex2);
}
}
int dm_queue_init(int max_size)
{
......@@ -43,9 +60,17 @@ int dm_queue_init(int max_size)
return INVALID_PARAMETER;
}
/* Create Mutex */
ctx->mutex2 = HAL_MutexCreate();
if (ctx->mutex2 == NULL) {
return INVALID_PARAMETER;
}
/* Init List */
ctx->msg_list.max_size = max_size;
INIT_LIST_HEAD(&ctx->msg_list.message_list);
ctx->msg_list2.max_size = max_size;
INIT_LIST_HEAD(&ctx->msg_list2.message_list);
return SUCCESS_RETURN;
}
......@@ -61,6 +86,10 @@ void dm_queue_deinit(void)
HAL_MutexDestroy(ctx->mutex);
}
if (ctx->mutex2) {
HAL_MutexDestroy(ctx->mutex2);
}
list_for_each_entry_safe(del_node, next_node, &ctx->msg_list.message_list, linked_list, dm_queue_msg_node_t) {
/* Free Message */
del_msg = (dm_queue_msg_t *)del_node->data;
......@@ -74,6 +103,25 @@ void dm_queue_deinit(void)
list_del(&del_node->linked_list);
free(del_node);
}
del_node = NULL;
next_node = NULL;
del_msg = NULL;
list_for_each_entry_safe(del_node, next_node, &ctx->msg_list2.message_list, linked_list, dm_queue_msg_node_t) {
/* Free Message */
del_msg = (dm_queue_msg_t *)del_node->data;
if (del_msg->data) {
free(del_msg->data);
}
free(del_msg);
del_msg = NULL;
/* Free Node */
list_del(&del_node->linked_list);
free(del_node);
}
}
int dm_queue_msg_insert(void *data)
......@@ -136,3 +184,64 @@ int dm_queue_msg_next(void **data)
return SUCCESS_RETURN;
}
int dm_queue_msg_insert2(void *data)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
dm_queue_msg_node_t *node = NULL;
if (data == NULL) {
return INVALID_PARAMETER;
}
_dm_queue_lock2();
printf("dm msg list size: %d, max size: %d", ctx->msg_list2.size, ctx->msg_list2.max_size);
if (ctx->msg_list2.size >= ctx->msg_list2.max_size) {
printf("dm queue list full");
_dm_queue_unlock2();
return FAIL_RETURN;
}
node = malloc(sizeof(dm_queue_msg_node_t));
if (node == NULL) {
_dm_queue_unlock2();
return MEMORY_NOT_ENOUGH;
}
memset(node, 0, sizeof(dm_queue_msg_node_t));
node->data = data;
INIT_LIST_HEAD(&node->linked_list);
ctx->msg_list2.size++;
list_add_tail(&node->linked_list, &ctx->msg_list2.message_list);
_dm_queue_unlock2();
return SUCCESS_RETURN;
}
int dm_queue_msg_next2(void **data)
{
dm_queue_t *ctx = _dm_queue_get_ctx();
dm_queue_msg_node_t *node = NULL;
if (data == NULL || *data != NULL) {
return INVALID_PARAMETER;
}
_dm_queue_lock2();
if (list_empty(&ctx->msg_list2.message_list)) {
_dm_queue_unlock2();
return FAIL_RETURN;
}
node = list_first_entry(&ctx->msg_list2.message_list, dm_queue_msg_node_t, linked_list);
list_del(&node->linked_list);
ctx->msg_list2.size--;
*data = node->data;
free(node);
_dm_queue_unlock2();
return SUCCESS_RETURN;
}
......@@ -28,7 +28,9 @@ typedef struct {
typedef struct {
void *mutex;
void *mutex2;
dm_queue_msg_list_t msg_list;
dm_queue_msg_list_t msg_list2;
} dm_queue_t;
int dm_queue_init(int max_size);
......
......@@ -238,15 +238,11 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
topic = cJSON_GetObjectItem(json, "topic");
payload = cJSON_GetObjectItem(json, "payload");
printf("_iotx_linkkit_event_callback topic: [%s] ,payload= %s \n",topic->valuestring,payload->valuestring );
if (strcmp(payload->valuestring, "addsub")==0){
kk_mid_subdev_add("a1OYuSallan","allanWno8yDdsjCX15iq","");
}else{
printf("rrr topic: [%s] ,payload= %s \n",topic->valuestring,payload->valuestring );
if (strpbrk(payload->valuestring, "register_reply") != NULL){
printf("topic: [%s] ,payload= %s \n",topic->valuestring,payload->valuestring );
if (strstr(topic->valuestring, "register_reply") != NULL){
//====todo======
//get devicececret and save it
printf(" topic:register_reply \n");
dm_msg_response_payload_t response;
res = dm_msg_response_parse((char *)payload->valuestring, strlen(payload->valuestring)+1, &response);
if (res != SUCCESS_RETURN) {
......@@ -257,9 +253,10 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
_iotx_linkkit_upstream_callback_remove(atoi(response.id.value), response.code.value_int);
_iotx_linkkit_upstream_mutex_unlock();
}else if (strpbrk(topic, "add_reply") != NULL){
}else if (strstr(topic->valuestring, "add_reply") != NULL){
//====todo======
//
printf(" topic:add_reply \n");
dm_msg_response_payload_t response;
res = dm_msg_response_parse((char *)payload->valuestring, strlen(payload->valuestring)+1, &response);
if (res != SUCCESS_RETURN) {
......@@ -270,9 +267,10 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
_iotx_linkkit_upstream_callback_remove(atoi(response.id.value), response.code.value_int);
_iotx_linkkit_upstream_mutex_unlock();
}else if (strpbrk(topic, "login_reply") != NULL){
}else if (strstr(topic->valuestring, "login_reply") != NULL){
//====todo======
//
printf(" topic:login_reply \n");
dm_msg_response_payload_t response;
res = dm_msg_response_parse((char *)payload->valuestring, strlen(payload->valuestring)+1, &response);
if (res != SUCCESS_RETURN) {
......@@ -282,13 +280,17 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
_iotx_linkkit_upstream_mutex_lock();
_iotx_linkkit_upstream_callback_remove(atoi(response.id.value), response.code.value_int);
_iotx_linkkit_upstream_mutex_unlock();
}else if (strstr(topic->valuestring, "thing/service/property/set") != NULL){
printf("property set reply \n");
dm_msg_thing_property_set_reply(topic->valuestring, payload->valuestring, strlen(payload->valuestring), NULL);
//kk_tsl_service_property_set(topic->valuestring, payload->valuestring, strlen(payload->valuestring), NULL);
}else{
printf("Error 222222222222222 \n");
//kk_tsl_service_property_set(topic->valuestring, payload->valuestring, strlen(payload->valuestring), NULL);
}
}
cJSON_Delete(json);
}
#if 0
int res = 0;
......@@ -1442,20 +1444,13 @@ static int _iotx_linkkit_subdev_login(int devid)
}
_iotx_linkkit_upstream_mutex_unlock();
//send app to subscribe mqtt
const char subscribe_cmd[] =
"{\"cmd\":\"subscribe\",\"productKey\":\"%s\",\"deviceName\":\"%s\",\"clientId\":\"%s\",\"timestamp\":\"%s\",\"signMethod\":\"%s\",\"sign\":\"%s\",\"cleanSession\":\"%s\"}";
kk_ipc_send(IPC_MID2APP, subscribe_cmd, strlen(subscribe_cmd) + 1);
printf("\n [%d][%s] [%d] allan kk_ipc_send \n", __LINE__, __FUNCTION__, HAL_UptimeMs());
/*res = iotx_dm_subscribe(devid);
res = iotx_dm_subscribe(devid);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
iotx_dm_send_aos_active(devid);
/*iotx_dm_send_aos_active(devid);
callback = iotx_event_callback(ITE_INITIALIZE_COMPLETED);
if (callback) {
((int (*)(const int))callback)(devid);
......@@ -1745,10 +1740,10 @@ int iot_linkkit_subdev_query_id(char product_key[IOTX_PRODUCT_KEY_LEN + 1], char
#endif /* #ifdef DEVICE_MODEL_GATEWAY */
int kk_mid_subdev_add(char product_key[PRODUCT_KEY_MAXLEN], char device_name[DEVICE_NAME_MAXLEN], char device_secret[DEVICE_SECRET_MAXLEN]){
int kk_mid_subdev_add(char product_key[PRODUCT_KEY_MAXLEN], char device_name[DEVICE_NAME_MAXLEN], char device_secret[DEVICE_SECRET_MAXLEN],char device_mac[DEVICE_MAC_MAXLEN]){
int res = 0;
int devid = 0;
res = dm_mgr_subdev_create(product_key,device_name,device_secret,&devid);
res = dm_mgr_subdev_create(product_key,device_name,device_secret,device_mac,&devid);
if (res != SUCCESS_RETURN) {
printf("subdev create Failed\n");
return FAIL_RETURN;
......
#include <stdio.h>
#include "kk_tsl_api.h"
#include "kk_wlist_mng.h"
#include "sqlite3.h"
#define KK_TSL_GATAWAY_ADDWHITELIST_IDENTIFIER "addWhiteList"
#define KK_TSL_GATAWAY_WHITELISTDEVICE_IDENTIFIER "Devices"
#define KK_TSL_GATAWAY_WHITELISTMAC_IDENTIFIER "getWhiteListNotification.Devices[%d].MACAddress"
#define KK_TSL_GATAWAY_WHITELISTPRODUCTID_IDENTIFIER "getWhiteListNotification.Devices[%d].ProductId"
#define KK_TSL_GATAWAY_WHITELISTSN_IDENTIFIER "getWhiteListNotification.Devices[%d].SN"
#define KK_TSL_GATAWAY_WHITELISTDEVICEID_IDENTIFIER "getWhiteListNotification.Devices[%d].deviceId"
#define KK_WLIST_DB_FILE "wlist.db"
typedef struct {
void *mutex;
int isOpened;
int wlistNum;
sqlite3 *pDb;
} kk_wlist_ctx_t;
static kk_wlist_ctx_t s_kk_wlist_ctx = {NULL,0,0,NULL};
static kk_wlist_ctx_t *_kk_wlist_get_ctx(void)
{
return &s_kk_wlist_ctx;
}
static void _kk_wlist_lock(void)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
if (ctx->mutex) {
HAL_MutexLock(ctx->mutex);
}
}
static void _kk_wlist_unlock(void)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
if (ctx->mutex) {
HAL_MutexUnlock(ctx->mutex);
}
}
static int kk_wlist_db_Init(void)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
//eUtils_LockLock(&sLock);
_kk_wlist_lock();
if (sqlite3_open_v2(KK_WLIST_DB_FILE, &ctx->pDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL) != SQLITE_OK)
{
printf("Error initialising linkage database (%s)", sqlite3_errmsg(ctx->pDb));
_kk_wlist_unlock();
return FAIL_RETURN;
}
printf("wlist Database opened\n");
{
const char *pwListTable = "CREATE TABLE IF NOT EXISTS WhiteList(idx INTEGER, deviceMac varchar(17),productId varchar(33), deviceSN varchar(33), deviceId varchar(33))";
char *pcErr;
// DBG_vPrintf(DBG_SQL, "Execute SQL: '%s'\n", pConditionTableDef);
if (sqlite3_exec(ctx->pDb, pwListTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
printf("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_wlist_unlock();
return FAIL_RETURN;
}
}
printf("linkag Database initialised\n");
//eUtils_LockUnlock(&sLock);
_kk_wlist_unlock();
return SUCCESS_RETURN;
}
static int _kk_check_exist(const char* device_mac)
{
int isExist = 0;
sqlite3_stmt *stmt;
char *pmac = NULL;
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
const char *searchCmd = "select * from WhiteList;";
sqlite3_prepare_v2(ctx->pDb, searchCmd, strlen(searchCmd), &stmt, NULL);
printf("total_column = %d\n", sqlite3_column_count(stmt));
while(sqlite3_step(stmt) == SQLITE_ROW){
pmac = sqlite3_column_text(stmt, 1);
if(!strcmp(device_mac,pmac))
{
isExist = 1;
break;
}
}
printf("\n");
sqlite3_finalize(stmt);
return isExist;
}
static int kk_wlist_insert_db(int index,char device_mac[DEVICE_MAC_MAXLEN],char product_Id[PRODUCT_KEY_MAXLEN], \
char device_SN[DEVICE_SN_MAXLEN],char device_Id[DEVICE_NAME_MAXLEN])
{
const char *insertCmd = "insert into WhiteList (idx, deviceMac, productId,deviceSN,deviceId) values ('%d', '%s', '%s','%s','%s');";
char *sqlCmd = NULL;
int len =0;
int rc = 0;
char *zErrMsg = 0;
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
_kk_wlist_lock();
len = strlen(insertCmd)+DEVICE_MAC_MAXLEN+DEVICE_SN_MAXLEN+PRODUCT_KEY_MAXLEN+DEVICE_NAME_MAXLEN;
sqlCmd = (char*)malloc(len);
if(sqlCmd == NULL)
{
_kk_wlist_unlock();
return MEMORY_NOT_ENOUGH;
}
memset(sqlCmd,0x0,len);
sprintf(sqlCmd, insertCmd, index,device_mac,product_Id,device_SN,device_Id);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
printf("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
printf("Table insert data successfully\n");
}
free(sqlCmd);
sqlCmd = NULL;
_kk_wlist_unlock();
return SUCCESS_RETURN;
}
static int _kk_wlist_delete_db_byMac(char device_mac[DEVICE_MAC_MAXLEN])
{
const char *deleteCmd = "delete from WhiteList where deviceMac = %s;";
char *sqlCmd = NULL;
int len =0;
int rc = 0;
char *zErrMsg = 0;
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
_kk_wlist_lock();
len = strlen(deleteCmd)+DEVICE_MAC_MAXLEN;
sqlCmd = (char*)malloc(len);
if(sqlCmd == NULL)
{
_kk_wlist_unlock();
return MEMORY_NOT_ENOUGH;
}
memset(sqlCmd,0x0,len);
sprintf(sqlCmd, deleteCmd,device_mac);
printf("Table delete data sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
printf("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
printf("Table delete data successfully\n");
}
free(sqlCmd);
sqlCmd = NULL;
_kk_wlist_unlock();
return SUCCESS_RETURN;
}
int kk_wlist_status_open(int isOpen)
{
int res = 0;
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
res = kk_tsl_set_value(kk_tsl_set_property_value,0,KK_TSL_GATAWAY_WHITELIST_IDENTIFIER,&isOpen,NULL);
if(res != SUCCESS_RETURN){
printf("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
return FAIL_RETURN;
}
ctx->isOpened = 1;
return SUCCESS_RETURN;
}
int kk_load_wlist(void)
{
const char *searchCmd = "select * from WhiteList;";
sqlite3_stmt *stmt;
char *pmac = NULL,*pPID = NULL,*pSN = NULL,pDID = NULL;
kk_wlist_dev_t wlist = {0};
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
if(ctx->isOpened != 1){
return FAIL_RETURN;
}
sqlite3_prepare_v2(ctx->pDb, searchCmd, strlen(searchCmd), &stmt, NULL);
printf("kk_load_wlist total_column = %d\n", sqlite3_column_count(stmt));
while(sqlite3_step(stmt) == SQLITE_ROW){
memset(&wlist,0x0,sizeof(kk_wlist_dev_t));
strcpy(wlist.device_mac,sqlite3_column_text(stmt, 1));
strcpy(wlist.product_id,sqlite3_column_text(stmt, 2));
strcpy(wlist.device_sn,sqlite3_column_text(stmt, 3));
strcpy(wlist.device_id,sqlite3_column_text(stmt, 4));
// kk_add_wlist(&wlist);
kk_set_wlist_byIdx(ctx->wlistNum,&wlist);
ctx->wlistNum++;
}
sqlite3_finalize(stmt);
return SUCCESS_RETURN;
}
int kk_wlist_init(void)
{
int res = 0;
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
/* Create Mutex */
ctx->mutex = HAL_MutexCreate();
if (ctx->mutex == NULL) {
return FAIL_RETURN;
}
res = kk_wlist_db_Init();
if(res != SUCCESS_RETURN){
printf("[%s][%d]kk_wlist_db_Init FAIL!!!\n",__FUNCTION__,__LINE__);
}
kk_load_wlist();
return SUCCESS_RETURN;
}
int kk_set_wlist_byIdx(int idx,kk_wlist_dev_t * wlist_dev)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
int res = 0;
char identifier_name[64] = {0};
if(wlist_dev == NULL)
{
printf("[%s][%d] wlist_dev == NULL!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
_kk_wlist_lock();
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTMAC_IDENTIFIER,idx);
res = kk_tsl_set_value(kk_tsl_set_event_output_value,0,identifier_name,NULL,wlist_dev->device_mac);
if(res != SUCCESS_RETURN){
goto fail_return;
}
memset(identifier_name,0x0,sizeof(identifier_name));
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTPRODUCTID_IDENTIFIER,idx);
res = kk_tsl_set_value(kk_tsl_set_event_output_value,0,identifier_name,NULL,wlist_dev->product_id);
if(res != SUCCESS_RETURN){
goto fail_return;
}
memset(identifier_name,0x0,sizeof(identifier_name));
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTSN_IDENTIFIER,idx);
res = kk_tsl_set_value(kk_tsl_set_event_output_value,0,identifier_name,NULL,wlist_dev->device_sn);
if(res != SUCCESS_RETURN){
goto fail_return;
}
memset(identifier_name,0x0,sizeof(identifier_name));
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTDEVICEID_IDENTIFIER,idx);
res = kk_tsl_set_value(kk_tsl_set_event_output_value,0,identifier_name,NULL,wlist_dev->device_id);
if(res != SUCCESS_RETURN){
goto fail_return;
}
_kk_wlist_unlock();
return SUCCESS_RETURN;
fail_return:
_kk_wlist_unlock();
printf("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
return FAIL_RETURN;
}
int kk_add_wlist(kk_wlist_dev_t *wlist_dev)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
int res = 0;
if(ctx->isOpened != 1){
printf("[%s][%d] PLEASE OPNE THE WHITELIST FUNCTION FIRST!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
if(ctx->wlistNum >= 512){
printf("[%s][%d] WHITELIST FULL!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
if(wlist_dev == NULL){
printf("[%s][%d] wlist_dev == NULL!!!\n",__FUNCTION__,__LINE__);
return INVALID_PARAMETER;
}
if(_kk_check_exist(wlist_dev->device_mac) == 1)
{
printf("[%s][%d] DATA ALREADY EXIST!!!\n",__FUNCTION__,__LINE__);
return SUCCESS_RETURN;
}
res = kk_wlist_insert_db(ctx->wlistNum,wlist_dev->device_mac,wlist_dev->product_id,wlist_dev->device_sn,wlist_dev->device_id);
res |= kk_set_wlist_byIdx(ctx->wlistNum,wlist_dev);
ctx->wlistNum++;
return res;
}
int kk_get_wlist_num(void)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
if(ctx->isOpened != 1)
{
printf("[%s][%d] PLEASE OPNE THE WHITELIST FUNCTION FIRST!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
return ctx->wlistNum;
}
int kk_getwlist_ByIdx(int idx,kk_wlist_dev_t* wlist_dev)
{
char *macs = NULL;
char *PID = NULL;
char *DID = NULL;
char *SN = NULL;
char identifier_name[64] = {0};
int res = 0;
_kk_wlist_lock();
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTMAC_IDENTIFIER,idx);
res = kk_tsl_get_value(kk_tsl_get_event_output_value,0,identifier_name,NULL,&macs);
if(res != SUCCESS_RETURN){
goto fail_return;
}
strcpy(wlist_dev->device_mac,macs);
memset(identifier_name,0x0,sizeof(identifier_name));
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTPRODUCTID_IDENTIFIER,idx);
res = kk_tsl_get_value(kk_tsl_get_event_output_value,0,identifier_name,NULL,&PID);
if(res != SUCCESS_RETURN){
goto fail_return;
}
strcpy(wlist_dev->product_id,PID);
memset(identifier_name,0x0,sizeof(identifier_name));
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTSN_IDENTIFIER,idx);
res = kk_tsl_get_value(kk_tsl_get_event_output_value,0,identifier_name,NULL,&SN);
if(res != SUCCESS_RETURN){
goto fail_return;
}
strcpy(wlist_dev->device_sn,SN);
memset(identifier_name,0x0,sizeof(identifier_name));
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTDEVICEID_IDENTIFIER,idx);
res = kk_tsl_get_value(kk_tsl_get_event_output_value,0,identifier_name,NULL,&DID);
if(res != SUCCESS_RETURN){
goto fail_return;
}
strcpy(wlist_dev->device_id,DID);
_kk_wlist_unlock();
return SUCCESS_RETURN;
fail_return:
_kk_wlist_unlock();
printf("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
return FAIL_RETURN;
}
int kk_get_wlistIdx_byMac(const char* device_mac)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
int res = 0;
char *pmac = NULL;
char identifier_name[64] = {0};
int idx = 0,findIdx = 0;
if(ctx->isOpened != 1)
{
printf("[%s][%d] PLEASE OPNE THE WHITELIST FUNCTION FIRST!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
if(idx >= 512)
{
printf("[%s][%d]Invalid idx!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
_kk_wlist_lock();
for(idx = 0; idx < ctx->wlistNum;idx++)
{
memset(identifier_name,0x0,sizeof(identifier_name));
sprintf(identifier_name,KK_TSL_GATAWAY_WHITELISTMAC_IDENTIFIER,idx);
res = kk_tsl_get_value(kk_tsl_get_event_output_value,0,identifier_name,NULL,&pmac);
if(res != SUCCESS_RETURN){
continue;
}
if(!strcmp(device_mac,pmac))
{
findIdx = idx;
printf("[%s][%d]find the delete index\n",__FUNCTION__,__LINE__);
_kk_wlist_unlock();
return findIdx;
}
}
if(idx == ctx->wlistNum)
{
_kk_wlist_unlock();
return TSL_EVENT_NOT_EXIST;
}
_kk_wlist_unlock();
return FAIL_RETURN;
}
static int _kk_delete_wlist_byIdx(int idx)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
int res = 0;
kk_wlist_dev_t dWlist = {0};
if(idx >= 512)
{
printf("[%s][%d]Invalid idx!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
strcpy(dWlist.product_id,"");
strcpy(dWlist.device_mac,"");
strcpy(dWlist.device_sn,"");
strcpy(dWlist.device_id,"");
res = kk_set_wlist_byIdx(idx,&dWlist);
return res;
}
int kk_delete_wlist_byMac(const char* device_mac)
{
kk_wlist_ctx_t *ctx = _kk_wlist_get_ctx();
char identifier_name[64] = {0};
int res;
int idx = 0;
char *pmac = NULL;
int findIdx = 0;
if(ctx->isOpened != 1)
{
printf("[%s][%d] PLEASE OPNE THE WHITELIST FUNCTION FIRST!!!\n",__FUNCTION__,__LINE__);
return FAIL_RETURN;
}
findIdx = kk_get_wlistIdx_byMac(device_mac);
if(findIdx < 0)
{
return FAIL_RETURN;
}
res = _kk_delete_wlist_byIdx(findIdx);
res |= _kk_wlist_delete_db_byMac(device_mac);
if(res != SUCCESS_RETURN)
{
return FAIL_RETURN;
}
ctx->wlistNum--;
return SUCCESS_RETURN;
}
#ifndef __KK_WHITELIST_MNG_H__
#define __KK_WHITELIST_MNG_H__
#include "kk_tsl_common.h"
typedef struct {
char device_mac[DEVICE_MAC_MAXLEN];
char product_id[PRODUCT_KEY_MAXLEN];
char device_sn[DEVICE_SN_MAXLEN];
char device_id[DEVICE_NAME_MAXLEN];
int index;
} kk_wlist_dev_t;
int kk_wlist_init(void);
int kk_wlist_status_open(int isOpen);
int kk_add_wlist(kk_wlist_dev_t *wlist_dev);
int kk_get_wlist_num(void);
int kk_delete_wlist_byMac(const char* device_mac);
#endif
\ No newline at end of file
......@@ -7,6 +7,7 @@ $(call Append_Conditional, TARGET, midware)
CFLAGS += -I$(TOP_DIR)/common/nanomsg/include
CFLAGS += -I$(TOP_DIR)/common/ev/include
CFLAGS += -I$(TOP_DIR)/common/api
CFLAGS += -I$(TOP_DIR)/common/sqlite
CFLAGS += -I$(TOP_DIR)/src/tsl/tsl_handle
LDFLAGS += -lapi_com -liot_cjson -lkk_tsl
LDFLAGS += -lsqlite -ldl -lm
......
......@@ -14,6 +14,7 @@
#include "cJSON.h"
#include "kk_product.h"
#include "kk_tsl_common.h"
#include "kk_dm_api.h"
......@@ -21,6 +22,7 @@ void mid_cb(void* data, int len){
if (data != NULL){
printf("app2mid_cb: %s RECEIVED \r\n", data);
char *out;cJSON *json, *topic, *payload;
int res;
json=cJSON_Parse(data);
if (!json) {
......@@ -32,28 +34,119 @@ void mid_cb(void* data, int len){
payload = cJSON_GetObjectItem(json, "payload");
printf("mid_cb topic: [%s] ,payload= %s \n",topic->valuestring,payload->valuestring );
if (strcmp(payload->valuestring, "addsub")==0){
kk_mid_subdev_add("a1OYuSallan","allanWno8yDdsjCX15iq","");
//kk_mid_subdev_add("a1OYuSallan","allanWno8yDdsjCX15iq","");
}else{
void* buf = malloc(len);
memcpy(buf, data, len);
int res = dm_queue_msg_insert((void *)buf);
if (res != SUCCESS_RETURN) {
free(buf);
return FAIL_RETURN;
//return FAIL_RETURN;
}
//kk_tsl_service_property_set(topic->valuestring, payload->valuestring, strlen(payload->valuestring), NULL);
}
char mac[DEVICE_MAC_MAXLEN];
res =dm_mgr_search_mac_by_topic(topic->valuestring, mac);
if (res != SUCCESS_RETURN) {
return;
}
printf("dm_mgr_search_mac_by_topic mac: %s \r\n", mac);
cJSON * jsonplay=cJSON_Parse(payload->valuestring);
cJSON_AddStringToObject(jsonplay, "mac", mac);
void* out = cJSON_Print(jsonplay);
kk_ipc_send(IPC_MID2PLAT, out, strlen(out));
free(out);
cJSON_Delete(jsonplay);
cJSON_Delete(json);
}
kk_ipc_send(IPC_MID2PLAT, data, len);
}
}
void mid2p_cb(void* data, int len){
if (data != NULL){
printf("mid2p_cb: %s RECEIVED \r\n", data);
kk_ipc_send(IPC_MID2APP, data, len);
printf("mid2plat_cb: %s RECEIVED \r\n", data);
void* buf = malloc(len);
memcpy(buf, data, len);
int res = dm_queue_msg_insert2((void *)buf);
if (res != SUCCESS_RETURN) {
free(buf);
return ;
}
//kk_ipc_send(IPC_MID2APP, data, len);
}
}
void kk_platMsg_handle(void* data){
char *out;
int res = 0;
cJSON *json, *method, *params;
json=cJSON_Parse(data);
if (!json) {
printf("Error before: [%s]\n","cJSON_Parse");
}
else{
method = cJSON_GetObjectItem(json, "method");
if (method != NULL && strcmp(method->valuestring, "thing.topo.add")==0){
cJSON *jsonPay, *proType, *proCode, *mac;
params = cJSON_GetObjectItem(json, "params");
jsonPay =cJSON_Parse(params->valuestring);
if (!jsonPay) {
printf("Error before: [%s]\n","cJSON_Parse");
}else{
proType = cJSON_GetObjectItem(jsonPay, "productType");
proCode = cJSON_GetObjectItem(jsonPay, "productCode");
mac = cJSON_GetObjectItem(jsonPay, "mac");
printf("productType productCode : [%s][%s]\n",proType, proCode);
kk_set_tsl_by_productKey(proCode->valuestring,"model.json");
kk_mid_subdev_add(proType->valuestring,proCode->valuestring,"", mac->valuestring);
cJSON_Delete(jsonPay);
}
}else if (method != NULL && strcmp(method->valuestring, "thing.event.property.post")==0){
cJSON *mac;
mac = cJSON_GetObjectItem(json, "mac");
//kk_tsl_service_property_set(topic->valuestring, data, strlen(data), NULL);
}else{
printf("kk_platMsg_handle data: [%s]\n",data);
//kk_tsl_service_property_set(topic->valuestring, payload->valuestring, strlen(payload->valuestring), NULL);
}
cJSON_Delete(json);
}
}
void kk_platMsg_dispatch(void)
{
int count = 0;
void *data = NULL;
while (CONFIG_DISPATCH_QUEUE_MAXLEN == 0 || count++ < CONFIG_DISPATCH_QUEUE_MAXLEN) {
if (dm_queue_msg_next2(&data) == SUCCESS_RETURN) {
//dm_queue_msg_t *msg = (dm_queue_msg_t *)data;
printf("kk_handle_platMsg_dispatch get call \n");
if (kk_platMsg_handle) {
kk_platMsg_handle( data);
}
free(data);
data = NULL;
} else {
break;
}
}
}
......@@ -164,7 +257,6 @@ int main(const int argc, const char **argv)
kk_ipc_init(IPC_MID2PLAT, mid2p_cb);
dm_mgr_init();
//DB_Init();
//test_tcp();
/* when Connect to app and platfrom */
......@@ -191,7 +283,7 @@ int main(const int argc, const char **argv)
ct =1;
kk_set_tsl_by_productKey("a1OYuSallan","model.json");
kk_mid_subdev_add("a1OYuSallan","allanWno8yDdsjCX15iq","");
kk_mid_subdev_add("a1OYuSallan","allanWno8yDdsjCX15iq","","aabbccddeeff1122");
}
/*memset(buf, 0, 100);
......
......@@ -1234,26 +1234,85 @@ int kk_msg_uri_parse_pkdn(_IN_ char *uri, _IN_ int uri_len, _IN_ int start_deli,
return SUCCESS_RETURN;
}
int kk_tsl_response_ok(const char *topic, const char *payload, unsigned int payload_len)
{
int res = 0;
char product_key[PRODUCT_KEY_MAXLEN] = {0};
char device_name[DEVICE_NAME_MAXLEN] = {0};
kk_msg_response_t response;
kk_msg_request_payload_t request;
memset(&request, 0, sizeof(kk_msg_request_payload_t));
memset(&response, 0, sizeof(kk_msg_response_t));
res =kk_msg_uri_parse_pkdn((char *)topic, strlen(topic), 2 + KK_URI_OFFSET, 4 + KK_URI_OFFSET, product_key,
device_name);
res = _kk_msg_request_parse((char *)payload, payload_len, &request);
if (res < SUCCESS_RETURN) {
return res ;
}
response.service_prefix = DM_URI_SYS_PREFIX;
response.service_name = DM_URI_THING_SERVICE_PROPERTY_SET_REPLY;
memcpy(response.product_key, product_key, strlen(product_key));
memcpy(response.device_name, device_name, strlen(device_name));
response.code = (res == SUCCESS_RETURN) ? (IOTX_DM_ERR_CODE_SUCCESS) : (IOTX_DM_ERR_CODE_REQUEST_ERROR);
dm_msg_response(&request, &response, "{}", strlen("{}"), NULL);
return SUCCESS_RETURN;
}
int kk_tsl_property_set_byMac(const char mac[DEVICE_MAC_MAXLEN], const char *payload, unsigned int payload_len)
{
kk_msg_request_payload_t request;
int res = 0, devid = 0;
memset(&request, 0, sizeof(kk_msg_request_payload_t));
res = dm_mgr_get_devId_by_mac(mac, &devid);
if(res != SUCCESS_RETURN){
return FAIL_RETURN;
}
res = _kk_msg_request_parse((char *)payload, payload_len, &request);
if (res < SUCCESS_RETURN) {
return res ;
}
/* Operation */
res = _kk_msg_property_set(devid, &request);
/* Response */
kk_tsl_post_property(devid,NULL);
#if 0
#define EVENT_ERROR_IDENTIFIER "Error"
#define EVENT_ERROR_OUTPUT_INFO_IDENTIFIER "ErrorCode"
//kk_tsl_post_property(devid,NULL);
char event_output_identifier[64];
snprintf(event_output_identifier, sizeof(event_output_identifier), "%s.%s",
EVENT_ERROR_IDENTIFIER, EVENT_ERROR_OUTPUT_INFO_IDENTIFIER);
int errorCode = 0;
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
kk_tsl_set_value(kk_tsl_set_event_output_value, devid,
event_output_identifier, &errorCode, NULL);
kk_tsl_post_event(devid,EVENT_ERROR_IDENTIFIER);
#endif
return SUCCESS_RETURN;
}
int kk_tsl_service_property_set(const char *topic, const char *payload, unsigned int payload_len,
void *context)
{
kk_msg_source_t source;
kk_msg_request_payload_t request;
kk_msg_response_t response;
int res = 0, devid = 0;
char product_key[PRODUCT_KEY_MAXLEN] = {0};
char device_name[DEVICE_NAME_MAXLEN] = {0};
memset(&source, 0, sizeof(kk_msg_source_t));
memset(&request, 0, sizeof(kk_msg_request_payload_t));
memset(&response, 0, sizeof(kk_msg_response_t));
source.uri = topic;
source.payload = (unsigned char *)payload;
source.payload_len = payload_len;
source.context = NULL;
/**************to do*******************/
......@@ -1278,13 +1337,6 @@ int kk_tsl_service_property_set(const char *topic, const char *payload, unsigned
res = _kk_msg_property_set(devid, &request);
/* Response */
response.service_prefix = DM_URI_SYS_PREFIX;
response.service_name = DM_URI_THING_SERVICE_PROPERTY_SET_REPLY;
memcpy(response.product_key, product_key, strlen(product_key));
memcpy(response.device_name, device_name, strlen(device_name));
response.code = (res == SUCCESS_RETURN) ? (IOTX_DM_ERR_CODE_SUCCESS) : (IOTX_DM_ERR_CODE_REQUEST_ERROR);
dm_msg_response(&request, &response, "{}", strlen("{}"), NULL);
kk_tsl_post_property(devid,NULL);
#if 0
......
......@@ -15,6 +15,9 @@
#define PRODUCT_KEY_MAXLEN (32 + 1)
#define DEVICE_NAME_MAXLEN (32 + 1)
#define DEVICE_SECRET_MAXLEN (64 + 1)
#define DEVICE_MAC_MAXLEN (16 + 1)
#define DEVICE_SN_MAXLEN (32 + 1)
#define TSL_PATH_MAXLEN (64 + 1)
#define DM_UTILS_UINT16_STRLEN (5)
......@@ -66,6 +69,7 @@
#define KK_TSL_GATAWAY_MAC_IDENTIFIER "MACAddress"
#define KK_TSL_GATAWAY_PORT_IDENTIFIER "Port"
#define KK_TSL_GATAWAY_SN_IDENTIFIER "SN"
#define KK_TSL_GATAWAY_WHITELIST_IDENTIFIER "WhiteListState"
typedef enum {
KK_TSL_DATA_TARGET_SERVICE_INPUT_DATA,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment