米家插件平台的技术实践之路

2023-05-16

2016年小米正式发布米家品牌,此后米家开始接入第三方的智能硬件产品,小米的IoT生态也迎来了快速发展。截止到2020年Q3,小米AIoT平台已连接的IoT设备(不包括智能手机及笔记本电脑)数达到2.89亿台。如何高效的接入和管理这么多设备,是米家App一直在探索的问题。我们希望通过米家插件来解决这个问题,下面将分享米家插件平台在研发过程中的一些探索和实践。

1

 米家APP介绍 

米家App是一个智能硬件管理平台,不仅连接小米及生态链公司的智能产品,同时也开放接入第三方智能硬件,为用户提供智能生活整体解决方案。用户可以简单便捷地通过手机与智能硬件交互,并实现智能硬件之间的互联互通。一键实现个性化定制的智能场景,与家人朋友分享智能设备。

2

 什么是米家插件 

米家插件是用户在米家App中用来控制设备的一段小程序。每个设备都有其相对应的插件,由开发者(通常是设备厂商)负责开发,测试,发布与维护。下面是一个灯组插件主要界面的截图。

米家插件基于小米研发的插件框架开发。插件框架是米家为支持插件开发而提供的JavaScript接口的集合,赋予了开发者开发/调试/运行插件的能力。接入小米IoT平台的智能硬件,米家App正是通过米家插件来控制和管理设备的。

2.1 米家插件发展史

随着小米IoT业务的快速发展,米家插件也经历了三个阶段:Native插件阶段、ReactNative插件(简称RN插件)阶段、公版插件阶段。

  1. Native插件阶段

在小米IoT业务早期,接入米家生态的智能设备还不多,这个阶段的插件都是Native插件,开发者需要基于iOS和Android分别开发插件,然后米家集成插件代码(Android可以动态下载)。随着小米IoT业务的快速发展,米家APP的安装包体积快速增长,代码维护困难,迫切需要一套支持动态化的插件方案。

  1. RN插件阶段

随着IoT业务的快速发展,Native插件的弊端越来越明显。为了适应业务的发展,米家对新一代的插件方案要求是支持动态化和跨平台。2018年我们开始着手下一代插件方案的研究,结合用户体验和开发维护成本,最终我们选择基于ReactNative搭建一套插件框架,以帮助开发者快速开发米家插件。基于RN的插件框架,插件开发语言统一为JavaScript,开发者只需要一套RN插件代码,便可运行在iOS和Android双平台上,极大的减轻了开发者的开发成本。

  1. 公版插件阶段

为了进一步降低开发成本,米家启动了公版插件的研发工作。公版插件是由米家开发,支持开发者做一些个性化配置并且可以免费使用的通用插件。正如其名,某个品类的公版插件可以用来控制该品类的所有设备。目前,米家已经提供了如空气净化器、灯、电暖器、浴霸、风扇...等多个品类的公版插件。开发者在没太多自定义需求的时候,使用公版插件可以零成本接入米家。后续我们会推出更多品类的公版插件,以及更多的定制化能力支持。现阶段,公版插件也是基于RN开发,不管后面米家的插件框架如何迭代升级,使用公版插件的开发者将省去很多维护工作。

2.2 RN插件的优势

RN在Facebook官方支持和广大社区推动下,发展非常迅速。从2015.04月发布第1个版本开始,截止到2020.11月,在Github累计发布351个版本,共收到91.9k份Star。鉴于RN具有的各种优越性,米家App选择基于RN开发插件框架。相比Native插件,RN插件有很多优势:

  1. 跨平台

RN开发的应用大多用于iOS和Android平台,但通过众多开发者和社区的支持,也可用于PC、Web等平台。

  1. 可快速迭代

RN插件在使用感受上和用Objecttive-C(OC)或Java编写的应用相比几乎无法区分。RN插件可以快速迭代开发,比起传统原生应用漫长的编译过程,插件开发者可以在瞬间刷新插件,实时预览插件UI效果。

  1. JavaScript拥有大量的开发者

自1996年JavaScript发布第1版以来,JavaScript在互联网中广泛使用。近年在各大机构的编程语言排行榜中JavaScript基本都在Top 10,拥有数据庞大的开发者。

2.3 RN插件的挑战

RN的设计初衷是成为JS和Native应用之间的桥梁,核心模块就是JSBridge。JSBridge完美的隔离了JS和Native应用,提供了足够的灵活性,但却导致页面性能存在一些问题,尤其是复杂页面的渲染性能较差。JS和Native交互使用JSON数据,数据的传输效率不高,消息通道容易阻塞。RN也意识到这些问题,提出了一系列的重构计划来解决这些性能瓶颈。

3

 米家插件体系 

米家插件是米家App中智能设备的控制中枢。如下图所示,米家插件体系包含6大部分:平台服务、RN-SDK、RN插件、公版插件、插件开发环境和插件发布环境。涉及插件开发、调试、发布各个环节。

3.1 米家平台服务

依托Android和iOS的系统能力,米家插件具备了丰富的IoT能力。在此基础上,我们还针对网络、储存、安全等模块进行加固和封装,插件不用担心通信安全和数据隐私泄露等问题。米家后台提供了如消息推送、多设备联动、语音控制、云计算等丰富的IOT设备管理能力。有了这些基础能力,插件开发者只需专注于插件的开发即可,大多设备甚至都不需要开发自家的后台服务即具有强大的后端能力。

3.2  RN-SDK

默认情况下,RN会将所有的JS代码打包成一个Bundle,App可以把Bundle文件放在本地或者从服务器下载。我们结合米家插件自身的业务特点,对RN的编译脚本进行定制化开发,可以打包成多个Bundle。每个插件打包成2个Bundle:由一个main.bundle和一个sdk.bundle组成。其中main.bundle是由插件代码编译打包的生成的,不同的插件对应不同的main.bundle,由厂商负责迭代更新;sdk.bundle是由米家开发的RN-SDK的代码编译打包生成的,不同的插件共用同一个sdk.bundle,由米家负责迭代更新。通过深度定制编译脚本,米家的RN-SDK是向后兼容的。基于低版本RN-SDK开发的插件,可以在高版本的RN-SDK上运行。这样插件和RN-SDK就可以按自己的节奏去发布新版本。把公共的代码和资源放到RN-SDK里面去,不仅可以减少插件包的大小,对于减少插件的打开时间也有帮助。

RN-SDK封装了米家提供的设备管理能力、网络通信、存储、蓝牙、WiFi、红外、视频、音频、固件更新、UI组件库等。开发者可基于该SDK开发富有差异性的业务功能。UI组件库提供的各种控件,经过精心设计,不仅样式精美,而且对深色模式、无障碍、大字体等都做了适配,使用起来非常方便。如下图展示了UI组件库里面提供的一些常用的控件。

如果有些功能在RN-SDK里不提供,React生态也有很丰富的开源的三方库,开发者可以很方便的引入到插件使用。

3.3 插件开发与调试

为了降低插件的开发难度,米家提供了一系列的工具帮助开发者快速上手插件开发。

  • 一键安装插件开发环境

通过运行我们的脚本程序,开发者可以快速安装插件开发所需要的各种依赖,即使是从没用过RN开发的开发者都可以快速完成环境的搭建。

  • 丰富的代码模板

这些代码模板把相应设备需要的基本功能都已经开发好,开发者只需把相关参数修改一下即可完成基本的开发。常见的WiFi设备、蓝牙设备,米家都有提供对应的插件模板,开发者可根据硬件产品的联网方式、开发能力选择使用对应的模板。

  • UI实时预览

插件开发过程中,开发者可以通过米家APP随时调试功能是否正常,UI是否符合设计预期。

  • 扫码调试

为了进一步简化调试设置,米家RN插件已经支持扫码调试,开发者运行我们提供的npm指令,然后即可扫描调试,省去了很多设置步骤。

如果这些工具还不能解决开发者的问题,我们还有一个工单系统。开发者可以给我们提工单反馈问题,每个工单都会有工程师来跟进,直到问题解决。

3.4 发布插件

开发者完成插件开发后,将代码打包发布到小米IoT管理平台,通过米家测试后,即可上线发布。在Iot管理平台,开发者可以随时查看发布后的活跃用户、质量指标、用户反馈等多个维度的数据指标。

3.5 公版插件

为了提高厂商的接入效率,减少插件的开发成本,提升插件质量和用户体验,米家启动了公版插件的研发。公版插件是由米家开发,厂商可以免费使用的米家插件。以空气净化器为例,公版插件是米家综合考虑市场上主流的空气净化器的产品功能后,设计出来的一款可以适用于大多数空气净化器的插件。当然,提供给每个厂商的公版插件并不都是完全一样的,公版插件具备哪些功能还跟设备的instance(基于MIoT-Spec协议编写的定义设备功能的文件)有关。目前,米家提供了如空气净化器、灯、电暖器、浴霸、风扇等多个品类的公版插件,后续我们会推出更多品类的公版插件。下面是空气净化器的公版插件截图,公版插件也是使用RN来发开发的,对于用户来说使用上没有本质的区别。

考虑到厂商可能想做一些有差异性的功能,公版插件也支持一些定制化的能力。公版插件是基于厂商的需求生成配置文件,然后根据配置文件态生成相关的代码,以满厂商的定制化需求。

目前,我们正在开发公版插件可视化系统,厂商可以根据自己的需求独立地定制公版插件。在可视化系统里面,厂商不仅可以调整文字显示、界面布局等,还可以按照自己的想法去设计每个功能应该以何种样式展示出来,定制功能的交互方式。

对于开发能力不强的厂商,使用公版插件可以保证用户有一个良好的使用体验;对于那些自己开发插件的厂商,使用公版插件可以降低成本,缩短接入时间,让产品尽快上市。

截止2020年底,已经有上百家厂商在使用公版插件。相比厂商自研插件需要多次验收才能通过米家测试,公版插件大多一次验收就能通过测试;从后台统计的到插件crash率来看,公版插件的crash率相比厂商自研插件减少了80%,稳定性更好;相比自研一款插件需要动辄3-4周的开发时间,使用公版插件只需要在IoT平台花几分钟简单配置一下即可自动生成,真正的实现了零成本接入。

4

 插件监控运维 

插件发布后,运维是非常重要的一项工作。做好运维工作离不开好的运维工具的支持,米家提供的监控运维可以分为平台运维和开发者运维两部分。

平台运维可以分为发布运维、业务监控和质量监控。

  • 发布运维:RN-SDK灰度/上线/下线、插件灰度/上线/下线、下发配置等;

  • 业务监控:用户活跃统计、API调用热度分布、新功能的使用情况等;

  • 质量监控:插件启动成功率、插件启动耗时、API执行成功率和耗时、米家后台服务监控、插件crash统计等。

开发者可使用的运维工具集中在IoT管理平台,在这里开发者可以创建插件、调试插件功能、发布插件、用户画像、插件质量指标、查看用户反馈、crash日志等。

5

 总结与展望 

米家插件在2019年迁移到RN框架,此后所有新接入的产品都在使用RN插件接入米家,插件开发的人力成本减少50%。截止2020年Q1,RN插件已经覆盖米家所有品类的智能设备。

未来我们会继续优化米家插件开发的各个流程,尽可能帮助开发者提升开发效率,降低开发门槛。同时,我们也会持续优化米家插件的各项指标,为米家用户带来更好的使用体验。

参考文献

[1] 张小武. React Native技术及其在米家插件端实践

[2] 什么是米家扩展程序: 

https://iot.mi.com/new/doc/extension-development/overview

往期文章

No.1 日志异常检测初步实践与探索

No.2 基于chaosblade的故障注入平台实践

No.3 HDFS慢节点监控及处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

米家插件平台的技术实践之路 的相关文章

  • 【手撕代码】多个线程交替打印

    目 录 xff1a 方法一 xff1a 锁实现 推荐 方法二 xff1a 信号量 semaphore 实现 推荐 方法三 xff1a wait notify 实现 方法四 xff1a 使用 Lock Condition 实现 面试的过程中
  • 【搞定算法】找出数组中出现次数大于数组长度一半和 N/K 的数

    博主秋招提前批已拿百度 字节跳动 拼多多 顺丰等公司的offer xff0c 可加微信 xff1a pcwl Java 一起交流秋招面试经验 目 录 xff1a 1 找出数组中出现次数大于数组长度一半的数 2 找出数组中出现次数大于数组长度
  • NVIDIA Jetson Nano 电源适配器 (供电)

    1 Jetson Nano 供电 Jetson Nano 的 micro USB 接口支持 2A 的电流 xff0c DC 供电接口支持 4A 电流 MicroUSB 在安全范围内的最大承载电流为 2A 实际项目中 CPU 满载 43 GP
  • 【搞定算法】常见算法题分类总览

    博主秋招提前批已拿百度 字节跳动 拼多多 顺丰等公司的offer xff0c 可加微信 xff1a pcwl Java 一起交流秋招面试经验 xff0c 可获得博主的秋招简历和复习笔记 完善中 由于本人平时刷题比较零散 xff0c 有时候找
  • 堆、栈的储存内容

    Java的JVM的内存可分为3个区 xff1a 堆 heap 栈 stack 和方法区 method 堆区 1 存储的全部是对象 xff0c 每个对象都包含一个与之对应的class的信息 class的目的是得到操作指令 2 jvm只有一个堆
  • 某32位系统下, C++程序,请计算sizeof 的值.

    某32 位系统下 C 43 43 程序 xff0c 请计算 sizeof 的值 void Foo 1 char str 100 cout lt lt 34 Foo 1 34 lt lt sizeof str lt lt endl char
  • python-pcl安装及使用

    在开始前 xff0c 先说明一下 xff0c pcl的库安装不简单 xff0c 不仅需要pip安装 xff0c 还需要安装C 43 43 的pcl库 xff0c 所以整个流程会比较漫长 鉴于官方参考网站的python pcl太麻烦 xff0
  • ROSBAG解析bag包教程

    一 软件安装教程 1 安装rosbag xff1a https www cnblogs com arkenstone p 6676203 html 2 安装mjepgtools和ffmpeg sudo apt get install mje
  • 双电机同步PID调试方法(二)

    由于双电机的PID上升曲线难以完全重合 xff0c 造成左右电机速度不一致 本文为了解决该问题设计了一种方法 主要思想是将不同速度对应的PWM占空比曲线拟合出来 xff0c 减1000 xff08 总10000 xff09 占空比后作为预设
  • exe打包成安装包

    前面介绍了如何将python代码打包成可执行文件 xff0c 这里再介绍一下如何将exe打包成安装包 一 安装InstallShield2015 百度云网址 xff1a https pan baidu com s 1fFGDeczPduWa
  • Python 打包成 wheel

    1 编写 setup py 在项目的根目录下外面一个文件夹创建 96 setup py 96 96 name 96 xff1a 指的是你打包后发布的名称 xff08 如 96 numpy 96 和 96 torch 96 xff09 96
  • plugins插件使用例程

    最近在看一个pyqt写的工具软件 xff0c 项目中大量使用plugins xff0c 所以了解了一下plugins的功能机制 下面简单分享一个例程 xff0c 代码结构如下 main py platform py init py plug
  • pycharm中.gitignore无效

    1 打开pycharm的命令行 xff0c 输入以下指令 git rm r cached git add 2 再次在pycharm上 xff0c 点击commit 原因 xff1a 这是因为pycharm会自动运行git add 的功能 x
  • Jetson Orin&Nx&Nano平台 FPDlink Ⅲ相机采集---双目场景应用

    1 前言 基于上次在淘宝上采购的FPDlink 相机采集套件使用一段时间之后 不少人对此方案很感兴趣的 又激发了我继续写的激情 上次帖子链接如下 Jetson Orin平台多路 FPDlink 相机采集套装推荐 bingdund的博客 CS
  • SBUS协议:SBUS解析与合成

    在说协议之前 xff0c 我想强调一点 xff1a 信号要取反 xff0c 硬件取反 xff01 xff01 xff01 xff01 xff01 至于为什么强调 xff0c 我会在后面解释 xff0c 你们先记住 SBUS协议 xff1a
  • 上海灵信视觉A4控制板

    资料准备 xff1a 1 LED Player上位机控制 xff1a em span style font size 12px http www 168led com AjaxFile DownLoadFileNew aspx FilePa
  • stm32串口一直进USART1_IRQHandler

    今天在使用USART模块 xff0c 遇到了一些问题并解决了 xff0c 于是发贴共享 问题描述 xff1a 在使用USART做串口通讯时 xff0c 我只把接收中断打开 xff0c 并设置抢占优先级为最低一个级别 xff0c 而接收中断上
  • tensorflow载入报错Process finished with exit code -1073741819 (0xC0000005)

    这几天准备在现有的软件里加上caffe来测试一种新算法 发现windows下python3 6安装caffe是真的难 xff0c 只能装好python2 7的版本就放弃了 回来继续完善软件 xff0c 又发现软件里的tensorflow不能
  • python项目打包(自定义dll) anaconda3+pyinstaller

    目前手上有一个python 43 pyqt的项目需要打包 xff0c 所以查了一下打包的方法 下面介绍一下具体步骤 xff1a python打包有很多方法 xff0c py2exe xff0c pyinstaller等等 xff08 其实我
  • Docker(六)同一镜像有多个Tag情况下,执行 docker rmi 镜像ID 指令无法删除

    删除方法一 docker rmi f 镜像ID 删除方法二 docker rmi repository tag 参考 xff1a 1 https www imooc com article 35040

随机推荐

  • 《ROS机器人开发实践(胡春旭)》第十章MoveIt!机械臂控制 学习笔记

    r 在学习 ROS机器人开发实践 胡春旭 第10章的MoveIt xff01 时 xff0c 因为在自己创建的工作空间中没有下载作者的源代码 xff0c 所有有以下几个问题 xff1a 1 使用moveit setup assistant时
  • Android 根据网络分析运营商信息

    我们想获取手机的运营商信息 通常都会去调用系统的TelephonyManager类的取数据 但是很多时候可能取不到卡的信息 xff08 例如双卡手机和一些特殊卡 xff09 xff0c 这样就区别不了运营商了 但是有时候我们的需求要进行不通
  • 简单又好看的按钮,扁平化按钮。

    今天分享一下流行的扁平化按钮 完全不需要用到图片哦 效果图如下 xff1a 里面有2个按钮都是一样的模式 只要修改的色值就可以 下面跟我来更新你的UI吧 首先编写 button xml 代码如下 lt xml version 61 34 1
  • Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题

    由于国内的运营商问题 xff0c 双卡手机获取IMSI号问题要根据厂商API 来实现 下面我们就来做一套完整的分析运营商获取IMSI号逻辑 1 xff0c 首先我们要判断手机的平台 1 1 xff0c 判断手机是否MTK平台 public
  • AstarPathfindingProject 中RVO碰撞体扩展

    原本库中只有矩形RVO碰撞体 xff0c 如果要添加自己的需要继承RVOObstacle抽象类 xff0c 重写里面的方法 例如下面的圆柱形碰撞 using UnityEngine if UNITY EDITOR using UnityEd
  • Android中抓取手机视频流数据。

    目前实时抓取手机视频数据有2种方法 xff0c 一种是通过camera的回调获取源数据 xff0c 这里获取的源数据是没有编码的数据 有的人发送yuv数据然后在那绘制图片 xff0c 也说视频聊天 xff0c 真是可笑 这种方式是可是实现视
  • Android 使用AudioRecord录音相关和音频文件的封装

    在Android中录音可以用MediaRecord录音 xff0c 操作比较简单 但是不够专业 xff0c 就是不能对音频进行处理 如果要进行音频的实时的处理或者音频的一些封装 就可以用AudioRecord来进行录音了 这里给出一段代码
  • Android 中使用MediaRecorder进行录像详解(视频录制)

    在这里给出自己的一个测试DEMO xff0c 里面注释很详细 简单的视频录制功能 package com video import java io IOException import android app Activity import
  • Android手机中获取手机号码和运营商信息

    代码如下 xff1a package com pei activity import android app Activity import android os Bundle import android view View import
  • C语言下划线开头的函数

    首先 xff0c C 43 43 里关于下划线的问题是源于C语言 xff0c 因为C 43 43 允许用extern C 来修饰代码以C语言语法方式编译 然后说C语言里的下划线 xff1a C语言确实允许以下划线开头的函数存在 xff0c
  • 校验和计算方法

    1 说明 xff1a 1 校验和覆盖的内容 xff1a IP校验和 xff1a IP首部 ICMP校验和 xff1a ICMP首部 43 ICMP数据 xff1b UDP TCP校验和 xff1a 首部 43 数据 43 12个字节伪首部
  • 布谷鸟算法浅谈与简单应用

    简介 布谷鸟算法是由剑桥大学Xin She Yang教授和S Deb于2009年提出的一种新兴的启发算法 xff0c 是一种通过模拟自然界当中布谷鸟 xff08 也就是杜鹃 xff0c 故该算法也称为杜鹃算法 xff09 在繁育后代的行为而
  • torchvision中inception v3的实现

    一 torchvision中inception v3的网络结构 论文中给的结构如下图所示 但是torchvision中的inception v3结构中并不是这么实现的 下面解释一下torchvision中的inception v3结构 xf
  • 实践 基于Arduino 的 平衡车

    完成样子 因为只是学习验证 xff0c 没用电烙铁 xff0c 只用了面包板来连接各个组件 xff0c 中间用扎带固定 xff08 不稳定 xff09 完成后能基本保持平衡 xff0c 但太大力去推容易倒 平衡原理 通过负反馈实现平衡 xf
  • CMake入门-04-自定义编译选项

    工作环境 系统 xff1a macOS Mojave 10 14 6CMake Version 3 15 0 rc4 Hello World 自定义编译选项 CMake 允许为项目增加编译选项 xff0c 从而可以根据用户的环境和需求选择最
  • Linux 驱动开发简单实例

    Xiuye XY于 2021 08 03 19 17 07 发布343 收藏 3 分类专栏 xff1a 笔记 C C 43 43 Linux 版权 编辑笔记同时被 3 个专栏收录正在上传 重新上传取消 128 篇文章0 订阅 订阅专栏 编辑
  • ros下编译安装package

    原文地址 配置Release目录 catkin config install修改CMakeList txt文件 修改节点中CMakeLists txt文件 假设此处我们的节点项目名称为 test node 即CMakeLists txt中p
  • 什么是解耦?

    什么是解耦 解耦就是用数学方法将两种运动分离开来处理问题 对项目划分为多个模块这种做法你有什么看法 xff1f 优势 劣势有哪些 xff1f 多模块化项目优势在于 xff1a 提高代码的重用率 xff0c 可维护性高 xff0c 架构灵活
  • HDFS-Tiering 数据分层存储

    1 背景 随着小米业务迅猛发展 xff0c 存储到 HDFS 集群的数据量不断增大 xff0c 存储成本也不断攀升 尤其是海外 HDFS 集群每 GB 数据的成本是国内集群的 10 倍左右 xff0c 如何优化海外集群的存储成本变得非常迫切
  • 米家插件平台的技术实践之路

    2016年小米正式发布米家品牌 xff0c 此后米家开始接入第三方的智能硬件产品 xff0c 小米的IoT生态也迎来了快速发展 截止到2020年Q3 xff0c 小米AIoT平台已连接的IoT设备 xff08 不包括智能手机及笔记本电脑 x