static nsapi_error_t mbed_lwip_socket_open(nsapi_stack_t *stack, nsapi_socket_t *handle, nsapi_protocol_t proto) { // check if network is connected if (lwip_connected == NSAPI_STATUS_DISCONNECTED) { return NSAPI_ERROR_NO_CONNECTION; } // allocate a socket struct lwip_socket *s = mbed_lwip_arena_alloc(); if (!s) { return NSAPI_ERROR_NO_SOCKET; } enum netconn_type lwip_proto = proto == NSAPI_TCP ? NETCONN_TCP : NETCONN_UDP; #if LWIP_IPV6 // Enable IPv6 (or dual-stack) lwip_proto |= NETCONN_TYPE_IPV6; #endif s->conn = netconn_new_with_callback(lwip_proto, mbed_lwip_socket_callback); if (!s->conn) { mbed_lwip_arena_dealloc(s); return NSAPI_ERROR_NO_SOCKET; } netconn_set_recvtimeout(s->conn, 1); *(struct lwip_socket **)handle = s; return 0; }
static int lwip_socket_open(nsapi_stack_t *stack, nsapi_socket_t *handle, nsapi_protocol_t proto) { // check if network is connected if (!lwip_get_ip_address()) { return NSAPI_ERROR_NO_CONNECTION; } // allocate a socket struct lwip_socket *s = lwip_arena_alloc(); if (!s) { return NSAPI_ERROR_NO_SOCKET; } s->conn = netconn_new_with_callback( proto == NSAPI_TCP ? NETCONN_TCP : NETCONN_UDP, lwip_socket_callback); if (!s->conn) { lwip_arena_dealloc(s); return NSAPI_ERROR_NO_SOCKET; } netconn_set_recvtimeout(s->conn, 1); *(struct lwip_socket **)handle = s; return 0; }
int lwip_socket(int domain, int type, int protocol) { struct netconn *conn; int i; if (!socksem) socksem = sys_sem_new(1); /* create a netconn */ switch (type) { case SOCK_RAW: conn = netconn_new_with_proto_and_callback(NETCONN_RAW, protocol, event_callback); LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); break; case SOCK_DGRAM: conn = netconn_new_with_callback(NETCONN_UDP, event_callback); LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); break; case SOCK_STREAM: conn = netconn_new_with_callback(NETCONN_TCP, event_callback); LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); break; default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n", domain, type, protocol)); set_errno(EINVAL); return -1; } if (!conn) { LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n")); set_errno(ENOBUFS); return -1; } i = alloc_socket(conn); if (i == -1) { netconn_delete(conn); set_errno(ENOBUFS); return -1; } conn->socket = i; LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); set_errno(0); return i; }
static nsapi_error_t mbed_lwip_socket_open(nsapi_stack_t *stack, nsapi_socket_t *handle, nsapi_protocol_t proto) { // check if network is connected if (!lwip_connected) { return NSAPI_ERROR_NO_CONNECTION; } // allocate a socket struct lwip_socket *s = mbed_lwip_arena_alloc(); if (!s) { return NSAPI_ERROR_NO_SOCKET; } u8_t lwip_proto = proto == NSAPI_TCP ? NETCONN_TCP : NETCONN_UDP; #if LWIP_IPV6 && LWIP_IPV4 const ip_addr_t *ip_addr; ip_addr = mbed_lwip_get_ip_addr(true, &lwip_netif); if (IP_IS_V6(ip_addr)) { // Enable IPv6 (or dual-stack). LWIP dual-stack support is // currently incomplete as of 2.0.0rc2 - eg we will only be able // to do a UDP sendto to an address matching the type selected // here. Matching "get_ip_addr" and DNS logic, use v4 if // available. lwip_proto |= NETCONN_TYPE_IPV6; } #elif LWIP_IPV6 lwip_proto |= NETCONN_TYPE_IPV6; #endif s->conn = netconn_new_with_callback(lwip_proto, mbed_lwip_socket_callback); if (!s->conn) { mbed_lwip_arena_dealloc(s); return NSAPI_ERROR_NO_SOCKET; } netconn_set_recvtimeout(s->conn, 1); *(struct lwip_socket **)handle = s; return 0; }
static int lwip_socket_open(nsapi_stack_t *stack, nsapi_socket_t *handle, nsapi_protocol_t proto) { struct lwip_socket *s = lwip_arena_alloc(); if (!s) { return NSAPI_ERROR_NO_SOCKET; } s->conn = netconn_new_with_callback( proto == NSAPI_TCP ? NETCONN_TCP : NETCONN_UDP, lwip_socket_callback); if (!s->conn) { lwip_arena_dealloc(s); return NSAPI_ERROR_NO_SOCKET; } netconn_set_recvtimeout(s->conn, 1); *(struct lwip_socket **)handle = s; return 0; }
static struct netconn * createServer(int port) { struct netconn * conn; err_t err; conn = netconn_new_with_callback(NETCONN_TCP, scpi_netconn_callback); if (conn == NULL) { return NULL; } err = netconn_bind(conn, NULL, port); if (err != ERR_OK) { netconn_delete(conn); return NULL; } netconn_listen(conn); return conn; }
void wanwuyun_task(void * pvParameters) { //创建Queue SENSOR_STRUCT *pRxSensorFrame; portBASE_TYPE xStatus; struct ip_addr WanWuYunIPaddr; static err_t err,recv_err; //网络相关结构体 struct netbuf *inbuf; uint8_t *buf; uint16_t buflen; //成功发送 = true,其他状态为 = false bool wan_send_success_flag = false; //创建Json的结构体 cJSON *DataUpReqJson, *RowJson, *DataUpResJson,*fld; char *DataOut; char double_string[]={0}; #if 0 cJSON *SignInReqJson ,*SignInResJson; SignInReqJson=cJSON_CreateObject(); cJSON_AddStringToObject(SignInReqJson, "username", "jackeyjiang"); cJSON_AddStringToObject(SignInReqJson, "accessid", "AMFJA2V5AMLHBMCXNDI5NZE2NDIXMTMW"); cJSON_AddStringToObject(SignInReqJson, "appid", "9785739981"); cJSON_AddStringToObject(SignInReqJson, "dev_id", "stm32_test"); DataOut = cJSON_Print(DataUpReqJson); cJSON_Delete(SignInReqJson); vPortFree(DataOut); DataUpReqJson=cJSON_CreateArray(); cJSON_AddItemToObject(DataUpReqJson,NULL,fld = cJSON_CreateObject()); cJSON_AddStringToObject(fld, "seckey", "HgqoOLTlav5jTsefyj3nL5AkRu8UAFRf"); cJSON_AddItemToObject(fld, "row", RowJson=cJSON_CreateObject()); cJSON_AddStringToObject(RowJson, "DEV_ID", "stm32_test"); cJSON_AddNumberToObject(RowJson, "TEMPERATURE", 12.5); cJSON_AddNumberToObject(RowJson, "LATITUDE", 12.7); cJSON_AddNumberToObject(RowJson, "LONGITUDE", 12.8); //转换数据为cJSON数据 DataOut = cJSON_Print(DataUpReqJson); cJSON_Delete(DataUpReqJson); printf("%s",DataOut); vPortFree(DataOut); //解析返回的Json数据 SignInResJson = cJSON_Parse(SignInResponse); if (!SignInResJson) vPrintString("Error before: [%s]\n",cJSON_GetErrorPtr()); else {}; DataUpResJson = cJSON_Parse(DataUpResponse); if (!DataUpResJson) vPrintString("Error before: [%s]\n",cJSON_GetErrorPtr()); else {}; #endif //创建传感器队列 pRxSensor_xQueue = xQueueCreate( 2, sizeof( struct _SENSOR_STRUCT * ) ); //建立短连接,接收到队列传过来的数据,将其打包成json数据传送到万物云。 IP4_ADDR( &WanWuYunIPaddr, WANWUYUN_IP_ADDR0, WANWUYUN_IP_ADDR1, WANWUYUN_IP_ADDR2, WANWUYUN_IP_ADDR3 ); while(1) { /* Create a new connection identifier. */ STM_EVAL_LEDOff(LED2); wanwuyun_clientconn = netconn_new_with_callback(NETCONN_TCP,wanwuyun_callback); //测试 if (wanwuyun_clientconn!=NULL) { /*built a connect to wanwuyun.com server*/ //netconn_set_nonblocking(wanwuyun_clientconn, 1); //测试 err = netconn_connect(wanwuyun_clientconn,&WanWuYunIPaddr,WANWUYUN_SERVER_PORT); if (err != ERR_OK) netconn_delete(wanwuyun_clientconn); else if (err == ERR_OK) { STM_EVAL_LEDOn(LED2); vPrintString("netconn_connect wanwuyun_clientconn\r\n"); /*timeout to wait for new data to be received <Avoid death etc.> */ netconn_set_sendtimeout(wanwuyun_clientconn,300); netconn_set_recvtimeout(wanwuyun_clientconn,700); while(!ERR_IS_FATAL(wanwuyun_clientconn->last_err)) { STM_EVAL_LEDToggle(LED3); xStatus = xQueueReceive(pRxSensor_xQueue,&(pRxSensorFrame),( portTickType ) 1 ); if(xStatus == pdPASS) { //提取结构体中的数据 DataUpReqJson=cJSON_CreateArray(); cJSON_AddItemToObject(DataUpReqJson,NULL,fld = cJSON_CreateObject()); cJSON_AddStringToObject(fld, "seckey", "HgqoOLTlav5jTsefyj3nL5AkRu8UAFRf"); cJSON_AddItemToObject(fld, "row", RowJson=cJSON_CreateObject()); cJSON_AddStringToObject(RowJson, "DEV_ID", "stm32_test"); sprintf(double_string,"%f",pRxSensorFrame->temperature[0]); cJSON_AddStringToObject(RowJson, "TEMPERATURE", double_string); sprintf(double_string,"%f",pRxSensorFrame->latitude[0]); cJSON_AddStringToObject(RowJson, "LATITUDE", double_string); sprintf(double_string,"%f",pRxSensorFrame->longitude[0]); cJSON_AddStringToObject(RowJson, "LONGITUDE", double_string); //转换数据为cJSON数据 DataOut = cJSON_Print(DataUpReqJson); //printf("%d",strlen(DataOut)); cJSON_Delete(DataUpReqJson); vPrintString("%s\r\n",DataOut); //vPortFree(DataOut); err=netconn_write(wanwuyun_clientconn,\ DataOut,strlen(DataOut),\ NETCONN_COPY); if(err != ERR_OK) { vPortFree(DataOut); vPrintString("StatuUploadReq erro code is %d\r\n",err); break; } else { wan_send_success_flag = true; //表示数据已经发送了 vPortFree(DataOut); } } //netconn_recved(wanwuyun_clientconn,100); //测试 recv_err = netconn_recv(wanwuyun_clientconn, &inbuf); if (recv_err == ERR_OK) { if (netconn_err(wanwuyun_clientconn) == ERR_OK) { netbuf_data(inbuf, (void**)&buf, &buflen); DataUpResJson = cJSON_Parse((char *)buf); DataOut = cJSON_Print(DataUpResJson); vPrintString("%s\r\n",DataOut); netbuf_delete(inbuf); wan_send_success_flag = false; //使用短链接,成功后跳出while(1) //break; } else { vPrintString("recv_err != ERR_OK \r\n"); } } #if 1 //测试当断开连接的时候的状态 else if((recv_err == ERR_TIMEOUT)&&(wan_send_success_flag == true)) { wan_send_success_flag = false; vPrintString("recv_err == %d\r\n",recv_err); netconn_close(wanwuyun_clientconn); netbuf_delete(inbuf); netconn_delete(wanwuyun_clientconn); //为发送的数据重新入队 xQueueSendToFront(pRxSensor_xQueue,&(pRxSensorFrame),( portTickType )1); break; } #endif } } } } }