跳转至

基本指令

对应源码: components/airlink/src/luat_airlink_cmds.c components/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_macap_mac 是必然存在的, 可以间接判断出设备通讯是否正常
  • 设备无其他数据传输时, 建议周期性上报 dev_info
  • sta_stateap_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, 断开时清 0
  • ipv4: 网络就绪时由 lwip 写入

解析建议:

  • 4G 设备在 cat_state=1 时进入数据传输阶段, 主机可激活 IP 包通路
  • sim_statecat_state 配合使用: 必须 SIM 就绪且网络就绪才能传输 IP 包
  • imei/iccid/imsi 是字符串 (含 \0 终止), 注意编码一致
问一下 AI