/************************************************* * Function: ZC_SendJdQueryReq * Description: * Author: cxy * Returns: * Parameter: * History: *************************************************/ static int ZC_JDPacketBuild(u8* pBuf, int enctype, int type, cJSON *root) { common_header_t* pCommon = (common_header_t*)pBuf; pCommon->magic = 0x55AA; pCommon->enctype = 0; // 加密类型,如果是0表示调试阶段不加密 pBuf += sizeof(common_header_t); cmd_header* pCmd = (cmd_header*)(pBuf); pCmd->type = type; memcpy(pCmd->cmd, "OK", 2); u8* pData = pBuf+sizeof(cmd_header); char* psJson = cJSON_PrintUnformatted(root); int length = strlen(psJson); memcpy(pData, psJson, length); hfmem_free(psJson); pCommon->len = length+sizeof(cmd_header); int i = 0; unsigned char sum =0; for(i=0; i<pCommon->len; i++) { sum+= *(pBuf+i); } pCommon->checksum = sum; return pCommon->len+ sizeof(common_header_t); }
static int USER_FUNC download_audio_file(char *purl) { httpc_req_t http_req; char *content_data=NULL; char *temp_buf=NULL; parsed_url_t url={0}; http_session_t hhttp=0; int total_size,read_size=0; int rv=0; tls_init_config_t *tls_cfg=NULL; char *test_url=purl; bzero(&http_req,sizeof(http_req)); http_req.type = HTTP_GET; http_req.version=HTTP_VER_1_1; if((temp_buf = (char*)hfmem_malloc(256))==NULL) { u_printf("no memory\n"); rv= -HF_E_NOMEM; goto exit; } bzero(temp_buf,sizeof(temp_buf)); if((rv=hfhttp_parse_URL(test_url,temp_buf , 256, &url))!=HF_SUCCESS) { goto exit; } if((rv=hfhttp_open_session(&hhttp,test_url,0,tls_cfg,3))!=HF_SUCCESS) { u_printf("http open fail\n"); goto exit; } hfsys_disable_all_soft_watchdogs(); flash_erase_page(AUDIO_FILE_FLASH_OFFSET,AUDIO_FILE_MAX_SIZE/HFFLASH_PAGE_SIZE); http_req.resource = url.resource; hfhttp_prepare_req(hhttp,&http_req,HDR_ADD_CONN_CLOSE); hfhttp_add_header(hhttp,"Range","bytes=0"); if((rv=hfhttp_send_request(hhttp,&http_req))!=HF_SUCCESS) { u_printf("http send request fail\n"); goto exit; } content_data = (char*)hfmem_malloc(256); if(content_data==NULL) { rv= -HF_E_NOMEM; goto exit; } total_size=0; bzero(content_data,256); while((read_size=hfhttp_read_content(hhttp,content_data,256))>0) { hfgpio_fset_out_high(HFGPIO_F_NREADY); flash_write(AUDIO_FILE_FLASH_OFFSET+total_size,content_data,read_size,0); total_size+=read_size; hfgpio_fset_out_low(HFGPIO_F_NREADY); u_printf("download file:[%d] [%d]\r",total_size,read_size); } hfgpio_fset_out_low(HFGPIO_F_NREADY); exit: hfsys_enable_all_soft_watchdogs(); if(temp_buf!=NULL) hfmem_free(temp_buf); if(content_data!=NULL) hfmem_free(content_data); if(hhttp!=0) hfhttp_close_session(&hhttp); hfgpio_fset_out_low(HFGPIO_F_NREADY); return rv; }
void deinit_topic(topic_para **topic) { hfmem_free(*topic); *topic = NULL; }
/************************************************* * Function: ZC_SendJdQueryReq * Description: * Author: cxy * Returns: * Parameter: * History: *************************************************/ void ZC_SendJDQueryReq(u8 *pu8Msg, u32 u32RecvLen,struct sockaddr_in addr) { int len_udp_back; cmd_header* pCmd = NULL; ZC_SendParam struParam; cJSON* jDevice = ZC_JDPacketAnalyse(&pCmd, (char *)pu8Msg, u32RecvLen); if(jDevice == NULL) { ZC_Printf("PacketAnalyse error\n\r"); return; } cJSON *root = cJSON_CreateObject(); //注意用完必须释放内存 if(root == NULL) { ZC_Printf("cJSON_CreateObject failed"); cJSON_Delete(jDevice); return; } switch(pCmd->type) { case 1: { //int smtlk = 0; u8 DeviceId[ZC_HS_DEVICE_ID_LEN+1]; u8 *pu8DeviceId; #if 0 hfsys_nvm_read(0,(char *)&smtlk,4); if(!((hfsys_get_time() < 2000*60) && (smtlk == 1))) { smtlk = 0; hfsys_nvm_write(0,(char *)&smtlk,4); break; } #endif cJSON *pItem = cJSON_GetObjectItem(jDevice, "productuuid"); if( (strcmp((const char *)JD_PROUUID, (const char *)pItem->valuestring) )||(pItem->valuestring[0]==0)||(strcmp("0", (const char *)pItem->valuestring) )) { if(ZC_MAGIC_FLAG!=g_struZcConfigDb.struJdInfo.u32MagicFlag) { cJSON_AddStringToObject(root,"feedid", "0"); ZC_Printf("Configuration file not exists"); } else { cJSON_AddStringToObject(root,"feedid", (const char *)g_struZcConfigDb.struJdInfo.u8Feedid); ZC_Printf("Configuration file exists"); } ZC_GetStoreInfor(ZC_GET_TYPE_DEVICEID, &pu8DeviceId); memcpy(DeviceId, pu8DeviceId, ZC_HS_DEVICE_ID_LEN); DeviceId[ZC_HS_DEVICE_ID_LEN] = 0; cJSON_AddStringToObject(root,"mac", (const char *)DeviceId); cJSON_AddStringToObject(root,(const char *)"productuuid", (const char *)JD_PROUUID); int length = ZC_JDPacketBuild(pu8Msg, 2, 2, root); struParam.u8NeedPoll = 0; struParam.pu8AddrPara = (u8 *)&addr; g_struProtocolController.pstruMoudleFun->pfunSendUdpData(g_Jdfd, pu8Msg, length, &struParam); ZC_Printf("HeartBeat_OK\n"); } break; } case 3: { cJSON *pItem = cJSON_GetObjectItem(jDevice,"feedid"); ZC_StoreFeedInfo((u8 *)pItem->valuestring); cJSON_AddNumberToObject(root,"code",0); cJSON_AddStringToObject(root,"msg","write feed_id and accesskey successfully!"); len_udp_back = ZC_JDPacketBuild(pu8Msg, 2, 4, root); struParam.u8NeedPoll = 0; struParam.pu8AddrPara = (u8*)&addr; g_struProtocolController.pstruMoudleFun->pfunSendUdpData(g_Jdfd, pu8Msg, len_udp_back, &struParam); char* p = cJSON_PrintUnformatted(jDevice); ZC_Printf("WriteOK_%s",p); hfmem_free(p); break; } default: break; } cJSON_Delete(root); cJSON_Delete(jDevice); }
USER_FUNC void upnp_main_thread(void* arg) { int upnp_fd; uint32_t if_addr; fd_set sockfd_set; int max_fd ; struct timeval tv; char *pkt_buffer; int ret,i; char *p=0; #define UPNP_RECV_PACKET_SIZE (1024) extern int hfnet_enable_multicast(int enable); hfnet_enable_multicast(1); pkt_buffer = hfmem_malloc(UPNP_RECV_PACKET_SIZE); if(pkt_buffer==NULL) { //u_printf("no mem\n"); return; } while(1) { if((if_addr=get_if_ip_addr())==0) //µÃµ½Ä£¿éµ±Ç°ipµØÖ· kim { msleep(500); continue; } get_mac_addr(); //u_printf("kim+++ if_addr is %x\n",if_addr); upnp_fd = create_multicast_socket(if_addr); if(upnp_fd<0) return; else break; } //tcp server listenfd = socket(AF_INET, SOCK_STREAM, 0); memset((char*)&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(30001); servaddr.sin_addr.s_addr=htonl(INADDR_ANY); bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); listen(listenfd,10); //u_printf("tcp server bind ok!\n"); if(listenfd > upnp_fd) max_fd =listenfd; else max_fd =upnp_fd; maxi = -1; for(i=0;i<MAXCLIENT;i++) { client[i] = -1; } // while(1) { int recvsize=0; tv.tv_sec=0; tv.tv_usec=200; ////u_printf("time=%d\n",hfsys_get_time()); FD_ZERO(&sockfd_set); FD_SET(upnp_fd,&sockfd_set); FD_SET(listenfd,&sockfd_set); for(i=0;i<MAXCLIENT;i++) { if(client[i]>=0) { FD_SET(client[i],&sockfd_set); if(client[i] > max_fd) max_fd =client[i]; } } /* count++; if(count == 1000) { //u_printf("send alive package\r\n"); send_alive_packet(upnp_fd,pkt_buffer,UPNP_RECV_PACKET_SIZE,if_addr); count = 0; } */ ret=select(max_fd+1,&sockfd_set,NULL,NULL,&tv); if(ret<=0) { //send_alive_packet(upnp_fd,pkt_buffer,UPNP_RECV_PACKET_SIZE,if_addr); continue; } if(FD_ISSET(listenfd, &sockfd_set)) //s2 { clilen = sizeof(cliaddr); connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); for(i=0;i<MAXCLIENT;i++) { if(client[i]<0) { client[i] = connfd; maxi = maxi+1; //u_printf("accept client socket : %d client count : %d\n",connfd,maxi+1); break; } } if(i == MAXCLIENT) { //u_printf("too many clients\r\n"); } /*FD_SET(connfd, &sockfd_set); //½«ÒÑÁ¬½Ósocket ¼ÓÈëselect if(connfd > max_fd) max_fd = connfd; */ //if(i > maxi) if(--ret<=0) continue; } for(i=0;i<=maxi;i++) //¼ì²éËùÓеÄÒÑÁ¬½ÓsocketÓÐÎÞÊý¾Ý //s3 { if(((sockfd = client[i])<0)) continue; if(FD_ISSET(sockfd, &sockfd_set)) { if((recv_num =recv(sockfd,tcpserver_buf,sizeof(tcpserver_buf),0))>0) { while(tcp_send_finish == 0) { u_printf("busy,try late again\r\n"); msleep(10); } tcp_send_finish = 0; ////u_printf("recv data bytes:%d\n %s\r\n",recv_num,tcpserver_buf); if(recv_num <400) //·ÀÖ¹Á½ÌõÏûÏ¢Õ³Á¬ { TCP_Encode(); //add tcp identification code u_printf("FW to MCU,LOCAL TCP,TCP fd is %d:\r\n%s\r\n\r\n",sockfd,tcpserver_encodedbuf); hfuart_send(HFUART0,tcpserver_encodedbuf,strlen(tcpserver_encodedbuf), 50); // if(tcp_uartfd == 0) //{ tcp_uartfd = sockfd; } else { u_printf("recv num is %d, a catastrophe.Get rid of it\r\n",recv_num); } tcp_send_finish = 1; //²âÊÔ²éѯÉ豸Óà /* if((p = strstr(tcpserver_buf,"info"))!= NULL) //ÊÖ»ú²éѯÉ豸ÐÅÏ¢ { //u_printf("send info\r\n"); write(sockfd,info,strlen(info)); } else if((p = strstr(tcpserver_buf,"channel"))!= NULL) //ÊÖ»ú²éѯ°²È«Ä£Ê½´ò¿ª¹Ø±ÕµÄ״̬ { //u_printf("send channel\r\n"); write(sockfd,channel,strlen(channel)); } */ memset(tcpserver_encodedbuf,0,400); memset(tcpserver_buf,0,400); } else { close(sockfd); //FD_CLR(sockfd, &sockfd_set); client[i] = -1; maxi=maxi -1; //u_printf("delet client socket ,client count : %d\n",maxi+1); } if(--ret <= 0) break; } } if(FD_ISSET(upnp_fd, &sockfd_set)) //s1 { struct sockaddr_in fromaddr; socklen_t sockaddr_size = sizeof(struct sockaddr_in); memset(pkt_buffer,0,UPNP_RECV_PACKET_SIZE); recvsize = recvfrom(upnp_fd, (char*)pkt_buffer, UPNP_RECV_PACKET_SIZE-4, 0,(struct sockaddr *) &fromaddr, &sockaddr_size); // //u_printf("kim+++ Broadcast from ip:%x, port:%x\n",fromaddr.sin_addr.s_addr,fromaddr.sin_port); if (recvsize < 0) { //u_printf("recv() fail\n"); } else { if(strstr(pkt_buffer,"Lucis-tech")!=NULL) { //u_printf("recv length=%d,buffer is %s\n",recvsize,pkt_buffer); if(Sync_Flag == 1) //only after mcu sync Fa info to wifi { //u_printf("test AAA\r\n"); send_msearch_rsp_packet(&fromaddr); } } } if(--ret<=0) continue; } } if(pkt_buffer!=NULL) hfmem_free(pkt_buffer); return ; }