Commit d09c540f authored by 黄振令's avatar 黄振令

【修改内容】1. 修改网关添加逻辑;2. 增加网关与主机tcp通道

【提交人】huang.zhenling
parent f187487c
......@@ -39,11 +39,11 @@ typedef struct {
}Bloop_ctrl_t;
Bloop_ctrl_t Bloop_ctrl;
Bloop_ctrl_t Mloop_ctrl;
static Bloop_ctrl_t Bloop_ctrl;
static Bloop_ctrl_t Mloop_ctrl;
struct ev_loop* gloop = NULL;
pthread_t g_pTh = NULL;
static struct ev_loop* gloop = NULL;
static pthread_t g_pTh = NULL;
static char* _parse_data_by_subscribe(char* data, int len, int *outLen, void** chlMark){
......
This diff is collapsed.
......@@ -236,7 +236,8 @@ int HAL_GetDevice_Code(_OU_ char *device_code)
{
int len = strlen(g_device_code);
memset(device_code, 0x0, DEVICE_CODE_LEN);
strncpy(device_code, g_device_code, len);
//strncpy(device_code, g_device_code, len);
strncpy(device_code, "CCU_66666", strlen("CCU_66666"));
return len;
}
int HAL_GetVersion(_OU_ char *version)
......
......@@ -43,6 +43,20 @@ static int _kk_filter_to_plat(const char* msgtype)
}
return 0;
}
void kk_sendData2gw(void* data, int len, char* chalMark){
if (chalMark== NULL || strlen(chalMark) == 0){
ERROR_PRINT(" chalMark is null");
return;
}
if (kk_is_tcp_channel(chalMark) > -1){
kk_tcp_channel_ser_send(data, len, chalMark);
}else{
kk_ipc_send_ex(IPC_MID2PLAT, data, len, chalMark);
}
}
void mid_cb(void* data, int len){
if (data != NULL){
......@@ -78,7 +92,7 @@ void mid_cb(void* data, int len){
int devType = 0;
dm_mgr_get_devicetype_by_devicecode(deviceCode->valuestring,&devType);
if(devType == KK_DM_DEVICE_GATEWAY){
kk_ipc_send_ex(IPC_MID2PLAT, data, strlen(data), deviceCode->valuestring);//send to gw itself
kk_sendData2gw(data, strlen(data), deviceCode->valuestring);//send to gw itself
}else if(devType == KK_DM_DEVICE_SUBDEV){
dm_mgr_dev_node_t *gw_node = NULL;
res = dm_mgr_get_device_by_devicecode(deviceCode->valuestring,&gw_node);
......@@ -88,7 +102,7 @@ void mid_cb(void* data, int len){
cJSON_Delete(info);
return;
}
kk_ipc_send_ex(IPC_MID2PLAT, data, strlen(data), gw_node->fatherDeviceCode);//send to sub device
kk_sendData2gw(data, strlen(data), gw_node->fatherDeviceCode);//send to sub device
}
else{
ERROR_PRINT("wrong type\n");
......@@ -134,6 +148,14 @@ void mid2p_cb(void* data, int len, char* chalMark){
}
}
void gw2mid_cb(void* data, int len, char* chalMark){
if (data != NULL){
printf("gw2mid_cb chalMark=%s, data: %s RECEIVED \r\n", chalMark, data);
mid2p_cb(data,len,chalMark);
}
}
void kk_platMsg_handle(void* data, char* chalMark){
char *out;
......@@ -170,6 +192,8 @@ void kk_platMsg_handle(void* data, char* chalMark){
ERROR_PRINT("msgType info_dcode or jsonPay params are error\n");
goto error;
}
dm_mgr_update_timestamp_by_devicecode(info_dcode->valuestring,HAL_UptimeMs());
if (strcmp(msgType->valuestring, "/thing/topo/add")==0){
proCode = cJSON_GetObjectItem(jsonPay, "productCode");
......@@ -297,7 +321,7 @@ void *ota_dispatch_yield(void *args)
#define UDP_LAN_PORT 25556
#define UDP_LAN_PORT_HOST 25555
#define test_
void *udp_dispatch_yield(void *args){
......@@ -354,6 +378,7 @@ void *udp_dispatch_yield(void *args){
char szDec[1024] = {0};
char host_ip[32] = {0};
char mac[32] = {0};
char device_code[DEVICE_CODE_LEN] = {0};
int devId = 0;
while(1)
......@@ -372,6 +397,74 @@ void *udp_dispatch_yield(void *args){
DEBUG_PRINT("lan recmsg: %s\n", szDec);
//DEBUG_PRINT("udp client ip:%s ,port is :%d htons(UDP_LAN_PORT)=%d \n",inet_ntoa(from.sin_addr),from.sin_port, htons(UDP_LAN_PORT));
#ifdef test_
//"search_kk_ccu|deviceCode=1122334455667788;protocol=tcp"
if(strstr(szDec, "search_kk_ccu|") != NULL){
char* getConnet = szDec + strlen("search_kk_ccu|");
char* tmp = NULL;
char* endIdx = NULL;
int itemLen = 0;
int itemConnetLen = 0;
char gwDevCode[DEVICE_CODE_LEN] = {0};
char proto[10] = {0};
tmp = strstr(getConnet, "deviceCode=");
itemLen = strlen("deviceCode=");
if (tmp != NULL){
endIdx = strstr(tmp, ";");
if(endIdx == NULL){
itemConnetLen = strlen(tmp) - itemLen;
}else{
itemConnetLen = endIdx - tmp - itemLen;
}
memcpy(gwDevCode, tmp + itemLen,itemConnetLen);
}
tmp = strstr(getConnet, "protocol=");
itemLen = strlen("protocol=");
if (tmp != NULL){
endIdx = strstr(tmp, ";");
if(endIdx == NULL){
itemConnetLen = strlen(tmp) - itemLen;
}else{
itemConnetLen = endIdx - tmp - itemLen;
}
memcpy(proto, tmp + itemLen,itemConnetLen);
}
DEBUG_PRINT("gwDevCode =%s proto=%s \n",gwDevCode,proto);
if(strcmp(proto,"tcp") == 0){
//
kk_TCP_channel_init(gw2mid_cb);
kk_set_tcp_channel(gwDevCode,inet_ntoa(from.sin_addr));
}
memset(host_ip, 0, sizeof(host_ip));
memset(mac, 0, sizeof(mac));
memset(szOut, 0, sizeof(szOut));
HAL_Get_IP(host_ip,"ens33");
HAL_GetDevice_Code(device_code);
sprintf(szOut,"search_kk_ccu_ack|deviceCode=%s;ip=%s;port=%d",device_code,host_ip,16565);
DEBUG_PRINT("szOut:%s\n",szOut);
DEBUG_PRINT("udp client ip:%s ,port is :%d \n",inet_ntoa(from.sin_addr),from.sin_port);
//sendto(sock, szOut, strlen(szOut), 0, (struct sockaddr*)&from,len);
addrto_host.sin_addr.s_addr = inet_addr(inet_ntoa(from.sin_addr));
addrto_host.sin_port = htons(UDP_LAN_PORT_HOST);
//addrto_host.sin_port = from.sin_port;
//if(strcmp(host_ip,inet_ntoa(from.sin_addr)) == 0)
//{
sendto(sock_host, szOut, strlen(szOut), 0, (struct sockaddr*)&addrto_host,sizeof(addrto_host));
//}
//else
//{
// DEBUG_PRINT("udp client is not local ip , refused send ack to it\n");
//}
}
#else
json=cJSON_Parse(szDec);
if (!json) {
ERROR_PRINT("Error before: [%s]\n","cJSON_Parse");
......@@ -450,7 +543,7 @@ void *udp_dispatch_yield(void *args){
cJSON_Delete(json);
}
#endif
}
usleep(100000);
......
......@@ -4,6 +4,8 @@
#include "network-creator.h"
#include "network-creator-security.h"
#include "RPC_API.h"
#include "com_api.h"
#define KK_REPORT_DEVICE_JOINED_TYPE "/thing/topo/add"
#define KK_REPORT_DEVICE_LEFT_TYPE "/thing/topo/delete"
......@@ -16,11 +18,14 @@
#define KK_READ_ATTRIBUTE_METHOD "thing.service.property.get"
#define TEST_PRODUCT_CODE "24"
#define GW2CCU_PROTOCOL "tcp"
#define GW_DEVICE_CODE "1122334455667788"
cJSON *rpc_Control(jrpc_context * ctx, cJSON * params, cJSON *id,cJSON *mac);
cJSON *rpc_read_attribue(jrpc_context * ctx, cJSON * params, cJSON *id,cJSON *mac);
int lightStatusSet(jrpc_context * ctx,const char *mac,void* data);
int kk_sendData2CCU(char* data, int len);
int rpc_nwkPermitJoin(jrpc_context * ctx,const char *mac,void* data);
......
......@@ -20,7 +20,6 @@
#include "rpc_colorControl.h"
#include "rpc_onoff.h"
#include "com_api.h"
#include "kk_test.h"
//#include "kk_log.h"
......@@ -112,7 +111,7 @@ static int send_result_resp(cJSON * result,
char * str_result = rpc_cJSON_Print(result_root);
printf("send json:\n%s\n",str_result);
return_value = kk_ipc_send(IPC_PLAT2MID, str_result, strlen(str_result)+1);
return_value = kk_sendData2CCU(str_result, strlen(str_result)+1);
free(str_result);
rpc_cJSON_Delete(result_root);
return return_value;
......@@ -150,7 +149,7 @@ static int send_error_resp(int code, char* message,
}
char * str_result = rpc_cJSON_Print(result_root);
//printf("alla=========== :%d\n", strlen(str_result)+1);
return_value = kk_ipc_send(IPC_PLAT2MID, str_result, strlen(str_result)+1);
return_value = kk_sendData2CCU(str_result, strlen(str_result)+1);
printf("send_error_resp:\n%s\n", str_result);
free(str_result);
rpc_cJSON_Delete(result_root);
......@@ -268,9 +267,11 @@ int _init_param(struct jrpc_server *server) {
}
int addGW_and_getIP(char* ip){
int search_ccu(char devcode[33], char ip[16], int* port){
//char rgMessage[128] = "search_kk_gw|null";
char sendCmdFmt[] = "search_kk_ccu|deviceCode=%s;protocol=%s";
char sendMessage[128] = {0};
char revMessage[128] = {0};
int sock;
int sk_recv;
......@@ -282,22 +283,23 @@ int addGW_and_getIP(char* ip){
struct sockaddr_in Addrto;
struct sockaddr_in AddrRev;
sprintf(sendMessage,sendCmdFmt,GW_DEVICE_CODE,GW2CCU_PROTOCOL);
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("addGW_and_getIP socket fail\n");
printf("[%s] socket fail\n",__FUNCTION__);
return -1;
}
if ((sk_recv = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("addGW_and_getIP socket sk_recv fail\n");
printf("[%s] socket sk_recv fail\n",__FUNCTION__);
close(sock);
return -1;
}
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &iOptval, sizeof(int)) < 0)
{
printf("addGW_and_getIP setsockopt failed!");
printf("[%s] setsockopt failed\n",__FUNCTION__);
close(sock);
close(sk_recv);
return -1;
......@@ -305,7 +307,7 @@ int addGW_and_getIP(char* ip){
if (setsockopt(sk_recv, SOL_SOCKET, SO_REUSEADDR, &iOptval, sizeof(int)) < 0)
{
printf("addGW_and_getIP setsockopt failed!");
printf("[%s] setsockopt failed\n",__FUNCTION__);
close(sock);
close(sk_recv);
return -1;
......@@ -314,7 +316,7 @@ int addGW_and_getIP(char* ip){
flag = fcntl(sk_recv, F_GETFL, 0);
if (flag < 0)
{
printf("addGW_and_getIP fcntl failed.\n");
printf("[%s] fcntl failed.\n",__FUNCTION__);
close(sock);
close(sk_recv);
return -1;;
......@@ -322,7 +324,7 @@ int addGW_and_getIP(char* ip){
flag |= O_NONBLOCK;
if (fcntl(sk_recv, F_SETFL, flag) < 0)
{
printf("addGW_and_getIP fcntl failed.\n");
printf("[%s] fcntl failed.\n",__FUNCTION__);
close(sock);
close(sk_recv);
return -1;
......@@ -341,40 +343,76 @@ int addGW_and_getIP(char* ip){
if (bind(sk_recv, (struct sockaddr *)&AddrRev, sizeof(AddrRev)) == -1)
{
printf("addGW_and_getIP bind failed!\n");
printf("[%s] bind failed!\n",__FUNCTION__);
close(sock);
close(sk_recv);
return -1;
}
char info[] = "{\"msgtype\":\"/thing/topo/add\",\"productType\":\"gw\",\"productCode\":\"2\",\"deviceCode\":\"1122334455667788\"}";
char payload[] = "{\"msgId\":\"1\",\"version\":\"1.0\",\"params\":{\"deviceCode\":\"1122334455667788\",\"productCode\":\"2\",\"mac\":\"1122334455667788\"}}";
cJSON* root = cJSON_CreateObject();
cJSON* infoObj = cJSON_Parse(info);
cJSON* payloadObj = cJSON_Parse(payload);
cJSON_AddItemToObject(root, "info", infoObj);
cJSON_AddItemToObject(root, "payload",payloadObj);
char* outbuf = cJSON_Print(root);
cJSON_Delete(root);
while (1)
{
if ((iSendbytes = sendto(sock, outbuf, strlen(outbuf)+1, 0, (struct sockaddr*)&Addrto, sizeof(struct sockaddr))) == -1)
if ((iSendbytes = sendto(sock, sendMessage, strlen(sendMessage)+1, 0, (struct sockaddr*)&Addrto, sizeof(struct sockaddr))) == -1)
{
printf("addGW_and_getIP sendto fail, errno=%d\n", errno);
printf("[%s] sendto fail, errno=%d\n", __FUNCTION__,errno);
close(sock);
close(sk_recv);
free(outbuf);
return -1;
}
sleep(1);
recvLen = recvfrom(sk_recv, revMessage, sizeof(revMessage), 0, (struct sockaddr *)&AddrRev, &iAddrLength);
if (recvLen > 0){
printf("addGW_and_getIP recv:%s\n", revMessage);
if (strstr(revMessage, "/thing/topo/add_reply") != NULL){
memcpy(ip, inet_ntoa(AddrRev.sin_addr), strlen(inet_ntoa(AddrRev.sin_addr)));
printf(" recv ip:%s\n", ip);
printf("[%s] recv:%s\n", __FUNCTION__, revMessage);
//"search_kk_ccu_ack|deviceCode=CCU_66666;ip=192.168.36.128;port=16565"
if (strstr(revMessage, "search_kk_ccu_ack|") != NULL){
char* ackConnet = revMessage + strlen("search_kk_ccu_ack|");
char* tmp = NULL;
char* endIdx = NULL;
int itemLen = 0;
int itemConnetLen = 0;
tmp = strstr(ackConnet, "deviceCode=");
itemLen = strlen("deviceCode=");
if (tmp != NULL){
endIdx = strstr(tmp, ";");
if(endIdx == NULL){
itemConnetLen = strlen(tmp) - itemLen;
}else{
itemConnetLen = endIdx - tmp - itemLen;
}
memcpy(devcode, tmp + itemLen,itemConnetLen);
}
tmp = strstr(ackConnet, "ip=");
itemLen = strlen("ip=");
if (tmp != NULL){
endIdx = strstr(tmp, ";");
if(endIdx == NULL){
itemConnetLen = strlen(tmp) - itemLen;
}else{
itemConnetLen = endIdx - tmp - itemLen;
}
memcpy(ip, tmp + itemLen,itemConnetLen);
}
tmp = strstr(ackConnet, "port=");
itemLen = strlen("port=");
if (tmp != NULL){
endIdx = strstr(tmp, ";");
if(endIdx == NULL){
itemConnetLen = strlen(tmp) - itemLen;
}else{
itemConnetLen = endIdx - tmp - itemLen;
}
char portstr[20] = {0};
memcpy(portstr, tmp + itemLen,itemConnetLen);
*port = atoi(portstr);
}
//memcpy(ip, inet_ntoa(AddrRev.sin_addr), strlen(inet_ntoa(AddrRev.sin_addr)));
printf(" recv deviceCode:%s ip:%s port:%d \n", devcode, ip, *port);
break;
}
}
......@@ -382,24 +420,43 @@ int addGW_and_getIP(char* ip){
}
close(sock);
close(sk_recv);
free(outbuf);
return 0;
}
void ipcHandle(void)
{
char deviceCode[33] = {0};
char ip[16] = {0};
int port = 0;
emberAfAppPrint( "Thread rpc Interface Parse create\n" );
addGW_and_getIP(ip);
search_ccu(deviceCode, ip, &port);
_init_param(&my_server);
kk_ipc_init(IPC_PLAT2MID, _cb, "1122334455667788",ip);
if(strcmp(GW2CCU_PROTOCOL, "tcp") == 0){
kk_tcp_client_init(ip, port, _cb);
}else{
kk_ipc_init(IPC_PLAT2MID, _cb, GW_DEVICE_CODE, ip);
}
emberAfAppPrint("sizeof(rpc_table)=%d,sizeof(rpc_table_s)=%d,%d\n",sizeof(rpc_table),sizeof(rpc_table_s),sizeof(rpc_table)/sizeof(rpc_table_s));
for(int i=0;i<sizeof(rpc_table)/sizeof(rpc_table_s);i++){
emberAfAppPrint("i=%d,%s\r\n",i,rpc_table[i].name);
jrpc_register_procedure(&my_server, rpc_table[i].func, rpc_table[i].name, NULL );
}
//send add gw to ccu
char info[] = "{\"msgtype\":\"/thing/topo/add\",\"productType\":\"gw\",\"productCode\":\"2\",\"deviceCode\":\"1122334455667788\"}";
char payload[] = "{\"msgId\":\"1\",\"version\":\"1.0\",\"params\":{\"deviceCode\":\"1122334455667788\",\"productCode\":\"2\",\"mac\":\"1122334455667788\"}}";
cJSON* root = cJSON_CreateObject();
cJSON* infoObj = cJSON_Parse(info);
cJSON* payloadObj = cJSON_Parse(payload);
cJSON_AddItemToObject(root, "info", infoObj);
cJSON_AddItemToObject(root, "payload",payloadObj);
char* outbuf = cJSON_Print(root);
cJSON_Delete(root);
//kk_sendData2CCU(outbuf, strlen(outbuf));
kk_sendData2CCU("allan test", strlen("allan test"));
free(outbuf);
//handle procidure
while(1){
//
......@@ -422,7 +479,7 @@ int jrpc_send_msg(cJSON * msgJson) {
return_value = kk_ipc_send(IPC_PLAT2MID, str_result, strlen(str_result)+1);
return_value = kk_sendData2CCU(str_result, strlen(str_result)+1);
free(str_result);
return return_value;
}
......
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