- 背景
接触天猫精灵后,就想作一些小东西能接入天猫精灵。查看官网的文档后,选择了ESP系列,官方在文档中也比较推荐。读技术文档是个很难受的事情,容易犯困,最好有可以操作的设备。准备如下:
名称 | 规格 | 备注 |
ESP8266开发板 |
| ESP官方有售 |
Linux系统电脑或可以安装虚拟机的Windows电脑 | Linux系统使用Ubuntu | 请按照官方指导安装环境https://github.com/espressif/esp-ali-smartliving |
LED,电阻,导线若干 |
|
|
天猫精灵音响 |
| 任意类型 |
装有天猫精灵手机一台 |
|
|
1、准备环境注意事项
准备开发环境的过程有些麻烦,官方文档在指导中并没有特别详细。但是为了开发可以接入天猫精灵的环境,请务必使用Ubuntu系统,Windows系统可能编译不通过或者其他问题。官方在所有文档中都是使用的Ubuntu系统,建议安装64位系统。
准备环境的时候,需要首先下载ESP8266_RTOS_SDK(https://github.com/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.com/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.com/document_detail/178141.html?spm=a2c4g.11174283.6.570.2d197132EUPwMq),创建产品,此处文档建议创建“天猫精灵生态产品”,便于后续使用“零配”的配网方式。创建的产品请选择“电工照明->灯”类的
获取三元组信息后,请按照(https://github.com/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进行开关控制和亮度调节。
基本功能设置完成。
下一章为增加主动上报状态。