概述

IRext 是一个开源万能红外遥控码库、编解码压缩算法以及免费周边服务。它向智能家居开发者提供以下能力:

  • 支持 16 类 1000 多品牌,上万个型号的家用电器遥控。
  • 在线以及离线的万能红外码库,包括按照品牌分类的索引以及遥控编码。
  • 灵活的服务部署方式,利用开源的服务端以及控制台代码在容器环境内 5 分钟快速搭建自己的码库服务。
  • 码库和解码算法经过了极限压缩,能存储和运行在配置低至 51 MCU 的严苛硬件环境中。
  • 丰富的平台适配支持和示例代码。
  • 详尽的文档资源,覆盖万能遥控开发的每一个环节。
  • 开发者可使用码库扩展工具自行扩展码库,可基于开源代码自由修改方案功能细节。

红外遥控码

红外遥控码是一种基于 38000Hz 或者 56000Hz 载波频率的控制编码,接收方通过识别带有或不带有载波的时间间隔片进行编码识别。

在控制层通常使用高低物理电平对的序列来表示一个独立的控制信号,例如以下的 NEC 码:

它使用 9000us 载波 + 4500us 无载波时间序列表示引导码,并且使用 500us 载波 + 500us 无载波时间序列表示逻辑 0,使用 500us 载波 + 1500us 无载波时间序列表示逻辑 1,采用 2 字节地址码和 2 字节命令码构成,全码时间序列长度为 67.5ms。


以下是一些红外遥控码的规则:

  • 有载波的时间片称为物理高电平,无载波的时间片称为物理低电平。
  • 引导码,结束码,分隔符码以及逻辑 1 码,逻辑 0 码等统称为编码特征,每种协议具有不同的编码特征,比如 NEC 的衍生码 upd6121g 系列以及 tc9012 系列等等。
  • 编码特征中存在若干的 cycle,每个 cycle 即为一对高低物理电平,因此所有码中均有可能含有多个电平对,但通常只有 1 对。
  • 任何的引导码,结束码,分隔符码的均占 cycle 个逻辑 bit,例如上述的NEC码中的 9000-4500 占 1 bit。
  • 逻辑 1 和逻辑 0 码均占 cycle x 8 个 bit,通常为 8 个 bit。
  • 逻辑 1 和逻辑 0 码存在大端和小端两种按 bit 输出状态,大端为每个 8 bit 中按高位在前输出,小端为低位在前输出。
  • 逻辑 1 和逻辑 0 码存在按位掩码。
  • 某些协议的逻辑码存在 4 进制,8 进制和 16 进制码,定义为 4 样本,8 样本和 16 样本,最常见的为 2 样本 (逻辑 2 进制)。
  • 某些协议存在位反转,例如 RC-5 码和 RC-6 码,其特征是物理高低电平时间间隔相等。
  • 某些协议的引导码,结束码和分隔符码存在物理电平时间间隔为 0 的情况。

两种常用的红外控制码类型

  • 命令码: 命令码: 命令码即为编码接收方根据命令自行调整状态的应用编码,例如家用电视机,机顶盒等设备,遥控器每次按下一个功能按键,将发出固定的编码,由接收设备自动设置状态,例如每次按下 POWER 键,都发出同样的编码,电视机则在开和关两种状态之间切换。
  • 状态码: 状态码为编码发送方根据当前状态以及按下的按键组合形成新的状态后发送给受控方,受控方按照这个状态执行指令的编码;例如大部分红外控制的空调均是用此种编码进行控制。

系统架构

IRext 从4个层次向万能遥控开发者提供解决方案: 公有云索引/解码服务、私有云索引/解码服务、发射端解码服务以及码库扩展与管理服务。

  • 公有云服务主要提供在线的码库展示、体验、文档说明以及红外码交换服务 (IRIS)功能,也可以提供码库索引能力 (目前更推荐使用私有云)。
  • 私有云服务主要提供用户本地化环境中的码库索引能力、在线解码能力、码库管理控制台。
  • 解码端方案主要提供码库索引 SDK 调用以及离线解码能力。
  • 码库扩展和管理服务主要由 IRIS 项目负责,它是对 IRext 体系的一个能力补充。


各平台最佳实践

IRext 针对开发者的不同产品构成选型进行了良好的平台适配,几乎可以用于带有红外发射功能的任意软硬/云端一体环境中,请根据你自身的需求详细参考针对不同环境的最佳实践,优化你的开发流程。

Android 应用程序

你可以参考开源项目中的 Android NDK 编译脚本 Android.mk 为你的 Android 应用程序编译 IRext 离线解码程序,并将所有 SDK 接口映射为 JAVA 代码进行调用。


Windows 服务器/应用程序

可以参考开源项目中的 ir_decoder.vcxproj 工程文件导入 Visual Studio 进行生成 ir_deocde.dll 文件,且将生成的动态链接库导入你的项目中使用。参考示例请见 irext\src\example\decode_example\Win32。


Linux 服务器/应用程序

使用 CMake 编译环境,并且参考开源项目中的 CMakeLists.txt 对源码进行编译,可以生成可执行程序 (用于测试) 以及 Linux 动态链接库,再导入你的工程。


嵌入式

在嵌入式平台中进行离线解码,请按照 SDK 文档中的步骤进行操作,对内存消耗要求极小。

相同的代码依然可以支持运行在单片机环境中,已经对 51, Arduino 等单片机进行了兼容。

感谢开源项目 IRbaby 作者,将 IRext 适配至 Node-MCU 及相类似平台。


Java 服务器

你可以从开源库中下载 Java Cloud SDK 的源码或者 jar package,在你的工程里调用进行码库索引,并且参考文档的“服务部署”部署解码服务。


iOS 应用程序

直接集成云 Restful API 以及解码算法到 iOS 应用程序当中实现下载和解码。



概述

私有云服务可供使用者自行搭建一个完整的,不依赖于公有云的私有码库管理系统,它完全包含 IRext 所提供的所有编码索引和码库。

私有云服务为你提供以下能力:

  • 继承 IRext 的公共码库控制台关键功能。
  • 继承 IRext 公有云服务的码库索引和下载功能,为端侧产品提供服务能力。
  • 完全不依赖于 IRext 的公共码库运行环境。
  • 支持容器化部署和在线解码。
  • 你可以利用私有控制台自行新增码库。
  • 可以通过 IRext 提供的可视化码库管理工作流对码库质量进行管控,确保下游产品高可用性。

部署索引服务

1. 预置环境: Linux 操作系统的服务器 (推荐 Ubuntu 或者 CentOS) ,MySQL 数据库 (推荐版本 8.0 以上) ,Redis,Java 运行时环境 (推荐 17 以上版本)。

2. 获取 private-server 源代码 (git clone https://opensource.irext.net/irext/private-cloud.git,或者直接下载压缩包)。

3. 可以将工程导入 idea 进行修改,并使用 maven install 打包成 SpringBoot jar,也可以直接使用 packages 中的预编译安装包。

4. 获取最新的 IRext 索引,(git clone https://opensource.irext.net/irext/database.git),并将 sql 脚本导入 MySQL 数据库。

5. 将 decode-service 工程的 decode-core 下的 libirda_decoder.so 复制到 /data/irext/ 下 (需要root权限) 。

6. 通过 java -jar 执行 decode-service 服务包,解码服务将会默认在 HTTP 8081 端口监听。

7. 你可以自定义 application.properties 文件,设置你的 监听端口、MySQL 和 Redis 连接参数,并放置在与 .jar 文件同级的 config 目录下。

在接口中请将 localhost:8081 替换成你的 IP:port

部署控制台

1. 预置环境: Linux 操作系统的服务器 (推荐 Ubuntu 或者 CentOS) ,MySQL数据库 (推荐版本 8.0 以上) ,Redis,Nodejs 运行时环境 (推荐 17.X 版本) ,Python 2.7 运行时环境。

2. 开始之前,请确保安装上述环境,并确保 MySQL 和 Redis 服务处于运行状态。

3. 从 github 上 clone 或者下载 irext-console 到服务器: git@github.com:irext/irext-console.git。

4. 从工程的 database/db/irext_xxxxx.sql 导入数据至 MySQL。

5. 在 home 目录下建立 rc_extension 目录,并将 data/binaries/irext-debug.tar.gz 中的文件解压缩到 rc_extension 目录下。

6. 在工程的根目录下执行 npm install。

7. 在工程的 web/public_js 下执行 bower install。(前提是需要执行一次 npm install -g bower)

8. 在你的 Ubuntu 或 CentOS 上安装 tmux 工具,并且运行工程根目录下的 ./startup.sh,启动控制台服务。

9. 在浏览器 http://localhost>:8080 上可以访问到控制台,并且可以使用你在 https://site.irext.net 上注册的账号进行登录。


使用容器

1. 预置环境: Linux (推荐 Ubuntu 22.04) 和 Docker 运行环境。

2. 参考下面的命令获取镜像和数据,并启动容器:


wget https://irext-lib-release.oss-cn-hangzhou.aliyuncs.com/pc-docker-image/1.5.2/irext-private-data_1.5.2.tar.gz

tar -xf irext-private-data_1.5.2.tar.gz
sudo mv data /

sudo docker pull crpi-r0wi5w1pz8m6ceho.cn-hangzhou.personal.cr.aliyuncs.com/irext-private/irext-private-cloud:1.5.2
sudo docker run -itd --restart unless-stopped \
--name irext-private \
-v /data:/data \
-p 8080:8301 \
-p 8081:8081 \
crpi-r0wi5w1pz8m6ceho.cn-hangzhou.personal.cr.aliyuncs.com/irext-private/irext-private-cloud:1.5.2 /data/start_irext.sh

            

3. 在浏览器中打开 http://<server_ip>:8080 即可访问控制台。

4. 索引和解码接口请参考“云 Restful API”章节。

5. 你可以根据自身服务器环境对参数进行调整,例如端口映射、数据目录等。


使用控制台

码库索引和下载

进入控制台页面,可以通过索引的方式逐步找到你的目标码库,并且通过下载按钮下载二进制文件。

也可以透过搜索框对码库进行查找,在码库索引表中,你可以展开一些隐藏的编码字段,例如机顶盒运营商以及码库贡献者等。


更新数据

目前,请定期访问 IRext SDK 下载页面,可以和 IRext 同步码库数据。


概述

IRext 提供了一个基于云部署的索引和解码服务,可以在自建云底座上提供码库索引和远程解码服务,支持多终端、多场景,例如: 物联网设备、移动设备和服务器等。

在线解码服务包括了 IRext 核心解码算法的所有能力,并以标准的 Restful API 提供输出。

你可以单独下载 IRext 的在线解码服务源代码或者程序包,部署在你的服务器上,配合 IRext 提供的索引数据库以及二进制压缩码库进行部署。


运行环境

码库索引

只需要几步就能通过 IRext 的云 Restful API 获取到码库中的编码:

1. 获取编码二进制文件,可以通过 IRext 控制台获取,也可以通过云 Restful API 进行获取,获取方法请参考条目 2。

2. 通过云 Restful API 按照以下流程依次调用可以索引到最终的编码二进制文件。

3. 将获得的二进制文件内容传输到需要解码的平台上,支持 PC-Windows/Linux/Mac 环境,Arduino,Android APP 环境等具有 C runtime 的环境。


下面分接口描述云 Restful API 定义

在线解码

协议解析

数据结构

枚举量

状态码

响应


概述

IRext 为 Java 和 Android 项目提供了云 SDK,对 IRext 提供的遥控码按照设备类型、品牌、型号进行索引,下载二进制压缩编码,以及调用云端提供的在线解码功能。


Java Web SDK

1. 在 IRext 应用中注册一个 Web 类型的应用,并获取 APP Key 和 APP Secret。

register_app app_key_n_secret

2. 在 Java Web 工程中使用 maven 的 pom.xml 文件添加依赖项:

<dependency>
    <groupId>net.irext.webapi</groupId>
    <artifactId>irext-webapi</artifactId>
    <version>1.5.2</version>
</dependency>

3. 使用 SDK

(1) 添加依赖类型:

import net.irext.webapi.model.*;
import net.irext.webapi.WebAPIs;
import net.irext.webapi.WebAPICallbacks.*;

(2) 获取 WebAPIs 实例:

WebAPIs webApis = WebAPIs.getInstance();

(3) 使用 APP Key 和 APP Secret 登录并获取应用 id 和鉴权 token:

SignInCallback signInCallback = new SignInCallback() {
    @Override
    public void onSignInSuccess(UserApp userApp) {
        int id = userApp.getId();
        int token = userApp.getToken();
    }

    @Override
    public void onSignInFailed() {
    }

    @Override
    public void onSignInError() {
    }
};
webApis.signIn(context, signInCallback);

(4) 列举家电类型:

ListCategoriesCallback listCategoriesCallback = new ListCategoriesCallback() {
    @Override
    public void onListCategoriesSuccess(List<Category> categories) {
    }

    @Override
    public void onListCategoriesFailed() {
    }

    @Override
    public void onListCategoriesError() {
    }
};
webApis.listCategories(listCategoriesCallback);

(5) 列举家电品牌 (非机顶盒电器类型按照品牌进行索引):

ListBrandsCallback listBrandsCallback = new ListBrandsCallback() {
    @Override
    public void onListBrandsSuccess(List<Brand> brands) {
    }

    @Override
    public void onListBrandsFailed() {
    }

    @Override
    public void onListBrandsError() {
    }
};
webApis.listBrands(category.getId(), listBrandsCallback);

(6) 列举城市 (中国的机顶盒按照城市和运营商进行索引):

ListProvincesCallback listProvincesCallback = new ListProvincesCallback() {
    @Override
    public void onListProvincesSuccess(Listt<City> provinces) {
    }

    @Override
    public void onListProvincesFailed() {
    }

    @Override
    public void onListProvincesError() {
    }
};

ListCitiesCallback listCitiesCallback = new ListCitiesCallback() {
    @Override
    public void onListCitiesSuccess(Listt<City> cities) {
    }

    @Override
    public void onListCitiesFailed() {
    }

    @Override
    public void onListCitiesError() {
    }
};
webApis.listProvinces(listProvincesCallback);
webApis.listCities(provincePrefix, listCitiesCallback);

(7) 列举机顶盒运营商 (中国的机顶盒按照城市和运营商进行索引):

ListOperatersCallback listOperatorCallback = new ListOperatersCallback() {

    @Override
    public void onListOperatorsSuccess(List<StbOperator> operators) {
    }

    @Override
    public void onListOperatorsFailed() {
    }

    @Override
    public void onListOperatorsError() {
    }
};
webApis.listOperators(cityCode, listOperatorCallback);

(8) 例举遥控编码索引:

ListIndexesCallback listIndexesCallback = new ListIndexesCallback() {

    @Override
    public void onListIndexesSuccess(List<RemoteIndex> indexes) {
    }

    @Override
    public void onListIndexesFailed() {
    }

    @Override
    public void onListIndexesError() {
    }
};
webApis.listRemoteIndexes(category.getId(), brand.getId(), city.getCode(), operator.getOperator_id(), listIndexesCallback);

(9) 下载编码二进制文件:

DownloadBinCallback downloadBinCallback = new DownloadBinCallback() {

    @Override
    public void onDownloadBinSuccess(InputStream inputStream) {
    }

    @Override
    public void onDownloadBinFailed() {
    }

    @Override
    public void onDownloadBinError() {
    }
};
webApis.downloadBin(remoteIndex.getRemote_map(), remoteIndex.getId(), downloadBinCallback);

4. 参考文档的 “离线解码” 章节,对下载的二进制码进行解码和进一步处理。


Android APP SDK

1. 在 IRext 应用中注册一个 Android 类型的应用,并获取 APP Key 和 APP Secret,并填写你的 Android 应用包名和签名信息。

register_app app_key_n_secret

2. 在 Android APP 工程中使用 gradle 的 build.gradle 文件添加依赖项:

implementation 'net.irext.webapi:irext-androidapi:1.5.2'

并在 AndroidManifest.xml 文件中添加如下 metadata:

<meta-data
    android:name="irext_app_key"
    android:value="your app key">
<meta-data
    android:name="irext_app_secret"
    android:value="your app secret">

3. 使用 SDK

(1) 添加依赖类型:

import net.irext.webapi.model.*;
import net.irext.webapi.WebAPIs;
import net.irext.webapi.WebAPICallbacks.*;

(2) 获取 WebAPIs 实例:

WebAPIs webApis = WebAPIs.getInstance();

(3) 使用 APP Key 和 APP Secret 登录并获取应用 id 和鉴权 token:

SignInCallback signInCallback = new SignInCallback() {
    @Override
    public void onSignInSuccess(UserApp userApp) {
        int id = userApp.getId();
        int token = userApp.getToken();
    }

    @Override
    public void onSignInFailed() {
    }

    @Override
    public void onSignInError() {
    }
};
webApis.signIn(context, signInCallback);

(4) 列举家电类型:

ListCategoriesCallback listCategoriesCallback = new ListCategoriesCallback() {
    @Override
    public void onListCategoriesSuccess(List<Category> categories) {
    }

    @Override
    public void onListCategoriesFailed() {
    }

    @Override
    public void onListCategoriesError() {
    }
};
webApis.listCategories(listCategoriesCallback);

(5) 列举家电品牌 (非机顶盒电器类型按照品牌进行索引):

ListBrandsCallback listBrandsCallback = new ListBrandsCallback() {
    @Override
    public void onListBrandsSuccess(List<Brand> brands) {
    }

    @Override
    public void onListBrandsFailed() {
    }

    @Override
    public void onListBrandsError() {
    }
};
webApis.listBrands(category.getId(), listBrandsCallback);

(6) 列举城市 (中国的机顶盒按照城市和运营商进行索引):

ListProvincesCallback listProvincesCallback = new ListProvincesCallback() {
    @Override
    public void onListProvincesSuccess(Listt<City> provinces) {
    }

    @Override
    public void onListProvincesFailed() {
    }

    @Override
    public void onListProvincesError() {
    }
};

ListCitiesCallback listCitiesCallback = new ListCitiesCallback() {
    @Override
    public void onListCitiesSuccess(Listt<City> cities) {
    }

    @Override
    public void onListCitiesFailed() {
    }

    @Override
    public void onListCitiesError() {
    }
};
webApis.listProvinces(listProvincesCallback);
webApis.listCities(provincePrefix, listCitiesCallback);

(7) 列举机顶盒运营商 (中国的机顶盒按照城市和运营商进行索引):

ListOperatersCallback listOperatorCallback = new ListOperatersCallback() {

    @Override
    public void onListOperatorsSuccess(List<StbOperator> operators) {
    }

    @Override
    public void onListOperatorsFailed() {
    }

    @Override
    public void onListOperatorsError() {
    }
};
webApis.listOperators(cityCode, listOperatorCallback);

(8) 例举遥控编码索引:

ListIndexesCallback listIndexesCallback = new ListIndexesCallback() {

    @Override
    public void onListIndexesSuccess(List<RemoteIndex> indexes) {
    }

    @Override
    public void onListIndexesFailed() {
    }

    @Override
    public void onListIndexesError() {
    }
};
webApis.listRemoteIndexes(category.getId(), brand.getId(), city.getCode(), operator.getOperator_id(), listIndexesCallback);

(9) 下载编码二进制文件:

DownloadBinCallback downloadBinCallback = new DownloadBinCallback() {

    @Override
    public void onDownloadBinSuccess(InputStream inputStream) {
    }

    @Override
    public void onDownloadBinFailed() {
    }

    @Override
    public void onDownloadBinError() {
    }
};
webApis.downloadBin(remoteIndex.getRemote_map(), remoteIndex.getId(), downloadBinCallback);

4. 参考文档的 “离线解码” 章节,对下载的二进制码进行解码和进一步处理。


概述

使用云 Restful API 最终将编码下载之后,将二进制文件保存到本地,也可以将它的值读取到内存的缓冲区,并且使用解码 API 对其进行打开、解码,最后关闭。

1. 需要根据云 Restful API 中的返回值 remoteIndex 对象打开其对应下载的遥控码库文件,主要对象参数包括: remoteIndex.categoryId,remoteIndex.subCate。

2. 成功打开码库文件之后,根据每次遥控按键的按键码 (参见按键映射) ,以及空调的状态 (如果是空调) ,最终得到一个整数型数组的红外编码输出结果。

3. 将这个结果发送到红外发射的功能接口或者驱动程序接口中,实现遥控控制。


从文件系统解码

                    ir_file_open(category, sub_category, "my_ir_code_file.bin");
                    ir_decode(key_code, user_data, &ac_status);
                    ir_close();
                

加载到内存解码

                    ir_binary_open(category, sub_category, buffer, buffer_length);
                    ir_decode(key_code, user_data, &ac_status);
                    ir_close();
                

解码之后在 decoded_data 中获得可供输出的 IR 时间序列,将此序列递交给 IR 设备驱动即可实现红外发送。


解码接口说明

                    #include "ir_decode.h"
                


对于机顶盒设备,频道 0~9 的按键码为 14+0 ~ 14+9


概述

本节内容侧重介绍编码原理与手工码库维护,如果需要高级编码采集功能,请参考 IRIS 项目。

借助 IRext 的私有云服务、编码算法以及一些外部设备,可以在现有码库的基础之上扩展你的遥控码库,并对编码的正确性进行校验,对码库进行管理。

私有云服务的搭建方式请参考“私有服务部署”一节所描述的内容,搭建好之后,通过了解和学习本文档的知识和步骤,就可以对码库进行扩充了。

由于命令码 (除空调之外的绝大部分设备)和状态码 (大部分空调设备)在编码方式上存在差异,本文目前只阐述如何扩充命令码码库。


编码原理

由于状态码编码复杂,维护难度较高,目前文档只介绍命令码编码原理以及维护的方法。

1. 命令码码库由 protocol 和 control 两部分组成。

2. protocol 表示这种控制编码的起始码,结束码,逻辑0,逻辑1,位反转等信息,对于遥控的所有功能所发出的码,这些信息都是适用的。

3. control 表示某一个具体的遥控设备每个功能按键所能发出的编码的具体信息。protocol 和 control 之间是一对多的关系,即一个 protocol 可以衍生出多种不同的遥控设备编码。

4. protocol 部分由多个属性组成,包括: bit_boot,bit_1,bit_0,bit_stop,bit_flip,frame_normal。

  • bit_boot: 红外控制引导码,红外接收装置将这种特殊的成对时间序列视为一个有效控制信号的开端,以排除噪声。
  • bit_stop: 红外控制结束码,红外接收装置将这种特殊的成对时间序列视为遥控信号结束。
  • bit_0: 逻辑信号 0。
  • bit_1: 逻辑信号 1。
  • bit_flip: 逻辑信号位反转。
  • frame_normal: 一个完整控制码的序列,由上述5种码组合而成,例如 upd6121g 协议中,一个完整控制帧的构成为: bit_boot,8bit segment 1, 8bit segment 2, 8bit segment3, 8bit segment3-reverse,bit_stop。其中每个 8bit 的 segment 在每个按键上都有所不同,但是每个 bit 只可能是逻辑 0 或者 逻辑 1。
  • frame_normal 的定义当中还有针对每个 segment 的属性,又分为:
  • (1) bits: 定义一个 8bit 的 segment 当中有几个有效位,对于无效位应该做 mask 屏蔽。
    (2) ending: 定义一个 8bit 的 segment 的输出是大端方式 (msb,正序输出)还是小端 (lsb,反序输出)方式。
    (3) mode: 定义一个 8bit 的 segment 是按照 bit 正常还是 bit 反转方式输出。
    (4) type: 定义一个 1bit 的类型,取值为 boot,stop,flip 当中的一种。

5. control 部分由多个按键的编码以及对应的 protocol 名称组成。control 当中根据 protocol 指定了不同的按键发出编码的帧结构。

6. 每个按键有对应的名称,且包括规定协议当中的所有 segment 的具体值,例如,某个 upd6121g 协议的设备的电源按键帧值为: 0x45 0xBA 0x12,即对应 upd6121g protocol 当中的 3 个 normal mode 的 byte 以及 一个 reversed mode 的 byte,byte 当中的每一个 bit 翻译成 bit_0 或者 bit_1。


一个命令码 protocol (upd6121g-NEC) 的例子

一个命令码 control (某扫地机器人) 的例子

编码规则

如果详细了解了上述的实例,那么例如我们需要生成一个扫地机器人的电源按键编码,可以看到其电源按键的控制码为:

item1=0x40,item2=0x55,item3=0x44,

upd6121g 当中涉及到了 item3 的反码,因此 item3(inverse)=NOT(0x44)=0xBB,

换算成2进制即为: item1=01000000,item2=01010101,item3=01000100,item3(inverse)=10111011,

由于每个 item 指定为 lsb 模式,即反序输出,换算为: item1=00000010,item2=10101010,item3=00100010,item3(inverse)=11011101,

对照 upd6121g 协议,最终产生的红外时间序列为:

9000,4500,560,565,560,565,560,565,560,565,560,565,560,565,560,1690,560,565,560,1690,560,565,560,1690,560,565,560,1690,560,565,560,1690,560,565,560,565,560,565,560,1690,560,565,560,565,560,565,560,1690,560,565,560,1690,560,1690,560,565,560,1690,560,1690,560,1690,560,565,560,1690,560,560,0
            

将上述时间序列作为输入,提交到红外发射驱动,实现依次按照 38KHz 有载波-无载波顺序调制,即可发出让科沃斯扫地机器人工作的控制信号。

当然,上述算法,包括最终码库的二进制压缩,都由 IRext 编码算法实现好了,你只需要产生所需要的控制码 XML 文件,提交给 encoder core 即可完成编码工作。


码库维护环境准备

1. 红外码库的扩充,需要借助一台 YG-920 红外码分析仪。在将来 IRext 也会推出成本更加低廉的红外码分析方式。

2. 安装红外码分析仪的配套软件 (目前只支持 Windows 操作系统),连接分析仪到电脑,确认可以在分析仪的仪表板上接收到任意第三方遥控器的编码。

分析仪配套软件下载链接

3. 参考“私有服务部署”一节描述的内容,搭建好 IRext 私有云服务。

4. 准备好需要录入的第三方遥控器,然后就可以开始录入了。


码库维护方法

在已有协议基础上扩充和维护码库

1. 打开 YG-920 分析配套软件,接入分析仪,将第三方遥控器对准 YG-920 的接收接口,按下相应功能按键,在分析软件界面上可以看到这个功能遥控码的解析结果。

2. 如果解析结果当中的 protocol 是 IRext 已经编录的 protocol,那么只需要根据 system code 和 custom code 录入按键码即可,准备一个和上面扫地机器人控制码 xml 文档类似的文档,按照下面的规则填写信息:

  • 如果电器的类别 (category) 是 IRext 当中的 category,那么请参考 ir_command_encode.py 进行功能按键编码的录入。
  • 仔细分析 protocol 当中的 frame 字段内容,并且根据遥控分析仪上的 system code 和 custom code 填入每个按键的 item 值。
  • 下载 encode core 算法源码到 private console 的 ir_encoder 目录,并且在 system_config.js 当中配置好你环境中的 PYTHON_PATH。
  • 下载 binary data 到本地文件夹,并且在 system_config.js 配置 FILE_TEMP_PATH,指向 protocol 和 binary 文件夹的父目录。
  • 在 private console 的管理控制台当中新增一个红外码,选好所属类别 (category)和品牌 (brand)/城市 (city),选好它所属的协议,上传上面手工加入的 xml 文件,一个新的码库就生成了。
  • 通过管理控制台,你可以控制码库的验证,将码库下载到本地,使用解码算法进行实际验证,如果验证不通过,你可以回退码库状态,也可以验证通过进入正式发布状态。
  • 如果要新增的编码不属于 IRext 当中的任何类别 (category) ,例如游戏机,那么需要用户手动添加相应的 category 到数据库,并且通过私有控制台创建 brand,接着按照上面的方法新增遥控码。

编码维护服务

如果要录入的编码,是属于不在 IRext 官方码库当中的协议,请联系作者,可以通过企业服务的方式帮助企业用户进行新增协议的支持,这部分服务会收取一定费用。

如果有任何疑问,请在 https://opensource.irext.net/irext/irext 项目上提出 bug。


Web 服务相关问题

Q: 如何在自己的服务器上搭建 IRext 服务?

A: 可以在 github 上下载 私有服务器 配合 码库索引数据库 进行部署,部署方式可参考文档“服务部署”章节。


Q: 如何实现类似 IRext 控制台上的在线解码功能?

A: 如果部署了码库索引的私有服务,那么可以下载资源库当中的 JNI 解码库,并在私有服务器的 application.properties 当中的 user.data.basedir,且将解码库放置于 $user.data.basedir/irext/ 下,则一并具备了在线解码的能力,在线解码的调用参见文档“云 Restful API”章节。


解码相关问题

Q: 空调解码时,解码接口为什么既要传递空调状态参数,又要传递按键?

A: 因为空调解码过程不仅需要得到当前的状态,还需要知道当前状态是如何迁移过来的,例如从 制热-24 度 切换到 制冷-24 度 与从 制冷-23 度 切换到 制冷-24 度,发出去的红外指令是不同的。


Q: 空调支持扫风和风向控制吗?

A: 目前仅支持控制上下扫风和风向控制,不支持左右扫风控制 (比较小众)。


Q: 空调状态当中有 Sleep,Timing,Display 三项,是否支持?

A: 此三项目前为保留字段,不支持其功能,但用户如果有编码和码库维护能力,可以自主根据源代码进行扩展。


Q: 电视机和机顶盒支持频道控制吗?

A: 支持,电视机和机顶盒支持直接频道数字码发送 (0-9) ,请参阅文档“按键映射”章节。


Q: 如何在 iOS 平台上实现红外解码?

A: 解码核心算法是由纯 C 语言开发,可直接集成到 iOS 开发环境进行编译,但是需要用户自行研究从 iPhone 等设备发射红外码的方法。并且需要为 iPhone 购买音频转红外的发射模组,具体实践过程请参考文档首页的“最佳实践”章节。


Q: 为什么有些遥控器匹配成功之后,大部分按键都可以正常控制,个别按键按下之后设备无反应?

A: 因为各大家电厂家会推出同一季发布、规格相近但是不完全相同的电器。它们在遥控指令方面大部分是共享的,但是也有功能上的差异化。在产品上进行控制匹配时比较难仅仅通过简单的几个按键 100% 精准匹配到用户使用的电器,此时建议提升按键匹配数以提高准确度。如果码库当中实在不存在 1:1 匹配的电器,可以考虑自行扩充编码。


编码相关问题

Q: 目前 IRext 上提供的编码方案可以通过哪些途径获得?

A: 目前可以通过 IRIS 项目向 IRext 码库提供编码,当前 IRIS 支持通过虚拟机和开发板的途径从外界吸收码库,也可以通过在线协议分析功能进行编码分析。


其它问题

Q: 如何让最终用户更快的在 IRext 遥控码索引中找到其家电的遥控码?

A: IRext 的遥控码索引均已按照特定品牌家电的普及程度排序,越普及的遥控码的 priority 值就越小,建议按照 priority 从小到大的顺序在产品当中呈现遥控码列表。


致谢

特别感谢在 IRext 和 IRIS 建设当中给予支持的同学:
  • 参与原始编解码算法贡献者: @阿贵,@香江🍌,@恩恩
  • IRIS 码库贡献者: @呆呆
  • 设计师: @Teresa
  • BabyIR 👶作者: @Caffreyfans
  • 特别感谢 @Huangyidao2006 在 2020 年夏天测试了所有空调码库的可用性 🤣
  • 特别感谢 @fengpeng.net@163.com 贡献了第一个用户自定义空调编码
  • 特别感谢 @BS_joo0vocal

感谢所有帮助 IRext 不断改善的用户 (排名不分先后):

ivluowei, backrunner, Caffreyfans, Clanaid, FounderSG, TanJunYi, FatDogJoe, tianbl, yuanchaowang

shengMR, figo-fe, ll00ccuuss, lujw, liuhailiang, 逍遥行工作室, Joketinnel, Liweiwei, 无敌浣熊, 呆呆

cylon147, wa111314, lazyling, 欧阳, Lyb-coder, XWZYZ, killer-p, fengpeng.net@163.com, 小賤賤要飛

huangxb, Bipj


                    2026-02-22
                    IRext front page has been updated
                    Develop assistant chatbot is now available

                    2026-02-15
                    The public cloud encoding database has fixed issues with most of the air conditioner code library based on the 1.5.2 decoding algorithm
                    It is strongly suggested to update to the 1.5.2 decoding algorithm as soon as possible for better compatibility

                    The private service has been updated to 1.5.2 with latest database and remote binary code, it is strongly suggested to update to the latest versoin 1.5.2

                    The IRext embedded example and Android APP example have been updated
                    The Android APP indexes Arduino, allowing users to download encoding and decode using Arduino

                    IRIS remote encoding has supported protocol upd6121g and m50560 series
                
                    2026-01-12
                    Optimized decode algorithm parameeter and stack memory
                    Released decode SDK 1.5.2 for all platforms
                    Updated example code and private cloud back-end and containers
                    Upgraded Protocol analyzer database and firmware for IRIS

                    2025-12-08
                    Java Web Cloud SDK now can be added to pom.xml in maven project
                    Android APP Cloud SDK now can be added to build.gradle in Android project

                    2025-11-01
                    The collected remote can be automatically encoded into compressed encoding
                    Compression encoding and encoding verification functions have been launched
                    Fixed a JNI memory leak issue in the decoding algorithm.
                    The IRext console can connect to the IRIS Kit and IRIS APP for real-time transmission
                    The latest private server supports synchronizing the latest collected remote code from IRext
                    Released milestone version 1.5.0, including:
                        - Decoding algorithm for all supported platforms
                        - Java Web and Android index SDKs, development examples
                        - Private cloud container and offline data updated to the 2025-10-31 version
                        - IRIS Kit firmware update
                        - IRIS APP client update

                    2025-06-02
                    Optimized key mappings for decode panel
                    Bug fixes for web server cache leak

                    2025-02-25
                    Bug fixes for frequent heartbeat re-publish when IRIS APP connected to EMQX

                    2025-01-31
                    Added code emitting functionality to IRIS web console
                    Added key status sync functionality for code collection from VM on IRIS web console

                    Enhanced IRIS Kit MQTT connection stability (Need to update to latest firmware for Kit)

                    2025-01-06
                    Launched IRIS Kit remote code study feature
                    IRIS Kit could be registered by QR scan with Wechat
                    IRIS remote code attached protocol analysis result
                    Supported instant UI between IRext console and IRIS Kit studying feature

                    From Jan. 2025, all registered users can apply for administrator with IRIS VM, Kit and remote protocol analysis features

                    Optimized protocol analysis performance
                    Bug fixes for IRIS Kit and remote protocol analysis
                    IRIS is enhanced with HA of Aliyun IoT and EMQX

                    2024-05-04
                    Launched 1.3.1, supported new categories - camera and water heater

                    2024-03-09
                    Launched protocol analysis features
                    Fixed some bugs of IRIS APP and IRIS Kit

                    2024-01-14
                    Launched 1.3.0 with IRIS code collector optimized
                    Launched IRIS Kit, the firmware could be downloaded from SDK page

                    2023-09-07
                    Updated DB to Sep. 2023

                    2022-07-12
                    Fixed mode switch bug for AC control

                    2022-03-04
                    Fixed Hexadecimal format command-typed decode issue
                    Released version 1.2.7 for all components

                    2022-02-20
                    Launched IRIS-Stack to optimize protocol analysis
                    Real remote control test (by IRIS APP) linked to Alibaba-Cloud IoT for stability

                    2021-08-15
                    Public service updated to 0.2.6
                    Private cloud data updated to 0.2.6
                    Fixed some bugs for decode core

                    2021-04-18
                    IR carrier waves support in IRIS page
                    Optimized SDK management
                    Remote IR protocol analyzer for code manager
                    Real home appliance control test is supported by IRIS APP

                    2021-03-03
                    IRIS APP for Android has been released separately, support collecting code from IRIS-VM
                    IRIS online protocol analyzer is published, you can analyze IR protocol directly from IRIS console
                    Bug fixes

                    2020-11-15
                    A new IRIS code collector is released with dashboard, code collection and remote emit features
                    Refined authentication framework and logic of admin and APP SDK, has no side effect to currently online clients

                    2020-10-11
                    Added best practice for SW/HW platforms
                    Optimized SDK and multi-point access by SDK
                    IRIS server critical bug fixed

                    2020-06-26
                    IRIS Code collector is not available on github
                    IRIS server critical bug fixed

                    2020-06-14
                    Enhanced IRIS statistics with new remote collection notification
                    International support for private cloud and console

                    2020-05-04
                    IRIS now supports merging or creating unknown brands and STB service providers
                    Containerized deployment for indexing service and console
                    Local deployment document is updated

                    2020-04-06
                    Fixed hybrid 8-bit and 16-bit issue in decode core and support 8-bit MCU better
                    New feature in IRIS supporting geo location mock (China only)
                    New feature in IRIS supporting STB code collection (China only)
                    IRIS could now run on MacOS
                    IRIS/directional decoding is enabled in private server
                    Documentation issue correction and optimization
                    irext.net is beautified and single point login is allowed
                    Published IRIS database
                    Released version 0.2.5 for all components

                    2020-02-07
                    IRIS Virtual Machine is now available
                    Support online direct decode by API
                    Support online direct decode IRIS code by API

                    2019-12-28
                    The kick start version of IRIS (IR Interchange Service) Engine is online
                    Added online reverse search of command code
                    Added online non-extraction decode API, now you can use the latest code from IRIS engine
                    Uploaded the link of ARM and AARCH64 decode library
                    Bug fix for status typed decoding
                    Fixed all bugs in documents
                    Released version 0.2.4 for all components

                    2019-10-06
                    Completed key mappings for all remote categories
                    Updated remote index data and binaries to 2019-10
                    Support armhf and aarch64 build options in decode core

                    2019-07-29
                    Added FAQ to document
                    CC25XX 51MCU is supported, with an example
                    Fixed bugs in Android example

                    2019-07-01
                    Fix wind direction control is supported in decode core
                    Fixed macro definition issue in decode core header file
                    Fixed a critical bug for STM32 in decode algorithm
                    Published private web server with indexing and decoding API
                    Released version 0.2.2 for all components

                    2019-06-16
                    Key mapping bug fix in decode core
                    Online decoding crash issue fix
                    Support no file system function in decode core
                    Support SQLite3 offline database
                    Released version 0.2.1 for all components

                    2019-04-12
                    Published code maintain method
                    Supported encoding feature in private console

                    2019-02-22
                    Core decode algorithm enhancement, support AC function support query
                    Core decode algorithm enhancement, support decoding by channel number for STB
                    Support CC2650 + TI OSAL
                    Full support for JNI and Java
                    Open source online decode project
                    Offline database is maintained in a new project
                    Backend code collector is ready
                    Released version 0.2.0 for all components

                    2018-08-26
                    Node-MCU support
                    Fixed some issues in indexing API and SDK
                    Fixed data type conversion issues in decode algorithm
                    Added private IR code indexing server and guide
                    Released version 0.1.5 for all components

                    2018-04-29
                    Decode algorithm on STM8S207
                    Fixed authentication issue in indexing API
                    Updated document
                    Released version 0.1.4 for all components

                    2018-03-25
                    Added IR code for Dyson series
                    Fixed bugs in decode algorithm

                    2017-11-04
                    Allow anonymous access to console and documentations
                    Disabled remote code search functionality since there is a bug

                    2017-08-25
                    Done i18n for console and back end data

                    2017-07-15
                    Added online decode feature

                    2017-07-05
                    Released JAVA and Android web-api SDK version 0.1.3

                    2017-06-08
                    Released decode library version 0.1.2 fixed issue in AC decode algorithm
                    Support for APP registration for Android and JAVA SDK
                    Fixed some issues in JNI

                    2017-05-29
                    Released Android and JAVA Web SDK version 0.1.2

                    2017-04-30
                    Released decode SDK for Android

                    2017-03-31
                    Released decode function for CC2650 on board

                    2017-02-11
                    Released WEB COM

                    2017-01
                    Released Console

                    2016
                    Released core algorithm encoding and decoding
                    Released databases
                
Dev Assistant

开发助手

- ⭐ 红外遥控基本知识 - 🔧 各平台 SDK 集成问题(Android/Linux/MCU/Windows) - 📡 云端 API 调用与参数说明 - 📺 遥控码解码 API 调用说明 - 🖥️ 私有云部署指南(Docker/手动) - 🔍 红外解码与码库维护 - ❓ 常见问题排查