# 通信协议选择与适配
Tiny中支持MQTT、LWM2M、CoAP、mbedtls、LwIP全套IoT互联互通协议栈，以下主要介绍MQTT、LWM2M、CoAP这三种协议。
表1支持协议 
| 术语名称 | 描述                                                                                                                                                                                               |
|:---|:---|
| MQTT    | MQTT（Message Queue Telemetry Transport）是一个物联网传输协议，被设计用于轻量级的发布/订阅式消息传输，旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTTS指MQTT+SSL/TLS，在MQTTS中使用SSL/TLS协议进行加密传输。                                             |
| CoAP    | 受约束的应用协议CoAP（Constrained Application Protocol）是一种软件协议，旨在使非常简单的电子设备能够在互联网上进行交互式通信。CoAPS指CoAP over DTLS，在CoAPS中使用DTLS协议进行加密传输。                                                                     |
| LwM2M | LwM2M（lightweight Machine to Machine）是由OMA（Open Mobile Alliance)定义的物联网协议，主要使用在资源受限(包括存储、功耗等)的NB-IoT终端。                                                                                          |
| mbedtls | mbedTLS（前身PolarSSL）是面向嵌入式系统，实现的一套易用的加解密算法和SSL/TLS库。mbedTLS系统开销极小，对于系统资源要求不高。mbedTLS是开源项目，并且使用Apache 2.0许可证，使得用户既可以将mbedTLS使用在开源项目中，也可以应用于商业项目。目前使用mbedTLS的项目很多，例如Monkey HTTP Daemon，LinkSYS路由器。 |
   
#### 云服务抽象层API
端云互通组件是IoT Device SDK Tiny中的重要组件，提供端云协同能力和基于MQTT、LwM2M、CoAP协议对接华为云的开放API。
支持MQTT/ LwM2M/CoAP协议、MQTT/ LwM2M协议模组或内置对接华为云模组来对接华为云的开发者，无需关注对接华为云物联网协议的实现细节，仅仅需要将所选择的物联网协议注册到云服务抽象层（OC AL），再调用OC AL提供的抽象层接口即可。
- OC-MQTT OC AL提供的基于MQTT协议抽象层接口代码目录为：...\\iot_link\\oc\\oc_mqtt，OC AL提供的MQTT协议端云互通API请参考最新的oc_mqtt_al.h文件，API接口具体如下：
  
  | 目录                    | 描述                                            |
  |:---|:---|
  | .../oc_mqtt_al        | 适配华为OC服务的MQTT抽象层。通过注册机制，最终调用到用户注册的函数        |
  | .../oc_mqtt_tiny_v5 | SDK内置的soft类设备适配华为OC服务的MQTT的具体实现(针对云端V5版本接口)。 |
  | .../oc_mqtt_profile_v5 | SDK内置的基于物模型的接口，解析了topic，定义了相关的数据格式           |
     
  
- OC-LwM2M OC AL提供的基于LwM2M协议抽象层接口代码目录为：...\\iot_link\\oc\\oc_lwm2m， OC AL提供的基于LwM2M协议端云互通API参考oc_lwm2m_al.h文件，API接口具体如下：
  
  | 目录                          | 描述                                                                               |
  |:---|:---|
  | .../oc_lwm2m_al              | 华为云服务OC LwM2M的抽象层接口及实现。通过注册，最终调用底层的适配函数                                        |
  | .../atiny_lwm2m              | SDK内置的soft类设备适配华为OC服务的LwM2M的具体实现。通过抽象层提供的oc_lwm2m_register注册函数，将相关功能注册到SDK中     |
  | .../oc_lwm2m_imp/boudica150 | SDK内置的boudica150适配华为OC服务的LwM2M的具体实现。通过抽象层提供的oc_lwm2m_register注册函数，将相关功能注册到SDK中 |
     
  
- OC-CoAP OC AL提供的基于CoAP协议抽象层接口代码目录为：...\\iot_link\\oc\\oc_coap，OC AL提供的基于CoAP协议端云互通API参考oc_coap_al.h文件，API接口具体如下：
  
  | 目录              | 描述                                                                          |
  |:---|:---|
  | .../oc_coap_al   | 华为云服务OC CoAP的抽象层接口及实现。通过注册，最终调用底层的适配函数                                     |
  | .../atiny_coap | SDK内置的soft类设备适配华为OC服务的CoAP的具体实现。通过抽象层提供的oc_coap_register注册函数，将相关功能注册到SDK中 |
     
  
 
#### 物联组件协议层
IoT Device SDK Tiny集成了LwM2M、CoAP、MQTT等物联网标准协议，您可以直接调用已实现协议，或添加自定义协议，将其注册进SDK中。其协议层目录为：...\\network\\。
1. MQTT AL 根据MQTT标准协议，IoT Device SDK Tiny提供的MQTT服务都是建立在标准的MQTT协议基础上，并提供MQTT协议抽象层接口。适配MQTT的软件结构示意图如下：
   ```
   typedef struct
   {
      ///< connect to the server
      void* (* connect)   (mqtt_al_conpara_t *param);
      ///< disconnect from the server
      int    (* disconnect)(void *handle );
      ///< publish a message to the server
      int   (* publish)    (void *handle, mqtt_al_pubpara_t *msg);
      ///< subscribe a topic to the server
      int    (* subscribe)   (void *handle, mqtt_al_subpara_t *subpara);
      ///< unsubscribe a topic to the server
      int    (* unsubscribe) (void *handle, mqtt_al_unsubpara_t *unsubpara);
      ///< check the mqtt engine status
      en_mqtt_al_connect_state (* check_status) (void *handle);
   }mqtt_al_op_t;
   int mqtt_al_install(mqtt_al_op_t *op);
   ```
   表2MQTT抽象层接口 
   | 接口分类                                       | 接口名                                                                      | 说明      |
   |:---|:---|:---|
   | MQTT相关接口      | void \* mqtt_al_connect( mqtt_al_conpara_t \*conparam)                  | 请求连接  |
   | MQTT相关接口      | int mqtt_al_disconnect(void \*handle)                                  | 断开连接  |
   | MQTT相关接口      | int mqtt_al_publish(void \*handle, mqtt_al_pubpara_t \*pubpara)       | 发布消息  |
   | MQTT相关接口      | int mqtt_al_subscribe(void \*handle, mqtt_al_subpara_t \*subpara)       | 订阅请求  |
   | MQTT相关接口      | int mqtt_al_unsubscribe(void \*handle, mqtt_al_unsubpara_t \*unsubpara) | 取消订阅 |
   | MQTT相关接口      | en_mqtt_al_connect_state mqtt_al_check_status(void \*handle)            | 检查连接状态 |
      
   
2. LWM2M AL 根据LwM2M标准协议，IoT Device SDK Tiny提供的LwM2M服务都是建立在标准的LwM2M协议基础上，并提供LwM2M协议抽象层接口。适配LwM2M的软件结构示意图如下：
   ```
   typedef struct
   {
       /* lwm2m config, prepare endpoint name and message deal callback */
       int (*config)(void **handle, lwm2m_al_init_param_t *init_param);
       /* lwm2m deinit */
       int (*deconfig)(void *handle);
       /* lwm2m add object */
       int (*add_object)(void *handle, int object_id, int object_instance_id, int resource_id, void *param);
       /* lwm2m delete object */
       int (*delete_object)(void *handle, int object_id);
       /* lwm2m connect */
       int (*connect)(void *handle);
       /* lwm2m disconnect */
       int (*disconnect)(void *handle);
       /* lwm2m send */
       int (*send)(void *handle, lwm2m_al_send_param_t *send_param);
   } lwm2m_al_op_t;
   ```
   表3LWM2M 抽象层接口 
   | 接口分类                                               | 接口名                                                                                                   | 说明    |
   |:---|:---|:---|
   | LWM2M相关接口       | int (\*config)(void \*\*handle, lwm2m_al_init_param_t \*init_param);                                    | 配置初始化  |
   | LWM2M相关接口       | int (\*deconfig)(void \*handle);                                                                       | 取消初始化 |
   | LWM2M相关接口       | int (\*add_object)(void \*handle, int object_id, int object_instance_id, int resource_id, void \*param); | 添加对象  |
   | LWM2M相关接口       | int (\*delete_object)(void \*handle, int object_id);                                                 | 删除对象   |
   | LWM2M相关接口       | int (\*connect)(void \*handle);                                                                       | 请求连接   |
   | LWM2M相关接口       | int (\*disconnect)(void \*handle);                                                                    | 断开连接    |
   | LWM2M相关接口       | int (\*send)(void \*handle, lwm2m_al_send_param_t \*send_param);                                     | 发送     |
      
   
3. COAP AL 根据COAP标准协议，IoT Device SDK Tiny提供的COAP服务都是建立在标准的COAP协议基础上，并提供COAP协议抽象层接口。适配CoAP的软件结构示意图如下：
   ```
   typedef struct
   {
      ///< coap init, prepare context, session, etc
      int    (* init)     (coap_al_initpara_t *initparam);
      ///< coap deinit
      int    (* deinit)   (void *handle);
      ///< coap add option
      void*  (* add_opt)  (coap_al_optpara_t *optparam);
      ///< new coap request
      void*  (* request)  (coap_al_reqpara_t *reqparam);
      ///< send a request to server
      int   (* send)     (coap_al_sndpara_t *sndparam);
      ///< recv and handle response from server
      int    (* recv)     (coap_al_rcvpara_t *rcvparam);
   }coap_al_op_t;
   int coap_al_install(coap_al_op_t *op);
   ```
   相关适配接口介绍：
   
   | 接口分类   | 接口名                                                          | 说明              |
   |:---|:---|:---|
   | CoAP相关接口 | int coap_al_init(coap_al_initpara_t \*initparam);         | 初始化              |
   | CoAP相关接口 | int coap_al_deinit(void \*handle);                          | 取消初始化         |
   | CoAP相关接口 | void \*coap_al_add_option(coap_al_optpara_t \*optparam);  | 添加CoAP选项        |
   | CoAP相关接口 | void \*coap_al_new_request(coap_al_reqpara_t \*reqparam); | 创建新的消息请求         |
   | CoAP相关接口 | int coap_al_send(coap_al_sndpara_t \*sndparam);           | 发送消息给服务器         |
   | CoAP相关接口 | int coap_al_recv(coap_al_rcvpara_t \*rcvparam);             | 接收并处理服务器下发的数据 |
   | CoAP相关接口 | int coap_al_install(coap_al_op_t \*op);                     | 将协议栈注册到系统中      |
   | CoAP相关接口 | int coap_al_uninstall();                                 | 取消注册             |
      
   
 
