第一章:红外与网络基础
各位同学好,我是老张。做嵌入式这行十几年了,红外和网络这块算是我的老本行。今天咱们先打好基础,聊聊红外通信和网络通信到底是怎么回事。
说实话,很多人一上来就急着调代码、焊板子,结果遇到问题抓瞎。我建议你先花点时间理解原理,后面会少走很多弯路。
1.1 红外通信原理
红外通信,说白了就是用光来传数据。但不是可见光,是红外光。波长大概在850nm到940nm之间,人眼看不见。
它的工作方式很简单:发送端用红外LED发光,接收端用光电二极管或者光电三极管来接收。发1和0,靠的是载波的有无。
核心要点:红外通信是半双工的,而且必须要有视距。中间不能有遮挡物。我在项目中遇到过,客户说遥控器不灵,结果发现是电视机柜的玻璃门挡住了红外信号。
调制方式呢,最常见的是38kHz载波。为什么是38kHz?因为这样可以有效抵抗环境光的干扰。你想想看,家里的日光灯是50Hz或60Hz,节能灯可能到几十kHz,但38kHz这个频段相对干净。
接收端一般会用一体化接收头,比如VS1838B、HS0038这些。它们内部集成了光电转换、放大、解调等功能,输出直接就是数字信号。
小提示:选接收头的时候注意看它的载波频率。38kHz是主流,但也有36kHz、40kHz的。买错了就收不到信号。
1.2 红外协议:NEC协议
协议这块,NEC协议是咱们最常用的。几乎所有的家电遥控器都在用。我记得第一次分析NEC波形时,用示波器抓了半天才搞明白。
NEC协议的特点:
- 载波频率:38kHz
- 数据格式:引导码 + 地址码 + 地址反码 + 命令码 + 命令反码
- 逻辑1:560μs高电平 + 1680μs低电平
- 逻辑0:560μs高电平 + 560μs低电平
- 引导码:9ms高电平 + 4.5ms低电平
这里有个坑要注意:NEC协议有两种格式,一种是标准NEC,一种是NEC扩展。扩展格式的地址码是16位的,而标准格式是8位。我曾经在项目里没注意这个区别,结果遥控器对不上码,折腾了两天。
// NEC协议解码示例(伪代码)
if (检测到引导码) {
for (i = 0; i < 32; i++) {
等待下一个脉冲
测量低电平时间
if (低电平时间 > 1000μs) {
数据位 = 1
} else {
数据位 = 0
}
}
地址码 = 前8位
地址反码 = 中间8位
命令码 = 后16位的高8位
命令反码 = 后16位的低8位
if (地址码 == ~地址反码 && 命令码 == ~命令反码) {
数据有效
}
}
1.3 红外协议:RC5协议
RC5是飞利浦搞的协议,和NEC不太一样。它用的是曼彻斯特编码,每个数据位的时间是固定的1.778ms。
RC5的特点:
- 载波频率:36kHz(注意,不是38kHz)
- 数据格式:起始位(1位) + 控制位(1位) + 系统地址(5位) + 命令码(6位)
- 编码方式:曼彻斯特编码
- 位时间:1.778ms
曼彻斯特编码什么意思?就是每个位中间有一次电平跳变。从高到低表示1,从低到高表示0。这种编码的好处是自带时钟同步,不容易出错。
注意:RC5和NEC的载波频率不同,接收头不能混用。如果你用38kHz的接收头去收RC5信号,距离会变短,甚至完全收不到。
1.4 网络通信基础:TCP/IP
好了,聊完红外,咱们说说网络。TCP/IP协议族是互联网的基石。你想想看,咱们的设备要联网,就得用这套协议。
TCP/IP分层模型:
| 层级 | 作用 | 常见协议 |
|---|---|---|
| 应用层 | 为用户提供网络服务 | HTTP、MQTT、FTP |
| 传输层 | 端到端的数据传输 | TCP、UDP |
| 网络层 | 路由和寻址 | IP、ICMP |
| 链路层 | 物理介质上的数据传输 | 以太网、Wi-Fi |
TCP和UDP的区别,我打个比方:TCP就像寄挂号信,有回执,能保证送到;UDP就像扔纸飞机,快是快,但可能丢。在咱们的红外转网络方案里,控制指令一般用TCP,因为可靠性要求高。状态上报可以用UDP,丢了也无所谓。
1.5 UDP协议
UDP,全称是用户数据报协议。它很简单,没有连接的概念。你只管把数据包发出去,对方收不收得到,它不管。
UDP的特点:
- 无连接:不需要三次握手
- 不可靠:不保证数据到达
- 速度快:没有确认重传机制
- 支持广播和多播
UDP的报文格式也很简单:源端口(2字节) + 目的端口(2字节) + 长度(2字节) + 校验和(2字节) + 数据。
我在做红外中继项目时,用UDP来做设备发现。设备上电后发一个UDP广播包,网关收到就知道有新设备上线了。这个方案简单又高效。
1.6 HTTP协议简介
HTTP是应用层协议,咱们上网浏览网页用的就是它。在物联网里,HTTP也经常用来做设备控制和状态查询。
HTTP的核心概念:
- 请求方法:GET(获取)、POST(创建)、PUT(更新)、DELETE(删除)
- 状态码:200(成功)、404(未找到)、500(服务器错误)
- 请求头:包含客户端信息、内容类型等
- 响应体:返回的数据内容
举个例子,你要查询红外中继设备的状态:
GET /api/device/status HTTP/1.1
Host: 192.168.1.100
Accept: application/json
响应:
HTTP/1.1 200 OK
Content-Type: application/json
{
"device_id": "IR-001",
"status": "online",
"last_command": "power_on",
"temperature": 32.5
}
经验之谈:在嵌入式设备上用HTTP,要注意资源消耗。每次请求都要解析HTTP头,对单片机来说负担不小。我建议用轻量级的HTTP库,或者干脆用MQTT替代。
1.7 红外与网络的结合思路
好了,基础讲完了。咱们的红外转网络方案,说白了就是:
- 用单片机接收红外信号,解码成数据
- 把数据通过Wi-Fi或以太网发到服务器
- 服务器再通过网络把指令转发给其他设备
- 其他设备收到指令后,用红外发射出去
这个方案的核心就是协议转换。红外协议和网络协议,中间需要一个桥梁。这个桥梁,就是咱们要做的中继器。
下一章,我会带大家搭建开发环境,咱们开始动手做。到时候你会看到,理论知识和实际代码是怎么结合起来的。
嗯,今天就到这里。有什么问题,咱们课后交流。