Vendor部分软件机制和接口介绍

[English]

重要

本部分只是给用户提供自定义参数传递和控制的设计参考,并以LED灯来展示出设计的效果,用户完全可以自行设计Vendor部分的接口 本demo中的格式与APP内部搭配使用,不建议用户修改。

Vendor部分的软件机制

Vendor部分软件机制分为如下两种机制:

  • 外部查询事件机制

  • 内部状态设置机制

外部查询事件机制

外部查询事件机制,顾名思义,就是用户通过外部的设备来访问BK WIFI MESH网络模组内的某个成员,并且通过外部消息区域的Vendor字段来配置Vendor部分 这里的外部设备,包括但不限于Android设备,ios设备和网页,他们通过空口/有线/串口等多种方式。

备注

外部消息为外部设备和所连接的节点之间信息交换格式。

具体的消息交互图大致如下:

show mesh and external_device msg

mesh节点和外部设备之间的交互

其中:

  • Vendor Request:

    Vendor Request命令是由用户通过外设设备(external_device)将想要配置的信息发送至其所连接的某个节点,并由这个节点发送到目标节点。

  • Vendor Indication:

    Vendor Indication命令是由完成配置的节点,将配置完的信息通过与外部设备相连转发至外部设备上,以通知用户的外部设备该IND对应请求的执行结果和执行效果。

外部消息区域的Vendor字段格式

外部消息区域的Vendor字段,是用户在使用外部设备时唯一与Vendor部分交互的方式,因此需要对Vendor字段格式需要定义,下图是定义的Vendor字段格式:

Vendor字段格式

Vendor字段格式

下面介绍一下各个字段的含义:

Vendor 字段

长度

说明

Vendor Length

2

整个Vendor字段长度,不包含自身

Vendor Bitmap

1

指示整个Vendor携带内容的map,具体内容见下图

Vendor Bitmap0 Content

M0

客户自定义的第一段文本内容,长度不定

Vendor Bitmap7 Content

M7

客户自定义的第八段文本内容,长度不定

Vendor Bitmap字段格式
Vendor Bitmap字段格式

Vendor Bitmap字段格式

在Vendor Bitmap字段上,目前一个提供了8种Vendor的定制需求,每一个bit对应后面的bitmapN Content的有效性

  1. Bitmap0

    • Bitmap0目前被LED三色灯工程所用,如涉及到LED三色灯交互,则需要将此bit置1。

  2. Bitmap1

    • 保留,接下来将给device_type使用

  3. Bitmap2

    • Bitmap2目前被LED PWM工程所用,如涉及到LED PWM工程交互,则需要将此bit置1。

  4. Bitmap3

    • 保留,用户可自定义

  5. Bitmap4

    • 保留,用户可自定义

  6. Bitmap5

    • 保留,用户可自定义

  7. Bitmap6

    • 保留,用户可自定义

  8. Bitmap7

    • 保留,用户可自定义

内部状态设置机制

内部状态设置机制,是SDK内部通过API接口和对应的事件来驱动LED的不同效果,其软件流程图如下:

mesh and external_device msg

mesh节点和SDK内部消息交互机制

其中:

  • SDK:

    图上的SDK指的是SDK内部任何地点,其意义在于SDK的任何地点都可以通过调用Vendor API来操控LED。

  • Vendor API:

    Vendor API是一个封装好的中间层,这样SDK无需知晓Vendor内部是如何处理的,只要传入指定参数并接受输出即可。

  • Vendor Func:

    Vendor Func指的就是Vendor的具体执行函数,在LED中则为LED相关操作函数(get/set/inform)的具体形式。可以由由用户进行自定义

下表是目前使用到的内部消息:

枚举

事件说明

NODE_POWER_ON

节点开机

NODE_START_NET

开始组网

NODE_NET_FAIL

组网失败

NODE_NET_LAYER

根据层级配置颜色,SDK默认,颜色见下表

NODE_BREAKDOWN

节点失效

NODE_REVOVER

节点恢复

NODE_LAYER_CHANGE

节点层级更改

NODE_STOP

节点停止

Vendor字段封装的API

外部设备设置、获取Vendor信息时,需要统一的API来挂载到SDK内部的全局指针上,因此,此处给出了定于的API接口格式:

Header File
Functions
void bk_mesh_set_vendor_info(uint8_t *vendor_ptr)

APP set vendor info.

参数
  • vendor_ptr – vendor_ptr is the pointer formatted by Vendor format,it contains the vendor info

  • type – type is not use, the parameter is retained to align with the global variable function pointer

  • layer – layer is not use, the parameter is retained to align with the global variable function pointer

返回

  • none

uint8_t *bk_mesh_get_vendor_info(uint16_t *len, uint8_t *vendor_ptr)

APP get vendor info.

参数
  • vendor_ptr – vendor_ptr is the pointer of request vendor info

  • len – len is used for BK MESH NET to used to form a reply frame

返回

  • reply frame head ptr

void bk_mesh_inform_vendor_info(uint8_t type, uint8_t layer)

SDK set vendor info through specified events.

参数
  • type – type is the event type

  • layer – layer is the specified layer.

返回

  • none

void bk_mesh_vendor_info_init(void)

vendor init.

返回

  • none

  • set vendor: 函数接口无返回值,接受一个按照上述格式传入的字符串指针,函数内部需要对指针进行解析进行设置,且无需返回设置结果。

  • get vendor: 函数接口由一个u8*的返回值,返回查询的结果,格式按照上面的vendor格式(包含长度),接受两个指针,一个u16*指针用于SDK接口处理,与外部设备无关,而u8* vendor_ptr是外部设备传入的想要查询的部分(格式按照上述vendor格式)

  • vendor inform: 根据SDK配置的事件和层级,实现不同的vendor功能。

备注

如果用户需要自行实现这两个接口,那么在完成后需要将函数挂载在全局变量上,可通过下图方式实现:

vendor_cb

set/get/inform vendor 函数注册

用户只需要将自行编写的Vendor Func作为入参填入上述函数即可。

除了封装的API外,vendor部分还需要一个全局的结构体来统领整个SDK运行期间的Vendor的配置和读取,其公共结构如下:

Header File
Structures
struct bk_mesh_vendor_info

Public Members

u16 vendor_len

vendor_len

u8 vendor_bitmap

show SDK support capabilities,it will set when init

另外,根据目前SDK的实现,在不同的工程下,都会在这里放置一个自己的信息配置与读取的全局结构体,如

vendor_cb

使用vendor的工程在vendor结构体中的位置

对于这个结构体的实现 g_vendor_info , 其整个SDK生命周期内的使用方式,大致如下:

  1. 初始化

    • 需要在mesh初始化时对vendor部分进行初始化,越早越好,防止某些开机想要的动作。

  2. 设置自身能力

    • 在初始化中,根据工程的不同,给g_vendor_info.bitmap配置自身支持的能力。

  3. 针对set vendor情景

    • 当收到set vendor消息后,需要与g_vendor_info.bitmap已经存储的能力进行比较,相等才继续操作,并将设置值存入项目在g_vendor_info对应的结构体中。不同则返回。

  4. 针对get vendor情景

    • 当收到get vendor消息后,需要与g_vendor_info.bitmap已经存储的能力进行比较,相等才继续操作,并从项目在g_vendor_info对应的结构体中读取值返回。不同则返回NULL。

  5. inform vendor情景

    • inform vendor消息后,需要根据预先设定好的vendor值,在与事件或者层级相关!

Vendor软件逻辑图

Vendor软件逻辑图如下:

led_proj_flow

Vendor软件逻辑图