Vendor部分软件机制和接口介绍
重要
本部分只是给用户提供自定义参数传递和控制的设计参考,并以LED灯来展示出设计的效果,用户完全可以自行设计Vendor部分的接口 本demo中的格式与APP内部搭配使用,不建议用户修改。
Vendor部分的软件机制
Vendor部分软件机制分为如下两种机制:
外部查询事件机制
内部状态设置机制
外部查询事件机制
外部查询事件机制,顾名思义,就是用户通过外部的设备来访问BK WIFI MESH网络模组内的某个成员,并且通过外部消息区域的Vendor字段来配置Vendor部分 这里的外部设备,包括但不限于Android设备,ios设备和网页,他们通过空口/有线/串口等多种方式。
备注
外部消息为外部设备和所连接的节点之间信息交换格式。
具体的消息交互图大致如下:

mesh节点和外部设备之间的交互
其中:
Vendor Request:
Vendor Request命令是由用户通过外设设备(external_device)将想要配置的信息发送至其所连接的某个节点,并由这个节点发送到目标节点。
Vendor Indication:
Vendor Indication命令是由完成配置的节点,将配置完的信息通过与外部设备相连转发至外部设备上,以通知用户的外部设备该IND对应请求的执行结果和执行效果。
外部消息区域的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字段上,目前一个提供了8种Vendor的定制需求,每一个bit对应后面的bitmapN Content的有效性
Bitmap0
Bitmap0目前被LED三色灯工程所用,如涉及到LED三色灯交互,则需要将此bit置1。
Bitmap1
保留,接下来将给device_type使用
Bitmap2
Bitmap2目前被LED PWM工程所用,如涉及到LED PWM工程交互,则需要将此bit置1。
Bitmap3
保留,用户可自定义
Bitmap4
保留,用户可自定义
Bitmap5
保留,用户可自定义
Bitmap6
保留,用户可自定义
Bitmap7
保留,用户可自定义
内部状态设置机制
内部状态设置机制,是SDK内部通过API接口和对应的事件来驱动LED的不同效果,其软件流程图如下:

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功能。
备注
如果用户需要自行实现这两个接口,那么在完成后需要将函数挂载在全局变量上,可通过下图方式实现:

set/get/inform vendor 函数注册
用户只需要将自行编写的Vendor Func作为入参填入上述函数即可。
除了封装的API外,vendor部分还需要一个全局的结构体来统领整个SDK运行期间的Vendor的配置和读取,其公共结构如下:
Header File
Structures
-
struct bk_mesh_vendor_info
另外,根据目前SDK的实现,在不同的工程下,都会在这里放置一个自己的信息配置与读取的全局结构体,如

使用vendor的工程在vendor结构体中的位置
对于这个结构体的实现 g_vendor_info , 其整个SDK生命周期内的使用方式,大致如下:
初始化
需要在mesh初始化时对vendor部分进行初始化,越早越好,防止某些开机想要的动作。
设置自身能力
在初始化中,根据工程的不同,给g_vendor_info.bitmap配置自身支持的能力。
针对set vendor情景
当收到set vendor消息后,需要与g_vendor_info.bitmap已经存储的能力进行比较,相等才继续操作,并将设置值存入项目在g_vendor_info对应的结构体中。不同则返回。
针对get vendor情景
当收到get vendor消息后,需要与g_vendor_info.bitmap已经存储的能力进行比较,相等才继续操作,并从项目在g_vendor_info对应的结构体中读取值返回。不同则返回NULL。
inform vendor情景
inform vendor消息后,需要根据预先设定好的vendor值,在与事件或者层级相关!
Vendor软件逻辑图
Vendor软件逻辑图如下:

Vendor软件逻辑图