红外二进制码

红外二进制码是一种基于 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系统架构


平台支持

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)

在嵌入式平台中进行离线解码,请按照 SDK 文档中的步骤进行操作,目前已经支持 TI CC25XX, CC26XX,对内存消耗要求极小。参考示例请见 irext\src\example\decode_example\CC26xx,可以导入 IAR 工程文件进行测试。

相同的代码依然可以支持运行在增强型 51 单片机之上,已经对 51 单片机 进行了兼容。


ESP8266

感谢开源项目IRmqtt作者,将IRext适配至ESP8266及相类似平台 。


Java 服务器

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



概述

本节文档阐述 IRext 中的红外二进制码通过 Web services 进行索引以及在线解码的方法。

IRext 提供了一个基于 SpringBoot 的私有化部署的索引和解码服务,适用于智能家居APP,远程遥控等场景。

在线解码服务包括了 IRext 核心解码算法的所有能力,并以标准的 Restful 接口提供输出,供具有 HTTP 能力的一切终端使用。

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


部署方式

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

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

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

4. 获取最新的 IRext 索引,(git clone https://github.com/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

运行环境


Web Service 接口

只需要几步就能通过 IRext 的Web service API获取到码库中的编码。

1. 获取编码二进制文件,可以通过 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 定义


数据结构


枚举量


状态码


返回值


概述

使用 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"
                

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


概述

本地控制台可供使用者自行搭建一个完整的,不依赖于 IRext.net 主站的私有码库管理系统,它完全包含IRext所提供的所有编码索引和码库。

本地控制台对用户提供以下能力:

  • 完全继承 IRext 的公共码库控制台功能。
  • 用户可自行修改代码,对自己的下游产品提供码库索引和下载功能。
  • 私有化部署,完全不依赖于 IRext 的公共码库运行环境。
  • 支持Docker镜像。
  • 用户可利用私有控制台自行新增码库。
  • 可以通过 IRext 提供的码库管理工作流对码库质量进行管控,确保下游产品高可用性。

部署控制台

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 上可以访问到控制台,并且可以使用您在 IRext.net 上注册的账号进行登录。


使用控制台

码库索引和下载

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

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


更新数据

目前,请定期访问 IRext.net 首页,可以和 IRext 同步码库数据。


概述

本文档内容适合有一定综合技术背景和能力(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://github.com/irext/core 项目上提 issue。


Web 服务相关问题

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 等设备发射红外码的方法。


编码相关问题

暂时没有


其它问题

暂时没有

                    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
                    ESP8266 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`