IRext 是一个开源万能红外遥控码库、编解码压缩算法以及免费周边服务。它向智能家居开发者提供以下能力:
支持 16 类 1000 多品牌,上万个型号的家用电器遥控。
在线以及离线的万能红外码库,包括按照品牌分类的索引以及遥控编码。
灵活的服务部署方式,利用开源的服务端以及控制台代码在容器环境内 5 分钟快速搭建自己的码库服务。
码库和解码算法经过了极限压缩,能存储和运行在配置低至 51 MCU 的严苛硬件环境中。
丰富的平台适配支持和示例代码。
详尽的文档资源,覆盖万能遥控开发的每一个环节。
开发者可使用码库扩展工具自行扩展码库,可基于开源代码自由修改方案功能细节。
红外遥控码是一种基于 38000Hz 或者 56000Hz 载波频率的控制编码,接收方通过识别带有或不带有载波的时间间隔片进行编码识别。
在控制层通常使用高低物理电平对的序列来表示一个独立的控制信号,例如以下的NEC码:
它使用9000us载波+4500us无载波时间序列表示引导码,并且使用500us载波+500us无载波时间序列表示逻辑0,使用500us载波+1500us无载波时间序列表示逻辑1,采用2字节地址码和2字节命令码构成,全码时间序列长度为67.5ms。
以下是一些红外遥控码的规则:
有载波的时间片称为物理高电平,无载波的时间片称为物理低电平。
引导码,结束码,分隔符码以及逻辑1码,逻辑0码等统称为编码特征,每种协议具有不同的编码特征,比如NEC的衍生码upd6121-g系列以及tc9012系列等等。
编码特征中存在若干的cycle,每个cycle即为一对高低物理电平,因此所有码中均有可能含有多个电平对,但通常只有1对。
任何的引导码,结束码,分隔符码的均占cycle个逻辑bit,例如上述的NEC码中的9000-4500占1bit。
逻辑1和逻辑0码均占cycle x 8个bit,通常为8个bit。
逻辑1和逻辑0码存在大端和小端两种按bit输出状态,大端为每个8bit中按高位在前输出,小端为低位在前输出。
逻辑1和逻辑0码存在按位掩码。
某些协议的逻辑码存在4进制,8进制和16进制码,定义为4样本,8样本和16样本,最常见的为2样本(逻辑2进制)。
某些协议存在位反转,例如RC5码和RC6码,其特征是物理高低电平时间间隔相等。
某些协议的引导码,结束码和分隔符码存在物理电平时间间隔为0的情况。
两种常用的红外控制码类型
命令码:
命令码即为编码接收方根据命令自行调整状态的应用编码,例如家用电视机,机顶盒等设备;遥控器每次按下一个功能按键,将发出固定的编码,由接收设备自动设置状态,例如每次按下POWER键,都发出同样的编码,电视机则在开和关两种状态之间切换。
状态码:
状态码为编码发送方根据当前状态以及按下的按键组合形成新的状态后发送给受控方,受控方按照这个状态执行指令的编码;例如大部分红外控制的空调均是用此种编码进行控制。
IRext 从4个层次向万能遥控开发者提供解决方案:公有云索引/解码服务、私有云索引/解码服务、发射端解码服务以及码库扩展与管理服务。
公有云服务主要提供在线的码库展示、体验、文档说明以及红外码交换服务 (IRIS)功能,也可以提供码库索引能力 (目前更推荐使用私有云)。
私有云服务主要提供用户本地化环境中的码库索引能力、在线解码能力、码库管理控制台。
解码端方案主要提供码库索引 SDK 调用以及离线解码能力。
码库扩展和管理服务主要由 IRIS 项目负责,它是对 IRext 体系的一个能力补充。
IRext 针对开发者的不同产品构成选型进行了良好的平台适配,几乎可以用于带有红外发射功能的任意软硬/云端一体环境中,请根据您自身的需求详细参考针对不同环境的最佳实践,优化您的开发流程。
Android 应用程序
你可以使用 repository 中的 Android NDK 编译脚本 Android.mk 为你的 Android 应用程序编译 IRext 离线解码程序,并将所有 SDK 接口映射为 JAVA 代码进行调用。
Windows 服务器/应用程序
可以使用 repository 中的 ir_decoder.vcxproj 工程文件导入 Visual Studio 进行生成 ir_deocde.dll 文件,且将生成的动态链接库导入你的项目中使用。参考示例请见 irext\src\example\decode_example\Win32。
Linux 服务器/应用程序
使用 CMake 编译环境, 并且使用 repository 中的 CMakeLists.txt 对源码进行编译,可以生成可执行程序(用于测试)以及 Linux 动态链接库,再导入你的工程。
TI RTOS (CC26XX)
ARM Cortext
在嵌入式平台中进行离线解码,请按照 SDK 文档中的步骤进行操作,目前已经支持 TI CC25XX,CC26XX,对内存消耗要求极小。参考示例请见 irext\src\example\decode_example\CC26xx,可以导入 IAR 工程文件进行测试。
相同的代码依然可以支持运行在增强型 51 单片机之上,已经对 51 单片机 进行了兼容。
感谢开源项目IRmqtt 作者,将IRext适配至 Node-MCU 及相类似平台。
Java 服务器
你可以从开源库中下载 WebAPI 的源码或者 jar package,在您的工程里调用进行码库索引,并且参考文档的“在线解码 API” 部署解码服务。
iOS 应用程序
直接集成 IRext index service API 以及 decode core 到 iOS 应用程序当中实现下载和解码。
本地控制台可供使用者自行搭建一个完整的,不依赖于公有云的私有码库管理系统,它完全包含 IRext 所提供的所有编码索引和码库。
本地控制台为您提供以下能力:
继承 IRext 的公共码库控制台关键功能。
继承 IRext 公有云服务的码库索引和下载功能,为端侧产品提供服务能力。
完全不依赖于 IRext 的公共码库运行环境。
支持容器化部署和在线解码。
您可以利用私有控制台自行新增码库。
可以通过 IRext 提供的可视化码库管理工作流对码库质量进行管控,确保下游产品高可用性。
1. 预置环境: Linux 操作系统的服务器 (推荐 Ubuntu 或者 CentOS),MySQL数据库 (推荐版本
5.6),Redis,Java 运行时环境 (推荐1.7 以上版本)。
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 目录下。
在 Web API 接口中请将 localhost:8081 替换成您的 IP:port
1. 预置环境: Linux 操作系统的服务器 (推荐 Ubuntu 或者 CentOS),MySQL数据库 (推荐版本
5.6),Redis,Nodejs运行时环境 (推荐 8.X版本),Python 2.7运行时环境。
2. 开始之前,请确保安装上述环境,并确保 MySQL 和 Redis 服务处于运行状态。
3. 从 github 上 clone 或者 download 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. 在浏览器 localhost 上可以访问到控制台,并且可以使用您在 site.irext.net 上注册的账号进行登录。
×
容器可以帮助您简化部署过程,手工部署和容器部署任选其一即可。
1. 预置环境:Docker 运行环境。
2. 下载 IRext 容器镜像包 (包括索引服务和控制台),和
数据包 (包含了最新版本数据和码库,2023-09-06 更新)。
3. 使用 su 将数据包解压缩到系统根目录,形成 /data 。
4. 运行以下命令导入并启动容器:
wget https://irext-lib-release.oss-cn-hangzhou.aliyuncs.com/pc-docker-image/1.2.7/irext-private_1.2.7.tar.gz
wget https://irext-lib-release.oss-cn-hangzhou.aliyuncs.com/pc-docker-image/1.2.7/irext-private-data-20230906.tar.gz
tar -xf irext-private-data-20230906.tar.gz
sudo mv data /
sudo docker load < irext-private_1.2.7.tar.gz
sudo docker run -itd \
--name irext-private \
-v /data:/data \
-p 8080:8301 \
-p 8081:8081 \
irext-private:1.2.7 /data/start_irext.sh
5. 在浏览器中打开 localhost:8080 即可访问控制台。
6. 索引和解码接口请参考 Web API 章节。
7. 您可以根据自身服务器环境对参数进行调整,例如端口映射、数据目录等。
码库索引和下载
进入控制台页面,可以通过索引的方式逐步找到您的目标码库,并且通过下载按钮下载二进制文件。
也可以透过搜索框对码库进行查找,在码库索引表中,您可以展开一些隐藏的编码字段,例如机顶盒运营商以及码库贡献者等。
目前,请定期访问 site.irext.net 首页,可以和 IRext 同步码库数据。
本节文档阐述 IRext 中的红外遥控码通过 Web services 进行索引以及在线解码的方法。
IRext 提供了一个基于 SpringBoot 的私有化部署的索引和解码服务,适用于智能家居APP,远程遥控等场景。
在线解码服务包括了 IRext 核心解码算法的所有能力,并以标准的 Restful 接口提供输出,供具有 HTTP
能力的一切终端使用。
您可以单独下载 IRext 的在线解码服务源代码或者程序包,部署在您的服务器上,配合 IRext
提供的索引数据库以及二进制压缩码库进行部署。
测试环境URL
http://localhost:8081/irext-server/
公有云环境URL
https://srv.irext.net/irext-server/ (因为目前公有云负载过大,因此强烈不推荐产品连接到公有云环境进行部署,建议使用私有云)
Post 请求参数示例
"http://localhost:8081/irext-server/indexing/list_categories
Body参数: {"id":"yourID","token":"yourToken","from":"0","count":"10"}
注意事项
1. 请先在控制台上注册SDK账号,APP类型选择Web,不需要填写包名和签名。
2. 随后得到APP Key和APP Secret。
3. 时用APP Key和APP Secret调用下面的 "登录接口" 获取到 id(注意不是adminId) 以及 token。
4. id 和 token 在随后的所有其它 API 中均要作为 Body 参数。
多语言支持
默认为简体中文版,如果需要英文版,需要在 HTTP requst 的 Header 中添加一个项 : user-lang=en-US,繁体中文版 user-lang=zh-TW。
只需要几步就能通过 IRext 的Web service API获取到码库中的编码。
1. 获取编码二进制文件,可以通过 site.irext.net 控制台获取,也可以通过Web API进行获取,通过Web
API获取方法请参考条目2。
2. 通过 Web API 按照以下流程依次调用可以索引到最终的编码二进制文件。
3. 将获得的二进制文件内容传输到需要解码的平台上,支持PC-Windows/Linux/Mac环境,TI
CC25XX/26XX,Android APP环境等具有C runtime的环境。
下面分接口描述 Web Service API 定义
×
警告! 因为目前公有云负载过大,因此强烈不推荐产品连接到公有云环境进行部署,建议使用私有云。
客户端登录换取 id
和 token
URL
http://srv.irext.net/irext-server/app/app_login
请求类型
Post
输入参数
名称
类型
说明
appKey
Body
控制台SDK中申请的Web AppKey。
appSecret
Body
控制台SDK中申请的Web AppSecret。
appType
Body
控制台SDK中申请的Web AppType(Web APP为2)。
响应
LoginResponse
可能的返回状态 : SUCCESS, FAILED
数据结构 : UserApp
示例
http://srv.irext.net/irext-server/app/app_login
Body参数 :
{"appKey":"501387e9a56026847fe486bbbace4adc","appSecret":"87d6044ff1b76d1b9542c2cc0ee2404","appType":"2"}
获取遥控码(家电)类型
URL
http://localhost:8081/irext-server/indexing/list_categories
请求类型
Post
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
from
Body
查询开始的ID号,用作分页,无分页时请指定为0。
count
Body
每页显示的条目数量,由客户端自定义。
响应
CategoryResponse
可能的返回状态 : SUCCESS, FAILED
数据结构 : List<Category>
示例
http://localhost:8081/irext-server/indexing/list_categories
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","from":"0","count":"10"}
获取遥控码(家电)品牌
URL
http://localhost:8081/irext-server/indexing/list_brands
请求类型
Post
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
categoryId
Body
该品牌所述的电器类型(Category) ID。
from
Body
查询开始的ID号,用作分页,无分页时请指定为0。
count
Body
每页显示的条目数量,由客户端自定义。
响应
BrandResponse
可能的返回状态 : SUCCESS, FAILED
数据结构 : List<Brand>
示例
http://localhost:8081/irext-server/indexing/list_brands
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","categoryId":"1","from":"0","count":"10"}
列出所有省份
URL
http://localhost:8081/irext-server/indexing/list_provinces
请求类型
Post
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
响应
CityResponse
可能的返回状态 : SUCCESS, FAILED
数据结构 : List<City>
示例
http://localhost:8081/irext-server/indexing/list_provinces
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175"}
根据省份编码前缀列出地级市
URL
http://localhost:8081/irext-server/indexing/list_cities
请求类型
Post
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
provincePrefix
Body
省份编码前缀,例如江苏省为“32”。
响应
CityResponse
可能的返回状态 : SUCCESS, FAILED
数据结构 : List<City>
示例
http://localhost:8081/irext-server/indexing/list_cities
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","provincePrefix":"32"}
根据城市编码列出广电运营商
URL
http://localhost:8081/irext-server/indexing/list_operators
请求类型
Post
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
cityCode
Body
城市国际标准码,例如南京为“320100”。
from
Body
查询开始的ID号,用作分页,无分页时请指定为0。
count
Body
每页显示的条目数量,由客户端自定义。
响应
OperatorResponse
可能的返回状态 : SUCCESS, FAILED
数据结构 : List<Operator>
示例
http://localhost:8081/irext-server/indexing/list_operators
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","cityCode":"320100","from":"0","count":"10"}
获取遥控码索引
URL
http://localhost:8081/irext-server/indexing/list_indexes
请求类型
Get
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
categoryId
Body
该品牌所述的电器类型(Category) ID。
brandId
Body
该品牌所述的电器品牌(Brand) ID。
cityCode
Body
城市国标码。
from
Body
查询开始的ID号,用作分页,无分页时请指定为0。
count
Body
每页显示的条目数量,由客户端自定义。
响应
RemoteIndexResponse
可能的返回状态 : SUCCESS, FAILED,
INVALID_CATEGORY, INVALID_PARAMETER, REMOTE_INDEX_NOT_FOUND
数据结构 : List<RemoteIndex>
示例
http://localhost:8081/irext-server/indexing/list_indexes
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","categoryId":"1",brandId:"1","from":"0","count":"10"}
或者
http://localhost:8081/irext-server/indexing/list_indexes
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","cityCode":"320100","from":"0","count":"10"}
建议和备注
categoryId 为 3(机顶盒) 的时候,cityCode 有效,系统会根据上述组合进行参数校验, 根据情况返回 INVALID_PARAMETER 和
INVALID_CATEGORY 错误。
获取扩展遥控码索引(Experimental)
URL
http://localhost:8081/irext-server/indexing/list_collected_indexes
请求类型
Get
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
categoryId
Body
该品牌所述的电器类型(Category) ID。
brandId
Body
该品牌所述的电器品牌(Brand) ID。
cityCode
Body
城市国标码。
from
Body
查询开始的ID号,用作分页,无分页时请指定为0。
count
Body
每页显示的条目数量,由客户端自定义。
响应
RemoteIndexResponse
可能的返回状态 : SUCCESS, FAILED,
INVALID_CATEGORY, INVALID_PARAMETER, REMOTE_INDEX_NOT_FOUND
数据结构 : List<RemoteIndex>
示例
http://localhost:8081/irext-server/indexing/list_collected_indexes
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","categoryId":"1","brandId":"1","from":"0","count":"10"}
或者
http://localhost:8081/irext-server/indexing/list_collected_indexes
Body参数 :
{"id":"1","token":"9fd1f939ed0ba5e868d96e418e4f7175","cityCode":"320100","from":"0","count":"10"}
建议和备注
categoryId 为 3(机顶盒) 的时候,cityCode 有效,系统会根据上述组合进行参数校验, 根据情况返回 INVALID_PARAMETER 和
INVALID_CATEGORY 错误。
根据索引ID下载代码二进制文件
URL
http://localhost:8081/irext-server/operation/download_bin
请求类型
POST
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
indexId
Body
要下载的遥控码对应的
RemoteIndex 的 ID。
响应
文件
示例
http://localhost:8081/irext-server/operation/download_bin
Body参数 : {"indexId":"200"}
在线解码
URL
http://localhost:8081/irext-server/operation/decode
请求类型
POST
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
indexId
Body
通过 Web API
获得的遥控码 IndexId (id字段)
acStatus
Body
空调当前状态对象的JSON,具体字段清参考 Java 类 ACStatus (当且仅当红外遥控是空调类型有效)
keyCode
Body
按键编号,详情请查询按键映射
changeWindDir
Body
是否切换扫风方向, (0:不切换;1:切换,当且仅当红外遥控是空调类型有效)
directDecode
Body
是否直接解码 (0:不使用;1:使用。默认为 0)
paraData
Body
是否为 IRIS
预备码 (0:否;1:是。默认为 0)
响应
IntArrayResponse
示例
http://localhost:8081/irext-server/operation/decode
Body参数 :
{
"indexId":"3597",
"keyCode":"1",
"acStatus":
{
"acPower":"0",
"acMode":"0",
"acTemp":"4",
"acWindSpeed":"0",
"acWindDir":"0"
},
"changeWindDir":"0",
"paraData":"0"
}
响应 :
{"status":{"code":0,"cause":"success"},"entity":[8400,4200,520,...,19800]}
其中 entity 为解码后的红外时间序列码。
获取空调支持/限制参数
URL
http://localhost:8081/irext-server/operation/get_ac_parameters
请求类型
POST
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
indexId
Body
通过码 Web API
获得的遥控码 IndexId (id字段)
mode
Body
空调当前的工作模式
响应
ACParametersResponse
示例
http://localhost:8081/irext-server/operation/get_ac_parameters
Body参数 :
{"indexId":"13021","mode":"1"}
响应 :
{
"status":{"code":"0","cause":"success"},
"entity":{
"tempMin":"0",
"tempMax":"14",
"supportedModes":[1,1,1,1,1],
"supportedWindSpeed":[1,1,1,1],
"supportedSwing":[1,1],
"supportedWindDirections":"1"
}
}
其中 entity 为空调当前支持的功能,说明如下表。
空调支持的功能说明:
1. 空调状态中的电源 power = 0 表示设置为开启状态,power = 1 表示设置为关闭状态,这一点请格外注意。
2. 空调支持的模式是有限的,该接口的相应中使用 supportedModes 表示支持的模式,数组大小固定为 5,每个元素用 0 或者 1 表示该模式是否支持,从第 0 个元素起分别代表“制冷”,“制热”,“自动”,“送风”,“除湿”。Request 当中不论 mode 填写何值,supportedMode 总是会返回,但是 mode 的值只能从 0,1,2,3,4,当中选取,分别代表 1 当中说明的 5 种工作模式。
3. 除了 supportedMode 之外的其他参数,均表示在给定 Request 的 mode 模式下所支持的功能,例如当 mode = 1 时,supportedWindSpeed 代表制热模式下的风力一共有几档;
4. supportedWindSpeed 表示在给定 mode 的工作模式下,支持几档风力,返回值数组大小固定为 4,每个元素用 0 或者 1 表示该风力是否支持,从第 0 个元素起分别代表“自动”,“弱风”,“中风”,“强风”。
5. tempMin 和 tempMax 分别代表在给定 mode 的工作模式下,支持的最低温度和最高温度,是一个枚举值,0 代表 16度,1 代表 17度,以此类推,14 代表 30度,-1 代表当前模式不支持温度调节。
6. supportedSwing 代表在给定模式下支持扫风的模式,返回值数组大小固定为 2,其中第 0 个元素表示是否支持摆风,第 1 个元素表示是否支持固定风。
7. supportedWindDirections 代表在给定模式下支持固定风的档位数,是一个整数,表示当前一共有多少种不同方向的固定风。
逆向匹配 (仅支持命令码,此接口因为性能和匹配准确度问题,已作废,如果有巨大需求作者才将继续优化)
URL
http://localhost:8081/irext-server/operation/reverse_match_remote_index
请求类型
POST
输入参数
名称
类型
说明
indexMatchRequest
Body
要进行逆向匹配的原始编码的 JSON 字符串,详情参考说明
响应
RemoteIndexResponse
示例
http://localhost:8081/irext-server/operation/reverse_match_remote_index
Body参数 :
{
"categoryId":"2",
"brandId":"128",
"cityCode":"",
"operatorId":"",
"remoteKeys":
[
{
"keyNumber":"0",
"keyName":"power",
"keyValue":[500,1500,500,500...],
},
{
"keyNumber":"1",
"keyName":"up",
"keyValue":[500,1500,500,500...],
},
....
]
}
注意:输入参数是数据结构 IndexMatchRequest 的 JSON 字符串。
远程协议解析
URL
http://srv.irext.net/irext-server/operation/invoke
请求类型
POST
输入参数
名称
类型
说明
id
Body
由APP登录换取的id。
token
Body
由APP登录换取的token。
keyValue
Body
遥控时间序列码
keyId
Body
按键编号,具体编号请参考按键映射部分文档 (此参数选填,如果编码来自 IRext 原生码库可以用此参数提高精确度)
indexId
Body
遥控码 IndexId (id字段,此参数选填,如果编码来自 IRext 原生码库可以用此参数提高精确度)
响应
RemoteInfoResponse
可能的返回状态 : SUCCESS, FAILED
数据结构 : RemoteInfo
示例
http://srv.irext.net/irext-server/operation/invoke
Body参数 :
{
"id":"8",
"token":"bfb4d75eba95612220f606a1d3fe5dd2",
"keyValue":"8564,4265,542,571,543,566,540,1638,540,566,545,567,...,45189"}
}
响应 :
{
"entity":{
"type":0,
"frequency":0,
"protocol":"uPD6121G",
"customCode":"E084",
"keyCode":"20",
"fullCode":"84 E0 20 DF",
"endurance":628110,
"signal":0,
"analyzeResult":0
}
}
此接口只适用于注册用户在公有云环境中进行调用。
APP登录信息
(AppInfo)
域
类型
说明
id
int
数据库自增列,也可以用于标识唯一 AppInfo对象 ,
在所有API中将会用到
token
String
访问标识码 ,
在所有API中将会用到
name
String
APP名称
appType
int
APP类型(0: Android APP,
1: iOS APP, 2: Web APP)
androidPackageName
String
Android包名(如果是Android APP)
androidSignature
String
Android签名(如果是Android APP)
isDebug
int
是否为Debug APP(0: 否, 1:
是)
appKey
String
App Key
appSecret
String
App Secret
updateTime
String
更新时间,格式为 YYYY-MM-DD
hh:mm:ss
遥控码类型
(Category)
域
类型
说明
id
int
数据库自增列,也可以用于标识唯一 Category对象
name
String
类型名称
updateTime
String
更新时间,格式为 YYYY-MM-DD
hh:mm:ss
status
int
是否有效(1: 有效, 0: 无效),默认为1
遥控码品牌
(Brand)
域
类型
说明
id
int
数据库自增列,也可以用于标识唯一 Brand对象
name
String
品牌名称
categoryId
int
该品牌所属的类型的ID(比如大金为空调)
categoryName
String
该品牌所属的类型的名称
updateTime
String
更新时间,格式为 YYYY-MM-DD
hh:mm:ss
status
int
是否有效(1: 有效, 0: 无效),默认为1
城市 (City)
域
类型
说明
id
int
数据库自增列,也可以用于标识唯一 City对象
code
String
城市国际标准码,例如南京为“320100”
name
String
名称
longitude
double
经度
latitide
double
纬度
广电运营商
(Operator)
域
类型
说明
id
int
数据库自增列,也可以用于标识唯一 Operator对象
operatorId
String
国内运营商唯一标识码
operatorName
String
名称
cityCode
String
运营商所属城市国标码
cityName
String
运营商所属城市
status
int
是否有效(1: 有效, 0: 无效),默认为1
遥控码索引对象
(RemoteIndex)
域
类型
说明
id
int
数据库自增列,也可以用于标识唯一 Operator对象
categoryId
int
电器类型ID
categoryName
String
电器类型名称
brandId
int
电器品牌ID
(仅categoryId为1或2时有效)
brandName
String
电器品牌名称
(仅categoryId为1或2时有效)
cityCode
String
城市国标码
(仅categoryId为3时有效)
cityName
String
城市名称
(仅categoryId为3时有效)
operatorId
int
广电运营商ID
(仅categoryId为3时有效)
operatorName
String
广电运营商名称
(仅categoryId为3时有效)
protocol
String
红外码协议文件
remote
String
红外代码文件
remoteMap
String
红外遥控码映射
status
int
是否有效(1: 有效, 0: 无效),默认为1
subCate
int
命令控制码样本类型(1: 2/4进制码, 2:
8/16进制码)
协议解析信息 (RemoteInfo)
域
类型
说明
type
int
协议类型,一般是 Generic
frequency
int
载波频率类型,0 表示 38KHz,1 表示 56KHz
protocol
String
协议名称
customCode
String
厂商自定义码
keyCode
String
按键码
fullCode
String
遥控全量码
endurance
int
总时间长度
signal
int
信号类型,一般是 0
analyzeResult
int
解析结果,成功时为 0
名称
值
ITEM_INVALID
0
ITEM_VALID
1
CITY_NORMAL
0
CITY_COVERED
1
CATEGORY_AC (空调)
1
CATEGORY_TV (电视机)
2
CATEGORY_STB (广电机顶盒)
3
CATEGORY_NW (网络机顶盒)
4
CATEGORY_IPTV (IPTV)
5
CATEGORY_DVD (DVD)
6
CATEGORY_FAN (电风扇)
7
CATEGORY_PROJECTOR
(投影仪)
8
CATEGORY_STEREO (音响)
9
CATEGORY_LIGHT_BULB (灯)
10
CATEGORY_BSTB
(按品牌归类的机顶盒)
11
CATEGORY_CLEANING_ROBOT (扫地机器人)
12
CATEGORY_AIR_CLEANER (空气净化器)
13
CATEGORY_DYSON (Dyson系列)
14
CATEGORY_CAMERA (相机)
15
CATEGORY_HEATER (热水器)
16
状态码
数值
SUCCESS
0 (成功)
FAILED
-1 (未知原因错误)
SERVER_ERROR
-1 (服务器异常响应)
AUTHENTICATION_FAILURE
1 (token鉴权失败)
INVALID_CATEGORY
2 (未知的品类)
INVALID_BRAND
3 (未知的品牌)
INVALID_PARAMETER
4 (参数错误)
CATEGORY_NOT_FOUND
100 (品类不存在)
BRAND_NOT_FOUND
101 (品牌不存在)
REMOTE_INDEX_NOT_FOUND
200 (遥控码索引(二进制遥控码)不存在)
REMOTE_BIN_DOWNLOAD_FAILURE
203 (遥控码下载失败)
ServiceResponse
status
通用返回状态
status 由以下2个成员构成:
(1) code:整数型状态码,详情请参考状态码
(2) cause:文字性说明,目前暂不支持i18n
LoginResponse
status
APP 登录响应
UserApp
UserApp 对象
CategoryResponse
status
获取 Category对象列表返回状态
List<Category>
Category列表
BrandResponse
status
获取 Brand对象列表返回状态
List<Brand>
Brand列表
CityResponse
status
获取 City City
对象列表返回状态
List<City>
省份或者地级市 列表
OperatorResponse
status
获取 SP
List<Operator>
广电运营商 列表
RemoteIndexResponse
status
获取 Remote
Index
List<RemoteIndex>
遥控码索引列表(二进制格式遥控码列表)
StringResponse
status
获取 String
String
String
SingleRemoteIndexResponse
status
获取 Remote
Index Instance
RemoteInstance
单个遥控索引实例 对象
RemoteInfoResponse
status
获取 Remote
Info
RemoteInfo
遥控协议分析信息
使用 Web API
最终将编码下载之后,将二进制文件保存到本地,也可以将它的值读取到内存的缓冲区,并且使用解码API对其进行打开、解码,最后关闭。
1. 需要根据 Web API
中的返回值remoteIndex对象打开其对应下载的遥控码库文件,主要对象参数包括:remoteIndex.categoryId, remoteIndex.subCate。
2.
成功打开码库文件之后,根据每次遥控按键的按键码 (参见按键映射),以及空调的状态 (如果是空调),最终得到一个整数型数组的红外编码输出结果。
3. 将这个结果发送到IR发射的功能接口或者驱动程序接口中,实现遥控控制。
从文件系统解码
ir_file_open(category, sub_category, "my_ir_code_file.bin");
ir_decode(key_code, user_data, ac_status, change_wind_dir);
ir_close();
加载到内存解码
ir_binary_open(category, sub_category, buffer, buffer_length);
ir_decode(key_code, user_data, &ac_status, change_wind_dir);
ir_close();
解码之后在 decoded_data 中获得可供输出的 IR 时间序列,将此序列递交给 IR 设备驱动即可实现红外发送。
#include "ir_decode.h"
从文件打开二进制编码
函数名称
ir_file_open
输入参数
名称
类型
说明
category
UINT8
电器种类,参见索引API的categoryId。
sub_category
UINT8
命令类编码的样本类型,参见索引API的sub_cate。
file_name
char*
二进制编码文件名。
返回值
INT8 ir_status
示例
char* file_name = "/home/usr/irda_tc9012_remote_tv_117.bin";
// Open an IR binary in quaternary format for a TV from file
INT8 ret = ir_file_open(2, 0, file_name);
从内存缓存打开二进制编码
函数名称
ir_binary_open
输入参数
名称
类型
说明
category
UINT8
电器种类,参见索引API的categoryId。
sub_category
UINT8
命令类编码的样本类型,参见索引API的subCate。
binary
UINT8*
指向二进制编码的指针。
binary_length
UINT16
二进制编码指向buffer的长度。
返回值
INT8 ir_status
示例
UINT8 bin_buffer[1024] = { ... };
UINT16 bin_length = 150;
// Open an IR binary in quaternary format for a TV from buffer
INT8 ret = ir_binary_open(2, 0, bin_buffer, bin_length);
根据遥控按键解码
函数名称
ir_decode
输入参数
名称
类型
说明
key_code
UINT8
功能按键码
user_data
UINT16*
输出的解码之后的时间序列数组。
ac_status
t_remote_ac_status*
空调当前设置的状态(仅适用于空调设备,其它设备此参数为NULL)。
change_wind_direction
BOOL
是否改变扫风风向(仅适用于空调设备,其它设备此参数为0)。
返回值(时间序列数组长度)。
UINT16 data_length
示例
UINT16 decoded[1024] = { 0 };
UINT16 length = ir_decode(2, decoded, NULL, 0);
或者
UINT16 decoded[1024] = { 0 };
t_remote_ac_status ac_status;
ac_status.ac_power = AC_POWER_ON;
ac_status.ac_temp = AC_TEMP_24;
ac_status.ac_mode = AC_MODE_COOL;
ac_status.ac_wind_dir = AC_SWING_ON;
ac_status.ac_wind_speed = AC_WS_AUTO;
UINT16 length = ir_ac_control(ac_status, decoded, AC_FUNCTION_POWER, 0);
注意:ac_wind_dir 由于历史原因,命名存在规范问题,这里仅表示是否为扫风/固定风模式。
详细的空调控制参数说明请参考 'WebAPI', 中关于 获取空调支持/限制参数', 段落的说明,离线库函数参数与其一致。
获取空调支持的模式
函数名称
get_supported_mode
输入参数
名称
类型
说明
supported_mode
UINT8*
空调支持的模式 (输出)
返回值
INT8 ir_status
示例
UINT8 supported_modes = 0;
// Get AC supported modes
INT8 ret = get_supported_mode(&supported_modes);
说明
1. 此接口只对空调有作用
2. 从输出参数的最低位开始 0:4 分别代表空调的“制冷"、"制热"、"自动"、"送风"、"除湿" 功能是否支持,1代表支持,0代表不支持
3. 此接口需要在 ir_open 之后调用
获取空调温度范围
函数名称
get_temperature_range
输入参数
名称
类型
说明
ac_mode
UINT8
空调的工作模式
temp_min
INT8*
所能够支持的最低温度 (输出)
temp_max
INT8*
所能够支持的最高温度 (输出)
返回值
INT8 ir_status
示例
UINT8 ac_mode = AC_MODE_COOL; // 0, indicates cool mode, other options are : 1, 2, 3, 4
INT8 temp_min = -1;
INT8 temp_max = -1;
// Get AC temperature range in cool mode
INT8 ret = get_temperature_range(ac_mode, &temp_min, &temp_max);
说明
1. 此接口只对空调有作用,并且需要指定当前空调工作模式 (不同模式下支持的温度范围可能不同)
2. 获取到的 temp_min 或者 temp_max 的值为 t_ac_temperature 类型变量,即 0 代表 16 摄氏度,1 代表 17 摄氏度,以此类推,最大 14
代表 30 摄氏度
3. 此接口需要在 ir_open 之后调用
获取空调支持的风力档
函数名称
get_supported_wind_speed
输入参数
名称
类型
说明
ac_mode
UINT8
空调的工作模式
supported_wind_speed
UINT8*
所能支持的风力档 (输出)
返回值
INT8 ir_status
示例
UINT8 ac_mode = AC_MODE_COOL; // 0, indicates cool mode, other options are : 1, 2, 3, 4
UINT8 supported_wind_speed = 0;
// Get AC supported wind speed levels in cool mode
INT8 ret = get_supported_wind_speed(ac_mode, &supported_wind_speed);
说明
1. 此接口只对空调有作用,并且需要指定当前空调工作模式 (不同模式下支持的风力档数可能不同)
2. 从输出参数的最低位开始 0:3 分别代表空调的“自动"、"弱风"、"中风"、"强风"、是否支持,1代表支持,0代表不支持
3. 此接口需要在 ir_open 之后调用
获取空调支持的扫风模式
函数名称
get_supported_swing
输入参数
名称
类型
说明
ac_mode
UINT8
空调的工作模式
supported_swing
UINT8*
所能支持的扫风模式 (输出)
返回值
INT8 ir_status
示例
UINT8 ac_mode = AC_MODE_COOL; // 0, indicates cool mode, other options are : 1, 2, 3, 4
UINT8 supported_swing = 0;
// Get AC supported swing mode in cool mode
INT8 ret = get_supported_swing(ac_mode, &supported_swing);
说明
1. 此接口只对空调有作用,并且需要指定当前空调工作模式 (不同模式下支持的风向调节支持可能不同)
2. 输出参数值的含义:2 - 只支持控制是否扫风,不支持固定风;3 - 支持控制扫风和控制固定风向;0 - SWING_TAG 未存在于码库;1 - 预留
3. 此接口需要在 ir_open 之后调用
获取空调支持的风向档位
函数名称
get_supported_wind_direction
输入参数
名称
类型
说明
ac_mode
UINT8
空调的工作模式
supported_wind_directions
UINT8*
所能支持的风向档位
返回值
INT8 ir_status
示例
UINT8 ac_mode = AC_MODE_COOL; // 0, indicates cool mode, other options are : 1, 2, 3, 4
UINT8 supported_wind_directions = 0;
// Get AC supported wind directions in cool mode
INT8 ret = get_supported_wind_direction(ac_mode, &supported_wind_directions);
说明
1. 此接口只对空调有作用,并且需要指定当前空调工作模式 (不同模式下支持的风向调节支持可能不同)
2. 输出参数值的含义:输出参数为正整数,表示固定风的风向有多少档位,调用者获得此值之后可以设置 0 -- (最大档位 - 1)进行调节
3. 此接口需要在 ir_open 之后调用
关闭解码程序,释放资源
函数名称
ir_close
输入参数
返回值
INT8 ir_status
示例
ir_close();
类型\按键
0
1
2
3
4
5
6
7
8
9
10
11
12
13
空调
电源
模式
温度+
温度-
N/A
N/A
N/A
温度+
温度-
风力
扫风
固定风
N/A
N/A
电视机
电源
静音
上
下
左
右
确认
音量+
音量-
返回
信号源
菜单
主页
设置
机顶盒
电源
静音
上
下
左
右
确认
音量+
音量-
返回
信号源
菜单
上一页
下一页
网络盒子
电源
上
下
左
右
确认
音量+
音量-
返回
菜单
主页
N/A
N/A
N/A
IPTV
电源
静音
上
下
左
右
确认
音量+
音量-
返回
信号源
菜单
上一页
下一页
DVD
电源
上
下
左
右
确认
音量+
音量-
播放
暂停
弹出
回播
快进
菜单
电风扇
电源
上
下
左
右
确认
风量+
风量-
扫风
风力
风类
返回
主页
菜单
投影仪
电源
上
下
左
右
确认
音量+
音量-
缩小
菜单
放大
返回
主页
菜单
音响
电源
上
下
左
右
确认
音量+
音量-
静音
菜单
电源
返回
主页
菜单
灯
电源
色彩1
色彩2
色彩3
色彩4
色彩0
亮度+
亮度-
开灯
流光
关灯
返回
主页
菜单
扫地机器人
电源
前
后
左
右
起/停
+
-
自动
定点
速度
定时
回充
预约
空气净化器
电源
上
下
左
右
离子
+
-
自动
风力
模式
定时
灯光
强力
Dyson 系列
电源
风量+
风量-
定时-
定时+
自动
温度+
温度-
扫风
扩散
偏好
定时
睡眠
制冷
相机
电源
上
下
左
右
拍摄
焦距+
焦距-
照相
录像
定时
闪光
微距
夜景
热水器
电源
温度+
温度-
定时-
定时+
自动
容积+
容积-
增容
保温
定时
节能
变频
数显
对于机顶盒设备,频道 0~9 的按键码为 14+0 ~ 14+9
本文档内容适合有一定综合技术背景和能力 (Javascript + python + 嵌入式)的用户参考。
借助 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
将上述时间序列作为输入,提交到 IR emit 驱动,实现依次按照 38K
有载波-无载波顺序调制,即可发出让科沃斯扫地机器人工作的控制信号。
当然,上述算法,包括最终码库的二进制压缩,都由 IRext encoder core 实现好了,您只需要产生所需要的控制码 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/-/issues 项目上提 issue。
Q: 如何在自己的服务器上搭建 IRext 服务?
A: 可以在 github 上下载 私有服务器 配合 码库索引数据库 进行部署,部署方式可参考文档 Web API 章节。
Q: 如何实现类似 IRext 控制台上的在线解码功能?
A: 目前 0.2.2 版本上,如果部署了码库索引的私有服务,那么可以下载资源库当中的 Linux JNI 解码库 ,并在私有服务器的 application.properties 当中的 user.data.basedir,且将解码库放置于
$user.data.basedir/irext/ 下, 则一并具备了在线解码的能力,在线解码的 Web API 调用参见文档 Web 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, 小賤賤要飛
感谢以下客户使用或者试用 IRext 并提出宝贵意见
提交反馈后可以升级到管理员,管理员可以获赠一个 IRIS Kit (ESP模组),并且拥有红外协议分析、编码学习、远程实机录码等高级功能,也可以使用 IRIS 提供的非压缩遥控码库。
您如何评价 IRext
您对 IRext 和 IRIS 有什么意见和建议吗?
提交评论可以获赠一个 IRIS Kit 开发版模组作为礼物,如果您希望收到 IRIS Kit,请在此处提交您的收货地址和联系方式,IRext 将严格保护您的个人隐私,这个地址信息仅用于发货。
地址和联系方式:
提交
如果您有好的建议和意见,欢迎在 opensource.irext.net 上留言 ,谢谢。
如果本项目对您的业务带来了帮助,欢迎为作者捐赠一杯咖啡,咖啡是产生灵感和代码的源泉。
2025-02-25
修复了 IRIS APP 连接到 EMQX 时心跳包失序问题
2025-01-31
IRIS 控制台增加发射编码功能
IRIS 控制台支持从虚拟机采集编码时的实时按键状态同步
增强了 IRIS Kit 的连接稳定性(需要升级 Kit 最新版本固件)
2025-01-06
IRIS Kit 远程编码学习和录入功能发布
IRIS Kit 可使用微信扫码注册
远程协议解析取得的遥控协议可记录到 IRIS 编码,开放 Rest API 接口
远程编码录入可实时与 IRext 前端互动
2025 年 1 月 开始,所有注册用户均可免费申请 IRIS 虚拟机、Kit 和远程协议分析服务,并可获赠一个免费 IRIS Kit 模组
优化了远程协议分析性能
修复了 IRIS APP 和 IRIS Kit bug
IRIS 采用阿里云 IoT 和 EMQX 主备 HA,增强稳定性
2024-05-04
发布 1.3.1 版本,IRIS 开始支持照相机和热水器遥控码,将陆续补充码库
2024-03-09
协议分析功能上线
修正了部分 IRIS APP 和 IRIS Kit bug
2024-01-14
发布 1.3.0 版本,更新 IRIS 编码采集算法和文档
IRIS Kit 发布,可在 SDK 页面下载固件(欢迎申请 IRIS Kit 试用)
2023-09-07
数据库更新至 2023-09
2022-07-12
修正 1.2.7 版本空调模式控制的 bug
2022-03-04
修正 16 进制命令码解码算法故障 (台湾地区机顶盒)
发布全部组件 1.2.7 版本 (第一个正式版发布,所以小版本继续迭代,大版本设置为 1)
2022-02-20
发布了专用远程协议测试的 IRIS-Stack 设备
发布了基于阿里云物联网平台的远程遥控实机测试
2021-08-15
更新了公有云服务至 0.2.6 版本
更新了本地化部署数据和源代码
解码算法修复了一些边界检查 bug
2021-04-18
IRIS 和编码管理支持解码波形图展示
SDK 生成任务精细化管理
控制台支持在线红外协议分析
IRIS 客户端可以安装在带有红外发射器的手机上,连接 IRIS WebRTC 进行发射实机验证
2021-03-03
IRIS Android APP 独立输出,支持配合 IRIS 虚拟机进行码库搬运
IRIS 红外协议云分析上线,支持在 IRIS 面板上的存量编码分析
修正了若干 bug
2020-11-15
IRIS 编码采集客户端重大更新,支持 Dashboard 查看,编码采集,远程编码发送
重构了 IRext 体系的 Admin 以及 APP SDK 登录框架,对已在线的客户端无影响
2020-10-11
文档部分增加了各平台最佳实践向导
优化了 SDK 和基于 SDK 的多点登录
修正了 IRIS 服务端的部分 bug
2020-06-26
IRIS 编码采集客户端开源
修正了 IRIS 服务端的部分 bug
2020-06-14
IRIS 统计功能增强,增加新码库消息通知
本地控制台和私有云服务发布国际化版本
2020-05-04
IRIS 控制台支持对未收录的品牌以及机顶盒运营商进行合并或者创建
索引/解码服务和控制台本地化部署支持容器化
本地化部署指南更新
2020-04-06
解码算法支持8位单片机,修复8位和16位混用异常
IRIS 虚拟机支持模拟地理位置,可选择机顶盒所在省、市、区
IRIS 新增支持机顶盒码库录入和编码
IRIS 新增对 MacOS 的支持
私有云 server 支持基于 IRIS 码库索引和直接解码
文档勘误、结构优化
irext.net 站点主页美化,支持单点登录
发布离线 IRIS 和直接解码码库
发布全部组件 0.2.5 版本
2020-02-07
IRIS 虚拟机开放下载
在线解码 API 支持直接解码非空调设备
在线解码 API 支持 IRIS 库新增非空调设备编码
2019-12-28
IRIS (IR Interchange Service)服务上线
新增命令码在线逆向匹配功能
新增无解压在线解码接口,可获取包括基于 IRIS 引擎编码在内的遥控码库
离线解码算法提供 Linux ARM 和 AARCH64 版本下载
修复了状态码解码算法当中的几处 bug
修复了所有文档 bug
发布全部组件的 0.2.4 版本
2019-10-06
补齐了所有家电的按键映射
更新和完善了现有码库到 2019-10 版本
增加了解码算法在 ARM 和 AARCH64 下的交叉编译选项
2019-07-29
文档增加 FAQ 章节
解码算法支持 CC25XX 51MCU,并添加了示例
修复 Android 示例当中的 bug
2019-07-01
解码核心算法支持空调定向风调节
修复解码算法头文件按键定义宏
解码核心为 STM32 修复一处关键异常
发布开源私有云服务器,集成码库索引 API 和在线解码 API
发布全部组件的 0.2.2 版本
2019-06-16
解决核心算法按键映射当中的 BUG
解决部分空调导致在线解码 JNI 崩溃的 BUG
解码算法支持无文件系统 (NO_FS) 的应用场景
离线数据支持 SQLite3
发布全部组件的 0.2.1 版本
2019-04-12
公开命令码编码原理,手动编码方法
公开私有控制台编码功能
2019-02-22
解码算法支持查询特定空调支持的模式、温度范围、风力、摆风和风向支持
解码算法支持机顶盒和部分机顶盒功能的电视机按频道进行控制
解码算法支持CC2650芯片+TI OSAL
解码算法完全支持JNI调用,提供Java使用范例
公开发布在线解码Web服务,可供Java,nodejs,PHP等后端进行调用
单独维护离线数据库,支持离线数据和本地控制台以及本地解码服务整合
编码收集器上线
发布全部组件的 0.2.0 版本
2018-08-26
解码算法支持 Node-MCU 芯片
修正码库索引若干问题
修正解码算法中部分数据类型转换问题
修正 BUG 并正式发布本地控制台系统,添加本地控制台架设和使用文档
发布全部组件的 0.1.5 版本
2018-04-29
解码算法支持STM8S207芯片
修正码库索引API的鉴权问题
更新文档
发布全部组件的 0.1.4 版本
2018-03-25
增加对Dyson系列电器的支持
修复解码算法中的部分BUG
2017-11-04
允许对控制台和文档进行匿名访问
因为 BUG 的缘故,取消了编码索引搜索功能
2017-08-25
控制台以及遥控编码信息文本国际化
2017-07-15
控制台首页增加在线解码体验功能
2017-07-05
发布 Java 和 Android web-api SDK 版本 0.1.3,采用回调方式获取索引记录
2017-06-08
发布解码算法库,版本 0.1.2 修复空调解码时的一处内存异常;
控制台支持 Android 和 Java Web APP 注册;
修复 JNI 中的一处状态缺省问题
2017-05-29
发布 Java 和 Android web-api SDK,版本 0.1.2
2017-04-30
发布 Android 上的解码SDK
2017-03-31
发布 CC2650 板载解码功能
2017-02-11
发布 WEB COM
2017-01
发布 Console
更早期
发布核心编解码算法, 发布索引数据库
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 feature,
administrator could also apply for 1 IRIS Kit for start up.
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 client) 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 client 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