本文介绍SDK同步与异步通信模式。
同步通信模式
大多数嵌入式平台移植C Link SDK使用同步底层通信模型,能够支持C Link SDK以轮询方式主动收取网络报文。例如嵌入式Linux、Windows系统,以及大部分配备LwIP协议栈通信的RTOS(FreeRTOS系统)等,都支持上层应用主动收取网络报文。在这些系统上,C Link SDK的网络应用软件,可以随时主动的调用类似read()
的函数接口,从已开启的Socket
接口收取报文。
因此,C Link SDK的默认方式通过轮询方式和底层通信软件模块交互,当IOT_MQTT_Yield()
接口被调用时,从网络上收取云端下发报文的动作。
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 Link 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()
等接口去网络收取报文。