SDK同步与异步通信模式

本文介绍SDK同步与异步通信模式。

同步通信模式

大多数嵌入式平台移植C Link SDK使用同步底层通信模型,能够支持C Link SDK以轮询方式主动收取网络报文。例如嵌入式Linux、Windows系统,以及大部分配备LwIP协议栈通信的RTOS(FreeRTOS系统)等,都支持上层应用主动收取网络报文。在这些系统上,C Link SDK的网络应用软件,可以随时主动的调用类似read()的函数接口,从已开启的Socket接口收取报文。

因此,C Link SDK的默认方式通过轮询方式和底层通信软件模块交互,当IOT_MQTT_Yield()接口被调用时,从网络上收取云端下发报文的动作。

SDK初始化以及收发数据的示意图

  1. 应用程序通过 IOT_MQTT_Construct() 建立IoT设备与云端之间的长连接通道。

  2. 在长连接上使用 IOT_MQTT_Subscribe() 订阅Topic,将可接受的消息报文下发,并设置消息到达后处理的回调函数。

  3. 达到初始化就绪状态,进入主要的业务逻辑循环。

    • 在该循环中,调用 IOT_MQTT_Yield(),不仅可以收取云端下发的报文,也完成了必要的数据重发和MQTT Keepalive报文发送。

    • 应用程序检查是否有属性发生变化需要通知物联网平台,调用 IOT_MQTT_Publish(),将消息报文向云端上报。

异步通信模式

有的TCP/IP协议栈不提供同步方式的数据接收接口,例如Nucleus操作系统。有的用户认为同步方式效率不高,希望设备收到数据时可以主动将数据发送给SDK,可以使用SDK的异步通信模式。

异步通信模式与同步通信模式的最大区别在于,数据报文的接收发起方不再是应用程序或SDK,而是设备的协议栈或者底层通信模块。

在V3.0.1及以上版本,C Link SDK支持将SDK切换到异步通信模式,在SDK提供的配置工具中可以通过Main Menu -> MQTT Configurations > FEATURE_ASYNC_PROTOCOL_STACK 使用异步通信模式开关。

SDK的收发数据示意图

。
  1. 应用通过IOT_MQTT_Construct()建立IoT设备与云端之间的长连接通道。

  2. 当设备从SDK创建的Socket上收到网络报文时调用SDK提供的接口 IOT_MQTT_Nwk_Event_Handler(),由该函数将数据发送给SDK进行处理。

  3. IOT_MQTT_Yield()只发不收。

    • 重传云端尚未应答的QoS1消息仍然进行。

    • 若达到心跳间隔,则发送心跳维持连接仍然进行。

    • 不会调用HAL_TCP_Read()等接口去网络收取报文。