前言

如何给一面普通的镜子赋予更多的功能?本期系列文章将会教给大家怎样通过涂鸦平台及涂鸦wifi模组快速实现一款智能镜产品。

创建产品

  • 首先登录涂鸦智能IoT平台,点击 “创建产品”,在标准类目栏的最下方找到 “找不到品类”,点击进入自定义产品创建页面。

  • 输入产品名称和描述,通讯协议选择 WIFI+蓝牙,点击 创建产品

  • 在功能定义一栏添加DP点,如下图所示,本demo添加了标准功能:“开关”、“灯光开关”、“灯光模式”、“亮度值”、“电量状态”、“人体感应状态”、“人体感应开关”等功能;功能点可以根据需求自行增减,功能点名称以及属性也可根据需求自行修改。

  • 进入设备面板,可以选择自己喜欢的模板或者自己自定义面板,调试阶段推荐选择开发调试面板,便于测试。

  • 选择硬件开发平台,可以根据需要自行选择开发平台。注意,需要选择芯片平台并上传固件后,面板才能够使用;固件标识名要和上传的固件名称需保持一致,否则烧录授权时将无法通过。

  • 至此,产品创建阶段已经基本完成,此时可以通过“涂鸦智能”app和虚拟设备体验dp数据的接收和发送。

嵌入式系统搭建

产品创建完毕后,接下来需要实现产品模组固件,首先要做的就是搞定开发环境。

开发环境

本案例是基于BK7231N平台进行的SOC开发,开发所用的涂鸦通用SDK编译需要linux环境,首先要安装linux开发环境,然后从涂鸦仓库拉取包含SDK环境的demo例程。。

  • 下载Tuya IoTOS Embeded WiFi & BLE sdk

    $ cd "your directory"
    $ git clone https://github.com/tuya/tuya-iotos-embeded-sdk-wifi-ble-bk7231n
    

    在自己建立的目录中git下来demo,里面有附带有SDK环境,同时“apps”目录中也有几个应用案例,我们就使用apps/tuya_demo_template这个demo为开发模板,在此基础上增减代码,实现一个嵌入式系统框架。

实现配网连接涂鸦平台的最简嵌入式系统框架

在正式开始智能镜应用代码开发前,我们可以先搭建一个基本的嵌入式框架,实现设备联网,与平台建立上报下发通道。

  • 在现有的demo基础上搭建系统框架
    当前tuya_demo_template应用程序的文件组成如下:
├── src
|    └── tuya_device.c            //应用层入口文件
|
├── include             //头文件目录
|    └──  tuya_device.h
|
└── output              //编译产物
  • 将 tuya_demo_template 文件夹更名为 bk7231n_mirror_demo,修改 include 文件夹中的 tuya_device.h 里的 PRODECT_ID 宏定义,修改为我们刚刚创建的智能镜产品的 pid。

  • 创建一个 tuya_app.c 文件,做为智能镜应用代码的主要文件
    创建后的demo文件目录如下:
├── src
|    └── tuya_device.c            //应用层入口文件
|    └── tuya_app.c            //主要应用文件
|
├── include             //头文件目录
|    └──  tuya_device.h
|    └──  tuya_app.h
|
└── output              //编译产物
  • tuya_app.h中涉及到 DP 点宏定义以及 DP 点上报、下发数据处理函数的声明。
#ifndef __TUYA_APP_H__
#define __TUYA_APP_H__#include "uni_log.h"
#include "tuya_cloud_error_code.h"
#include "tuya_cloud_com_defs.h"#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus *//***********************************************************
*************************variable define********************
***********************************************************/
typedef enum{APP_MIRROR_NORMAL,       //normal modeAPP_MIRROR_PRODTEST      //prodact test mode
}APP_MIRROR_MODE;#define DPID_SWITCH                      1
#define DPID_SWITCH_LED                  2
#define DPID_LIGHT_MODE                  4
#define DPID_LIGHT_VALUE                 5
#define DPID_BATTERY_STATUS              101
#define DPID_PIR_MODE                    103
#define DPID_PIR_STATE                   105
/********************************************************************************* FUNCTION:       app_mirror_init* DESCRIPTION:    application initialization* INPUT:          mode:application mode* OUTPUT:         none* RETURN:         none* OTHERS:         none* HISTORY:        2021-01-12*******************************************************************************/
OPERATE_RET app_mirror_init(IN APP_MIRROR_MODE mode);/********************************************************************************* FUNCTION:       deal_dp_proc* DESCRIPTION:    deal the data sented by app* INPUT:          root:app issued data structure* OUTPUT:         none* RETURN:         none* OTHERS:         none* HISTORY:        2021-01-12*******************************************************************************/
VOID deal_dp_proc(IN CONST TY_OBJ_DP_S *root);/********************************************************************************** FUNCTION:       app_report_all_dp_status* DESCRIPTION:    report all dp date* INPUT:          none* OUTPUT:         none* RETURN:         none* OTHERS:         dp_cnt needs to be modified when adding or deleting the dp function* HISTORY:        2021-01-12*******************************************************************************/
VOID app_report_all_dp_status(VOID);#ifdef __cplusplus
}
#endif /* __cplusplus */#endif  /* __TUYA_APP_H__*/
  • tuya_app.c 中需实现下发 dp 点数据处理函数:deal_dp_proc 和 dp 数据上报函数:app_report_all_dp_status 。这里由于涂鸦SDK在上报 dp 数据时会做筛选处理,所有可以一次性把所有dp点全部上报。
//接收下发数据,解析 dp id 和 dp 内容
VOID deal_dp_proc(IN CONST TY_OBJ_DP_S *root)
{UCHAR_T dpid;dpid = root->dpid;PR_DEBUG("dpid:%d",dpid);switch (dpid) {case DPID_SWITCH://获取dp内容值mirror_ctrl_data.Mirror_switch = root->value.dp_bool;break;case DPID_SWITCH_LED:......break;case DPID_LIGHT_MODE:......break;case DPID_LIGHT_VALUE:......break;case DPID_PIR_MODE:......break;default:break;}app_report_all_dp_status();return;}//dp数据上报,判断已经连接涂鸦平台后,上报所有 dp 点。VOID app_report_all_dp_status(VOID)
{OPERATE_RET op_ret = OPRT_OK;GW_WIFI_NW_STAT_E wifi_state = 0xFF;op_ret = get_wf_gw_nw_status(&wifi_state);if (OPRT_OK != op_ret) {PR_ERR("get wifi state err");return;}if (wifi_state <= STAT_AP_STA_DISC || wifi_state == STAT_STA_DISC) {return;}INT_T dp_cnt = 0;dp_cnt = 7;if(!mirror_ctrl_data.Wifi_state) {return;} TY_OBJ_DP_S *dp_arr = (TY_OBJ_DP_S *)Malloc(dp_cnt*SIZEOF(TY_OBJ_DP_S));if(NULL == dp_arr) {PR_ERR("malloc failed");return;}memset(dp_arr, 0, dp_cnt*SIZEOF(TY_OBJ_DP_S));dp_arr[0].dpid = DPID_SWITCH;dp_arr[0].type = PROP_BOOL;dp_arr[0].time_stamp = 0;dp_arr[0].value.dp_value = mirror_ctrl_data.Mirror_switch;dp_arr[1].dpid = DPID_SWITCH_LED;dp_arr[1].type = PROP_BOOL;dp_arr[1].time_stamp = 0;dp_arr[1].value.dp_value = mirror_ctrl_data.Light_switch;dp_arr[2].dpid = DPID_LIGHT_MODE;dp_arr[2].type = PROP_ENUM;dp_arr[2].time_stamp = 0;dp_arr[2].value.dp_value = mirror_ctrl_data.Light_mode;dp_arr[3].dpid = DPID_LIGHT_VALUE;dp_arr[3].type = PROP_VALUE;dp_arr[3].time_stamp = 0;dp_arr[3].value.dp_value = mirror_ctrl_data.Light_value;dp_arr[4].dpid = DPID_BATTERY_STATUS;dp_arr[4].type = PROP_ENUM;dp_arr[4].time_stamp = 0;dp_arr[4].value.dp_value = mirror_ctrl_data.Battery_remain;dp_arr[5].dpid = DPID_PIR_MODE;dp_arr[5].type = PROP_BOOL;dp_arr[5].time_stamp = 0;dp_arr[5].value.dp_value = mirror_ctrl_data.PIR_switch;dp_arr[6].dpid = DPID_PIR_STATE;dp_arr[6].type = PROP_ENUM;dp_arr[6].time_stamp = 0;dp_arr[6].value.dp_value = mirror_ctrl_data.PIR_state;op_ret = dev_report_dp_json_async(NULL,dp_arr,dp_cnt);Free(dp_arr);if(OPRT_OK != op_ret) {PR_ERR("dev_report_dp_json_async relay_config data error,err_num",op_ret);}PR_DEBUG("dp_query report_all_dp_data");return;
}
  • 修改 tuya_device.c 中的几处回调,将上面实现的 dp 上报和下发处理函数填进去。
VOID dev_obj_dp_cb(IN CONST TY_RECV_OBJ_DP_S *dp)
{PR_DEBUG("dp->cid:%s dp->dps_cnt:%d",dp->cid,dp->dps_cnt);UCHAR_T i = 0;for(i = 0;i < dp->dps_cnt;i++) {deal_dp_proc(&(dp->dps[i]));dev_report_dp_json_async(get_gw_cntl()->gw_if.id, dp->dps, dp->dps_cnt);}
}VOID hw_report_all_dp_status(VOID)
{app_report_all_dp_status();
}STATIC VOID dev_dp_query_cb(IN CONST TY_DP_QUERY_S *dp_qry)
{PR_NOTICE("Recv DP Query Cmd");hw_report_all_dp_status();
}

至此一个基本的配网上报下发接收框架就搭建好了,可以在 dp 下发处理函数中不做任何操作,只执行打印日志,以便测试整个通信链路是否正常。

程序的编译和烧录

  • 在SDK根目录下执行以下命令开始编译:

    sh build_app.sh apps/bk7231n_mirror_demo bk7231n_mirror_demo 1.0.0
    
  • 固件烧录授权相关信息请参考:Wi-Fi + BLE 系列模组烧录授权

  • 设备连接与实验
    烧录授权完成后即可打开涂鸦智能app搜索设备进行配网绑定,绑定完成后就可以用 app 下发指令控制设备了。模组日志将输出在串口2。

系统框架建立完成

此时设备已经和app端进行了连接实现了通信,接下来就可以着手开始实现智能镜的具体功能了。
具体功能实现过程将在后续的文章详细介绍。

后续内容

  • 《自制智能镜之——应用入口及触摸按键实现篇》
  • 《自制智能镜之——屏幕显示时间日期篇》
  • 《自制智能镜之——化妆灯和人体感应篇》

智能镜——4.产品创建及开发环境搭建篇相关推荐

  1. Ionic+Cordova开发环境搭建

    Ionic+Cordova的组合是一个跨平台的移动开发框架,属于HybirdApp开发模式.其中Ionic是一个前端框架,集成了AngularJs在里面,有很好很漂亮的UI控件.Cordova本身就是 ...

  2. 【MM32F5270】Keil开发环境搭建

    本文完整记录了--如何从零搭建MM32F5270 Keil开发环境以及如何编译运行MM32F5270 SDK中的hello_world示例.本文写作过程中参考了一些链接,具体可以在本文末尾找到,感兴趣 ...

  3. day01--java基础编程:计算机基础知识 ,java语言概述,java开发环境搭建,eclipse概述,创建简单java项目,JDK JRE JVM的关系,java开发中的命名规范,编程风格

    1 Day01–Java开发环境+HelloWorld 1.1 计算机基础知识 资料下载网址:刘沛霞 18600949004 code.tarena.com.cn tarenacode code_20 ...

  4. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

  5. 智能合约开发环境搭建及 Hello World 合约

    智能合约开发环境搭建及 Hello World 合约 如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是 Hel ...

  6. 涂鸦智能模组SDK开发系列课程——SoC开发环境搭建(一)

    SoC开发环境搭建 本章节主要介绍如何搭建涂鸦 Wi-Fi 和 Wi-Fi&Bluetooth LE 系列模组二次开发的编译环境.在 Windows 上使用 VirtualBox 虚拟机软件安 ...

  7. ETH 开发环境搭建及智能合约 helloworld

    ETH 开发环境搭建及智能合约 helloworld 自己的菜鸟级的起步教程,给自己长记性 准备 什么是以太坊 以太坊白皮书 以太坊白皮书_ZH 以太坊白皮书_EN 环境介绍 这里使用了,以下两个开发 ...

  8. 关于如何在github上创建团队开发环境

    今天想写个如何在github上创建团队开发环境的博客.送给那些还不知道如何在github上创建团队开发环境的开发人员. 1.首先,当然你要有个github的账号.具体怎么注册我这里就不说了.可以上gi ...

  9. Create-React-App创建antd-mobile开发环境

    Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 详细文档可前往链接:Create-React-App文 ...

最新文章

  1. 智能指针shared_ptr的用法
  2. html访问java接口出现缓存_一个牛逼的多级缓存实现方案
  3. Java算法-符号~
  4. submit与execute区别
  5. 儿童手工制作日历_德莎胶带手工制作实用且美观的巨幅挂历,让你未雨绸缪
  6. 前端学习(1420):ajax的post请求
  7. Java-环境搭建(Mac版)
  8. 机器学习分类算法综述
  9. matlab复杂网络仿真,matlab在复杂网络上的应用
  10. linux mysql apache php 安装_linux下安装apache与php;Apache+PHP+MySQL配置攻略
  11. 毕设题目:Matlab疾病识别与分类
  12. 手工制作totem播放器的播放列表
  13. Android APP 全局字体替换-思源黑体
  14. 计算机画cad很慢怎么办,【2人回答】画CAD图时电脑很卡怎么办?-3D溜溜网
  15. 数据的预处理分箱python_数据预处理——数据分箱
  16. Ionic for Angular 环境搭建
  17. FaceNet2ExpNet: Regularizing a Deep Face Recognition Net for Expression Recognition论文个人解读
  18. gbt7714在overleaf中如何把英文作者大写变小写
  19. leofs管理工具之s3 browser连接
  20. 搜索引擎优化是什么,搜索引擎优化应该怎么学?

热门文章

  1. 【LOJ 3037】开关游戏(DP)
  2. 登录操作之MD5盐值加密
  3. 微软函数 for vba自定义函数Function
  4. HUAWEI 机试题:消消乐游戏
  5. Nachos实习——Lab1线程机制实习报告
  6. [18调剂]2018-中科院成都计算机应用研究所调剂
  7. 4.7 Python设置代码格式
  8. C语言科学计数法E格式
  9. Linux操作系统分析--课程总结报告
  10. git 问题 之 git add 后直接git commit --amend导致合入了上一笔提交的解决办法