全部产品
云市场

SDK的同步与异步通信模式

更新时间:2019-03-18 10:19:30

同步通信模式

C-SDK需要被移植到的大多数嵌入式平台都使用 同步 的底层通信模型, 能够支持C-SDK用 轮询 的方式主动去网络上收取报文

  • 比如, 我们熟悉的嵌入式 Linux 系统, Windows 系统, 以及大部分配备lwip协议栈通信的RTOS比如 FreeRTOS 系统等, 它们都支持上层应用随时去 主动 收取网络报文
  • 在这样的系统上, C-SDK这样的网络应用软件, 可以 随时的主动的** 调用类似 read() 这样的函数接口从已开启的socket接口收取报文

因此, C-SDK的默认方式通过 轮询方式 去和底层通信软件模块交互: 当它的 IOT_MQTT_Yield() 接口被调用时, 去做从网络上收取云端下发报文的动作。SDK初始化以及收发数据的示意图如下所示:

下面对SDK的同步通信模式进行简单的描述:

  • 首先应用程序通过 IOT_MQTT_Construct() 建立IoT设备与云端之间的长连接通道
  • 然后在这个长连接上用 IOT_MQTT_Subscribe() 订阅一些Topic, 表达自己将可接受哪些消息报文的下发, 并设置这些消息到达后处理它们的回调函数
  • 达到初始化就绪状态, 进入主要的业务逻辑循环
    • 在该循环中, 调用 IOT_MQTT_Yield(), 不仅可以收取云端下发的报文, 也完成了必要的数据重发和MQTT Keepalive报文发送
    • 应用程序检查是否有属性发生变化需要通知物联网平台, 调用 IOT_MQTT_Publish(), 将消息报文向云端上报

异步通信模式

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

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

在V3.0.1及以上版本, C-SDK支持将SDK切换到异步通信模式, 在SDK提供的配置工具中可以通过Main Menu -> MQTT Configurations -> FEATURE_ASYNC_PROTOCOL_STACK 使能异步开关。使用异步方式通信的SDK的收发数据示意图如下所示:

下面对上面的数据收发过程进行简单的描述:

  • 首先应用通过 IOT_MQTT_Construct() 建立IoT设备与云端之间的长连接通道
  • 当设备从SDK创建的socket上收到网络报文时调用SDK提供的接口 IOT_MQTT_Nwk_Event_Handler(),由该函数将数据发送给SDK进行处理
  • IOT_MQTT_Yield()只发不收
    • 重传云端尚未应答的 QoS1 消息仍然进行
    • 若达到心跳间隔, 则发送心跳维持连接仍然进行
    • 不会调用 HAL_TCP_Read() 等接口去网络收取报文

SDK在 MTK2503/MTK6261Nucleus 上使用异步通信模式进行了集成, 详见: MTK2503/MTK6261+Nucleus移植示例