25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

862 lines
22 KiB

  1. #include "WiFiCtrl.h"
  2. #include "string.h"
  3. #include "driver/include/nmasic.h"
  4. #include <stdint.h>
  5. //#include "socket/include/socket.h"
  6. #include "define.h"
  7. #include "Terminal.h"
  8. #include "driver/include/m2m_periph.h"
  9. #include "ProtocolDefs.h"
  10. #include "BoardCfg.h"
  11. #include "timer.h"
  12. #include "BootloaderProtocol.h"
  13. #include "SPI_Flash.h"
  14. #include "FlashMapping.h"
  15. /** IP address of host. */
  16. uint32 gu32HostIp = 0;
  17. /** Retry count. */
  18. uint8 gu8RetryCount = 0;
  19. /** TCP client socket handlers. */
  20. static SOCKET tcp_client_socket = -1;
  21. SOCKET TerminalSocket = -1, TerminalServerSocket = -1;
  22. uint8 TerminalRxBuf[1024];
  23. #ifdef USE_SYSLOG
  24. SOCKET SyslogSocket = -1, SyslogServerSocket = -1;
  25. uint8 SyslogRxBuf[200]; //Syslog shall not receive much data
  26. #endif
  27. SOCKET NetworkSocket = -1, NetworkServerSocket = -1;
  28. uint8 NetworkRxBuf[1024];
  29. SOCKET BootloaderSocket = -1, BootloaderServerSocket = -1;
  30. uint8 BootloaderRxBuf[1024];
  31. /** Receive buffer definition. */
  32. static uint8 gau8ReceivedBuffer[MAIN_WIFI_M2M_BUFFER_SIZE] = {0};
  33. /** Wi-Fi status variable. */
  34. static bool gbConnectedWifi = false;
  35. /** Get host IP status variable. */
  36. static bool gbHostIpByName = false;
  37. /** TCP Connection status variable. */
  38. static bool gbTcpConnection = false;
  39. /** Server host name. */
  40. static char server_host_name[] = MAIN_WEATHER_SERVER_NAME;
  41. tstrWifiInitParam param;
  42. uint8 mac_addr[6];
  43. uint8 u8IsMacAddrValid;
  44. struct sockaddr_in addr_in;
  45. uint32 mCurIPAddress;
  46. tstrM2MIPConfig mModuleIPConfig;
  47. bool mWiFiInitOK = false;
  48. char mWiFiState = WIFI_MODULE_OFF_STATE; //JFM wifi module is always OFF at boot...
  49. /**
  50. * \brief Callback function of IP address.
  51. *
  52. * \param[in] hostName Domain name.
  53. * \param[in] hostIp Server IP.
  54. *
  55. * \return None.
  56. */
  57. static void resolve_cb(uint8 *hostName, uint32 hostIp)
  58. {
  59. gu32HostIp = hostIp;
  60. gbHostIpByName = true;
  61. char IP1,IP2,IP3,IP4;
  62. IP1 = IPV4_BYTE(hostIp, 0);
  63. IP2 = IPV4_BYTE(hostIp, 1);
  64. IP3 = IPV4_BYTE(hostIp, 2);
  65. IP4 = IPV4_BYTE(hostIp, 3);
  66. printf("Host IP is %d.%d.%d.%d\r\n",
  67. (int)IPV4_BYTE(hostIp, 0),
  68. (int)IPV4_BYTE(hostIp, 1),
  69. (int)IPV4_BYTE(hostIp, 2),
  70. (int)IPV4_BYTE(hostIp, 3));
  71. printf("Host Name is %s\r\n", hostName);
  72. }
  73. static void socket_cb(SOCKET sock, uint8 u8Msg, void *pvMsg)
  74. {
  75. /* Check for socket event on TCP socket. */
  76. //if(sock == TerminalSocket)
  77. {
  78. switch(u8Msg)
  79. {
  80. case SOCKET_MSG_BIND:
  81. {
  82. tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg;
  83. if(pstrBind->status == 0)
  84. {
  85. if(sock == TerminalServerSocket)
  86. {
  87. listen(TerminalServerSocket, 0);
  88. }
  89. else if(sock == SyslogServerSocket)
  90. {
  91. listen(SyslogServerSocket,0);
  92. }
  93. else if(sock == NetworkServerSocket)
  94. {
  95. listen(NetworkServerSocket,0);
  96. }
  97. else if(sock == BootloaderServerSocket)
  98. {
  99. listen(BootloaderServerSocket,0);
  100. printf("Bootloader server started\n");
  101. }
  102. }
  103. else
  104. {
  105. printf("Bind Failed\n");
  106. }
  107. break;
  108. }
  109. case SOCKET_MSG_LISTEN:
  110. {
  111. tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg;
  112. if(pstrListen->status != 0)
  113. {
  114. printf("socket %d listen Failed. Error: %d\n",(int)sock, pstrListen->status);
  115. break;
  116. }
  117. if(sock == SyslogServerSocket)
  118. {
  119. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,1);
  120. }
  121. break;
  122. }
  123. case SOCKET_MSG_ACCEPT:
  124. {
  125. // New Socket is accepted.
  126. tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg *)pvMsg;
  127. if(pstrAccept->sock >= 0)
  128. {
  129. if(sock == TerminalServerSocket)
  130. {
  131. memset(TerminalRxBuf,0,sizeof(TerminalRxBuf));
  132. // Get the accepted socket.
  133. TerminalSocket = pstrAccept->sock;
  134. recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0);
  135. SendTerminalData("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n",strlen("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n"));
  136. // SendSyslogData("Terminal client connected\n",strlen("Terminal client connected\n"));
  137. printf("Terminal client connected\n");
  138. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1);
  139. }
  140. else if(sock == SyslogServerSocket)
  141. {
  142. memset(SyslogRxBuf,0,sizeof(SyslogRxBuf));
  143. // Get the accepted socket.
  144. SyslogSocket = pstrAccept->sock;
  145. recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0);
  146. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1);
  147. SendSyslogData("Syslog Welcome\n",strlen("Syslog Welcome\n"));
  148. }
  149. else if(sock == NetworkServerSocket)
  150. {
  151. memset(NetworkRxBuf,0,sizeof(NetworkRxBuf));
  152. // Get the accepted socket.
  153. NetworkSocket = pstrAccept->sock;
  154. recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0);
  155. printf("Network client connected\n");
  156. }
  157. else if(sock == BootloaderServerSocket)
  158. {
  159. memset(BootloaderRxBuf,0,sizeof(BootloaderRxBuf));
  160. // Get the accepted socket.
  161. BootloaderSocket = pstrAccept->sock;
  162. recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0);
  163. printf("Bootloader client connected\n");
  164. }
  165. }
  166. else
  167. {
  168. printf("Socket %d : Accept Failed\n", sock);
  169. }
  170. break;
  171. }
  172. case SOCKET_MSG_RECV:
  173. {
  174. tstrSocketRecvMsg *pstrRecvMsg = (tstrSocketRecvMsg*)pvMsg;
  175. if((pstrRecvMsg->pu8Buffer != NULL) && (pstrRecvMsg->s16BufferSize > 0))
  176. {
  177. // Process the received message
  178. if(sock == TerminalSocket)
  179. {
  180. //Fwd data to Terminal...
  181. recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0);
  182. RxTerminalBuf(TerminalRxBuf, pstrRecvMsg->s16BufferSize);
  183. }
  184. else if(sock == SyslogSocket)
  185. {
  186. //Fwd data to stdin...
  187. recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0);
  188. RxSyslogBuf(SyslogRxBuf, pstrRecvMsg->s16BufferSize);
  189. }
  190. else if(sock == NetworkSocket)
  191. {
  192. //Fwd data to Network...
  193. recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0);
  194. }
  195. else if(sock == BootloaderSocket)
  196. {
  197. //Fwd data to Network...
  198. if(recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0) != 0)
  199. {
  200. char toto;
  201. toto = 1;
  202. }
  203. BootloaderProtocolProtocolAnalyzeNewData(pstrRecvMsg->pu8Buffer, pstrRecvMsg->s16BufferSize);
  204. }
  205. }
  206. else //Socket must be closed.
  207. {
  208. if(sock == TerminalSocket)
  209. {
  210. close(TerminalSocket);
  211. TerminalSocket = -1;
  212. // SendSyslogData("Terminal client disconnected\n",strlen("Terminal client disconnected\n"));
  213. printf("Terminal client disconnected\n");
  214. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0);
  215. }
  216. else if(sock == SyslogSocket)
  217. {
  218. close(SyslogSocket);
  219. SyslogSocket = -1;
  220. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0);
  221. }
  222. else if(sock == NetworkSocket)
  223. {
  224. close(NetworkSocket);
  225. NetworkSocket = -1;
  226. printf("Network client disconnected\n");
  227. }
  228. else if(sock == BootloaderSocket)
  229. {
  230. close(BootloaderSocket);
  231. BootloaderSocket = -1;
  232. printf("Bootloader client disconnected\n");
  233. BootloaderDeactivateBootloader();
  234. }
  235. }
  236. break;
  237. }
  238. case SOCKET_MSG_SEND:
  239. {
  240. if(sock == SyslogSocket)
  241. {
  242. }
  243. }
  244. }
  245. }
  246. }
  247. static void set_dev_name_to_mac(uint8 *name, uint8 *mac_addr)
  248. {
  249. /* Name must be in the format WINC1500_00:00 */
  250. uint16 len;
  251. // len = m2m_strlen(name);
  252. if (len >= 5) {
  253. name[len - 1] = MAIN_HEX2ASCII((mac_addr[5] >> 0) & 0x0f);
  254. name[len - 2] = MAIN_HEX2ASCII((mac_addr[5] >> 4) & 0x0f);
  255. name[len - 4] = MAIN_HEX2ASCII((mac_addr[4] >> 0) & 0x0f);
  256. name[len - 5] = MAIN_HEX2ASCII((mac_addr[4] >> 4) & 0x0f);
  257. }
  258. }
  259. /**
  260. * \brief Callback to get the Wi-Fi status update.
  261. *
  262. * \param[in] u8MsgType Type of Wi-Fi notification.
  263. * \param[in] pvMsg A pointer to a buffer containing the notification parameters.
  264. *
  265. * \return None.
  266. */
  267. static void wifi_cb(uint8 u8MsgType, void *pvMsg)
  268. {
  269. switch (u8MsgType) {
  270. case M2M_WIFI_RESP_CON_STATE_CHANGED: {
  271. tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged *)pvMsg;
  272. if (pstrWifiState->u8CurrState == M2M_WIFI_CONNECTED)
  273. {
  274. printf("Wi-Fi connected\r\n");
  275. if(mUseDHCP == true)
  276. {
  277. // m2m_wifi_request_dhcp_client();
  278. }
  279. else
  280. {
  281. m2m_wifi_set_static_ip(&mModuleIPConfig);
  282. gbConnectedWifi = true;
  283. mCurIPAddress = mModuleIPConfig.u32StaticIP;
  284. }
  285. //#ifndef USE_STATIC_IP
  286. // // m2m_wifi_request_dhcp_client();
  287. //#else
  288. // m2m_wifi_set_static_ip(&mModuleIPConfig);
  289. // gbConnectedWifi = true;
  290. // mCurIPAddress = mModuleIPConfig.u32StaticIP;
  291. //#endif
  292. mWiFiState = WIFI_CONNECTED_STATE;
  293. } else if (pstrWifiState->u8CurrState == M2M_WIFI_DISCONNECTED)
  294. {
  295. printf("Wi-Fi disconnected\r\n");
  296. gbConnectedWifi = false;
  297. mWiFiState = WIFI_DISCONNECTED_STATE;
  298. CloseSockets();
  299. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0);
  300. mCurIPAddress = 0xFFFFFFFF;
  301. }
  302. break;
  303. }
  304. case M2M_WIFI_REQ_DHCP_CONF:
  305. {
  306. tstrM2MIPConfig *IPConfig;
  307. IPConfig = (tstrM2MIPConfig*)pvMsg;
  308. // mCurIPAddress = *(uint32*)pvMsg;
  309. mCurIPAddress = IPConfig->u32StaticIP;
  310. unsigned char ip1,ip2,ip3,ip4;
  311. ip1 = IPV4_BYTE(mCurIPAddress,0);
  312. ip2 = IPV4_BYTE(mCurIPAddress,1);
  313. ip3 = IPV4_BYTE(mCurIPAddress,2);
  314. ip4 = IPV4_BYTE(mCurIPAddress,3);
  315. /* Turn LED0 on to declare that IP address received. */
  316. // printf("Wi-Fi IP is %u.%u.%u.%u\r\n", pu8IPAddress[0], pu8IPAddress[1], pu8IPAddress[2], pu8IPAddress[3]);
  317. gbConnectedWifi = true;
  318. /* Obtain the IP Address by network name */
  319. gethostbyname((uint8 *)server_host_name);
  320. break;
  321. }
  322. case M2M_WIFI_RESP_PROVISION_INFO:
  323. {
  324. tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo *)pvMsg;
  325. printf("wifi_cb: M2M_WIFI_RESP_PROVISION_INFO.\r\n");
  326. if (pstrProvInfo->u8Status == M2M_SUCCESS) {
  327. m2m_wifi_connect((char *)pstrProvInfo->au8SSID,
  328. strlen((char *)pstrProvInfo->au8SSID),
  329. pstrProvInfo->u8SecType,
  330. pstrProvInfo->au8Password,
  331. M2M_WIFI_CH_ALL);
  332. } else {
  333. printf("wifi_cb: Provision failed.\r\n");
  334. }
  335. } break;
  336. default: {
  337. break;
  338. }
  339. }
  340. }
  341. int InitWiFi()
  342. {
  343. tstrWifiInitParam param;
  344. int8_t ret;
  345. gbTcpConnection = false;
  346. TimerStart(WIFI_RECONNECT_TIMER,1);
  347. mCurIPAddress = 0xFFFFFFFF;
  348. char IP1,IP2,IP3,IP4,GW1,GW2,GW3,GW4;
  349. //Load WiFi parameters from flash if present
  350. if(SPIFlashIsPresent() == 1 && USE_IP_STORED_IN_FLASH == 1)
  351. {
  352. char StoredIPConfig[11];
  353. if(SPIFlashReadBuffer(StoredIPConfig,11,FLASH_WIFI_IP_ADDRESS) != RET_ERROR)
  354. {
  355. mUseDHCP = StoredIPConfig[8]; //Use DHCP
  356. //if(mUseDHCP == 0)
  357. {
  358. IP1 = StoredIPConfig[0];
  359. IP2 = StoredIPConfig[1];
  360. IP3 = StoredIPConfig[2];
  361. IP4 = StoredIPConfig[3];
  362. GW1 = StoredIPConfig[4];
  363. GW2 = StoredIPConfig[5];
  364. GW3 = StoredIPConfig[6];
  365. GW4 = StoredIPConfig[7];
  366. if((IP1 == (char)0xFF) && (IP2 == (char)0xFF) && (IP3 == (char)0xFF) && (IP4 == (char)0xFF) || \
  367. ((GW1 == (char)0xFF && GW2 == (char)0xFF && GW3 == (char)0xFF && GW4 == (char)0xFF)))
  368. {
  369. IP1 = STATIC_IP_ADDRESS_1;
  370. IP2 = STATIC_IP_ADDRESS_2;
  371. IP3 = STATIC_IP_ADDRESS_3;
  372. IP4 = STATIC_IP_ADDRESS_4;
  373. GW1 = GATEWAY_ADDRESS_1;
  374. GW2 = GATEWAY_ADDRESS_2;
  375. GW3 = GATEWAY_ADDRESS_3;
  376. GW4 = GATEWAY_ADDRESS_4;
  377. }
  378. }
  379. char APNameLength, APPassLenght;
  380. APNameLength = StoredIPConfig[9];
  381. APPassLenght = StoredIPConfig[10];
  382. if((APNameLength > 64) || APPassLenght > 64)
  383. {
  384. strcpy(mAPName,HOME_AP_NAME);
  385. strcpy(mAPPassword,HOME_AP_PWD);
  386. }
  387. else
  388. {
  389. if(SPIFlashReadBuffer(mAPName,APNameLength,FLASH_WIFI_IP_ADDRESS+11) != RET_OK)
  390. {
  391. strcpy(mAPName,HOME_AP_NAME);
  392. }
  393. if(SPIFlashReadBuffer(mAPPassword,APPassLenght,FLASH_WIFI_IP_ADDRESS+11+APNameLength) != RET_OK)
  394. {
  395. strcpy(mAPPassword,HOME_AP_PWD);
  396. }
  397. }
  398. }
  399. }
  400. else
  401. {
  402. IP1 = STATIC_IP_ADDRESS_1;
  403. IP2 = STATIC_IP_ADDRESS_2;
  404. IP3 = STATIC_IP_ADDRESS_3;
  405. IP4 = STATIC_IP_ADDRESS_4;
  406. GW1 = GATEWAY_ADDRESS_1;
  407. GW2 = GATEWAY_ADDRESS_2;
  408. GW3 = GATEWAY_ADDRESS_3;
  409. GW4 = GATEWAY_ADDRESS_4;
  410. strcpy(mAPPassword,HOME_AP_PWD);
  411. strcpy(mAPName,HOME_AP_NAME);
  412. #ifdef USE_STATIC_IP
  413. mUseDHCP = 0;
  414. #else
  415. mUseDHCP = 1;
  416. #endif
  417. }
  418. memset(&mModuleIPConfig,0,sizeof(mModuleIPConfig));
  419. // mModuleIPConfig.u32StaticIP = IP_TO_U32(STATIC_IP_ADDRESS_1,STATIC_IP_ADDRESS_2,STATIC_IP_ADDRESS_3,STATIC_IP_ADDRESS_4);
  420. mModuleIPConfig.u32StaticIP = IP_TO_U32(IP1,IP2,IP3,IP4);
  421. mModuleIPConfig.u32DNS = IP_TO_U32(DEFAULT_DNS_ADD_1,DEFAULT_DNS_ADD_2,DEFAULT_DNS_ADD_3,DEFAULT_DNS_ADD_4);
  422. // mModuleIPConfig.u32AlternateDNS = IP_TO_U32(ALT_DNS_ADD_1,ALT_DNS_ADD_2,ALT_DNS_ADD_3,ALT_DNS_ADD_4);
  423. // mModuleIPConfig.u32Gateway = IP_TO_U32(GATEWAY_ADDRESS_1,GATEWAY_ADDRESS_2,GATEWAY_ADDRESS_3,GATEWAY_ADDRESS_4);
  424. mModuleIPConfig.u32Gateway = IP_TO_U32(GW1,GW2,GW3,GW4);
  425. mModuleIPConfig.u32SubnetMask = IP_TO_U32(SUBNET_MASK_1,SUBNET_MASK_2,SUBNET_MASK_3,SUBNET_MASK_4);
  426. /* Initialize the BSP. */
  427. // nm_bsp_init();
  428. /* Initialize Wi-Fi parameters structure. */
  429. memset((uint8_t *)&param, 0, sizeof(tstrWifiInitParam));
  430. /* Initialize Wi-Fi driver with data and status callbacks. */
  431. param.pfAppWifiCb = (void*) &wifi_cb;
  432. ret = m2m_wifi_init(&param);
  433. if (M2M_SUCCESS != ret)
  434. {
  435. mWiFiInitOK = false;
  436. mWiFiState = WIFI_INIT_ERROR_STATE;
  437. return RET_ERROR;
  438. }
  439. mWiFiInitOK = true;
  440. mWiFiState = WIFI_DISCONNECTED_STATE;
  441. socketInit();
  442. registerSocketCallback(socket_cb, resolve_cb);
  443. //Get MAC address from the module
  444. m2m_wifi_get_otp_mac_address(mac_addr, &u8IsMacAddrValid);
  445. if (!u8IsMacAddrValid) {
  446. m2m_wifi_set_mac_address(gau8MacAddr);
  447. }
  448. //Get the working MAC address from driver.
  449. m2m_wifi_get_mac_address(gau8MacAddr);
  450. //Initialize the human readable MAC address based on the working MAC
  451. set_dev_name_to_mac((uint8 *)gacDeviceName, gau8MacAddr);
  452. //Use the MAC to define the SSID of the module
  453. set_dev_name_to_mac((uint8 *)gstrM2MAPConfig.au8SSID, gau8MacAddr);
  454. // m2m_wifi_set_device_name((uint8 *)gacDeviceName, (uint8)m2m_strlen((uint8 *)gacDeviceName));
  455. //#ifdef USE_STATIC_IP
  456. // //Use static ip --> disable dhcp client before connecting
  457. // m2m_wifi_enable_dhcp(0);
  458. //#endif
  459. // if(m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL) != M2M_SUCCESS)
  460. // {
  461. // //wifi connect error...
  462. // printf("error");
  463. // }
  464. if(mUseDHCP == 1)
  465. {
  466. m2m_wifi_enable_dhcp(1);
  467. }
  468. else
  469. {
  470. m2m_wifi_enable_dhcp(0);
  471. }
  472. if(m2m_wifi_connect(mAPName,strlen(mAPName),HOME_AP_SEC_TYPE,mAPPassword,M2M_WIFI_CH_ALL) != M2M_SUCCESS)
  473. {
  474. //wifi connect error...
  475. printf("Wifi Connect error");
  476. }
  477. tstrPerphInitParam tst;
  478. m2m_periph_init(&tst);
  479. //Set all IOs as inputs except the LED (IO3)..
  480. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO3,1);
  481. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO4,1);
  482. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO15,1);
  483. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO16,0);
  484. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO18,0);
  485. // m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO6,0);
  486. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0);
  487. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0);
  488. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO15,0);
  489. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO16,0);
  490. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO18,0);
  491. // m2m_periph_gpio_set_val(M2M_PERIPH_GPIO6,0);
  492. TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT);
  493. // m2m_wifi_start_provision_mode((tstrM2MAPConfig *)&gstrM2MAPConfig, (char *)gacHttpProvDomainName, 1);
  494. // printf("Provision Mode started.\r\nConnect to [%s] via AP[%s] and fill up the page.\r\n",
  495. // MAIN_HTTP_PROV_SERVER_DOMAIN_NAME,
  496. // gstrM2MAPConfig.au8SSID);
  497. }
  498. int TurnOFFWiFi()
  499. {
  500. int shit;
  501. CloseSockets();
  502. socketDeinit();
  503. m2m_wifi_disconnect();
  504. m2m_wifi_deinit(&shit);
  505. WIFI_CHP_EN_PIN = 0;
  506. WIFI_CHP_RST_PIN = 0;
  507. mWiFiInitOK = false;
  508. gbConnectedWifi = false;
  509. HEARTBEAT_LED_2_PIN = LED_OFF;
  510. mCurIPAddress = 0xFFFFFFFF;
  511. // WIFI
  512. mWiFiState = WIFI_MODULE_OFF_STATE;
  513. return RET_OK;
  514. }
  515. int CloseSockets()
  516. {
  517. gbTcpConnection = false;
  518. close(TerminalServerSocket);
  519. if(TerminalSocket != -1)
  520. {
  521. close(TerminalSocket);
  522. }
  523. close(NetworkServerSocket);
  524. if(NetworkSocket != -1)
  525. {
  526. close(NetworkSocket);
  527. }
  528. #ifdef USE_SYSLOG
  529. close(SyslogServerSocket);
  530. if(SyslogSocket != -1)
  531. {
  532. close(SyslogSocket);
  533. }
  534. #endif
  535. close(BootloaderServerSocket);
  536. if(BootloaderSocket != -1)
  537. {
  538. close(BootloaderSocket);
  539. }
  540. }
  541. char GetWiFiSate()
  542. {
  543. return mWiFiState;
  544. }
  545. uint32 GetCurIPAddress()
  546. {
  547. return mCurIPAddress;
  548. }
  549. void TickWiFi()
  550. {
  551. if(mWiFiInitOK == false)
  552. {
  553. return;
  554. }
  555. if(mWiFiState == WIFI_DISCONNECTED_STATE && gbConnectedWifi == false)//we should be connected.. if the timer is expired, retry
  556. {
  557. if(IsTimerExpired(WIFI_RECONNECT_TIMER))
  558. {
  559. //m2m_wifi_disconnect();
  560. //m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL);
  561. m2m_wifi_connect(mAPName,strlen(mAPName),HOME_AP_SEC_TYPE,mAPPassword,M2M_WIFI_CH_ALL);
  562. TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT);
  563. }
  564. }
  565. // if(IsTimerExpired(WIFI_TICK_TIMER))
  566. // {
  567. m2m_wifi_handle_events();
  568. // TimerStart(WIFI_TICK_TIMER,1);
  569. // }
  570. if (gbConnectedWifi && !gbTcpConnection)
  571. {
  572. OpenTerminalServer();
  573. //OpenNetworkServer();
  574. // OpenBootloaderServer();
  575. // BootloaderActivateBootloader();
  576. #ifdef USE_SYSLOG
  577. OpenSyslogServer();
  578. #endif
  579. gbTcpConnection = true;
  580. }
  581. }
  582. //Terminal server implementation
  583. int OpenTerminalServer()
  584. {
  585. struct sockaddr_in strAddr;
  586. TerminalServerSocket = socket(AF_INET, SOCK_STREAM,0);
  587. uint16 TerminalPort = TERMINAL_SERVER_PORT;
  588. if(TerminalServerSocket >= 0)
  589. {
  590. strAddr.sin_family = AF_INET;
  591. strAddr.sin_port = _htons(TerminalPort);
  592. strAddr.sin_addr.s_addr = 0;
  593. bind(TerminalServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  594. return RET_OK;
  595. }
  596. else
  597. {
  598. return RET_ERROR;
  599. }
  600. }
  601. void SendTerminalData(uint8 *data, int size)
  602. {
  603. if(TerminalSocket != -1)
  604. {
  605. send(TerminalSocket,data,size,0);
  606. recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  607. }
  608. }
  609. void SentTerminalByte(uint8 data)
  610. {
  611. if(TerminalSocket != -1)
  612. {
  613. send(TerminalSocket,&data,1,0);
  614. recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  615. }
  616. }
  617. int OpenNetworkServer()
  618. {
  619. struct sockaddr_in strAddr;
  620. NetworkServerSocket = socket(AF_INET, SOCK_STREAM,0);
  621. uint16 ServerPort = NETWORK_SERVER_PORT;
  622. if(NetworkServerSocket >= 0)
  623. {
  624. strAddr.sin_family = AF_INET;
  625. strAddr.sin_port = _htons(ServerPort);
  626. strAddr.sin_addr.s_addr = 0;
  627. bind(NetworkServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  628. return RET_OK;
  629. }
  630. else
  631. {
  632. return RET_ERROR;
  633. }
  634. }
  635. void SendNetworkData(uint8 *data, int size)
  636. {
  637. if(NetworkSocket != -1)
  638. {
  639. send(NetworkSocket,data,size,0);
  640. recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  641. }
  642. }
  643. void SentNetworkByte(uint8 data)
  644. {
  645. if(NetworkSocket != -1)
  646. {
  647. send(NetworkSocket,&data,1,0);
  648. recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  649. }
  650. }
  651. //Printf Server Implementation
  652. #ifdef USE_SYSLOG
  653. int OpenSyslogServer()
  654. {
  655. struct sockaddr_in strAddr;
  656. SyslogServerSocket = socket(AF_INET, SOCK_STREAM,0);
  657. uint16 ServerPort = SYSLOG_SERVER_PORT;
  658. if(SyslogServerSocket >= 0)
  659. {
  660. strAddr.sin_family = AF_INET;
  661. strAddr.sin_port = _htons(ServerPort);
  662. strAddr.sin_addr.s_addr = 0;
  663. bind(SyslogServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  664. return RET_OK;
  665. }
  666. else
  667. {
  668. return RET_ERROR;
  669. }
  670. }
  671. void SendSyslogData(uint8 *data, int size)
  672. {
  673. if(SyslogSocket != -1);
  674. {
  675. send(SyslogSocket,data,size,0);
  676. recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0);
  677. }
  678. }
  679. void SendSyslogByte(uint8 data)
  680. {
  681. if(SyslogSocket != -1)
  682. {
  683. send(SyslogSocket,&data,1,0);
  684. recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0);
  685. }
  686. }
  687. int IsSyslogClientConnected()
  688. {
  689. if(SyslogSocket == -1)
  690. {
  691. return 0;
  692. }
  693. return 1;
  694. }
  695. #endif
  696. int OpenBootloaderServer()
  697. {
  698. struct sockaddr_in strAddr;
  699. BootloaderServerSocket = socket(AF_INET, SOCK_STREAM,0);
  700. uint16 ServerPort = BOOTLOADER_SERVER_PORT;
  701. if(BootloaderServerSocket >= 0)
  702. {
  703. strAddr.sin_family = AF_INET;
  704. strAddr.sin_port = _htons(ServerPort);
  705. strAddr.sin_addr.s_addr = 0;
  706. bind(BootloaderServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  707. return RET_OK;
  708. }
  709. else
  710. {
  711. return RET_ERROR;
  712. }
  713. }
  714. int CloseBootloaderServer()
  715. {
  716. close(BootloaderServerSocket);
  717. BootloaderServerSocket = -1;
  718. if(BootloaderSocket != -1)
  719. {
  720. close(BootloaderSocket);
  721. BootloaderSocket = -1;
  722. }
  723. }
  724. void SendBootloaderData(uint8 *data, int size)
  725. {
  726. if(BootloaderSocket != -1);
  727. {
  728. send(BootloaderSocket,data,size,0);
  729. recv(BootloaderSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0);
  730. }
  731. }
  732. void SendSBootloaderByte(uint8 data)
  733. {
  734. if(BootloaderSocket != -1)
  735. {
  736. send(BootloaderSocket,&data,1,0);
  737. recv(BootloaderSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0);
  738. }
  739. }
  740. int IsBootloaderClientConnected()
  741. {
  742. if(BootloaderSocket == -1)
  743. {
  744. return 0;
  745. }
  746. return 1;
  747. }