基本指令
对应源码:
components/airlink/src/luat_airlink_cmds.ccomponents/airlink/include/luat_airlink_devinfo.h
基础指令是 AirLink 协议的 "心跳" 与 "握手" 类指令, 包含链路保活、设备身份同步、结果回调等.
指令列表
| cmd | 名称 | 方向 | 启用宏 | 说明 |
|---|---|---|---|---|
| 0x01 | ping | 主→从 | LUAT_USE_AIRLINK_EXEC_PING |
链路 ping, 异步结果通过 cmd 0x02 回送 |
| 0x02 | pong | 从→主 | LUAT_USE_AIRLINK_EXEC_PING |
ping 回显 |
| 0x03 | reset | 主→从 | always | 重启对端 |
| 0x08 | result | 双工 | always | 异步响应匹配 seq_id, 系统使用, 不直接暴露 |
| 0x10 | dev_info | 从→主 | always | 设备信息上报 |
ping / pong (0x01 / 0x02)
异步 ping, 用于链路保活与时延测量.
请求 (主→从, cmd 0x01)
| 字段 | 长度 | 含义 |
|---|---|---|
| data | NB | 可选 payload, 长度任意, 会原样回显 |
主端调用:
airlink.ping("hello", 3000) -- 3 秒超时
响应 (从→主, cmd 0x02)
从端将 ping 的 payload 原样回送. 主端 sys.subscribe("AIRLINK_PING_RESULT", function(id, ok, v1, v2) ... end) 接收:
| 参数 | 含义 |
|---|---|
| id | 包序号 (与 ping 匹配) |
| ok | true = 成功, false = 超时 |
| v1 | 成功: rtt (ms); 失败: -1 |
| v2 | 成功: 回显数据; 失败: nil |
reset (0x03)
重启对端设备.
| 项目 | 值 |
|---|---|
| cmd | 0x03 |
| data | 无 |
调用: airlink.slave_reboot(). 对端收到后执行系统复位.
result (0x08)
异步结果响应通道, 用于 seq_id 匹配. 系统内部使用, 不对 Lua 用户暴露注册接口.
线格式
[new_pkgid : 8B] // 本端 next_pkg_id
[req_pkgid : 8B] // 来自原始请求的 seq_id
[result_code: 2B] // 大端, 0 = 成功, 负值 = 错误码
[resp_payload: NB] // 业务响应数据 (可选)
行为
| 模式 | 行为 |
|---|---|
| RPC (cmd 0x30) | 由 luat_airlink_result_send() 自动填充 [req_pkgid + result_code + payload], 系统再加 8 字节 new_pkgid 前缀 |
| raw driver | 调用方拼好 [req_pkgid + result_code + resp], 传入 luat_airlink_result_send() |
接收端用 req_pkgid 在 64 槽位 luat_airlink_result_reg_t 表中查找等待者, 唤醒信号量或协程 (src/luat_airlink.c:999-1092).
dev_info (0x10)
设备信息上报, 由从机主动发送, 主机据此填充 g_airlink_ext_dev_info. 状态变化时也会重新发送.
data 第一个字节: 设备类型 (tp)
| 值 | 类型 |
|---|---|
| 0x01 | WiFi 设备 |
| 0x02 | 4G Cat.1 设备 |
后续字节按类型解析.
0x01 WiFi 设备结构
来源:
components/airlink/include/luat_airlink_devinfo.h:10-26
typedef struct luat_airlink_dev_wifi_info {
uint8_t sta_mac[6]; // STA 的 MAC 地址
uint8_t ap_mac[6]; // AP 的 MAC 地址
uint8_t bt_mac[6]; // 蓝牙的 MAC 地址, 不支持则全为 0
uint8_t sta_state; // STA 状态: 0=离线, 1=已连上 AP
uint8_t ap_state; // AP 状态: 0=离线, 1=已创建热点
uint8_t reserved[32]; // 预留空位
uint8_t version[4]; // 固件版本号, 实际为 uint32_t, 数字越大代表版本越高
uint8_t fw_type[2]; // 固件类型, 当前无实际含义
uint8_t unique_id_len; // 唯一 ID 的长度
uint8_t unique_id[24]; // 唯一 ID 的数据
// 2025.5.29 新增
uint8_t sta_ap_bssid[6]; // 已连 AP 的 MAC 地址 (BSSID)
int32_t sta_ap_rssi; // 已连 AP 的信号强度
uint8_t sta_ap_channel; // 已连 AP 所属的通道
} luat_airlink_dev_wifi_info_t;
解析建议:
- 应考虑到 data 长度可能超过结构体长度 (新增字段), 实现更好的新老版本兼容性 — 用实际 data 长度截断读取
sta_mac和ap_mac是必然存在的, 可以间接判断出设备通讯是否正常- 设备无其他数据传输时, 建议周期性上报 dev_info
sta_state和ap_state变化时, 建议生成系统消息, 开启/关闭本地网卡设备version值是设备固件版本, 与支持的固件功能强相关
0x02 4G 设备结构
来源:
components/airlink/include/luat_airlink_devinfo.h:28-41
typedef struct luat_airlink_dev_wifi_cat {
uint8_t ipv4[4]; // IPv4 地址 (NETIF_LINK_ON 时有效)
uint8_t ipv6[16]; // IPv6 地址 (预留)
uint8_t cat_state; // 4G 链路状态: 0=未连接, 1=已连接
uint8_t sim_state; // SIM 卡状态: 0=无卡, 1=就绪, 2=需要 PIN
uint8_t imei[16]; // IMEI 字符串 (15 位 + \0)
uint8_t iccid[20]; // ICCID 字符串 (SIM_READY 时填充)
uint8_t imsi[16]; // IMSI 字符串 (SIM_READY 时填充)
uint8_t reserved[32]; // 预留空位
uint8_t version[4]; // 固件版本号
uint8_t fw_type[4]; // 固件类型
uint8_t unique_id_len; // 唯一 ID 的长度
uint8_t unique_id[32]; // 唯一 ID 的数据
} luat_airlink_dev_wifi_cat_t;
字段来源:
imei: 启动时通过luat_mobile_get_imei()获取iccid/imsi: SIM 卡就绪事件 (LUAT_MOBILE_SIM_READY) 时填充cat_state: 网络就绪 (LUAT_MOBILE_NETIF_LINK_ON) 时置 1, 断开时清 0ipv4: 网络就绪时由 lwip 写入
解析建议:
- 4G 设备在
cat_state=1时进入数据传输阶段, 主机可激活 IP 包通路 sim_state与cat_state配合使用: 必须 SIM 就绪且网络就绪才能传输 IP 包imei/iccid/imsi是字符串 (含\0终止), 注意编码一致