在上一篇文章中,着重分析了 SDK的 核心调度线程yield,本文再简单的分析下用户 事件调度 API 接口函数,该函数 原型如下:
原型
void IOT_Linkkit_Yield(int timeout_ms);
接口说明
若SDK占有独立线程, 该函数只将接收到的网络报文分发到用户的回调函数中, 否则表示将CPU交给SDK让其接收网络报文并将消息分发到用户的回调函数中
参数说明
参数 数据类型 方向 说明
timeout_ms int 输入 单线程模式下, 每次尝试接收网络报文的超时时间
返回值说明
无返回值
官方的解释貌似还是有点让人混淆,无操作系的 移植我没有测试过, 这里就简单的 说下在有操作系统的 应用开发下,该函数的功能就是是“用户态”的 “事件调度” ,它会将 接收到的网络报文,进行分析,然后触发对应的用户事件回调函数,不同类型的网络报文,对应不同的 用户回调函数。
上一篇文章中分析到的 SDK自己的守护、调度线程 yield,是SDK自己使用,而 IOT_Linkkit_Yield 则是 给用户使用的,所以这个接口API的应用有2点需要注意:
① 网关设备,必须要 单独创建一个 线程,运行 IOT_Linkkit_Yield 函数。
② 编写 用户自定义的 事件 回调函数,使用 IOT_RegisterCallback 接口函数 进行 事件 注册,示例代码如下:
/* Register Callback */
IOT_RegisterCallback(ITE_CONNECT_SUCC, user_connected_event_handler);
IOT_RegisterCallback(ITE_DISCONNECTED, user_disconnected_event_handler);
IOT_RegisterCallback(ITE_PROPERTY_SET, user_property_set_event_handler);
IOT_RegisterCallback(ITE_REPORT_REPLY, user_report_reply_event_handler);
IOT_RegisterCallback(ITE_TIMESTAMP_REPLY, user_timestamp_reply_event_handler);
IOT_RegisterCallback(ITE_INITIALIZE_COMPLETED, user_initialized);
IOT_RegisterCallback(ITE_PERMIT_JOIN, user_permit_join_event_handler);
这些 “事件” 能够反映 整个SDK 的运行 状态,我们在 这些事件 的自定义回调函数中,添加 我们自己的 应用 业务逻辑即可。
关于 SDK 提供的各种事件,官方提供的介绍如下:
- ITE_CONNECT_SUCC
- ITE_DISCONNECTED
- ITE_RAWDATA_ARRIVED
- ITE_SERVICE_REQUEST
- ITE_PROPERTY_SET
- ITE_PROPERTY_GET
- ITE_REPORT_REPLY
- ITE_TRIGGER_EVENT_REPLY
- ITE_TIMESTAMP_REPLY
- ITE_TOPOLIST_REPLY
- ITE_PERMIT_JOIN
- ITE_INITIALIZE_COMPLETED
- ITE_FOTA
- ITE_COTA
这里,要特别说明一下,文中提到的 “用户自定义事件回调函数”,并非是我们开发者自己定义的 私有 事件回调函数,而是说,SDK已经规定好了 上面 那些 事件类型, 而且也规定了 这些 回调函数的 框架,其实就是定义好了 形参和返回值类型。我们需要根据这个框架去编写填充 事件回调函数 内容,说到底,这些事件回调函数并非自定义,只不过 这些事件 我们怎么用,才是“自己定义”的。
接下来,分析一下 该函数 的 代码逻辑:
小结:这个函数 很重要,必须要有,因为所有的 应用开发,其实都是围绕着 SDK提供的 各种 “事件”机制来做开发的。