admin管理员组

文章数量:1609939

  1. 背景

 

接触天猫精灵后,就想作一些小东西能接入天猫精灵。查看官网的文档后,选择了ESP系列,官方在文档中也比较推荐。读技术文档是个很难受的事情,容易犯困,最好有可以操作的设备。准备如下:

名称

规格

备注

ESP8266开发板

 

ESP官方有售

Linux系统电脑或可以安装虚拟机的Windows电脑

Linux系统使用Ubuntu

请按照官方指导安装环境https://github/espressif/esp-ali-smartliving

LED,电阻,导线若干

 

 

天猫精灵音响

 

任意类型

装有天猫精灵手机一台

 

 

 

1、准备环境注意事项

准备开发环境的过程有些麻烦,官方文档在指导中并没有特别详细。但是为了开发可以接入天猫精灵的环境,请务必使用Ubuntu系统,Windows系统可能编译不通过或者其他问题。官方在所有文档中都是使用的Ubuntu系统,建议安装64位系统。

准备环境的时候,需要首先下载ESP8266_RTOS_SDK(https://github/espressif/ESP8266_RTOS_SDK), 官方的适配ESP8266的版本是release v3.3,所以不要下载master版本或者下载后切换到v3.3版本。下载好v3.3版本后,先按照官方指导文档进行编译样例程序,然后下载到开发板上,试验是否可以下载,修改部分代码(增加日志),查看是否能烧录到开发板,查看是否可以顺利编译和下载新代码。

建议将export IDF_PATH="$HOME/esp/ESP8266_RTOS_SDK"写入到系统文件/etc/bash.bashrc中,后续系统启动后,该环境变量将自动生效。

 

然后下载esp-ali-smartliving(https://github/espressif/esp-ali-smartliving),按照官方指导编译和设置ali-smartliving-device-sdk-c,下载master版本即可。

下载完成后,需要设置环境变量export ALI_PATH="${your_path}/esp-ali-smartliving"

否则将编译失败。

完成了以上操作,才算万里长征第一步完成了。

如果使用对linux命令行使用不熟悉,可以在在linux系统里安装一个VSCODE,便于阅读和修改代码。VScode教程请自己找。

 

2、正餐

进入天猫精灵sdk的文件中($YOUR_HOME/esp-ali-smartliving/examples/solutions/smart_light),使用官方提供的样例程序智能灯,不用修改程序,直接编译然后下载,查看日志。

使用的EPS8266,该程序控制的是GPIO 0/2/4管脚控制灯的开关。

第一次编译下载到开发板,该板子没有进行初始化,应该是直接进入到等待配网环节。日志将打印“chan xx”等字样,这是系统等待配网。同时各个管脚控制的灯应该是处于点亮状态。

此时由于设备没有烧录三元组,即使通过天猫精灵也不能配网成功。

 

准备三元组

按照官方指导(https://help.aliyun/document_detail/178141.html?spm=a2c4g.11174283.6.570.2d197132EUPwMq),创建产品,此处文档建议创建“天猫精灵生态产品”,便于后续使用“零配”的配网方式。创建的产品请选择“电工照明->灯”类的

获取三元组信息后,请按照(https://github/espressif/esp-ali-smartliving/blob/master/config/mass_mfg/README.md)中指导进行修改配置文件,然后烧录到开发板中。

连接配网

在此过程之前,不需要修改任何代码。

烧录完程序和三元组信息,通过make monitor查看开发板输出的日志,等日志打印到“chan xx”时候,表示板子已经进入等待配网状态,可以通过语音控制天猫精灵“找队友/发现设备”功能,等天猫精灵提示发现了智能灯,只需语音控制“链接”后,天猫精灵将自动为其配网。

配网成功后,可以在APP上查看到有一个智能灯的设备。但是通过语音或者APP却不能控制灯的开关及亮度。原因是官方提供的例程中,参数和当前天猫精灵下发的参数不一样,估计该样例是以前对接旧的平台的参数。

 

在完成以上操作后,表示开发环境、开发板、系统工程等没有问题了。后续的事情就是修改软件代码和调试了。

修改代码

 

云端设置

修改代码前,为了便于调试,需要再阿里生活物联网平台修改该灯的部分参数。截图如下

将其他多余参数删除,仅留下开关和亮度的参数。对亮度brightness参数进行编辑,调整该参数的步长值,设置为1,这样可有100个亮度单位。

然后配置好人机交互后,进入设备调试页。云端设置完成。

 

设备端代码修改

 

设备端代码修改,需要修改两个文件lightbulb.c和linkkit_solo.c。

这两个文件,原有的代码,我将不修改,自己写新函数。

在lightbulb.c中增加设置powerstate的函数

/**

 * @brief set the powerstate of lightbulb

 */

int lightbulb_set_powerstate(bool value)

{

    ESP_LOGI(TAG, "lightbulb_set_powerstate : %s.", value == true ? "true" : "false");

    if (true == value)
    {

        lightbulb_start();
    }

    else
    {
        lightbulb_stop();
    }

    return 0;

}

//封装启停灯的函数


void lightbulb_stop(void)

{
    pwm_stop(0);
    s_on = false;

}

void lightbulb_start(void)
{

    pwm_start();
    s_on = true;

}

启停代码请查看源代码,已经上传到git上

在linksol.c文件中,修改static int user_property_set_event_handler(const int devid, const char *request, const int request_len)函数。

 

static int user_property_set_event_handler(const int devid, const char *request, const int request_len)

{

    int res = 0;

    cJSON *root = NULL, *powerstate = NULL, *brightness = NULL;

    ESP_LOGI(TAG,"Property Set Received, Devid: %d, Request: %s", devid, request);

    if (!request) {

        return NULL_VALUE_ERROR;
    }

    /* Parse Root */
    root = cJSON_Parse(request);
    if (!root) {

        ESP_LOGI(TAG,"JSON Parse Error");
        return FAIL_RETURN;

    }
    /** Switch Lightbulb powerstate On/Off   */
    powerstate = cJSON_GetObjectItem(root, "powerstate");
    if (powerstate) {

        lightbulb_set_powerstate(powerstate->valueint);
    }

    /** set the lightbulb brightnees 1-100  **/
    brightness = cJSON_GetObjectItem(root, "brightness");

    if(brightness)
    {

        lightbulb_set_brightness(brightness->valueint);
    }
    cJSON_Delete(root);

    res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
                             (unsigned char *)request, request_len);

    ESP_LOGI(TAG,"Post Property Message ID: %d", res);
    return SUCCESS_RETURN;

}

源代码请从git获取。

该函数原有的代码已经被注释了。

此时可以重新编译,然后下载到开发板上,待设备连接到阿里云,可以通过天猫精灵或者APP进行开关控制和亮度调节。

基本功能设置完成。

下一章为增加主动上报状态。

本文标签: 精灵