platformNetwork.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #define rlogEnable 1 // 是否使能日志
  2. #define rlogColorEnable 1 // 是否使能日志颜色
  3. #define rlogLevel (rlogLvlWarning) // 日志打印等级
  4. #define rlogTag "RyanMqttNet" // 日志tag
  5. #include "platformNetwork.h"
  6. #include "RyanMqttLog.h"
  7. #define tcpConnect (RyanMqttBit1)
  8. #define tcpSend (RyanMqttBit2)
  9. #define tcpClose (RyanMqttBit3)
  10. #define tcpRecv (RyanMqttBit4)
  11. static osEventFlagsId_t mqttNetEventHandle;
  12. static const osEventFlagsAttr_t mqttNetEvent_attributes = {
  13. .name = "mqttNetEvent"};
  14. static void callback_socket_connect(s32 socketId, s32 errCode, void *customParam)
  15. {
  16. platformNetwork_t *platformNetwork = (platformNetwork_t *)customParam;
  17. if (errCode == SOC_SUCCESS_OK && platformNetwork->socket == socketId)
  18. {
  19. rlog_i("socket 连接成功: %d", socketId);
  20. osEventFlagsSet(mqttNetEventHandle, tcpConnect);
  21. }
  22. }
  23. static void callback_socket_close(s32 socketId, s32 errCode, void *customParam)
  24. {
  25. if (errCode == SOC_SUCCESS_OK)
  26. {
  27. rlog_w("关闭socket成功: %d", socketId);
  28. }
  29. else
  30. {
  31. rlog_e("关闭socket失败 socketId=%d,error_cause=%d", socketId, errCode);
  32. }
  33. }
  34. static void callback_socket_read(s32 socketId, s32 errCode, void *customParam)
  35. {
  36. platformNetwork_t *platformNetwork = (platformNetwork_t *)customParam;
  37. if (SOC_SUCCESS_OK == errCode && platformNetwork->socket == socketId)
  38. {
  39. rlog_w("socket接收到数据: %d", socketId);
  40. osEventFlagsSet(mqttNetEventHandle, tcpRecv);
  41. }
  42. }
  43. static void callback_socket_accept(s32 listenSocketId, s32 errCode, void *customParam)
  44. {
  45. }
  46. static ST_SOC_Callback callback_soc_func =
  47. {
  48. callback_socket_connect,
  49. callback_socket_close,
  50. callback_socket_accept,
  51. callback_socket_read,
  52. };
  53. /**
  54. * @brief 连接mqtt服务器
  55. *
  56. * @param userData
  57. * @param platformNetwork
  58. * @param host
  59. * @param port
  60. * @return RyanMqttError_e
  61. * 成功返回RyanMqttSuccessError, 失败返回错误信息
  62. */
  63. RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platformNetwork, const char *host, const char *port)
  64. {
  65. RyanMqttError_e result = RyanMqttSuccessError;
  66. u8 nw_state = 0;
  67. int32_t eventId;
  68. Ql_SOC_Register(callback_soc_func, platformNetwork); // 注册socket回调函数
  69. // 如果第一次connect就创建事件标志组,否则情况事件标志组标志位
  70. // todo 这里还是推荐在close的时候把时间标志组删除,否则没有别的地方可以调用删除函数。
  71. if (NULL == mqttNetEventHandle)
  72. mqttNetEventHandle = osEventFlagsNew(&mqttNetEvent_attributes);
  73. else
  74. osEventFlagsClear(mqttNetEventHandle, INTMAX_MAX);
  75. // 获取网络连接状态
  76. Ql_GetCeregState(&nw_state);
  77. if ((1 != nw_state) && (5 != nw_state))
  78. {
  79. result = RyanMqttSocketConnectFailError;
  80. goto __exit;
  81. }
  82. // 创建socket
  83. platformNetwork->socket = Ql_SOC_Create(0, SOC_TYPE_TCP);
  84. if (platformNetwork->socket < 0)
  85. {
  86. result = RyanSocketFailedError;
  87. goto __exit;
  88. }
  89. // 等待连接成功
  90. s32 connectResult = Ql_SOC_Connect(platformNetwork->socket, (u8 *)host, atoi(port));
  91. if (SOC_SUCCESS_OK != connectResult && SOC_NONBLOCK != connectResult)
  92. {
  93. platformNetworkClose(userData, platformNetwork);
  94. result = RyanMqttSocketConnectFailError;
  95. goto __exit;
  96. }
  97. eventId = osEventFlagsWait(mqttNetEventHandle, tcpConnect, osFlagsWaitAny, 10000);
  98. if (tcpConnect != eventId)
  99. {
  100. platformNetworkClose(userData, platformNetwork);
  101. result = RyanMqttSocketConnectFailError;
  102. goto __exit;
  103. }
  104. __exit:
  105. return result;
  106. }
  107. /**
  108. * @brief 非阻塞接收数据
  109. *
  110. * @param userData
  111. * @param platformNetwork
  112. * @param recvBuf
  113. * @param recvLen
  114. * @param timeout
  115. * @return RyanMqttError_e
  116. * socket错误返回 RyanSocketFailedError
  117. * 接收超时或者接收数据长度不等于期待数据接受长度 RyanMqttRecvPacketTimeOutError
  118. * 接收成功 RyanMqttSuccessError
  119. */
  120. RyanMqttError_e platformNetworkRecvAsync(void *userData, platformNetwork_t *platformNetwork, char *recvBuf, int recvLen, int timeout)
  121. {
  122. int32_t recvResult = 0;
  123. int32_t offset = 0;
  124. int32_t timeOut2 = timeout;
  125. int32_t eventId;
  126. platformTimer_t timer = {0};
  127. if (-1 == platformNetwork->socket)
  128. return RyanSocketFailedError;
  129. platformTimerCutdown(&timer, timeout);
  130. while ((offset < recvLen) && (0 != timeOut2))
  131. {
  132. recvResult = Ql_SOC_Recv(platformNetwork->socket, (u8 *)(recvBuf + offset), recvLen - offset);
  133. if (recvResult > 0)
  134. {
  135. offset += recvResult;
  136. }
  137. else
  138. {
  139. eventId = osEventFlagsWait(mqttNetEventHandle, tcpRecv, osFlagsWaitAny, timeOut2);
  140. if (tcpRecv == eventId)
  141. {
  142. recvResult = Ql_SOC_Recv(platformNetwork->socket, (u8 *)(recvBuf + offset), recvLen - offset);
  143. if (recvResult < 0) // 小于零,表示错误,个别错误不代表socket错误
  144. {
  145. if (recvResult != SOC_NONBLOCK &&
  146. recvResult != SOC_ERROR_TIMEOUT)
  147. {
  148. rlog_e("recv失败 result: %d, recvLen: %d, eventId: %d", recvResult, recvLen, eventId);
  149. return RyanSocketFailedError;
  150. }
  151. break;
  152. }
  153. offset += recvResult;
  154. }
  155. }
  156. timeOut2 = platformTimerRemain(&timer);
  157. }
  158. if (offset != recvLen)
  159. return RyanMqttRecvPacketTimeOutError;
  160. return RyanMqttSuccessError;
  161. }
  162. /**
  163. * @brief 非阻塞发送数据
  164. *
  165. * @param userData
  166. * @param platformNetwork
  167. * @param sendBuf
  168. * @param sendLen
  169. * @param timeout
  170. * @return RyanMqttError_e
  171. * socket错误返回 RyanSocketFailedError
  172. * 接收超时或者接收数据长度不等于期待数据接受长度 RyanMqttRecvPacketTimeOutError
  173. * 接收成功 RyanMqttSuccessError
  174. */
  175. RyanMqttError_e platformNetworkSendAsync(void *userData, platformNetwork_t *platformNetwork, char *sendBuf, int sendLen, int timeout)
  176. {
  177. int32_t sendResult = 0;
  178. int32_t offset = 0;
  179. int32_t timeOut2 = timeout;
  180. int32_t eventId;
  181. platformTimer_t timer = {0};
  182. if (-1 == platformNetwork->socket)
  183. return RyanSocketFailedError;
  184. platformTimerCutdown(&timer, timeout);
  185. while ((offset < sendLen) && (0 != timeOut2))
  186. {
  187. sendResult = Ql_SOC_Send(platformNetwork->socket, (u8 *)(sendBuf + offset), sendLen - offset);
  188. if (sendResult < 0) // 小于零,表示错误,个别错误不代表socket错误
  189. {
  190. if (sendResult != SOC_NONBLOCK &&
  191. sendResult != SOC_ERROR_TIMEOUT)
  192. return RyanSocketFailedError;
  193. }
  194. offset += sendResult;
  195. timeOut2 = platformTimerRemain(&timer);
  196. }
  197. // osDelay(1000);
  198. if (offset != sendLen)
  199. return RyanMqttSendPacketTimeOutError;
  200. return RyanMqttSuccessError;
  201. }
  202. /**
  203. * @brief 断开mqtt服务器连接
  204. *
  205. * @param userData
  206. * @param platformNetwork
  207. * @return RyanMqttError_e
  208. */
  209. RyanMqttError_e platformNetworkClose(void *userData, platformNetwork_t *platformNetwork)
  210. {
  211. if (platformNetwork->socket >= 0)
  212. {
  213. Ql_SOC_Close(platformNetwork->socket);
  214. platformNetwork->socket = -1;
  215. }
  216. return RyanMqttSuccessError;
  217. }