app_socket.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /****************************************************************************
  2. *
  3. * Copy right: 2017-, Copyrigths of EigenComm Ltd.
  4. * File name: app.c
  5. * Description: EC616 socket demo entry source file
  6. * History: Rev1.0 2018-10-12
  7. *
  8. ****************************************************************************/
  9. #include "bsp.h"
  10. #include "bsp_custom.h"
  11. #include "osasys.h"
  12. #include "ostask.h"
  13. #include "queue.h"
  14. #include "ps_event_callback.h"
  15. //#include "psproxytask.h"
  16. #include "app.h"
  17. #include "cmisim.h"
  18. #include "cmimm.h"
  19. #include "cmips.h"
  20. #include "sockets.h"
  21. #include "psifevent.h"
  22. #include "ps_lib_api.h"
  23. #include "lwip/netdb.h"
  24. #include "debug_log.h"
  25. #include "slpman_ec616.h"
  26. #include "plat_config.h"
  27. typedef enum {
  28. UDP_CLIENT,
  29. UDP_SERVER,
  30. TCP_CLIENT,
  31. TCP_SERVER
  32. } socketCaseNum;
  33. // Choose which test case to run
  34. static socketCaseNum testCaseNum = TCP_CLIENT;
  35. uint8_t socketSlpHandler = 0xff;
  36. // app task static stack and control block
  37. #define INIT_TASK_STACK_SIZE (1024)
  38. #define RINGBUF_READY_FLAG (0x06)
  39. #define APP_EVENT_QUEUE_SIZE (10)
  40. #define MAX_PACKET_SIZE (256)
  41. static StaticTask_t initTask;
  42. static UINT8 appTaskStack[INIT_TASK_STACK_SIZE];
  43. static volatile UINT32 Event;
  44. static QueueHandle_t psEventQueueHandle;
  45. static UINT8 gImsi[16] = {0};
  46. static INT32 sockfd = -1;
  47. static UINT32 gCellID = 0;
  48. static void sendQueueMsg(UINT32 msgId, UINT32 xTickstoWait)
  49. {
  50. eventCallbackMessage_t *queueMsg = NULL;
  51. queueMsg = malloc(sizeof(eventCallbackMessage_t));
  52. queueMsg->messageId = msgId;
  53. if (psEventQueueHandle)
  54. {
  55. if (pdTRUE != xQueueSend(psEventQueueHandle, &queueMsg, xTickstoWait))
  56. {
  57. ECOMM_TRACE(UNILOG_PLA_APP, sendQueueMsg_1, P_ERROR, 0, "xQueueSend error");
  58. }
  59. }
  60. }
  61. static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen)
  62. {
  63. CmiSimImsiStr *imsi = NULL;
  64. CmiPsCeregInd *cereg = NULL;
  65. UINT8 rssi = 0, index = 0;
  66. NmAtiNetifInfo *netif = NULL;
  67. switch(eventID)
  68. {
  69. case NB_URC_ID_SIM_READY:
  70. {
  71. imsi = (CmiSimImsiStr *)param;
  72. memcpy(gImsi, imsi->contents, imsi->length);
  73. ECOMM_STRING(UNILOG_PLA_STRING, socketRegisterPSUrcCallback_0, P_INFO, "SIM ready(imsi=%s)", (UINT8 *)imsi->contents);
  74. break;
  75. }
  76. case NB_URC_ID_MM_SIGQ:
  77. {
  78. rssi = *(UINT8 *)param;
  79. ECOMM_TRACE(UNILOG_PLA_APP, socketRegisterPSUrcCallback_1, P_INFO, 1, "RSSI signal=%d", rssi);
  80. break;
  81. }
  82. case NB_URC_ID_PS_BEARER_ACTED:
  83. {
  84. ECOMM_TRACE(UNILOG_PLA_APP, socketRegisterPSUrcCallback_2, P_INFO, 0, "Default bearer activated");
  85. break;
  86. }
  87. case NB_URC_ID_PS_BEARER_DEACTED:
  88. {
  89. ECOMM_TRACE(UNILOG_PLA_APP, socketRegisterPSUrcCallback_3, P_INFO, 0, "Default bearer Deactivated");
  90. break;
  91. }
  92. case NB_URC_ID_PS_CEREG_CHANGED:
  93. {
  94. cereg = (CmiPsCeregInd *)param;
  95. gCellID = cereg->celId;
  96. ECOMM_TRACE(UNILOG_PLA_APP, pslibPSUrcCallback_4, P_INFO, 4, "URCCallBack:CEREG changed act:%d celId:%d locPresent:%d tac:%d", cereg->act, cereg->celId, cereg->locPresent, cereg->tac);
  97. break;
  98. }
  99. case NB_URC_ID_PS_NETINFO:
  100. {
  101. netif = (NmAtiNetifInfo *)param;
  102. if (netif->netStatus == NM_NETIF_ACTIVATED)
  103. sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
  104. break;
  105. }
  106. }
  107. return 0;
  108. }
  109. static void testCaseTcpClient()
  110. {
  111. eventCallbackMessage_t *queueItem = NULL;
  112. INT32 recvTimeout = 10;
  113. INT32 result;
  114. UINT32 cliLen;
  115. fd_set readfds;
  116. struct timeval tv;
  117. struct addrinfo hints, *server_res;
  118. CHAR serverip[] = "39.156.69.79";
  119. CHAR serverport[] = "80";
  120. memset( &hints, 0, sizeof( hints ) );
  121. hints.ai_socktype = SOCK_STREAM;
  122. hints.ai_protocol = IPPROTO_TCP;
  123. while(1){
  124. if (xQueueReceive(psEventQueueHandle, &queueItem, portMAX_DELAY))
  125. {
  126. #ifdef USING_PRINTF
  127. printf("[%d]Queue receive->0x%x \r\n",__LINE__,queueItem->messageId);
  128. #endif
  129. switch(queueItem->messageId)
  130. {
  131. case QMSG_ID_NW_IP_READY:
  132. #ifdef USING_PRINTF
  133. printf("[%d]IP got ready\r\n",__LINE__);
  134. #endif
  135. if (getaddrinfo( serverip, serverport , &hints, &server_res ) != 0 )
  136. {
  137. #ifdef USING_PRINTF
  138. printf("[%d]TCP connect unresolved dns\r\n",__LINE__);
  139. #endif
  140. }
  141. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  142. if (sockfd < 0)
  143. {
  144. #ifdef USING_PRINTF
  145. printf("[%d]socket create error\r\n",__LINE__);
  146. #endif
  147. }
  148. if (connect(sockfd, (struct sockaddr *) server_res->ai_addr, server_res->ai_addrlen) < 0 && errno != EINPROGRESS)
  149. {
  150. #ifdef USING_PRINTF
  151. printf("[%d]socket connect fail\r\n",__LINE__);
  152. #endif
  153. close(sockfd);
  154. break;
  155. }
  156. #ifdef USING_PRINTF
  157. printf("[%d]socket connect success\r\n",__LINE__);
  158. #endif
  159. sendQueueMsg(QMSG_ID_SOCK_SENDPKG, 0);
  160. break;
  161. case QMSG_ID_NW_IP_NOREACHABLE:
  162. case QMSG_ID_NW_IP_SUSPEND:
  163. if (sockfd > 0)
  164. {
  165. close(sockfd);
  166. sockfd = -1;
  167. }
  168. break;
  169. case QMSG_ID_SOCK_SENDPKG:
  170. send( sockfd, "hello", 6, 0 );
  171. osDelay(2000);
  172. #ifdef USING_PRINTF
  173. printf("[%d]socket send success\r\n",__LINE__);
  174. #endif
  175. sendQueueMsg(QMSG_ID_SOCK_SENDPKG, 0);
  176. break;
  177. }
  178. free(queueItem);
  179. }
  180. }
  181. }
  182. static void socketAppTask(void *arg)
  183. {
  184. psEventQueueHandle = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(eventCallbackMessage_t*));
  185. if (psEventQueueHandle == NULL)
  186. {
  187. ECOMM_TRACE(UNILOG_PLA_APP, socketAppTask_1, P_ERROR, 0, "psEventQueue create error!");
  188. return;
  189. }
  190. switch(testCaseNum)
  191. {
  192. case TCP_CLIENT:
  193. testCaseTcpClient();
  194. break;
  195. case TCP_SERVER:
  196. break;
  197. }
  198. }
  199. static void appInit(void *arg)
  200. {
  201. osThreadAttr_t task_attr;
  202. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  203. {
  204. HAL_UART_RecvFlowControl(false);
  205. }
  206. slpManApplyPlatVoteHandle("SOCKET",&socketSlpHandler);
  207. registerPSEventCallback(NB_GROUP_ALL_MASK, socketRegisterPSUrcCallback);
  208. memset(&task_attr,0,sizeof(task_attr));
  209. memset(appTaskStack, 0xA5,INIT_TASK_STACK_SIZE);
  210. task_attr.name = "app";
  211. task_attr.stack_mem = appTaskStack;
  212. task_attr.stack_size = INIT_TASK_STACK_SIZE;
  213. task_attr.priority = osPriorityNormal;
  214. task_attr.cb_mem = &initTask;//task control block
  215. task_attr.cb_size = sizeof(StaticTask_t);//size of task control block
  216. osThreadNew(socketAppTask, NULL, &task_attr);
  217. //abupfotaInit();
  218. }
  219. /**
  220. \fn int main_entry(void)
  221. \brief main entry function.
  222. \return
  223. */
  224. void main_entry(void) {
  225. BSP_CommonInit();
  226. osKernelInitialize();
  227. registerAppEntry(appInit, NULL);
  228. if (osKernelGetState() == osKernelReady)
  229. {
  230. osKernelStart();
  231. }
  232. while(1);
  233. }