}int tcpCreateSocket(int8u bindOption, int32u localIp, int16u port, int8u seq, int8u ssl) { int8u buf[9]; buf[0] = ssl; buf[1] = seq; buf[2] = bindOption; if (bindOption) { memcpy(buf+3, (uint8_t*)&localIp, 4); memcpy(buf+7, (uint8_t*)&port, 2); serial_transmit(CMD_ID_SNIC, buf, 9, ACK_NOT_REQUIRED); } else serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-tcpCreateSocket\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsCreateSocketResponsed) { IsCreateSocketResponsed = false; break; } mdelay(1); } return 0; }int closeSocket(int8u shortSocket, int8u seq)
}int udpCreateSocket(int8u bindOption, int32u ip, int16u port, int8u seq) { int8u buf[9]; buf[0] = SNIC_UDP_CREATE_SOCKET_REQ; buf[1] = seq; buf[2] = bindOption; if (bindOption) { int32u myip = swap32(ip); int16u myport = swap16(port); memcpy(buf+3, (int8u*)&myip, 4); memcpy(buf+7, (int8u*)&myport, 2); serial_transmit(CMD_ID_SNIC, buf, 9, ACK_NOT_REQUIRED); } else serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-udpCreateSocket\n\r"); while (1) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsCreateSocketResponsed) { IsCreateSocketResponsed = false; break; } mdelay(1); } return 0; }int udpSendFromSock(int32u ip, int16u iPort, int8u shortsock, int8u conMode, int8u *sendbuf, int16u len, int8u seq)
// 把nRF24L01+接收到的数据发到串口。 void interpreter_rf2serial(const void * rfData,uint8_t len) { uint8_t frameHead[] = {0x55,0xAA,0x00}; frameHead[2]=len; serial_transmit(frameHead,sizeof(frameHead)); serial_transmit(rfData,len); }
void WifiDisconn(int8u seq) { int8u payload[2]; payload[0] = WIFI_DISCONNECT_REQ; payload[1] = seq; serial_transmit(CMD_ID_WIFI, payload, 2, ACK_NOT_REQUIRED); }
//Turn off Wifi on SN8200 void WifiOff(int8u seq) { int8u payload[2]; payload[0] = WIFI_OFF_REQ; payload[1] = seq; serial_transmit(CMD_ID_WIFI, payload, 2, ACK_NOT_REQUIRED); }
}void WifiDisconn(int8u seq) { int8u buf[2]; buf[0] = WIFI_DISCONNECT_REQ; buf[1] = seq; serial_transmit(CMD_ID_WIFI, buf, 2, ACK_NOT_REQUIRED); printf("-WifiDisconn\n\r"); }void SnicInit(int8u seq)
}void SnicCleanup(int8u seq) { int8u buf[2]; buf[0] = SNIC_CLEANUP_REQ; buf[1] = seq; serial_transmit(CMD_ID_SNIC, buf, 2, ACK_NOT_REQUIRED); printf("-SnicCleanup\n\r"); }void SnicIPConfig(int8u seq)
}int sendFromSock(int8u shortSocket, int8u * sendBuf, int16u len, int8u timeout, int8u seq) { int8u buf[MAX_BUFFER_SIZE+6]; int16u mybufsize; if (len == 0 || len > MAX_BUFFER_SIZE) { len = MAX_BUFFER_SIZE; } buf[0] = SNIC_SEND_FROM_SOCKET_REQ; buf[1] = seq; buf[2] = shortSocket; buf[3] = 0; mybufsize = swap16(len); memcpy(buf+4, (int8u*)&mybufsize, 2); memcpy(buf+6, sendBuf, len); serial_transmit(CMD_ID_SNIC, buf, 6+len, ACK_NOT_REQUIRED); printf("-sendFromSock\n\r"); while (1) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsSNICSendFromSocketResponsed) { IsSNICSendFromSocketResponsed = false; break; } mdelay(1); } return 0; }int udpCreateSocket(int8u bindOption, int32u ip, int16u port, int8u seq)
}int tcpConnectToServer(int8u shortSock, int32u ip, int16u port, int16u bufsize, int8u timeout, int8u seq) { int8u buf[12]; if (bufsize == 0 || bufsize > MAX_BUFFER_SIZE) { bufsize = MAX_BUFFER_SIZE; } buf[0] = SNIC_TCP_CONNECT_TO_SERVER_REQ; buf[1] = seq; buf[2] = shortSock; memcpy(buf+3, (int8u*)&ip, 4); memcpy(buf+7, (int8u*)&port, 2); bufsize = swap16(bufsize); memcpy(buf+9, (int8u*)&bufsize, 2); buf[11] = timeout; serial_transmit(CMD_ID_SNIC, buf, 12, ACK_NOT_REQUIRED); printf("-tcpConnectToServer\n\r"); mdelay(1000); //Wait module return value while (1) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsSNICTCPConnectToServerResponsed) { IsSNICTCPConnectToServerResponsed = false; break; } mdelay(1); } return 0; }int tcpCreateConnection(int8u shortSock, int16u size, int8u maxClient, int8u seq)
}int udpSendFromSock(int32u ip, int16u iPort, int8u shortsock, int8u conMode, int8u *sendbuf, int16u len, int8u seq) { int8u buf[2048+12]; int16u mybufsize; if (len == 0 || len > MAX_BUFFER_SIZE) { len = MAX_BUFFER_SIZE; } buf[0] = SNIC_UDP_SEND_FROM_SOCKET_REQ; buf[1] = seq; memcpy(buf+2, (int8u*)&ip, 4); memcpy(buf+6, (int8u*)&iPort, 2); buf[8] = shortsock; buf[9] = conMode; mybufsize = swap16(len); memcpy(buf+10, (int8u*)&mybufsize, 2); memcpy(buf+12, sendbuf, len); serial_transmit(CMD_ID_SNIC, buf, 12+len, ACK_NOT_REQUIRED); printf("-udpSendFromSock\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(sendUDPDone) { sendUDPDone = 0; break; } mdelay(1); } return 0; }int udpStartRecv(int32u sock, int16u bufsize, int8u seq)
}int fillNSendHttpReq(int8u seq, char* domain, char* uri, char method, char* contentType, char* otherHeader, int contentLen, char* content, unsigned char timeout, char moreData, char isHttps) { char *ptr = NULL; int8u buf[1024]; int16u encodedLen = moreData?contentLen|0x8000:contentLen; memset(buf, 0, sizeof(buf)); buf[0] = SNIC_HTTP_REQ; buf[1] = seq; *((int16u*)&buf[2]) = 0x5000; //swapped buf[4] = method; buf[5] = timeout; if (isHttps) { buf[0] = SNIC_HTTPS_REQ; *((int16u*)&buf[2]) = 0xbb01; // 443 swapped } ptr = (char*)buf+6; ptr += sprintf(ptr, "%s", domain)+1; ptr += sprintf(ptr, "%s", uri)+1; ptr += sprintf(ptr, "%s", contentType)+1; ptr += sprintf(ptr, "%s", otherHeader)+1; *((int16u*)ptr) = swap16(encodedLen); ptr += 2; if (contentLen) memcpy(ptr, content, contentLen); serial_transmit(CMD_ID_SNIC, buf, ptr-(char*)buf+contentLen, ACK_NOT_REQUIRED); return 0; }/*add HttpMoreReq cmd*/
}void WifiOff(int8u seq) { int8u buf[2]; buf[0] = WIFI_OFF_REQ; buf[1] = seq; serial_transmit(CMD_ID_WIFI, buf, 2, ACK_NOT_REQUIRED); printf("-WifiOff\n\r"); }void ApOnOff(int8u seq)
//Turn on Wifi on SN8200 void WifiOn(int8u seq) { int8u payload[4]; payload[0] = WIFI_ON_REQ; payload[1] = seq; payload[2] = (char)'U'; //Country code payload[3] = (char)'S'; //Country code serial_transmit(CMD_ID_WIFI, payload, 4, ACK_NOT_REQUIRED); }
}void WifiScan(int8u seq) { int8u buf[12]; buf[0] = WIFI_SCAN_REQ; buf[1] = seq; memset(&buf[2], 0, 10); buf[3] = 2; // bss type = any serial_transmit(CMD_ID_WIFI, buf, 12, ACK_NOT_REQUIRED); printf("-WifiScan\n\r"); }void WifiJoin(int8u seq)
}void WifiOn(int8u seq) { int8u buf[4]; buf[0] = WIFI_ON_REQ; buf[1] = seq; buf[2] = (char)'U'; buf[3] = (char)'S'; serial_transmit(CMD_ID_WIFI, buf, 4, ACK_NOT_REQUIRED); printf("-WifiOn\n\r"); }void WifiOff(int8u seq)
}int closeSocket(int8u shortSocket, int8u seq) { int8u buf[3]; buf[0] = SNIC_CLOSE_SOCKET_REQ; buf[1] = seq; buf[2] = shortSocket; serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-closeSocket\n\r"); printf("Socket %d closed\n\r", shortSocket); return 0; }int tcpConnectToServer(int8u shortSock, int32u ip, int16u port, int16u bufsize, int8u timeout, int8u seq)
}void SnicInit(int8u seq) { int8u buf[4]; int tmp; tmp = 0x00; //The Default receive buffer size buf[0] = SNIC_INIT_REQ; buf[1] = seq; memcpy(buf+2, (uint8_t*)&tmp, 2); serial_transmit(CMD_ID_SNIC, buf, 4, ACK_NOT_REQUIRED); printf("-SnicInit\n\r"); }void SnicCleanup(int8u seq)
/*for(i=0; i<strlen(secKey); i++) { ch = secKey[i]; ch = SSID[i]; DBGU_RxBuffer[DBGU_RxBufferHead] = ch; USART_SendData(USART2, ch); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; } DBGU_RxBuffer[DBGU_RxBufferHead] = ch; USART_SendData(USART2, 0x0D); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; DBGU_InputReady = 1; escape = 1;*/ //Test_fgetc(); delay_ms(10); printf("\n\r"); Keylen = (unsigned char)strlen(secKey); if (Keylen <= 0) { printf("Invalid Key\n\r"); return; } } *p++ = secMode; *p++ = Keylen; if (Keylen) { memcpy(p, secKey, Keylen); p += Keylen; } serial_transmit(CMD_ID_WIFI, buf, (int)(p - buf), ACK_NOT_REQUIRED); printf("-WifiJoin\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsWIFIJoinResponsed) { IsWIFIJoinResponsed = false; printf("ttttttttttttt"); break; } delay_ms(10); } joinok = 0; }void WifiDisconn(int8u seq) { int8u buf[2]; buf[0] = WIFI_DISCONNECT_REQ; buf[1] = seq; serial_transmit(CMD_ID_WIFI, buf, 2, ACK_NOT_REQUIRED); printf("-WifiDisconn\n\r"); }void SnicInit(int8u seq) { int8u buf[4]; int tmp; tmp = 0x00; //The Default receive buffer size buf[0] = SNIC_INIT_REQ; buf[1] = seq; memcpy(buf+2, (uint8_t*)&tmp, 2); serial_transmit(CMD_ID_SNIC, buf, 4, ACK_NOT_REQUIRED); printf("-SnicInit\n\r"); }void SnicCleanup(int8u seq) { int8u buf[2]; buf[0] = SNIC_CLEANUP_REQ; buf[1] = seq; serial_transmit(CMD_ID_SNIC, buf, 2, ACK_NOT_REQUIRED); printf("-SnicCleanup\n\r"); }void SnicIPConfig(int8u seq) { int8u buf[16]; buf[0] = SNIC_IP_CONFIG_REQ; buf[1] = seq; buf[2] = 0; //STA buf[3] = 1; //DHCP serial_transmit(CMD_ID_SNIC, buf, 4, ACK_NOT_REQUIRED); printf("-SnicIPConfig\n\r"); timeout = 10000; while (timeout--) { if(1) { ProcessSN8200Input(); } if(IsSNICIPConfigResponsed) { IsSNICIPConfigResponsed = false; break; } mdelay(1); } }void SnicGetDhcp(int8u seq) { int8u buf[3]; char tempstr[2] = {0}; buf[0] = SNIC_GET_DHCP_INFO_REQ; buf[1] = seq; printf("\n\rInterface Type? (0: STA 1: AP) \n\r"); scanf("%s", tempstr); printf("\n\r"); buf[2] = atoi(tempstr); //buf[2] = 0; // STA 1; // AP serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-SnicGetDhcp\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsSNICGetDHCPInfoResponsed) { IsSNICGetDHCPInfoResponsed = false; break; } mdelay(1); } }int tcpCreateSocket(int8u bindOption, int32u localIp, int16u port, int8u seq, int8u ssl) { int8u buf[9]; buf[0] = ssl; buf[1] = seq; buf[2] = bindOption; if (bindOption) { memcpy(buf+3, (uint8_t*)&localIp, 4); memcpy(buf+7, (uint8_t*)&port, 2); serial_transmit(CMD_ID_SNIC, buf, 9, ACK_NOT_REQUIRED); } else serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-tcpCreateSocket\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsCreateSocketResponsed) { IsCreateSocketResponsed = false; break; } mdelay(1); } return 0; }int closeSocket(int8u shortSocket, int8u seq) { int8u buf[3]; buf[0] = SNIC_CLOSE_SOCKET_REQ; buf[1] = seq; buf[2] = shortSocket; serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-closeSocket\n\r"); printf("Socket %d closed\n\r", shortSocket); return 0; }int tcpConnectToServer(int8u shortSock, int32u ip, int16u port, int16u bufsize, int8u timeout, int8u seq) { int8u buf[12]; if (bufsize == 0 || bufsize > MAX_BUFFER_SIZE) { bufsize = MAX_BUFFER_SIZE; } buf[0] = SNIC_TCP_CONNECT_TO_SERVER_REQ; buf[1] = seq; buf[2] = shortSock; memcpy(buf+3, (int8u*)&ip, 4); memcpy(buf+7, (int8u*)&port, 2); bufsize = swap16(bufsize); memcpy(buf+9, (int8u*)&bufsize, 2); buf[11] = timeout; serial_transmit(CMD_ID_SNIC, buf, 12, ACK_NOT_REQUIRED); printf("-tcpConnectToServer\n\r"); mdelay(1000); //Wait module return value while (1) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsSNICTCPConnectToServerResponsed) { IsSNICTCPConnectToServerResponsed = false; break; } mdelay(1); } return 0; }int tcpCreateConnection(int8u shortSock, int16u size, int8u maxClient, int8u seq) { int8u buf[6]; if (size == 0 || size > MAX_BUFFER_SIZE) { size = MAX_BUFFER_SIZE; } if (maxClient == 0 || maxClient > MAX_CONNECTION_PER_SOCK) maxClient = MAX_CONNECTION_PER_SOCK; buf[0] = SNIC_TCP_CREATE_CONNECTION_REQ; buf[1] = seq; buf[2] = shortSock; size = swap16(size); memcpy(buf+3, (int8u*)&size, 2); buf[5] = maxClient; serial_transmit(CMD_ID_SNIC, buf, 6, ACK_NOT_REQUIRED); printf("-tcpCreateConnection\n\r"); return 0; }int sendFromSock(int8u shortSocket, int8u * sendBuf, int16u len, int8u timeout, int8u seq) { int8u buf[MAX_BUFFER_SIZE+6]; int16u mybufsize; if (len == 0 || len > MAX_BUFFER_SIZE) { len = MAX_BUFFER_SIZE; } buf[0] = SNIC_SEND_FROM_SOCKET_REQ; buf[1] = seq; buf[2] = shortSocket; buf[3] = 0; mybufsize = swap16(len); memcpy(buf+4, (int8u*)&mybufsize, 2); memcpy(buf+6, sendBuf, len); serial_transmit(CMD_ID_SNIC, buf, 6+len, ACK_NOT_REQUIRED); printf("-sendFromSock\n\r"); while (1) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsSNICSendFromSocketResponsed) { IsSNICSendFromSocketResponsed = false; break; } mdelay(1); } return 0; }int udpCreateSocket(int8u bindOption, int32u ip, int16u port, int8u seq) { int8u buf[9]; buf[0] = SNIC_UDP_CREATE_SOCKET_REQ; buf[1] = seq; buf[2] = bindOption; if (bindOption) { int32u myip = swap32(ip); int16u myport = swap16(port); memcpy(buf+3, (int8u*)&myip, 4); memcpy(buf+7, (int8u*)&myport, 2); serial_transmit(CMD_ID_SNIC, buf, 9, ACK_NOT_REQUIRED); } else serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-udpCreateSocket\n\r"); while (1) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsCreateSocketResponsed) { IsCreateSocketResponsed = false; break; } mdelay(1); } return 0; }int udpSendFromSock(int32u ip, int16u iPort, int8u shortsock, int8u conMode, int8u *sendbuf, int16u len, int8u seq) { int8u buf[2048+12]; int16u mybufsize; if (len == 0 || len > MAX_BUFFER_SIZE) { len = MAX_BUFFER_SIZE; } buf[0] = SNIC_UDP_SEND_FROM_SOCKET_REQ; buf[1] = seq; memcpy(buf+2, (int8u*)&ip, 4); memcpy(buf+6, (int8u*)&iPort, 2); buf[8] = shortsock; buf[9] = conMode; mybufsize = swap16(len); memcpy(buf+10, (int8u*)&mybufsize, 2); memcpy(buf+12, sendbuf, len); serial_transmit(CMD_ID_SNIC, buf, 12+len, ACK_NOT_REQUIRED); printf("-udpSendFromSock\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(sendUDPDone) { sendUDPDone = 0; break; } mdelay(1); } return 0; }int udpStartRecv(int32u sock, int16u bufsize, int8u seq) { int8u buf[5]; int tmp; if (bufsize ==0 || bufsize > MAX_BUFFER_SIZE) { bufsize = MAX_BUFFER_SIZE; } tmp = swap16(bufsize); buf[0] = SNIC_UDP_START_RECV_REQ; buf[1] = seq; buf[2] = sock; memcpy(buf+3, (int8u*)&tmp, 2); serial_transmit(CMD_ID_SNIC, buf, 5, ACK_NOT_REQUIRED); printf("-udpStartRecv\n\r"); return 0; }void ProcessSN8200Input(void) { rx_thread_proc(); }void handleRxWiFi(int8u* buf, int len) { int8u subCmdId = buf[0]; switch (subCmdId) { case WIFI_GET_STATUS_RSP: { IsWIFIGetStatusResponsed = true; if (buf[2] == MODE_WIFI_OFF) { printf("WiFi Off.\n\r"); } else { char val[20] = {0}; int i=0; for(i=0; i<6; i++) { sprintf(val+3*i, "%02X:", buf[3+i]); } val[strlen(val)-1] = 0; printf("WiFi On. Mac: %s. ", val); if (buf[2] == MODE_NO_NETWORK) { printf("Not joined any network.\n\r"); } else { printf("Joined SSID: %s\n\r", buf+9); } } } break; case WIFI_JOIN_RSP: { IsWIFIJoinResponsed = true; if (WIFI_SUCCESS == buf[2]) printf("Join success\n\r"); else printf("Join fail\n\r"); } break; case WIFI_AP_CTRL_RSP: { IsWIFIApCtrlResponsed = true; if (WIFI_SUCCESS == buf[2]) { if (APOnOff) printf("AP is ON\n\r"); else printf("AP is OFF\n\r"); } else printf("AP control fail\n\r"); } break; case WIFI_NETWORK_STATUS_IND: { if (WIFI_NETWORK_UP == buf[3]) { printf("Network UP\n\r"); joinok = 1; } else { printf("Network Down\n\r"); } } break; case WIFI_SCAN_RESULT_IND: { int cnt = buf[2]; int i=3; int j; int8u ch, sec_tmp; int8s rssi; int8u len=32; if(cnt == 0) { for (j = 0; j < totalscan; j++) { printf("SSID: %20s CH: %2d RSSI: %3d Sec: %d\n\r",sl[j].SSIDname, sl[j].ch,sl[j].rssi,sl[j].sectype); } memset(sl, 0, totalscan * sizeof(scanlist_t)); totalscan = 0; //reset current scan result } else { while (cnt--) { ch = buf[i++]; rssi = (int8s)buf[i++]; sec_tmp = buf[i++]; i += 6; i++; i += 2; len = (int8u)strlen((char*)buf+i); if (len>32) { break; } strcpy((char*)sl[totalscan].SSIDname,(char*)buf+i); sl[totalscan].ch = ch; sl[totalscan].rssi = rssi; sl[totalscan].sectype = sec_tmp; if (len == 0) { while (buf[i] == 0) i++; } else i += len+1; totalscan++; } } } break; default: break; } printf(".\n\r"); }void handleRxSNIC(uint8_t* buf, int len) { uint8_t subCmdId = buf[0]; static int times = 0; static int isPrintable = 0; switch (subCmdId) { case SNIC_CLOSE_SOCKET_RSP: { if (SNIC_SUCCESS != buf[2]) printf("Close socket failed\n\r"); else { printf("Socket closed\n\r"); } } break; case SNIC_IP_CONFIG_RSP: { IsSNICIPConfigResponsed = true; ipok = 0; if (SNIC_SUCCESS == buf[2]) { printf("IPConfig OK\n\r"); ipok = 1; } else printf("IPConfig fail\n\r"); } break; case SNIC_GET_DHCP_INFO_RSP: { IsSNICGetDHCPInfoResponsed = true; if (SNIC_SUCCESS == buf[2]) { printf("IP assigned as %i.%i.%i.%i \n\r", buf[9],buf[10],buf[11],buf[12]); //save IP memcpy(&selfIP, buf+9, 4); } else printf("IP not assigned\n\r"); } break; case SNIC_TCP_CREATE_SOCKET_RSP: case SNIC_TCP_CREATE_ADV_TLS_SOCKET_RSP: case SNIC_TCP_CREATE_SIMPLE_TLS_SOCKET_RSP: case SNIC_UDP_CREATE_SOCKET_RSP: { IsCreateSocketResponsed = true; if (SNIC_SUCCESS == buf[2]) { mysock = buf[3]; printf("Socket %d opened\n\r", mysock); } else printf("Socket creation failed\n\r"); } break; case SNIC_TCP_CONNECT_TO_SERVER_RSP: { IsSNICTCPConnectToServerResponsed = true; if (SNIC_CONNECT_TO_SERVER_PENDING == buf[2] || SNIC_SUCCESS == buf[2]) ; else printf("Unable to connect server\n\r"); } break; case SNIC_TCP_CREATE_CONNECTION_RSP: { if (SNIC_SUCCESS != buf[2]) printf("Unable to create TCP server\n\r"); } break; case SNIC_TCP_CONNECTION_STATUS_IND: { if (SNIC_CONNECTION_UP == buf[2]) { printf("Socket connection UP\n\r"); sockConnected = buf[3]; } else if (SNIC_CONNECTION_CLOSED == buf[2]) { printf("Socket %i closed\n\r", buf[3]); sockClosed = buf[3]; } } break; case SNIC_SEND_RSP: { int32u sentsize; IsSNICSendFromSocketResponsed = true; if (SNIC_SUCCESS == buf[2]) { pktcnt ++; sentsize = ((int32u)(buf[3] << 8) | (int32u)buf[4]); printf("pkt %d, %d bytes sent \n\r", pktcnt, sentsize); } } break; case SNIC_CONNECTION_RECV_IND: { int i=0; int32u sentsize = ((int32u)(buf[3] << 8) | (int32u)buf[4]); int32u sock = (int32u)buf[2]; printf("%d bytes received from socket %d \n\r", sentsize, sock); mdelay(10); if (strncmp((char*)buf+5, "GET /", 5) == 0 || strncmp((char*)buf+5, "POST /", 6) == 0) { // Receives a HTTP(S) get/post request. static int i=0; for (i=0; i<sentsize; i++) { printf("%c", buf[5+i]); } i = 0; sprintf(out, HTTP_RSP_STR, i++); // Send back something sendFromSock(sock, (int8u*)out, strlen(out), 2, seqNo++); // If it is a TLS server, it only accepts one connection, so // it is better for the host app to close it after some idle time for new connections. // Sleep(100); // closeSocket((int8u)sock,seqNo++); } else if (strncmp((char*)buf+5, "HTTP/1.", 7) == 0) { // Receives HTTP response, close socket. If the socket is not closed, for (i=0; i<sentsize; i++) { printf("%c", buf[5+i]); } // it can be used for more data communication (using send from socket). closeSocket((int8u)sock,seqNo++); } } break; case SNIC_TCP_CLIENT_SOCKET_IND: { int8u listen_sock = buf[2]; printf("Accepted connection from %i.%i.%i.%i\n\r", buf[4], buf[5], buf[6], buf[7]); printf("Connection socket: %d\n\r", buf[3]); } break; case SNIC_UDP_RECV_IND: { printf("%d %d\n\r", times++, htons(*((int16u*)&buf[9]))); } break; case SNIC_UDP_SEND_FROM_SOCKET_RSP: { IsSNICUDPSendFromSocketResponsed = true; if (SNIC_SUCCESS != buf[2]) { printf("UDP Send bad\n\r"); } sendUDPDone = 1; break; } case SNIC_HTTP_REQ|0x80: case SNIC_HTTPS_REQ|0x80: case SNIC_HTTP_MORE_REQ|0x80: { char *contentT = ""; unsigned short len = *((short*)&buf[4]); short contTLen = 0; unsigned short moreData = len & 0x8000; char more[10] = {0}; int8u seq = buf[1]; short status = *((short*)&buf[2]); status = swap16(status); len = swap16(len); if (subCmdId == (SNIC_HTTP_MORE_REQ|0x80)) strcpy(more, "more "); len &= 0x7fff; if (status >= 100) { contentT = (char*)&buf[6];; contTLen = strlen(contentT)+1; } if (status < 100) { printf("\nHTTP %sRSP code: %d, seq#: %d\n\r", more, status, seq); break; } printf("\nHTTP %sRSP code: %d, seq#: %d, Content Length: %d, Type: %s, More data: %s\n\r", more, status, seq, len, contentT, moreData?"yes":"no"); isPrintable = 0; if (contTLen && (strstr(contentT, "text") || strstr(contentT, "xml") || strstr(contentT, "javascript") || strstr(contentT, "html") || strstr(contentT, "json"))) { isPrintable = 1; buf[6+contTLen+len] = 0; printf("Content: \n%s\n\r", buf+6+contTLen); } } break; case SNIC_HTTP_RSP_IND: { int8u seq = buf[1]; unsigned short moreData; unsigned short len = *((short*)&buf[2]); len = swap16(len); moreData = len & 0x8000; len &= 0x7fff; printf("\nHTTP RSP indication, seq#: %d, content length: %d, More data: %s\n\r", seq, len, moreData?"yes":"no"); if (isPrintable) { buf[4+len] = 0; printf("Content: \n%s\n\r", buf+4); } } break; default: break; } printf(".\n\r"); }void SendSNIC(unsigned char *buf, int size) { const unsigned int IP = udpDestIP; int16u port = udpDestPort; sendUDPDone = 0; udpSendFromSock(IP, port, mysock, 0, buf, size, seqNo++); }int fillNSendHttpReq(int8u seq, char* domain, char* uri, char method, char* contentType, char* otherHeader, int contentLen, char* content, unsigned char timeout, char moreData, char isHttps) { char *ptr = NULL; int8u buf[1024]; int16u encodedLen = moreData?contentLen|0x8000:contentLen; memset(buf, 0, sizeof(buf)); buf[0] = SNIC_HTTP_REQ; buf[1] = seq; *((int16u*)&buf[2]) = 0x5000; //swapped buf[4] = method; buf[5] = timeout; if (isHttps) { buf[0] = SNIC_HTTPS_REQ; *((int16u*)&buf[2]) = 0xbb01; // 443 swapped } ptr = (char*)buf+6; ptr += sprintf(ptr, "%s", domain)+1; ptr += sprintf(ptr, "%s", uri)+1; ptr += sprintf(ptr, "%s", contentType)+1; ptr += sprintf(ptr, "%s", otherHeader)+1; *((int16u*)ptr) = swap16(encodedLen); ptr += 2; if (contentLen) memcpy(ptr, content, contentLen); serial_transmit(CMD_ID_SNIC, buf, ptr-(char*)buf+contentLen, ACK_NOT_REQUIRED); return 0; }/*add HttpMoreReq cmd*/ int fillNSendHttpMoreReq(int8u seq, int contentLen, char* content, char moreData) { int8u buf[1024]; int16u len = moreData?contentLen|0x8000:contentLen; buf[0] = SNIC_HTTP_MORE_REQ; buf[1] = seq; *((int16u*)&buf[2]) = swap16(len); if (contentLen+4 > sizeof(buf)) return -1; memcpy(&buf[4], content, contentLen); serial_transmit(CMD_ID_SNIC, buf, contentLen+4, ACK_NOT_REQUIRED); return 0; }
static int serial_handler(struct context *ctxt, void *arg) { struct serial_port *sp = (struct serial_port *) arg; unsigned char iir; unsigned char lsr; int boguscnt = ISR_LIMIT; while (1) { lsr = inp((unsigned short) (sp->iobase + UART_LSR)); // If receiver ready drain FIFO if (lsr & LSR_RXRDY) serial_receive(sp); // If transmitter ready send next bytes from tx queue if (lsr & LSR_TXRDY) serial_transmit(sp); // Get interrupt identification register iir = inp((unsigned short) (sp->iobase + UART_IIR)); //kprintf("[sisr %d %x]", sp->irq, iir); if (iir & IIR_NOPEND) break; switch (iir & IIR_IMASK) { case IIR_MLSC: // Modem status changed sp->msr = inp((unsigned short) (sp->iobase + UART_MSR)); sp->mlsc = 1; break; case IIR_RLS: // Line status changed sp->linestatus |= (lsr & (LSR_OE | LSR_PE | LSR_FE | LSR_BI)); sp->rls = 1; break; } if (--boguscnt < 0) { kprintf("serial: Too much work at interrupt, iir=0x%02x\n", iir); break; } } // Set OUT2 to enable interrupts outp(sp->iobase + UART_MCR, sp->mcr); queue_irq_dpc(&sp->dpc, serial_dpc, sp); eoi(sp->irq); return 0; }
}int udpStartRecv(int32u sock, int16u bufsize, int8u seq) { int8u buf[5]; int tmp; if (bufsize ==0 || bufsize > MAX_BUFFER_SIZE) { bufsize = MAX_BUFFER_SIZE; } tmp = swap16(bufsize); buf[0] = SNIC_UDP_START_RECV_REQ; buf[1] = seq; buf[2] = sock; memcpy(buf+3, (int8u*)&tmp, 2); serial_transmit(CMD_ID_SNIC, buf, 5, ACK_NOT_REQUIRED); printf("-udpStartRecv\n\r"); return 0; }void ProcessSN8200Input(void)
}int tcpCreateConnection(int8u shortSock, int16u size, int8u maxClient, int8u seq) { int8u buf[6]; if (size == 0 || size > MAX_BUFFER_SIZE) { size = MAX_BUFFER_SIZE; } if (maxClient == 0 || maxClient > MAX_CONNECTION_PER_SOCK) maxClient = MAX_CONNECTION_PER_SOCK; buf[0] = SNIC_TCP_CREATE_CONNECTION_REQ; buf[1] = seq; buf[2] = shortSock; size = swap16(size); memcpy(buf+3, (int8u*)&size, 2); buf[5] = maxClient; serial_transmit(CMD_ID_SNIC, buf, 6, ACK_NOT_REQUIRED); printf("-tcpCreateConnection\n\r"); return 0; }int sendFromSock(int8u shortSocket, int8u * sendBuf, int16u len, int8u timeout, int8u seq)
}void GetStatus(int8u seq) { int8u buf[4]; buf[0] = WIFI_GET_STATUS_REQ; buf[1] = seq; buf[2] = 0; serial_transmit(CMD_ID_WIFI, buf, 3, ACK_NOT_REQUIRED); printf("-GetStatus\n\r"); timeout = 10000; while (timeout--) { if(1) { ProcessSN8200Input(); } if(IsWIFIGetStatusResponsed) { IsWIFIGetStatusResponsed = false; break; } mdelay(1); } }void WifiOn(int8u seq)
}void SnicIPConfig(int8u seq) { int8u buf[16]; buf[0] = SNIC_IP_CONFIG_REQ; buf[1] = seq; buf[2] = 0; //STA buf[3] = 1; //DHCP serial_transmit(CMD_ID_SNIC, buf, 4, ACK_NOT_REQUIRED); printf("-SnicIPConfig\n\r"); timeout = 10000; while (timeout--) { if(1) { ProcessSN8200Input(); } if(IsSNICIPConfigResponsed) { IsSNICIPConfigResponsed = false; break; } mdelay(1); } }void SnicGetDhcp(int8u seq)
//Get the WiFi status from SN8200 void GetStatus(int8u seq) { int8u payload[4]; payload[0] = WIFI_GET_STATUS_REQ; payload[1] = seq; payload[2] = 1; // 0 STA ; 1 AP serial_transmit(CMD_ID_WIFI, payload, 3, ACK_NOT_REQUIRED); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsWIFIGetStatusResponsed) { IsWIFIGetStatusResponsed = false; break; } mdelay(1); } }
}void ApOnOff(int8u seq) { int8u buf[4]; APOnOff ^= 1; buf[0] = WIFI_AP_CTRL_REQ; buf[1] = seq; buf[2] = APOnOff; buf[3] = 0; //persistency hardcode set as 0 means NOT save to NVM serial_transmit(CMD_ID_WIFI, buf, 4, ACK_NOT_REQUIRED); printf("-AP status\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsWIFIApCtrlResponsed) { IsWIFIApCtrlResponsed = false; break; } mdelay(1); } }void WifiScan(int8u seq)
//Turn on or off the soft AP void ApOnOff(int8u OnOff, int8u seq) { int8u payload[4]; APOnOff = OnOff; payload[0] = WIFI_AP_CTRL_REQ; payload[1] = seq; payload[2] = APOnOff; payload[3] = 0; //persistency hardcode set as 0 means NOT save to NVM serial_transmit(CMD_ID_WIFI, payload, 4, ACK_NOT_REQUIRED); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsWIFIApCtrlResponsed) { IsWIFIApCtrlResponsed = false; break; } mdelay(1); } }
}void SnicGetDhcp(int8u seq) { int8u buf[3]; char tempstr[2] = {0}; buf[0] = SNIC_GET_DHCP_INFO_REQ; buf[1] = seq; printf("\n\rInterface Type? (0: STA 1: AP) \n\r"); scanf("%s", tempstr); printf("\n\r"); buf[2] = atoi(tempstr); //buf[2] = 0; // STA 1; // AP serial_transmit(CMD_ID_SNIC, buf, 3, ACK_NOT_REQUIRED); printf("-SnicGetDhcp\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsSNICGetDHCPInfoResponsed) { IsSNICGetDHCPInfoResponsed = false; break; } mdelay(1); } }int tcpCreateSocket(int8u bindOption, int32u localIp, int16u port, int8u seq, int8u ssl)
}void WifiJoin(int8u seq) { int i; uint8_t ch; int8u buf[128]; char tempstr[2] = {0}; int8u *p = buf; *p++ = WIFI_JOIN_REQ; *p++ = seq; strcpy(SSID,"Kwak0042"); /*for(i=0; i<strlen(SSID); i++) { ch = SSID[i]; DBGU_RxBuffer[DBGU_RxBufferHead] = ch; USART_SendData(USART2, ch); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; } DBGU_RxBuffer[DBGU_RxBufferHead] = ch; USART_SendData(USART2, 0x0D); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; DBGU_InputReady = 1; escape = 1;*/ //Test_fgetc(); printf("qweqwe"); printf("\n\r"); while(!strlen(SSID)) { printf("SSID can't be empty. Enter SSID:\n\r"); scanf("%s", SSID); printf("\n\r"); } printf("asdasdasdsa"); delay_ms(10); memcpy(p, SSID, strlen(SSID)); p += strlen(SSID); *p++ = 0x00; delay_ms(10); strcpy(tempstr,"6"); /*DBGU_RxBuffer[DBGU_RxBufferHead] = tempstr[0]; USART_SendData(USART2, tempstr[0]); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; DBGU_RxBuffer[DBGU_RxBufferHead] = tempstr[0]; USART_SendData(USART2, 0x0D); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; DBGU_InputReady = 1; escape = 1;*/ //Test_fgetc(); delay_ms(10); printf("\n\r"); secMode = atoi(tempstr); if (secMode) { strcpy(secKey,"aaaaaaaa"); /*for(i=0; i<strlen(secKey); i++) { ch = secKey[i]; ch = SSID[i]; DBGU_RxBuffer[DBGU_RxBufferHead] = ch; USART_SendData(USART2, ch); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; } DBGU_RxBuffer[DBGU_RxBufferHead] = ch; USART_SendData(USART2, 0x0D); DBGU_RxBufferHead = (DBGU_RxBufferHead + 1) % DBGU_RX_BUFFER_SIZE; DBGU_InputReady = 1; escape = 1;*/ //Test_fgetc(); delay_ms(10); printf("\n\r"); Keylen = (unsigned char)strlen(secKey); if (Keylen <= 0) { printf("Invalid Key\n\r"); return; } } *p++ = secMode; *p++ = Keylen; if (Keylen) { memcpy(p, secKey, Keylen); p += Keylen; } serial_transmit(CMD_ID_WIFI, buf, (int)(p - buf), ACK_NOT_REQUIRED); printf("-WifiJoin\n\r"); timeout = 10000; while (timeout--) { if(SN8200_API_HasInput()) { ProcessSN8200Input(); } if(IsWIFIJoinResponsed) { IsWIFIJoinResponsed = false; printf("ttttttttttttt"); break; } delay_ms(10); } joinok = 0; }void WifiDisconn(int8u seq)