Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: NNN50_WIFI_API
Fork of NNN50_WiFi_HelloWorld by
CLI_Source/wifi_cli.cpp@9:871fc0231c7f, 2017-09-14 (annotated)
- Committer:
- silviaChen
- Date:
- Thu Sep 14 01:48:08 2017 +0000
- Revision:
- 9:871fc0231c7f
Support both BLE UART service and WiFi CLI command
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
silviaChen | 9:871fc0231c7f | 1 | /** |
silviaChen | 9:871fc0231c7f | 2 | * File: wifi-cli.c |
silviaChen | 9:871fc0231c7f | 3 | * Description: WIFI CLI commands used by all applications WIFI of profile. |
silviaChen | 9:871fc0231c7f | 4 | * |
silviaChen | 9:871fc0231c7f | 5 | * Copyright 2015 by CYNTEC Corporation. All rights reserved. |
silviaChen | 9:871fc0231c7f | 6 | * Author: Lester Lee |
silviaChen | 9:871fc0231c7f | 7 | */ |
silviaChen | 9:871fc0231c7f | 8 | |
silviaChen | 9:871fc0231c7f | 9 | #include "wifi_cli.h" |
silviaChen | 9:871fc0231c7f | 10 | |
silviaChen | 9:871fc0231c7f | 11 | #define AP_SSID_MAX_LEN 33 |
silviaChen | 9:871fc0231c7f | 12 | #define AP_PW_MAX_LEN 64 |
silviaChen | 9:871fc0231c7f | 13 | #define STATIC_IP_MAX_LEN 15 |
silviaChen | 9:871fc0231c7f | 14 | #define TCP_SEND_MAX_LEN 1400 |
silviaChen | 9:871fc0231c7f | 15 | #define UDP_SEND_MAX_LEN 1400 |
silviaChen | 9:871fc0231c7f | 16 | #define DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 17 | #define WIFI_MAX_AP_NUMBER 15 |
silviaChen | 9:871fc0231c7f | 18 | |
silviaChen | 9:871fc0231c7f | 19 | // General configuration parameters |
silviaChen | 9:871fc0231c7f | 20 | WIFIDevice wifiDevice; |
silviaChen | 9:871fc0231c7f | 21 | EthernetInterface eth; |
silviaChen | 9:871fc0231c7f | 22 | TCPSocketConnection tcpConnect; |
silviaChen | 9:871fc0231c7f | 23 | UDPSocket udpSocket; |
silviaChen | 9:871fc0231c7f | 24 | Endpoint cliEndpoint; |
silviaChen | 9:871fc0231c7f | 25 | TCPSocketServer tcpServer; |
silviaChen | 9:871fc0231c7f | 26 | char static_ip[STATIC_IP_MAX_LEN] = "192.168.1.1"; |
silviaChen | 9:871fc0231c7f | 27 | extern Serial console; |
silviaChen | 9:871fc0231c7f | 28 | extern const char* cyntecCommandErrorNames[]; |
silviaChen | 9:871fc0231c7f | 29 | |
silviaChen | 9:871fc0231c7f | 30 | static uint8_t is_Listen = false; |
silviaChen | 9:871fc0231c7f | 31 | static tstrM2mWifiscanResult saveAP[WIFI_MAX_AP_NUMBER]; |
silviaChen | 9:871fc0231c7f | 32 | static bool wifiIniState = false; |
silviaChen | 9:871fc0231c7f | 33 | |
silviaChen | 9:871fc0231c7f | 34 | typedef struct deviceNetwork_s { |
silviaChen | 9:871fc0231c7f | 35 | char ap_ssid[AP_SSID_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 36 | char ap_pw[AP_PW_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 37 | uint8_t ap_sec; |
silviaChen | 9:871fc0231c7f | 38 | } deviceNetwork_t; |
silviaChen | 9:871fc0231c7f | 39 | deviceNetwork_t devNetwork[4]; // 0-2 for setNetwork, 3 for set_ap |
silviaChen | 9:871fc0231c7f | 40 | |
silviaChen | 9:871fc0231c7f | 41 | static uint8_t cyntecIsValidIP(uint8_t *startIdx, uint8_t totalLen) |
silviaChen | 9:871fc0231c7f | 42 | { |
silviaChen | 9:871fc0231c7f | 43 | uint8_t *ipIdx = startIdx; |
silviaChen | 9:871fc0231c7f | 44 | uint8_t *tempIdx = ipIdx; |
silviaChen | 9:871fc0231c7f | 45 | uint8_t IPAddr[3]; |
silviaChen | 9:871fc0231c7f | 46 | //uint8_t IPTokenLen = 0; |
silviaChen | 9:871fc0231c7f | 47 | int16_t ipToken; |
silviaChen | 9:871fc0231c7f | 48 | while ( (tempIdx - startIdx) <= totalLen ) { |
silviaChen | 9:871fc0231c7f | 49 | if (*tempIdx == '.' || ((tempIdx - startIdx) == totalLen)) { |
silviaChen | 9:871fc0231c7f | 50 | memset( IPAddr, 0, 3); |
silviaChen | 9:871fc0231c7f | 51 | memcpy( IPAddr, ipIdx, (tempIdx - ipIdx)); |
silviaChen | 9:871fc0231c7f | 52 | |
silviaChen | 9:871fc0231c7f | 53 | ipToken = atoi((const char *)IPAddr); |
silviaChen | 9:871fc0231c7f | 54 | if (ipToken > 255 || ipToken < 0) |
silviaChen | 9:871fc0231c7f | 55 | return 1; |
silviaChen | 9:871fc0231c7f | 56 | |
silviaChen | 9:871fc0231c7f | 57 | ipIdx = tempIdx + 1; |
silviaChen | 9:871fc0231c7f | 58 | } |
silviaChen | 9:871fc0231c7f | 59 | tempIdx++; |
silviaChen | 9:871fc0231c7f | 60 | } |
silviaChen | 9:871fc0231c7f | 61 | return 0; |
silviaChen | 9:871fc0231c7f | 62 | } |
silviaChen | 9:871fc0231c7f | 63 | |
silviaChen | 9:871fc0231c7f | 64 | static void cyntecPrintOk(void) |
silviaChen | 9:871fc0231c7f | 65 | { |
silviaChen | 9:871fc0231c7f | 66 | console.printf("\r\nOK\r\n\r\n"); |
silviaChen | 9:871fc0231c7f | 67 | } |
silviaChen | 9:871fc0231c7f | 68 | |
silviaChen | 9:871fc0231c7f | 69 | static void cyntecPrintError(uint8_t errIdx) |
silviaChen | 9:871fc0231c7f | 70 | { |
silviaChen | 9:871fc0231c7f | 71 | console.printf("\r\nERROR;%s\r\n\r\n",cyntecCommandErrorNames[errIdx]); |
silviaChen | 9:871fc0231c7f | 72 | } |
silviaChen | 9:871fc0231c7f | 73 | |
silviaChen | 9:871fc0231c7f | 74 | /////////**** WIFI Device Implement ****////////// |
silviaChen | 9:871fc0231c7f | 75 | static void cyn_wifi_device_sleep() |
silviaChen | 9:871fc0231c7f | 76 | { |
silviaChen | 9:871fc0231c7f | 77 | if (cyntecGetCommandTokenCnt() != 2) { |
silviaChen | 9:871fc0231c7f | 78 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 79 | return; |
silviaChen | 9:871fc0231c7f | 80 | } |
silviaChen | 9:871fc0231c7f | 81 | uint8_t err_code = wifiDevice.sleep(); |
silviaChen | 9:871fc0231c7f | 82 | if (err_code == 0) |
silviaChen | 9:871fc0231c7f | 83 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 84 | else { |
silviaChen | 9:871fc0231c7f | 85 | console.printf("ERROR;%d\r\n",err_code); |
silviaChen | 9:871fc0231c7f | 86 | return; |
silviaChen | 9:871fc0231c7f | 87 | } |
silviaChen | 9:871fc0231c7f | 88 | } |
silviaChen | 9:871fc0231c7f | 89 | |
silviaChen | 9:871fc0231c7f | 90 | static void cyn_wifi_device_network() |
silviaChen | 9:871fc0231c7f | 91 | { |
silviaChen | 9:871fc0231c7f | 92 | //if (wifiIniState == true) { |
silviaChen | 9:871fc0231c7f | 93 | // cyntecPrintError(CYNTEC_CMD_ERR_WRONG_CMD_ORDER); |
silviaChen | 9:871fc0231c7f | 94 | // return; |
silviaChen | 9:871fc0231c7f | 95 | // } |
silviaChen | 9:871fc0231c7f | 96 | if (cyntecGetCommandTokenCnt() == 6) { |
silviaChen | 9:871fc0231c7f | 97 | uint8_t argLen = 0; |
silviaChen | 9:871fc0231c7f | 98 | uint8_t *argSSID; |
silviaChen | 9:871fc0231c7f | 99 | uint8_t *argPW; |
silviaChen | 9:871fc0231c7f | 100 | uint8_t *argSec; |
silviaChen | 9:871fc0231c7f | 101 | uint8_t security = 0; |
silviaChen | 9:871fc0231c7f | 102 | uint8_t *argPriority; |
silviaChen | 9:871fc0231c7f | 103 | /* 0~2, 0 is highest */ |
silviaChen | 9:871fc0231c7f | 104 | uint8_t priority = 0; |
silviaChen | 9:871fc0231c7f | 105 | |
silviaChen | 9:871fc0231c7f | 106 | /* handle priority */ |
silviaChen | 9:871fc0231c7f | 107 | argPriority = cyntecGetCommandArgument(3, NULL); |
silviaChen | 9:871fc0231c7f | 108 | priority = atoi((const char*)argPriority); |
silviaChen | 9:871fc0231c7f | 109 | |
silviaChen | 9:871fc0231c7f | 110 | if(priority > 2) { |
silviaChen | 9:871fc0231c7f | 111 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 112 | return; |
silviaChen | 9:871fc0231c7f | 113 | } |
silviaChen | 9:871fc0231c7f | 114 | |
silviaChen | 9:871fc0231c7f | 115 | /* handle SSID */ |
silviaChen | 9:871fc0231c7f | 116 | argSSID = cyntecGetCommandArgument(0, &argLen); |
silviaChen | 9:871fc0231c7f | 117 | if ( argLen > AP_SSID_MAX_LEN ) { |
silviaChen | 9:871fc0231c7f | 118 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 119 | return; |
silviaChen | 9:871fc0231c7f | 120 | } |
silviaChen | 9:871fc0231c7f | 121 | memset( devNetwork[priority].ap_ssid , 0, AP_SSID_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 122 | memcpy( devNetwork[priority].ap_ssid, argSSID, argLen); |
silviaChen | 9:871fc0231c7f | 123 | |
silviaChen | 9:871fc0231c7f | 124 | /* handle Password */ |
silviaChen | 9:871fc0231c7f | 125 | argPW = cyntecGetCommandArgument(1, &argLen); |
silviaChen | 9:871fc0231c7f | 126 | if ( argLen > AP_PW_MAX_LEN ) { |
silviaChen | 9:871fc0231c7f | 127 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 128 | return; |
silviaChen | 9:871fc0231c7f | 129 | } |
silviaChen | 9:871fc0231c7f | 130 | memset( devNetwork[priority].ap_pw, 0, AP_PW_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 131 | memcpy( devNetwork[priority].ap_pw, argPW, argLen); |
silviaChen | 9:871fc0231c7f | 132 | |
silviaChen | 9:871fc0231c7f | 133 | /* handle security */ |
silviaChen | 9:871fc0231c7f | 134 | argSec = cyntecGetCommandArgument(2, &argLen); |
silviaChen | 9:871fc0231c7f | 135 | //security = atoi((const char*)argSec); |
silviaChen | 9:871fc0231c7f | 136 | char numSec[1]; |
silviaChen | 9:871fc0231c7f | 137 | memcpy( numSec, argSec, 1); |
silviaChen | 9:871fc0231c7f | 138 | security = atoi(numSec); |
silviaChen | 9:871fc0231c7f | 139 | |
silviaChen | 9:871fc0231c7f | 140 | if(security > 4) { |
silviaChen | 9:871fc0231c7f | 141 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 142 | return; |
silviaChen | 9:871fc0231c7f | 143 | } |
silviaChen | 9:871fc0231c7f | 144 | |
silviaChen | 9:871fc0231c7f | 145 | devNetwork[priority].ap_sec = security; |
silviaChen | 9:871fc0231c7f | 146 | |
silviaChen | 9:871fc0231c7f | 147 | /* call setup API */ |
silviaChen | 9:871fc0231c7f | 148 | wifiDevice.setNetwork(devNetwork[priority].ap_sec, devNetwork[priority].ap_ssid, devNetwork[priority].ap_pw, priority); |
silviaChen | 9:871fc0231c7f | 149 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 150 | } else { |
silviaChen | 9:871fc0231c7f | 151 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 152 | } |
silviaChen | 9:871fc0231c7f | 153 | } |
silviaChen | 9:871fc0231c7f | 154 | |
silviaChen | 9:871fc0231c7f | 155 | void scanCallback(tstrM2mWifiscanResult result) |
silviaChen | 9:871fc0231c7f | 156 | { |
silviaChen | 9:871fc0231c7f | 157 | console.printf("scanCallback\r\n"); |
silviaChen | 9:871fc0231c7f | 158 | console.printf("[%d], ", result.u8index); |
silviaChen | 9:871fc0231c7f | 159 | console.printf("%d, ", result.s8rssi); |
silviaChen | 9:871fc0231c7f | 160 | console.printf("%d, ", result.u8AuthType); |
silviaChen | 9:871fc0231c7f | 161 | console.printf("%d,", result.u8ch); |
silviaChen | 9:871fc0231c7f | 162 | for(int i=0;i<6;i++) { |
silviaChen | 9:871fc0231c7f | 163 | console.printf(" %02x", result.au8BSSID[i]); |
silviaChen | 9:871fc0231c7f | 164 | } |
silviaChen | 9:871fc0231c7f | 165 | |
silviaChen | 9:871fc0231c7f | 166 | console.printf(", "); |
silviaChen | 9:871fc0231c7f | 167 | console.printf("%s\r\n", result.au8SSID); |
silviaChen | 9:871fc0231c7f | 168 | } |
silviaChen | 9:871fc0231c7f | 169 | |
silviaChen | 9:871fc0231c7f | 170 | static void cyn_wifi_device_ap_scan() |
silviaChen | 9:871fc0231c7f | 171 | { |
silviaChen | 9:871fc0231c7f | 172 | if (wifiIniState == false) { |
silviaChen | 9:871fc0231c7f | 173 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_CMD_ORDER); |
silviaChen | 9:871fc0231c7f | 174 | return; |
silviaChen | 9:871fc0231c7f | 175 | } |
silviaChen | 9:871fc0231c7f | 176 | memset(saveAP,0,sizeof(saveAP)); |
silviaChen | 9:871fc0231c7f | 177 | int scanResult = 0; |
silviaChen | 9:871fc0231c7f | 178 | scanResult = wifiDevice.apScan(scanCallback); |
silviaChen | 9:871fc0231c7f | 179 | if (scanResult >= 0) { |
silviaChen | 9:871fc0231c7f | 180 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 181 | console.printf("scan AP number:%d\r\n",scanResult); |
silviaChen | 9:871fc0231c7f | 182 | #endif |
silviaChen | 9:871fc0231c7f | 183 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 184 | return; |
silviaChen | 9:871fc0231c7f | 185 | } else { |
silviaChen | 9:871fc0231c7f | 186 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 187 | return; |
silviaChen | 9:871fc0231c7f | 188 | } |
silviaChen | 9:871fc0231c7f | 189 | } |
silviaChen | 9:871fc0231c7f | 190 | |
silviaChen | 9:871fc0231c7f | 191 | static void cyn_wifi_set_ap() |
silviaChen | 9:871fc0231c7f | 192 | { |
silviaChen | 9:871fc0231c7f | 193 | if (cyntecGetCommandTokenCnt() != 6) { |
silviaChen | 9:871fc0231c7f | 194 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 195 | } |
silviaChen | 9:871fc0231c7f | 196 | uint8_t argLen = 0; |
silviaChen | 9:871fc0231c7f | 197 | uint8_t * argSSID; |
silviaChen | 9:871fc0231c7f | 198 | uint8_t * argPW; |
silviaChen | 9:871fc0231c7f | 199 | uint8_t * argSEC; |
silviaChen | 9:871fc0231c7f | 200 | uint8_t * argCH; |
silviaChen | 9:871fc0231c7f | 201 | |
silviaChen | 9:871fc0231c7f | 202 | /* handle SSID */ |
silviaChen | 9:871fc0231c7f | 203 | argSSID = cyntecGetCommandArgument(0, &argLen); |
silviaChen | 9:871fc0231c7f | 204 | if ( argLen > AP_SSID_MAX_LEN ) { |
silviaChen | 9:871fc0231c7f | 205 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 206 | return; |
silviaChen | 9:871fc0231c7f | 207 | } |
silviaChen | 9:871fc0231c7f | 208 | memset( devNetwork[3].ap_ssid , 0, AP_SSID_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 209 | memcpy( devNetwork[3].ap_ssid, argSSID, argLen); |
silviaChen | 9:871fc0231c7f | 210 | |
silviaChen | 9:871fc0231c7f | 211 | /* handle Password */ |
silviaChen | 9:871fc0231c7f | 212 | argPW = cyntecGetCommandArgument(1, &argLen); |
silviaChen | 9:871fc0231c7f | 213 | if ( argLen > AP_PW_MAX_LEN ) { |
silviaChen | 9:871fc0231c7f | 214 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 215 | return; |
silviaChen | 9:871fc0231c7f | 216 | } |
silviaChen | 9:871fc0231c7f | 217 | memset( devNetwork[3].ap_pw, 0, AP_PW_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 218 | memcpy( devNetwork[3].ap_pw, argPW, argLen); |
silviaChen | 9:871fc0231c7f | 219 | |
silviaChen | 9:871fc0231c7f | 220 | /* handle Security */ |
silviaChen | 9:871fc0231c7f | 221 | tenuM2mSecType setSec = M2M_WIFI_SEC_OPEN; |
silviaChen | 9:871fc0231c7f | 222 | argSEC = cyntecGetCommandArgument(2, &argLen); |
silviaChen | 9:871fc0231c7f | 223 | char numSec[argLen]; |
silviaChen | 9:871fc0231c7f | 224 | memcpy( numSec, argSEC, argLen); |
silviaChen | 9:871fc0231c7f | 225 | int sec = atoi(numSec); |
silviaChen | 9:871fc0231c7f | 226 | |
silviaChen | 9:871fc0231c7f | 227 | if(sec == 0) |
silviaChen | 9:871fc0231c7f | 228 | setSec = M2M_WIFI_SEC_OPEN; |
silviaChen | 9:871fc0231c7f | 229 | else if(sec == 1) |
silviaChen | 9:871fc0231c7f | 230 | setSec = M2M_WIFI_SEC_WEP; |
silviaChen | 9:871fc0231c7f | 231 | else { |
silviaChen | 9:871fc0231c7f | 232 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 233 | return; |
silviaChen | 9:871fc0231c7f | 234 | } |
silviaChen | 9:871fc0231c7f | 235 | |
silviaChen | 9:871fc0231c7f | 236 | /* handle Channel */ |
silviaChen | 9:871fc0231c7f | 237 | argCH = cyntecGetCommandArgument(3, &argLen); |
silviaChen | 9:871fc0231c7f | 238 | int setChan = atoi((char *)argCH); |
silviaChen | 9:871fc0231c7f | 239 | |
silviaChen | 9:871fc0231c7f | 240 | if (setChan > 14 || setChan < 1) { |
silviaChen | 9:871fc0231c7f | 241 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 242 | return; |
silviaChen | 9:871fc0231c7f | 243 | } |
silviaChen | 9:871fc0231c7f | 244 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 245 | console.printf("argSSID:%s\r\n",devNetwork[3].ap_ssid); |
silviaChen | 9:871fc0231c7f | 246 | console.printf("argPW:%s\r\n",devNetwork[3].ap_pw); |
silviaChen | 9:871fc0231c7f | 247 | console.printf("sec:%i\r\n",sec); |
silviaChen | 9:871fc0231c7f | 248 | console.printf("setChan:%i\r\n",setChan); |
silviaChen | 9:871fc0231c7f | 249 | #endif |
silviaChen | 9:871fc0231c7f | 250 | |
silviaChen | 9:871fc0231c7f | 251 | /* call Enable Access Point API */ |
silviaChen | 9:871fc0231c7f | 252 | if (wifiDevice.enableAccessPoint(devNetwork[3].ap_ssid, devNetwork[3].ap_pw, static_ip, setSec, setChan) != 0) |
silviaChen | 9:871fc0231c7f | 253 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 254 | else |
silviaChen | 9:871fc0231c7f | 255 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 256 | |
silviaChen | 9:871fc0231c7f | 257 | } |
silviaChen | 9:871fc0231c7f | 258 | |
silviaChen | 9:871fc0231c7f | 259 | /////////**** WIFI Ethernet Implement ****////////// |
silviaChen | 9:871fc0231c7f | 260 | static void cyn_wifi_ethernet_init() |
silviaChen | 9:871fc0231c7f | 261 | { |
silviaChen | 9:871fc0231c7f | 262 | uint8_t argLen = 0; |
silviaChen | 9:871fc0231c7f | 263 | uint8_t *argIP; |
silviaChen | 9:871fc0231c7f | 264 | //EthernetInterface ethInterface; |
silviaChen | 9:871fc0231c7f | 265 | uint8_t result; |
silviaChen | 9:871fc0231c7f | 266 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 267 | /* use DHCP to get IP */ |
silviaChen | 9:871fc0231c7f | 268 | result = eth.init(); |
silviaChen | 9:871fc0231c7f | 269 | if ( result == 0 ) { |
silviaChen | 9:871fc0231c7f | 270 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 271 | wifiIniState = true; |
silviaChen | 9:871fc0231c7f | 272 | } else { |
silviaChen | 9:871fc0231c7f | 273 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 274 | } |
silviaChen | 9:871fc0231c7f | 275 | |
silviaChen | 9:871fc0231c7f | 276 | } else if ( cyntecGetCommandTokenCnt() == 3 ) { |
silviaChen | 9:871fc0231c7f | 277 | /* use static to get IP */ |
silviaChen | 9:871fc0231c7f | 278 | argIP = cyntecGetCommandArgument(0, &argLen); |
silviaChen | 9:871fc0231c7f | 279 | |
silviaChen | 9:871fc0231c7f | 280 | if ( cyntecIsValidIP(argIP,argLen) != 0) { |
silviaChen | 9:871fc0231c7f | 281 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 282 | return; |
silviaChen | 9:871fc0231c7f | 283 | } |
silviaChen | 9:871fc0231c7f | 284 | |
silviaChen | 9:871fc0231c7f | 285 | memset( static_ip, 0, STATIC_IP_MAX_LEN); |
silviaChen | 9:871fc0231c7f | 286 | memcpy( static_ip, argIP, argLen); |
silviaChen | 9:871fc0231c7f | 287 | if ( eth.init((const char *)static_ip, NULL, NULL) == 0) { |
silviaChen | 9:871fc0231c7f | 288 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 289 | wifiIniState = true; |
silviaChen | 9:871fc0231c7f | 290 | } else |
silviaChen | 9:871fc0231c7f | 291 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 292 | } else { |
silviaChen | 9:871fc0231c7f | 293 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 294 | } |
silviaChen | 9:871fc0231c7f | 295 | |
silviaChen | 9:871fc0231c7f | 296 | return; |
silviaChen | 9:871fc0231c7f | 297 | } |
silviaChen | 9:871fc0231c7f | 298 | static void cyn_wifi_ethernet_connect() |
silviaChen | 9:871fc0231c7f | 299 | { |
silviaChen | 9:871fc0231c7f | 300 | int timeout_ms = 5000; |
silviaChen | 9:871fc0231c7f | 301 | uint8_t *argTimeout; |
silviaChen | 9:871fc0231c7f | 302 | //EthernetInterface ethInterface; |
silviaChen | 9:871fc0231c7f | 303 | if (cyntecGetCommandTokenCnt() != 2 & cyntecGetCommandTokenCnt() != 3) |
silviaChen | 9:871fc0231c7f | 304 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 305 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 306 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 307 | console.printf("\r\n"); |
silviaChen | 9:871fc0231c7f | 308 | console.printf("Connecting..., Waiting for 5000 ms..."); |
silviaChen | 9:871fc0231c7f | 309 | console.printf("\r\n\r\n"); |
silviaChen | 9:871fc0231c7f | 310 | #endif |
silviaChen | 9:871fc0231c7f | 311 | if (eth.connect() == 0 ) |
silviaChen | 9:871fc0231c7f | 312 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 313 | else |
silviaChen | 9:871fc0231c7f | 314 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 315 | } |
silviaChen | 9:871fc0231c7f | 316 | if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 317 | argTimeout = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 318 | timeout_ms = atoi((const char*)argTimeout); |
silviaChen | 9:871fc0231c7f | 319 | |
silviaChen | 9:871fc0231c7f | 320 | if (timeout_ms < 0) { |
silviaChen | 9:871fc0231c7f | 321 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 322 | return; |
silviaChen | 9:871fc0231c7f | 323 | } |
silviaChen | 9:871fc0231c7f | 324 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 325 | console.printf("\r\nConnecting..., Waiting for "); |
silviaChen | 9:871fc0231c7f | 326 | console.printf((char*)argTimeout); |
silviaChen | 9:871fc0231c7f | 327 | console.printf(" ms...\r\n\r\n"); |
silviaChen | 9:871fc0231c7f | 328 | #endif |
silviaChen | 9:871fc0231c7f | 329 | if (eth.connect(timeout_ms) == 0 ) |
silviaChen | 9:871fc0231c7f | 330 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 331 | else |
silviaChen | 9:871fc0231c7f | 332 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 333 | } |
silviaChen | 9:871fc0231c7f | 334 | return; |
silviaChen | 9:871fc0231c7f | 335 | } |
silviaChen | 9:871fc0231c7f | 336 | static void cyn_wifi_ethernet_disconnect() |
silviaChen | 9:871fc0231c7f | 337 | { |
silviaChen | 9:871fc0231c7f | 338 | if (eth.disconnect() == 0) |
silviaChen | 9:871fc0231c7f | 339 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 340 | else |
silviaChen | 9:871fc0231c7f | 341 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 342 | } |
silviaChen | 9:871fc0231c7f | 343 | static void cyn_wifi_ethernet_mac() |
silviaChen | 9:871fc0231c7f | 344 | { |
silviaChen | 9:871fc0231c7f | 345 | char mac_addr[19]; |
silviaChen | 9:871fc0231c7f | 346 | memset(mac_addr, 0, 19); |
silviaChen | 9:871fc0231c7f | 347 | memcpy(mac_addr, eth.getMACAddress(), 19); |
silviaChen | 9:871fc0231c7f | 348 | |
silviaChen | 9:871fc0231c7f | 349 | console.printf("\r\nOK;%s\r\n\r\n",mac_addr); |
silviaChen | 9:871fc0231c7f | 350 | |
silviaChen | 9:871fc0231c7f | 351 | return; |
silviaChen | 9:871fc0231c7f | 352 | } |
silviaChen | 9:871fc0231c7f | 353 | static void cyn_wifi_ethernet_ip() |
silviaChen | 9:871fc0231c7f | 354 | { |
silviaChen | 9:871fc0231c7f | 355 | char ip_addr[15] = "\0"; |
silviaChen | 9:871fc0231c7f | 356 | memset(ip_addr, 0, 15); |
silviaChen | 9:871fc0231c7f | 357 | memcpy(ip_addr, eth.getIPAddress(), 15); |
silviaChen | 9:871fc0231c7f | 358 | |
silviaChen | 9:871fc0231c7f | 359 | console.printf("\r\nOK;%s\r\n\r\n",ip_addr); |
silviaChen | 9:871fc0231c7f | 360 | |
silviaChen | 9:871fc0231c7f | 361 | return; |
silviaChen | 9:871fc0231c7f | 362 | } |
silviaChen | 9:871fc0231c7f | 363 | |
silviaChen | 9:871fc0231c7f | 364 | static void cyn_wifi_ethernet_isConnected() |
silviaChen | 9:871fc0231c7f | 365 | { |
silviaChen | 9:871fc0231c7f | 366 | bool is_connected = false; |
silviaChen | 9:871fc0231c7f | 367 | is_connected = wifiDevice.is_AP_connected(); |
silviaChen | 9:871fc0231c7f | 368 | |
silviaChen | 9:871fc0231c7f | 369 | if (is_connected == true) |
silviaChen | 9:871fc0231c7f | 370 | console.printf("\r\nOK;TRUE\r\n\r\n"); |
silviaChen | 9:871fc0231c7f | 371 | else |
silviaChen | 9:871fc0231c7f | 372 | console.printf("\r\nOK;FALSE\r\n\r\n"); |
silviaChen | 9:871fc0231c7f | 373 | } |
silviaChen | 9:871fc0231c7f | 374 | |
silviaChen | 9:871fc0231c7f | 375 | /////////**** WIFI TCP Socket Server Implement ****////////// |
silviaChen | 9:871fc0231c7f | 376 | static void cyn_wifi_tcp_server_bind() |
silviaChen | 9:871fc0231c7f | 377 | { |
silviaChen | 9:871fc0231c7f | 378 | int port = 1; |
silviaChen | 9:871fc0231c7f | 379 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 380 | if (tcpServer.bind(port) == 0) |
silviaChen | 9:871fc0231c7f | 381 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 382 | else |
silviaChen | 9:871fc0231c7f | 383 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 384 | |
silviaChen | 9:871fc0231c7f | 385 | } else if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 386 | port = atoi((const char*)(cyntecGetCommandArgument(0, NULL))); |
silviaChen | 9:871fc0231c7f | 387 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 388 | console.printf("port:%i\r\n",port); |
silviaChen | 9:871fc0231c7f | 389 | #endif |
silviaChen | 9:871fc0231c7f | 390 | if (port < 0) { |
silviaChen | 9:871fc0231c7f | 391 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 392 | return; |
silviaChen | 9:871fc0231c7f | 393 | } |
silviaChen | 9:871fc0231c7f | 394 | |
silviaChen | 9:871fc0231c7f | 395 | if ( tcpServer.bind(port) == 0 ) |
silviaChen | 9:871fc0231c7f | 396 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 397 | else |
silviaChen | 9:871fc0231c7f | 398 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 399 | |
silviaChen | 9:871fc0231c7f | 400 | } else { |
silviaChen | 9:871fc0231c7f | 401 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 402 | } |
silviaChen | 9:871fc0231c7f | 403 | } |
silviaChen | 9:871fc0231c7f | 404 | static void cyn_wifi_tcp_server_listen() |
silviaChen | 9:871fc0231c7f | 405 | { |
silviaChen | 9:871fc0231c7f | 406 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 407 | if ( tcpServer.listen() == 0 ) { |
silviaChen | 9:871fc0231c7f | 408 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 409 | is_Listen = true; |
silviaChen | 9:871fc0231c7f | 410 | } else |
silviaChen | 9:871fc0231c7f | 411 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 412 | } else { |
silviaChen | 9:871fc0231c7f | 413 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 414 | } |
silviaChen | 9:871fc0231c7f | 415 | } |
silviaChen | 9:871fc0231c7f | 416 | static void cyn_wifi_tcp_server_accept() |
silviaChen | 9:871fc0231c7f | 417 | { |
silviaChen | 9:871fc0231c7f | 418 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 419 | if (is_Listen == false) { |
silviaChen | 9:871fc0231c7f | 420 | cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); |
silviaChen | 9:871fc0231c7f | 421 | return; |
silviaChen | 9:871fc0231c7f | 422 | } |
silviaChen | 9:871fc0231c7f | 423 | |
silviaChen | 9:871fc0231c7f | 424 | if ( tcpServer.accept(tcpConnect) == 0 ) { |
silviaChen | 9:871fc0231c7f | 425 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 426 | is_Listen = false; |
silviaChen | 9:871fc0231c7f | 427 | } else |
silviaChen | 9:871fc0231c7f | 428 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 429 | |
silviaChen | 9:871fc0231c7f | 430 | } else { |
silviaChen | 9:871fc0231c7f | 431 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 432 | } |
silviaChen | 9:871fc0231c7f | 433 | } |
silviaChen | 9:871fc0231c7f | 434 | static void cyn_wifi_tcp_server_blocking() |
silviaChen | 9:871fc0231c7f | 435 | { |
silviaChen | 9:871fc0231c7f | 436 | bool blocking = false; |
silviaChen | 9:871fc0231c7f | 437 | unsigned int timeout; |
silviaChen | 9:871fc0231c7f | 438 | |
silviaChen | 9:871fc0231c7f | 439 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 440 | |
silviaChen | 9:871fc0231c7f | 441 | if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 442 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 443 | if (arg[0] == '1') |
silviaChen | 9:871fc0231c7f | 444 | blocking = true; |
silviaChen | 9:871fc0231c7f | 445 | |
silviaChen | 9:871fc0231c7f | 446 | tcpServer.set_blocking(blocking, 1500); |
silviaChen | 9:871fc0231c7f | 447 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 448 | |
silviaChen | 9:871fc0231c7f | 449 | } else if (cyntecGetCommandTokenCnt() == 4) { |
silviaChen | 9:871fc0231c7f | 450 | |
silviaChen | 9:871fc0231c7f | 451 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 452 | if (arg[0] == '1') |
silviaChen | 9:871fc0231c7f | 453 | blocking = true; |
silviaChen | 9:871fc0231c7f | 454 | |
silviaChen | 9:871fc0231c7f | 455 | arg = cyntecGetCommandArgument(1, NULL); |
silviaChen | 9:871fc0231c7f | 456 | timeout = (unsigned int)atoi((const char *)arg); |
silviaChen | 9:871fc0231c7f | 457 | |
silviaChen | 9:871fc0231c7f | 458 | tcpServer.set_blocking(blocking, timeout); |
silviaChen | 9:871fc0231c7f | 459 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 460 | |
silviaChen | 9:871fc0231c7f | 461 | } else { |
silviaChen | 9:871fc0231c7f | 462 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 463 | } |
silviaChen | 9:871fc0231c7f | 464 | } |
silviaChen | 9:871fc0231c7f | 465 | static void cyn_wifi_tcp_server_close() |
silviaChen | 9:871fc0231c7f | 466 | { |
silviaChen | 9:871fc0231c7f | 467 | bool shutdown = true; |
silviaChen | 9:871fc0231c7f | 468 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 469 | |
silviaChen | 9:871fc0231c7f | 470 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 471 | if ( tcpServer.close(shutdown) == 0 ) |
silviaChen | 9:871fc0231c7f | 472 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 473 | else |
silviaChen | 9:871fc0231c7f | 474 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 475 | |
silviaChen | 9:871fc0231c7f | 476 | } else if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 477 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 478 | if (arg[0] == '0') |
silviaChen | 9:871fc0231c7f | 479 | shutdown = false; |
silviaChen | 9:871fc0231c7f | 480 | |
silviaChen | 9:871fc0231c7f | 481 | if ( tcpServer.close(shutdown) == 0 ) |
silviaChen | 9:871fc0231c7f | 482 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 483 | else |
silviaChen | 9:871fc0231c7f | 484 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 485 | |
silviaChen | 9:871fc0231c7f | 486 | } else { |
silviaChen | 9:871fc0231c7f | 487 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 488 | } |
silviaChen | 9:871fc0231c7f | 489 | } |
silviaChen | 9:871fc0231c7f | 490 | /////////**** WIFI TCP Socket Connection ****////////// |
silviaChen | 9:871fc0231c7f | 491 | static void cyn_wifi_tcp_connection_connect() |
silviaChen | 9:871fc0231c7f | 492 | { |
silviaChen | 9:871fc0231c7f | 493 | uint8_t connect_ip[STATIC_IP_MAX_LEN]; |
silviaChen | 9:871fc0231c7f | 494 | int port; |
silviaChen | 9:871fc0231c7f | 495 | |
silviaChen | 9:871fc0231c7f | 496 | uint8_t argLen = 0; |
silviaChen | 9:871fc0231c7f | 497 | uint8_t *argIP; |
silviaChen | 9:871fc0231c7f | 498 | |
silviaChen | 9:871fc0231c7f | 499 | if (cyntecGetCommandTokenCnt() == 4) { |
silviaChen | 9:871fc0231c7f | 500 | /* handle IP arg */ |
silviaChen | 9:871fc0231c7f | 501 | argIP = cyntecGetCommandArgument(0, &argLen); |
silviaChen | 9:871fc0231c7f | 502 | memset( connect_ip, 0, STATIC_IP_MAX_LEN); |
silviaChen | 9:871fc0231c7f | 503 | memcpy( connect_ip, argIP, argLen); |
silviaChen | 9:871fc0231c7f | 504 | |
silviaChen | 9:871fc0231c7f | 505 | /* handle Port arg */ |
silviaChen | 9:871fc0231c7f | 506 | port = atoi((const char *)cyntecGetCommandArgument(1, NULL)); |
silviaChen | 9:871fc0231c7f | 507 | |
silviaChen | 9:871fc0231c7f | 508 | if ( tcpConnect.connect((const char *)connect_ip, port) == 0 ) |
silviaChen | 9:871fc0231c7f | 509 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 510 | else |
silviaChen | 9:871fc0231c7f | 511 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 512 | |
silviaChen | 9:871fc0231c7f | 513 | } else { |
silviaChen | 9:871fc0231c7f | 514 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 515 | } |
silviaChen | 9:871fc0231c7f | 516 | } |
silviaChen | 9:871fc0231c7f | 517 | static void cyn_wifi_tcp_connection_is_connected() |
silviaChen | 9:871fc0231c7f | 518 | { |
silviaChen | 9:871fc0231c7f | 519 | bool is_connected = false; |
silviaChen | 9:871fc0231c7f | 520 | is_connected = tcpConnect.is_connected(); |
silviaChen | 9:871fc0231c7f | 521 | |
silviaChen | 9:871fc0231c7f | 522 | if (is_connected == true) |
silviaChen | 9:871fc0231c7f | 523 | console.printf("\r\nOK;TRUE\r\n\r\n"); |
silviaChen | 9:871fc0231c7f | 524 | else |
silviaChen | 9:871fc0231c7f | 525 | console.printf("\r\nOK;FALSE\r\n\r\n"); |
silviaChen | 9:871fc0231c7f | 526 | } |
silviaChen | 9:871fc0231c7f | 527 | |
silviaChen | 9:871fc0231c7f | 528 | static void cyn_wifi_tcp_connection_send() |
silviaChen | 9:871fc0231c7f | 529 | { |
silviaChen | 9:871fc0231c7f | 530 | char msg[TCP_SEND_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 531 | int sendData; |
silviaChen | 9:871fc0231c7f | 532 | uint8_t * argAllBuf = cyntecGetCommandTotalBuffer(); |
silviaChen | 9:871fc0231c7f | 533 | int sendLen = 0; // Maximum 1400 |
silviaChen | 9:871fc0231c7f | 534 | uint8_t sendLenCharNum = 0; // Maximum 4 |
silviaChen | 9:871fc0231c7f | 535 | uint8_t *argLeng = cyntecGetCommandArgument(0,&sendLenCharNum); |
silviaChen | 9:871fc0231c7f | 536 | sendLen = cyntecAtoi(argLeng,sendLenCharNum); |
silviaChen | 9:871fc0231c7f | 537 | //sendLen = cyntecAtoInt(argLeng); |
silviaChen | 9:871fc0231c7f | 538 | console.printf("len:%d\r\n", sendLen); |
silviaChen | 9:871fc0231c7f | 539 | if (sendLen > TCP_SEND_MAX_LEN || sendLen < 0) { |
silviaChen | 9:871fc0231c7f | 540 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 541 | return; |
silviaChen | 9:871fc0231c7f | 542 | } |
silviaChen | 9:871fc0231c7f | 543 | if (cyntecGetCommandTokenCnt() <4 ) { |
silviaChen | 9:871fc0231c7f | 544 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 545 | return; |
silviaChen | 9:871fc0231c7f | 546 | } |
silviaChen | 9:871fc0231c7f | 547 | if (cyntecGetCommandTokenCnt() >= 4) { |
silviaChen | 9:871fc0231c7f | 548 | if ( tcpConnect.is_connected() == false ) { |
silviaChen | 9:871fc0231c7f | 549 | cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); |
silviaChen | 9:871fc0231c7f | 550 | return; |
silviaChen | 9:871fc0231c7f | 551 | } |
silviaChen | 9:871fc0231c7f | 552 | |
silviaChen | 9:871fc0231c7f | 553 | /* handle Message arg */ |
silviaChen | 9:871fc0231c7f | 554 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 555 | console.printf("sendLen:%i,Buf:%s,Index:%i\r\n",sendLen,&argAllBuf[26+sendLenCharNum],cyntecGetTotalIndex()); |
silviaChen | 9:871fc0231c7f | 556 | #endif |
silviaChen | 9:871fc0231c7f | 557 | memset( msg, 0, TCP_SEND_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 558 | for (uint8_t i=0; i<sendLen; i++) |
silviaChen | 9:871fc0231c7f | 559 | msg[i] = argAllBuf[26+sendLenCharNum+i]; |
silviaChen | 9:871fc0231c7f | 560 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 561 | console.printf("msg:%s\r\n",msg); |
silviaChen | 9:871fc0231c7f | 562 | #endif |
silviaChen | 9:871fc0231c7f | 563 | sendData = tcpConnect.send(msg, sendLen); |
silviaChen | 9:871fc0231c7f | 564 | if ( sendData >= 0 ) { |
silviaChen | 9:871fc0231c7f | 565 | console.printf("\r\nOK;"); |
silviaChen | 9:871fc0231c7f | 566 | console.printf("%i\r\n\r\n",sendData); |
silviaChen | 9:871fc0231c7f | 567 | } else |
silviaChen | 9:871fc0231c7f | 568 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 569 | } |
silviaChen | 9:871fc0231c7f | 570 | } |
silviaChen | 9:871fc0231c7f | 571 | |
silviaChen | 9:871fc0231c7f | 572 | static void cyn_wifi_tcp_connection_send_all() |
silviaChen | 9:871fc0231c7f | 573 | { |
silviaChen | 9:871fc0231c7f | 574 | char msg[TCP_SEND_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 575 | int sendData; |
silviaChen | 9:871fc0231c7f | 576 | uint8_t * argAllBuf = cyntecGetCommandTotalBuffer(); |
silviaChen | 9:871fc0231c7f | 577 | int sendLen = 0; // Maximum 1400 |
silviaChen | 9:871fc0231c7f | 578 | uint8_t sendLenCharNum = 0; // Maximum 4 |
silviaChen | 9:871fc0231c7f | 579 | uint8_t *argLeng = cyntecGetCommandArgument(0,&sendLenCharNum); |
silviaChen | 9:871fc0231c7f | 580 | sendLen = cyntecAtoi(argLeng,sendLenCharNum); |
silviaChen | 9:871fc0231c7f | 581 | if (sendLen > TCP_SEND_MAX_LEN) { |
silviaChen | 9:871fc0231c7f | 582 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 583 | return; |
silviaChen | 9:871fc0231c7f | 584 | } |
silviaChen | 9:871fc0231c7f | 585 | if (cyntecGetCommandTokenCnt() <4 ) { |
silviaChen | 9:871fc0231c7f | 586 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 587 | return; |
silviaChen | 9:871fc0231c7f | 588 | } |
silviaChen | 9:871fc0231c7f | 589 | if (cyntecGetCommandTokenCnt() >= 4) { |
silviaChen | 9:871fc0231c7f | 590 | if ( tcpConnect.is_connected() == false ) { |
silviaChen | 9:871fc0231c7f | 591 | cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); |
silviaChen | 9:871fc0231c7f | 592 | return; |
silviaChen | 9:871fc0231c7f | 593 | } |
silviaChen | 9:871fc0231c7f | 594 | |
silviaChen | 9:871fc0231c7f | 595 | /* handle Message arg */ |
silviaChen | 9:871fc0231c7f | 596 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 597 | console.printf("sendLen:%i,Buf:%s,Index:%i\r\n",sendLen,&argAllBuf[30+sendLenCharNum],cyntecGetTotalIndex()); |
silviaChen | 9:871fc0231c7f | 598 | #endif |
silviaChen | 9:871fc0231c7f | 599 | memset( msg, 0, TCP_SEND_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 600 | for (uint8_t i=0; i<sendLen; i++) |
silviaChen | 9:871fc0231c7f | 601 | msg[i] = argAllBuf[30+sendLenCharNum+i]; |
silviaChen | 9:871fc0231c7f | 602 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 603 | console.printf("msg:%s\r\n",msg); |
silviaChen | 9:871fc0231c7f | 604 | #endif |
silviaChen | 9:871fc0231c7f | 605 | sendData = tcpConnect.send_all(msg, sendLen); |
silviaChen | 9:871fc0231c7f | 606 | if ( sendData >= 0 ) { |
silviaChen | 9:871fc0231c7f | 607 | console.printf("\r\nOK;"); |
silviaChen | 9:871fc0231c7f | 608 | console.printf("%i\r\n\r\n",sendData); |
silviaChen | 9:871fc0231c7f | 609 | } else |
silviaChen | 9:871fc0231c7f | 610 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 611 | } |
silviaChen | 9:871fc0231c7f | 612 | } |
silviaChen | 9:871fc0231c7f | 613 | |
silviaChen | 9:871fc0231c7f | 614 | static void cyn_wifi_tcp_connection_receive() |
silviaChen | 9:871fc0231c7f | 615 | { |
silviaChen | 9:871fc0231c7f | 616 | char msg[TCP_SEND_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 617 | int argLen = 0; |
silviaChen | 9:871fc0231c7f | 618 | |
silviaChen | 9:871fc0231c7f | 619 | if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 620 | /* handle Message arg */ |
silviaChen | 9:871fc0231c7f | 621 | argLen = atoi((const char *)cyntecGetCommandArgument(0, NULL)); |
silviaChen | 9:871fc0231c7f | 622 | //console.printf("argLen:%d\r\n",argLen); |
silviaChen | 9:871fc0231c7f | 623 | if (argLen > TCP_SEND_MAX_LEN || argLen < 0) { |
silviaChen | 9:871fc0231c7f | 624 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 625 | return; |
silviaChen | 9:871fc0231c7f | 626 | } |
silviaChen | 9:871fc0231c7f | 627 | |
silviaChen | 9:871fc0231c7f | 628 | memset( msg, 0, TCP_SEND_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 629 | |
silviaChen | 9:871fc0231c7f | 630 | if ( tcpConnect.receive(msg, argLen) >= 0 ) { |
silviaChen | 9:871fc0231c7f | 631 | console.printf("\r\nOK;%s\r\n\r\n",msg); |
silviaChen | 9:871fc0231c7f | 632 | } else |
silviaChen | 9:871fc0231c7f | 633 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 634 | |
silviaChen | 9:871fc0231c7f | 635 | } else { |
silviaChen | 9:871fc0231c7f | 636 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 637 | } |
silviaChen | 9:871fc0231c7f | 638 | } |
silviaChen | 9:871fc0231c7f | 639 | static void cyn_wifi_tcp_connection_receive_all() |
silviaChen | 9:871fc0231c7f | 640 | { |
silviaChen | 9:871fc0231c7f | 641 | char msg[TCP_SEND_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 642 | int argLen = 0; |
silviaChen | 9:871fc0231c7f | 643 | |
silviaChen | 9:871fc0231c7f | 644 | if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 645 | /* handle Message arg */ |
silviaChen | 9:871fc0231c7f | 646 | argLen = atoi((const char *)cyntecGetCommandArgument(0, NULL)); |
silviaChen | 9:871fc0231c7f | 647 | |
silviaChen | 9:871fc0231c7f | 648 | if (argLen > TCP_SEND_MAX_LEN || argLen < 0) { |
silviaChen | 9:871fc0231c7f | 649 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 650 | return; |
silviaChen | 9:871fc0231c7f | 651 | } |
silviaChen | 9:871fc0231c7f | 652 | |
silviaChen | 9:871fc0231c7f | 653 | memset( msg, 0, TCP_SEND_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 654 | |
silviaChen | 9:871fc0231c7f | 655 | if ( tcpConnect.receive_all(msg, argLen) >= 0 ) { |
silviaChen | 9:871fc0231c7f | 656 | console.printf("\r\nOK;%s\r\n\r\n",msg); |
silviaChen | 9:871fc0231c7f | 657 | } else |
silviaChen | 9:871fc0231c7f | 658 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 659 | |
silviaChen | 9:871fc0231c7f | 660 | } else { |
silviaChen | 9:871fc0231c7f | 661 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 662 | } |
silviaChen | 9:871fc0231c7f | 663 | } |
silviaChen | 9:871fc0231c7f | 664 | |
silviaChen | 9:871fc0231c7f | 665 | static void cyn_wifi_tcp_connection_blocking() |
silviaChen | 9:871fc0231c7f | 666 | { |
silviaChen | 9:871fc0231c7f | 667 | bool blocking = false; |
silviaChen | 9:871fc0231c7f | 668 | unsigned int timeout; |
silviaChen | 9:871fc0231c7f | 669 | |
silviaChen | 9:871fc0231c7f | 670 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 671 | |
silviaChen | 9:871fc0231c7f | 672 | if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 673 | |
silviaChen | 9:871fc0231c7f | 674 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 675 | if (arg[0] == '1') |
silviaChen | 9:871fc0231c7f | 676 | blocking = true; |
silviaChen | 9:871fc0231c7f | 677 | |
silviaChen | 9:871fc0231c7f | 678 | tcpConnect.set_blocking(blocking, 1500); |
silviaChen | 9:871fc0231c7f | 679 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 680 | |
silviaChen | 9:871fc0231c7f | 681 | } else if (cyntecGetCommandTokenCnt() == 4) { |
silviaChen | 9:871fc0231c7f | 682 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 683 | if (arg[0] == '1') |
silviaChen | 9:871fc0231c7f | 684 | blocking = true; |
silviaChen | 9:871fc0231c7f | 685 | |
silviaChen | 9:871fc0231c7f | 686 | arg = cyntecGetCommandArgument(1, NULL); |
silviaChen | 9:871fc0231c7f | 687 | timeout = (unsigned int)atoi((const char *)arg); |
silviaChen | 9:871fc0231c7f | 688 | |
silviaChen | 9:871fc0231c7f | 689 | tcpConnect.set_blocking(blocking, timeout); |
silviaChen | 9:871fc0231c7f | 690 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 691 | |
silviaChen | 9:871fc0231c7f | 692 | } else { |
silviaChen | 9:871fc0231c7f | 693 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 694 | } |
silviaChen | 9:871fc0231c7f | 695 | } |
silviaChen | 9:871fc0231c7f | 696 | |
silviaChen | 9:871fc0231c7f | 697 | static void cyn_wifi_tcp_connection_close() |
silviaChen | 9:871fc0231c7f | 698 | { |
silviaChen | 9:871fc0231c7f | 699 | bool shutdown = true; |
silviaChen | 9:871fc0231c7f | 700 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 701 | |
silviaChen | 9:871fc0231c7f | 702 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 703 | if ( tcpConnect.close(shutdown) == 0 ) |
silviaChen | 9:871fc0231c7f | 704 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 705 | else |
silviaChen | 9:871fc0231c7f | 706 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 707 | |
silviaChen | 9:871fc0231c7f | 708 | } else if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 709 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 710 | if (arg[0] == '0') |
silviaChen | 9:871fc0231c7f | 711 | shutdown = false; |
silviaChen | 9:871fc0231c7f | 712 | |
silviaChen | 9:871fc0231c7f | 713 | if ( tcpConnect.close(shutdown) == 0 ) |
silviaChen | 9:871fc0231c7f | 714 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 715 | else |
silviaChen | 9:871fc0231c7f | 716 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 717 | |
silviaChen | 9:871fc0231c7f | 718 | } else { |
silviaChen | 9:871fc0231c7f | 719 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 720 | } |
silviaChen | 9:871fc0231c7f | 721 | } |
silviaChen | 9:871fc0231c7f | 722 | |
silviaChen | 9:871fc0231c7f | 723 | /////////**** WIFI UDP Socket Implement ****////////// |
silviaChen | 9:871fc0231c7f | 724 | static void cyn_wifi_udp_init() |
silviaChen | 9:871fc0231c7f | 725 | { |
silviaChen | 9:871fc0231c7f | 726 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 727 | if ( udpSocket.init() == 0 ) |
silviaChen | 9:871fc0231c7f | 728 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 729 | else |
silviaChen | 9:871fc0231c7f | 730 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 731 | |
silviaChen | 9:871fc0231c7f | 732 | } else { |
silviaChen | 9:871fc0231c7f | 733 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 734 | } |
silviaChen | 9:871fc0231c7f | 735 | } |
silviaChen | 9:871fc0231c7f | 736 | static void cyn_wifi_udp_bind() |
silviaChen | 9:871fc0231c7f | 737 | { |
silviaChen | 9:871fc0231c7f | 738 | int port = 1; |
silviaChen | 9:871fc0231c7f | 739 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 740 | udpSocket.bind(port); |
silviaChen | 9:871fc0231c7f | 741 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 742 | // if ( udpSocket.bind(port) == 0 ) |
silviaChen | 9:871fc0231c7f | 743 | // cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 744 | // else |
silviaChen | 9:871fc0231c7f | 745 | // cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 746 | |
silviaChen | 9:871fc0231c7f | 747 | } else if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 748 | port = atoi((const char*)(cyntecGetCommandArgument(0, NULL))); |
silviaChen | 9:871fc0231c7f | 749 | |
silviaChen | 9:871fc0231c7f | 750 | if (port < 0) { |
silviaChen | 9:871fc0231c7f | 751 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 752 | return; |
silviaChen | 9:871fc0231c7f | 753 | } |
silviaChen | 9:871fc0231c7f | 754 | |
silviaChen | 9:871fc0231c7f | 755 | udpSocket.bind(port); |
silviaChen | 9:871fc0231c7f | 756 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 757 | // if ( udpSocket.bind(port) == 0 ) |
silviaChen | 9:871fc0231c7f | 758 | // cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 759 | // else |
silviaChen | 9:871fc0231c7f | 760 | // cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 761 | |
silviaChen | 9:871fc0231c7f | 762 | } else { |
silviaChen | 9:871fc0231c7f | 763 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 764 | } |
silviaChen | 9:871fc0231c7f | 765 | } |
silviaChen | 9:871fc0231c7f | 766 | static void cyn_wifi_udp_set_broadcasting() |
silviaChen | 9:871fc0231c7f | 767 | { |
silviaChen | 9:871fc0231c7f | 768 | bool broadcast = true; |
silviaChen | 9:871fc0231c7f | 769 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 770 | |
silviaChen | 9:871fc0231c7f | 771 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 772 | if ( udpSocket.set_broadcasting(broadcast) == 0 ) |
silviaChen | 9:871fc0231c7f | 773 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 774 | else |
silviaChen | 9:871fc0231c7f | 775 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 776 | |
silviaChen | 9:871fc0231c7f | 777 | } else if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 778 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 779 | if (arg[0] == '0') |
silviaChen | 9:871fc0231c7f | 780 | broadcast = false; |
silviaChen | 9:871fc0231c7f | 781 | |
silviaChen | 9:871fc0231c7f | 782 | if ( udpSocket.set_broadcasting(broadcast) == 0 ) |
silviaChen | 9:871fc0231c7f | 783 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 784 | else |
silviaChen | 9:871fc0231c7f | 785 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 786 | |
silviaChen | 9:871fc0231c7f | 787 | } else { |
silviaChen | 9:871fc0231c7f | 788 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 789 | } |
silviaChen | 9:871fc0231c7f | 790 | } |
silviaChen | 9:871fc0231c7f | 791 | |
silviaChen | 9:871fc0231c7f | 792 | static void cyn_wifi_udp_send_to() |
silviaChen | 9:871fc0231c7f | 793 | { |
silviaChen | 9:871fc0231c7f | 794 | char msg[UDP_SEND_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 795 | int sendData; |
silviaChen | 9:871fc0231c7f | 796 | uint8_t * argAllBuf = cyntecGetCommandTotalBuffer(); |
silviaChen | 9:871fc0231c7f | 797 | int sendLen = 0; // Maximum 1400, need to be integer |
silviaChen | 9:871fc0231c7f | 798 | uint8_t sendLenCharNum = 0; // Maximum 4 |
silviaChen | 9:871fc0231c7f | 799 | uint8_t *argLeng = cyntecGetCommandArgument(0,&sendLenCharNum); |
silviaChen | 9:871fc0231c7f | 800 | sendLen = cyntecAtoi(argLeng,sendLenCharNum); |
silviaChen | 9:871fc0231c7f | 801 | //sendLen = cyntecAtoInt(argLeng); |
silviaChen | 9:871fc0231c7f | 802 | if (sendLen > UDP_SEND_MAX_LEN || sendLen < 0) { |
silviaChen | 9:871fc0231c7f | 803 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 804 | return; |
silviaChen | 9:871fc0231c7f | 805 | } |
silviaChen | 9:871fc0231c7f | 806 | if (cyntecGetCommandTokenCnt() <4 ) { |
silviaChen | 9:871fc0231c7f | 807 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 808 | return; |
silviaChen | 9:871fc0231c7f | 809 | } |
silviaChen | 9:871fc0231c7f | 810 | if (cyntecGetCommandTokenCnt() >= 4) { |
silviaChen | 9:871fc0231c7f | 811 | |
silviaChen | 9:871fc0231c7f | 812 | /* handle Message arg */ |
silviaChen | 9:871fc0231c7f | 813 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 814 | console.printf("sendLen:%i,Buf:%s,Index:%i\r\n",sendLen,&argAllBuf[15+sendLenCharNum],cyntecGetTotalIndex()); |
silviaChen | 9:871fc0231c7f | 815 | #endif |
silviaChen | 9:871fc0231c7f | 816 | memset( msg, 0, UDP_SEND_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 817 | for (int i=0; i<sendLen; i++) |
silviaChen | 9:871fc0231c7f | 818 | msg[i] = argAllBuf[15+sendLenCharNum+i]; |
silviaChen | 9:871fc0231c7f | 819 | #ifdef DELTA_WIFI_DEBUG |
silviaChen | 9:871fc0231c7f | 820 | console.printf("msg:%s\r\n",msg); |
silviaChen | 9:871fc0231c7f | 821 | #endif |
silviaChen | 9:871fc0231c7f | 822 | sendData = udpSocket.sendTo(cliEndpoint, msg, sendLen); |
silviaChen | 9:871fc0231c7f | 823 | if ( sendData >= 0 ) { |
silviaChen | 9:871fc0231c7f | 824 | console.printf("\r\nOK;"); |
silviaChen | 9:871fc0231c7f | 825 | console.printf("%i\r\n\r\n",sendData); |
silviaChen | 9:871fc0231c7f | 826 | } else |
silviaChen | 9:871fc0231c7f | 827 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 828 | } |
silviaChen | 9:871fc0231c7f | 829 | } |
silviaChen | 9:871fc0231c7f | 830 | |
silviaChen | 9:871fc0231c7f | 831 | static void cyn_wifi_udp_received_from() |
silviaChen | 9:871fc0231c7f | 832 | { |
silviaChen | 9:871fc0231c7f | 833 | char msg[UDP_SEND_MAX_LEN+1]; |
silviaChen | 9:871fc0231c7f | 834 | int argLen = 0; |
silviaChen | 9:871fc0231c7f | 835 | |
silviaChen | 9:871fc0231c7f | 836 | if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 837 | /* handle Message arg */ |
silviaChen | 9:871fc0231c7f | 838 | argLen = atoi((const char *)cyntecGetCommandArgument(0, NULL)); |
silviaChen | 9:871fc0231c7f | 839 | |
silviaChen | 9:871fc0231c7f | 840 | if (argLen > UDP_SEND_MAX_LEN || argLen < 0) { |
silviaChen | 9:871fc0231c7f | 841 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 842 | return; |
silviaChen | 9:871fc0231c7f | 843 | } |
silviaChen | 9:871fc0231c7f | 844 | |
silviaChen | 9:871fc0231c7f | 845 | memset( msg, 0, UDP_SEND_MAX_LEN+1); |
silviaChen | 9:871fc0231c7f | 846 | |
silviaChen | 9:871fc0231c7f | 847 | if ( udpSocket.receiveFrom(cliEndpoint, msg, argLen) >= 0 ) { |
silviaChen | 9:871fc0231c7f | 848 | console.printf("\r\nOK;%s\r\n\r\n",msg); |
silviaChen | 9:871fc0231c7f | 849 | } else |
silviaChen | 9:871fc0231c7f | 850 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 851 | |
silviaChen | 9:871fc0231c7f | 852 | } else { |
silviaChen | 9:871fc0231c7f | 853 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 854 | } |
silviaChen | 9:871fc0231c7f | 855 | } |
silviaChen | 9:871fc0231c7f | 856 | static void cyn_wifi_udp_blocking() |
silviaChen | 9:871fc0231c7f | 857 | { |
silviaChen | 9:871fc0231c7f | 858 | bool blocking = false; |
silviaChen | 9:871fc0231c7f | 859 | unsigned int timeout; |
silviaChen | 9:871fc0231c7f | 860 | |
silviaChen | 9:871fc0231c7f | 861 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 862 | if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 863 | |
silviaChen | 9:871fc0231c7f | 864 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 865 | if (arg[0] == '1') |
silviaChen | 9:871fc0231c7f | 866 | blocking = true; |
silviaChen | 9:871fc0231c7f | 867 | |
silviaChen | 9:871fc0231c7f | 868 | udpSocket.set_blocking(blocking, 1500); |
silviaChen | 9:871fc0231c7f | 869 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 870 | |
silviaChen | 9:871fc0231c7f | 871 | } else if (cyntecGetCommandTokenCnt() == 4) { |
silviaChen | 9:871fc0231c7f | 872 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 873 | if (arg[0] == '1') |
silviaChen | 9:871fc0231c7f | 874 | blocking = true; |
silviaChen | 9:871fc0231c7f | 875 | |
silviaChen | 9:871fc0231c7f | 876 | arg = cyntecGetCommandArgument(1, NULL); |
silviaChen | 9:871fc0231c7f | 877 | timeout = (unsigned int)atoi((const char *)arg); |
silviaChen | 9:871fc0231c7f | 878 | |
silviaChen | 9:871fc0231c7f | 879 | udpSocket.set_blocking(blocking, timeout); |
silviaChen | 9:871fc0231c7f | 880 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 881 | |
silviaChen | 9:871fc0231c7f | 882 | } else { |
silviaChen | 9:871fc0231c7f | 883 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 884 | } |
silviaChen | 9:871fc0231c7f | 885 | } |
silviaChen | 9:871fc0231c7f | 886 | static void cyn_wifi_udp_close() |
silviaChen | 9:871fc0231c7f | 887 | { |
silviaChen | 9:871fc0231c7f | 888 | bool shutdown = true; |
silviaChen | 9:871fc0231c7f | 889 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 890 | |
silviaChen | 9:871fc0231c7f | 891 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 892 | if ( udpSocket.close(shutdown) == 0 ) |
silviaChen | 9:871fc0231c7f | 893 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 894 | else |
silviaChen | 9:871fc0231c7f | 895 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 896 | |
silviaChen | 9:871fc0231c7f | 897 | } else if (cyntecGetCommandTokenCnt() == 3) { |
silviaChen | 9:871fc0231c7f | 898 | arg = cyntecGetCommandArgument(0, NULL); |
silviaChen | 9:871fc0231c7f | 899 | if (arg[0] == '0') |
silviaChen | 9:871fc0231c7f | 900 | shutdown = false; |
silviaChen | 9:871fc0231c7f | 901 | |
silviaChen | 9:871fc0231c7f | 902 | if ( udpSocket.close(shutdown) == 0 ) |
silviaChen | 9:871fc0231c7f | 903 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 904 | else |
silviaChen | 9:871fc0231c7f | 905 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 906 | |
silviaChen | 9:871fc0231c7f | 907 | } else { |
silviaChen | 9:871fc0231c7f | 908 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 909 | } |
silviaChen | 9:871fc0231c7f | 910 | } |
silviaChen | 9:871fc0231c7f | 911 | |
silviaChen | 9:871fc0231c7f | 912 | |
silviaChen | 9:871fc0231c7f | 913 | |
silviaChen | 9:871fc0231c7f | 914 | /////////**** WIFI UDP Endpoint Implement ****////////// |
silviaChen | 9:871fc0231c7f | 915 | static void cyn_wifi_udp_endpoint_reset_address() |
silviaChen | 9:871fc0231c7f | 916 | { |
silviaChen | 9:871fc0231c7f | 917 | if (cyntecGetCommandTokenCnt() == 2) { |
silviaChen | 9:871fc0231c7f | 918 | cliEndpoint.reset_address(); |
silviaChen | 9:871fc0231c7f | 919 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 920 | } else { |
silviaChen | 9:871fc0231c7f | 921 | cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); |
silviaChen | 9:871fc0231c7f | 922 | } |
silviaChen | 9:871fc0231c7f | 923 | } |
silviaChen | 9:871fc0231c7f | 924 | static void cyn_wifi_udp_endpoint_address() |
silviaChen | 9:871fc0231c7f | 925 | { |
silviaChen | 9:871fc0231c7f | 926 | uint8_t argHost[STATIC_IP_MAX_LEN]; |
silviaChen | 9:871fc0231c7f | 927 | int port; |
silviaChen | 9:871fc0231c7f | 928 | |
silviaChen | 9:871fc0231c7f | 929 | uint8_t *arg; |
silviaChen | 9:871fc0231c7f | 930 | uint8_t argLen; |
silviaChen | 9:871fc0231c7f | 931 | |
silviaChen | 9:871fc0231c7f | 932 | if ( cyntecGetCommandTokenCnt() == 4 ) { |
silviaChen | 9:871fc0231c7f | 933 | /* handle Host addr */ |
silviaChen | 9:871fc0231c7f | 934 | arg = cyntecGetCommandArgument(0, &argLen); |
silviaChen | 9:871fc0231c7f | 935 | |
silviaChen | 9:871fc0231c7f | 936 | if ( cyntecIsValidIP(arg,argLen) != 0) { |
silviaChen | 9:871fc0231c7f | 937 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 938 | return; |
silviaChen | 9:871fc0231c7f | 939 | } |
silviaChen | 9:871fc0231c7f | 940 | |
silviaChen | 9:871fc0231c7f | 941 | memset( argHost, 0, STATIC_IP_MAX_LEN); |
silviaChen | 9:871fc0231c7f | 942 | memcpy( argHost, arg, argLen); |
silviaChen | 9:871fc0231c7f | 943 | |
silviaChen | 9:871fc0231c7f | 944 | /* Handle Port */ |
silviaChen | 9:871fc0231c7f | 945 | port = atoi((const char *)(cyntecGetCommandArgument(1, NULL))); |
silviaChen | 9:871fc0231c7f | 946 | if (port < 0) { |
silviaChen | 9:871fc0231c7f | 947 | cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); |
silviaChen | 9:871fc0231c7f | 948 | return; |
silviaChen | 9:871fc0231c7f | 949 | } |
silviaChen | 9:871fc0231c7f | 950 | |
silviaChen | 9:871fc0231c7f | 951 | if ( cliEndpoint.set_address((const char *)argHost, (const int)port) == 0) |
silviaChen | 9:871fc0231c7f | 952 | cyntecPrintOk(); |
silviaChen | 9:871fc0231c7f | 953 | else |
silviaChen | 9:871fc0231c7f | 954 | cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); |
silviaChen | 9:871fc0231c7f | 955 | |
silviaChen | 9:871fc0231c7f | 956 | } else { |
silviaChen | 9:871fc0231c7f | 957 | console.printf("\r\nOK;%s\r\n\r\n",cliEndpoint.get_address()); |
silviaChen | 9:871fc0231c7f | 958 | } |
silviaChen | 9:871fc0231c7f | 959 | } |
silviaChen | 9:871fc0231c7f | 960 | //static void cyn_wifi_udp_endpoint_get_address(){} |
silviaChen | 9:871fc0231c7f | 961 | static void cyn_wifi_udp_endpoint_port() // 2015/1/20: Lester add |
silviaChen | 9:871fc0231c7f | 962 | { |
silviaChen | 9:871fc0231c7f | 963 | console.printf("\r\nOK;%d\r\n\r\n",cliEndpoint.get_port()); |
silviaChen | 9:871fc0231c7f | 964 | } |
silviaChen | 9:871fc0231c7f | 965 | |
silviaChen | 9:871fc0231c7f | 966 | |
silviaChen | 9:871fc0231c7f | 967 | CyntecCommandEntry wifiCommandSets[] = { |
silviaChen | 9:871fc0231c7f | 968 | /////////**** WIFI Device ****////////// |
silviaChen | 9:871fc0231c7f | 969 | {"device_sleep", cyn_wifi_device_sleep, NULL, "Set WIFI module to sleep mode"}, |
silviaChen | 9:871fc0231c7f | 970 | {"device_network", cyn_wifi_device_network, NULL, " <SSID> <PASSWORD> <SECURITY> <PRIORITY> Set SSID and PASSWORD for WIFI module"}, |
silviaChen | 9:871fc0231c7f | 971 | {"device_apscan", cyn_wifi_device_ap_scan, NULL, "Scan for available access point on all channels."}, |
silviaChen | 9:871fc0231c7f | 972 | {"device_setap",cyn_wifi_set_ap, NULL, " <SSID> <PASSWORD> <SECURITY> <CHANNEL>Set Access Point in given configuration"}, |
silviaChen | 9:871fc0231c7f | 973 | |
silviaChen | 9:871fc0231c7f | 974 | /////////**** WIFI Ethernet ****////////// |
silviaChen | 9:871fc0231c7f | 975 | {"eth_init", cyn_wifi_ethernet_init, NULL, " <STATIC IP> Initialize the interface to use DHCP"}, |
silviaChen | 9:871fc0231c7f | 976 | {"eth_connect", cyn_wifi_ethernet_connect, NULL, "<TIMEOUT MS> Bring up the WiFi connection"}, |
silviaChen | 9:871fc0231c7f | 977 | {"eth_disconnect", cyn_wifi_ethernet_disconnect, NULL, "Bring the interface down"}, |
silviaChen | 9:871fc0231c7f | 978 | {"eth_mac", cyn_wifi_ethernet_mac, NULL, "Get MAC addr of Ethernet Interface"}, |
silviaChen | 9:871fc0231c7f | 979 | {"eth_ip", cyn_wifi_ethernet_ip, NULL, "Get IP addr of Ehternet Interface"}, |
silviaChen | 9:871fc0231c7f | 980 | {"eth_isConnect", cyn_wifi_ethernet_isConnected, NULL, "Check if the device is connected to Access Point"}, |
silviaChen | 9:871fc0231c7f | 981 | |
silviaChen | 9:871fc0231c7f | 982 | /////////**** WIFI TCP Socket Server ****////////// |
silviaChen | 9:871fc0231c7f | 983 | {"tcp_server_bind", cyn_wifi_tcp_server_bind, NULL, " <PORT> Bind a socket to a port"}, |
silviaChen | 9:871fc0231c7f | 984 | {"tcp_server_listen", cyn_wifi_tcp_server_listen, NULL, "Start listening for incomming connections"}, |
silviaChen | 9:871fc0231c7f | 985 | {"tcp_server_accept", cyn_wifi_tcp_server_accept, NULL, "Accept a new connection"}, |
silviaChen | 9:871fc0231c7f | 986 | {"tcp_server_blocking", cyn_wifi_tcp_server_blocking, NULL, " <SETTING> <TIMEOUT MS> Set blocking mode and timeout"}, |
silviaChen | 9:871fc0231c7f | 987 | {"tcp_server_close", cyn_wifi_tcp_server_close, NULL, " <SHUTDOWN> Close the socket"}, |
silviaChen | 9:871fc0231c7f | 988 | |
silviaChen | 9:871fc0231c7f | 989 | /////////**** WIFI TCP Socket Connection ****////////// |
silviaChen | 9:871fc0231c7f | 990 | {"tcp_connection_connect", cyn_wifi_tcp_connection_connect, NULL, " <IPADDR> <PORT> Connects TCP socket to the server"}, |
silviaChen | 9:871fc0231c7f | 991 | {"tcp_connection_is_connect", cyn_wifi_tcp_connection_is_connected, NULL, "Check if the socket is connected"}, |
silviaChen | 9:871fc0231c7f | 992 | {"tcp_connection_send", cyn_wifi_tcp_connection_send, NULL, " <DATALEN> <DATA> Send data to the remote host"}, |
silviaChen | 9:871fc0231c7f | 993 | {"tcp_connection_send_all", cyn_wifi_tcp_connection_send_all, NULL, " <DATALEN> <DATA> Send all the data to the remote host"}, |
silviaChen | 9:871fc0231c7f | 994 | {"tcp_connection_receive", cyn_wifi_tcp_connection_receive, NULL, " <DATALEN> Receive data from the remote host"}, |
silviaChen | 9:871fc0231c7f | 995 | {"tcp_connection_receive_all", cyn_wifi_tcp_connection_receive_all, NULL, "<DATALEN> Receive all the data from the remote host"}, |
silviaChen | 9:871fc0231c7f | 996 | {"tcp_connection_blocking", cyn_wifi_tcp_connection_blocking, NULL, "<SETTING> <TIMEOUT MS> Set blocking mode and timeout"}, |
silviaChen | 9:871fc0231c7f | 997 | {"tcp_connection_close", cyn_wifi_tcp_connection_close, NULL, "<SHUTDOWN> Close the connection"}, |
silviaChen | 9:871fc0231c7f | 998 | |
silviaChen | 9:871fc0231c7f | 999 | /////////**** WIFI UDP Socket ****////////// |
silviaChen | 9:871fc0231c7f | 1000 | {"udp_init", cyn_wifi_udp_init, NULL, "Init UDP Client Socket"}, |
silviaChen | 9:871fc0231c7f | 1001 | {"udp_bind", cyn_wifi_udp_bind, NULL, " <PORT> Bind UDP Server Socket to a port"}, |
silviaChen | 9:871fc0231c7f | 1002 | {"udp_set_broadcasting", cyn_wifi_udp_set_broadcasting, NULL, " <IS_BROADCAST> Set socket in broadcasting"}, |
silviaChen | 9:871fc0231c7f | 1003 | {"udp_send_to", cyn_wifi_udp_send_to, NULL, " <DATALEN> <DATA> Send a packet to a remote endpoint"}, |
silviaChen | 9:871fc0231c7f | 1004 | {"udp_received_from", cyn_wifi_udp_received_from, NULL, " <DATALEN> Receive a packet from a remote endpont"}, |
silviaChen | 9:871fc0231c7f | 1005 | {"udp_blocking", cyn_wifi_udp_blocking, NULL, " <DATALEN> Set blocking mode and timeout"}, |
silviaChen | 9:871fc0231c7f | 1006 | {"udp_close", cyn_wifi_udp_close, NULL, " <SHUTDOWN> Close the socket"}, |
silviaChen | 9:871fc0231c7f | 1007 | |
silviaChen | 9:871fc0231c7f | 1008 | /////////**** WIFI UDP Endpoint ****////////// |
silviaChen | 9:871fc0231c7f | 1009 | {"udp_endpoint_reset", cyn_wifi_udp_endpoint_reset_address, NULL, "Reset the address of this endpoint"}, |
silviaChen | 9:871fc0231c7f | 1010 | {"udp_endpoint_address", cyn_wifi_udp_endpoint_address, NULL, " <IPADDR> <PORT> Set/Get the address of this endpoint"}, |
silviaChen | 9:871fc0231c7f | 1011 | {"udp_endpoint_port", cyn_wifi_udp_endpoint_port, NULL, "Get the port of this endpoint"}, |
silviaChen | 9:871fc0231c7f | 1012 | |
silviaChen | 9:871fc0231c7f | 1013 | {NULL, NULL, NULL, NULL}, |
silviaChen | 9:871fc0231c7f | 1014 | }; |
silviaChen | 9:871fc0231c7f | 1015 | |
silviaChen | 9:871fc0231c7f | 1016 | |
silviaChen | 9:871fc0231c7f | 1017 |