版本:v1.0
本文描述了如何在阿里精灵开放平台上定义Wi-Fi IoT产品,选择产品功能,进行三元组烧录以及在SDK中实现相应的功能。
本文基于阿里精灵IoTConnect Kit Wi-Fi SDK (ali-smartliving-device-alios-things) v1.0.0版本进行编写。

1.在阿里精灵开放平台定义产品

1 下面的截图仅供参考,因为控制台的页面显示可能会发生变动。

1.1.创建产品

请登录“阿里精灵开放平台”进行产品创建。当创建产品时,将会跳出下面的页面:
Wi-Fi IoT品类定义与功能开发 - 图1

请选择您要创建的品类。
Wi-Fi IoT品类定义与功能开发 - 图2
创建产品时:

  • “品牌”:请选择相应的品牌名称,如果您的品牌名未在品牌下拉列表中,请联系阿里商务同学沟通与添加。
  • “产品名称”:请填写该产品的名称。
  • “产品型号”:请填写该产品的型号。
  • “通信协议”:请选择该产品用的通信协议,此处选择“Wi-Fi”
  • “数据格式”:请按实际需求选择。“标准”表示设备属性控制数据为标准JSON格式,“透传/自定义”表示产品开发者会在开放平台上定义好属性和设备串口控制指令的对应关系,模组收到服务端下发的控制指令直接透传,不做属性解析。

1.2.功能定义

如示例中定义了一个加湿器,将显示如下的属性选择页面:
Wi-Fi IoT品类定义与功能开发 - 图3
属性选择好后,将显示产品“Product ID”“产品标识符” 以及 选择的功能等相关信息。

Wi-Fi IoT品类定义与功能开发 - 图4
人机交互中主要定义了语音交互和APP H5控制面板信息,在次不作展开。

1.3.设备调试

在此步骤中,请选择选认证过的WiFi模组:
Wi-Fi IoT品类定义与功能开发 - 图5
在调试中心“生成三元组”栏中,可以找到为该设备申请的调试三元组。

Wi-Fi IoT品类定义与功能开发 - 图6
至此,设备属性功能 和 品类的三元组 信息已定义并获取到,可进行产品开发调试了。

2.设备端产品开发

2.1.设备身份信息设置

在阿里精灵IoT生态中,使用三元组进行设备鉴权与控制。
可在linkkit_example_solo.c的代码中设置了设备的身份信息,设备开发者需要将测试设备的信息对其进行替换:
Wi-Fi IoT品类定义与功能开发 - 图7
字段说明:
Wi-Fi IoT品类定义与功能开发 - 图8
设备开发者将设备身份信息设置到程序之后,可以将代码进行编译并遵循模组商提供的烧写工具将固件写入模组。

2.2. 设备配网触发

SDK中设备默认不会进入配网状态,可通过以下几种方式使设备进入配网状态:
1、在串口中输入以下命令
active_awss
2、在example/linkkitapp/app_entry.c文件中添加检查配网状态和触发配网的函数:
static void linkkit_check_awss(void)
{
int ret = 0;
int32_t len = 0;

netmgr_ap_config_t config1;
memset(&config1, 0, sizeof(netmgr_ap_config_t));

ret = netmgr_get_ap_config(&config1);
len = strlen(config1.ssid);

LOG(“ret = %d\n”, ret);
LOG(“len = %d\n”, len);

if (len <= 0) {
LOG(“Network is not configured, active_awss\n”);
awss_config_press();
}
}
在 application_start 函数中添加该函数的调用部分:
int application_start(int argc, char argv)
{

netmgr_init();
linkkit_check_awss(); //Check configuration and trigger network config

确保设备在未配网状态下可以用
“天猫精灵,找队友”发现设备,**配网并连接到阿里精灵开放平台。
如果模组提供串口打印输出,当模组连接到阿里精灵开放平台后将会输出类似下面的信息提示:
Wi-Fi IoT品类定义与功能开发 - 图9
如果模组可以正常连接阿里精灵开放平台,在天猫精灵APP上改账户上可以看到这个设备已激活,以及设备连接到物联网平台的时间信息。
建议设备开发者先确保模组已经可以正常连接到阿里精灵开放平台后,再继续进行下面产品功能的实现。

注:在example中设备的身份信息是在代码中写死的,设备开发时需要通过HAL_GetProductKey()、HAL_GetDeviceName()、HAL_GetDeviceSecret()进行返回。

2.3.产品属性上报

产品的属性发生变化时,需要将变化后的数值上报到开放平台。属性变化的检测以及上报是由设备开发者定义和实现的。

示例代码中对应的产品具有一个LightSwitch的属性,类型为bool;还具有一个RGBColor的属性,类型为复合型。在linkkit_example()函数中调用了函数user_post_property()用于上报相关属性,用户可以参考该代码实现产品的属性变化上报:
Wi-Fi IoT品类定义与功能开发 - 图10

2.4.产品属性设置

天猫精灵或手机App在下发设置属性时,设备收到后会调用callback函数user_property_set_event_handler。开发者需要在user_property_set_event_handler函数中实现对指令的解析与处理。
Wi-Fi IoT品类定义与功能开发 - 图11

2.5.产品服务调用

天猫精灵或手机App在调用服务时,设备收到后会调用callback函数user_service_request_event_handler。开发者需要在user_service_request_event_handler函数中实现对服务请求的解析与处理。
Wi-Fi IoT品类定义与功能开发 - 图12

2.6.产品事件上报

如果产品定义了事件,当事件发生时也需要向云端发送事件。事件的检测以及上报由设备开发者实现。

示例产品定义了一个标识符为“Error”的事件,该事件还有一个标识符为“ErrorCode”的输出参数。下面的代码示例描述了如何向开放平台发送一个事件:
Wi-Fi IoT品类定义与功能开发 - 图13
产品回调函数处理
在函数linkkit_example()中的linkkit_ops定义了系统的各种事件处理函数,如下面的代码所示:
Wi-Fi IoT品类定义与功能开发 - 图14
关于回调函数的说明:

事件 回调函数原型 事件触发条件说明
ITE_CONNECT_SUCC int callback(void); 与云端连接成功时
ITE_DISCONNECTED int callback(void); 与云端连接断开时
ITE_RAWDATA_ARRIVED int callback(const int devid, const unsigned char *payload, const int payload_len); Linkkit收到收到raw data数据时
ITE_SERVICE_REQUST int callback(const int devid, const char _serviceid, const int serviceid_len, const char request, const int request_len, char _response, int *response_len); Linkkit收到收到服务(同步/异步)调用请求时
ITE_PROPERTY_SET int callback(const int devid, const char *request, const int request_len); Linkkit收到收到属性设置请求时
ITE_PROPERTY_GET int callback(const int devid, const char _request, const int request_len, char _response, int response_len); Linkkit收到收到属性获取的请求时
ITE_REPORT_REPLY int callback(const int devid, const int msgid, const int code, const char *reply, const int reply_len); Linkkit收到收到上报消息的应答时
ITE_TRIGGER_EVENT_REPLY int callback(const int devid, const int msgid, const int code, const char _eventid, const int eventid_len, const char _message, const int message_len); Linkkit收到收到事件上报消息的应答时
ITE_TIMESTAMP_REPLY int callback(const char *timestamp); 当Linkkit收到收到查询时间戳请求的应答时
ITE_TOPOLIST_REPLY int callback(const int devid, const int msgid, const int code, const char * payload, const int payload_len); Linkkit收到收到查询拓扑关系请求的应答时
ITE_PERMIT_JOIN int callback(const char * product_key, const int time); Linkkit收到允许子设备入网的请求时
ITE_INITIALIZE_COMPLETED int callback(const int devid); 设备初始化完成时
ITE_FOTA int callback(int type, const char *version); Linkkit收到可用固件的通知时
ITE_COTA int callback(int type, const char _config_id, int config_size, const char _get_type, const char _sign, const char _sign_method, const char *url); Linkkit收到可用远程配置文件的通知时

2.7.主循环处理

在linkkit_example()中存在一个循环,其中IOT_Linkkit_Yield必须周期调用,用于linkkit业务处理;代码如下所示:
Wi-Fi IoT品类定义与功能开发 - 图15
其中还包含了下面一段演示代码,用于上报所有的属性、上报事件等,在实际产品开发时需要将其修改为设备商自己的逻辑,比如:
Wi-Fi IoT品类定义与功能开发 - 图16
设备商完成自己产品功能的代码编写之后,可以将固件编译出来并根据相关模组的烧写方法把固件烧写到模组上进行功能验证和调试。