网卡模式下获取Air720的运行状态

背景

  1. 需要获取联网状态,设备识别号(IMEI),ICCID,重启设备
  2. 通过AT可以获取网络状态,SIM的ICCID
  3. linux下需要修改内核驱动才能出AT口

效果预览

获取信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"sysinfo": {
"hardware_version": "NZ_SSG_V20",
"device_name": "MIFI",
"version_num": "NZ_NZ_CP_2.174.000X",
"version_date": "Oct 6 2018",
"model_name": "LV01",
"main_chip_name": "PXA1802",
"ssg_version": "LV01MVL01",
"ssg_compile_time": "Oct 6 2018 10:38:24",
"current_device_mac": "ac:3d:d3:d5:6d:af"
},
"wan": {
// ...
"IMEI": "869300038716XXX"
// ...
}
//... 剩下的省略
}

突破口

  1. 设备自带一个网页管理工具
  2. 该工具需要登录,基于变种的Digest realm登录验证
  3. 网页是通过ajax访问/xml_action.cgi读取和操作设备
  4. 必须先完成一次登录,才能通过普通的Digest realm机制访问xml_action

操作流程

1
2
3
4
5
6
1. 访问/login.cgi,服务器返回header WWW-Authenticate
2. 解析WWW-Authenticate,得到nonce
3. 先使用uri=/cgi/protected.cgi生成签名,作为url参数. 这点非常重要
4. 再使用uri=/cgi/xml_action.cgi生成普通的Digest realm签名,放入header
5. 使用上两步的参数和签名,访问/login.cgi, 服务器返回200代表登录成功,500代表失败
6. 使用普通Digest realm签名,访问/xml_action.cgi, 可以读取和操作设备

Digest realm签名算法简介

https://zh.wikipedia.org/wiki/HTTP%E6%91%98%E8%A6%81%E8%AE%A4%E8%AF%81

1
2
3
4
5
6
7
HA1 = md5_hex(username:realm:password)
HA2 = md5_hex(method:uri) // method是GET/POST/PUT等, uri是/cgi/protected.cgi(仅登录)或/xml_action.cgi
// 其中nonce是访问/login.cgi时获取的
// nonceCount是16进制自增数列,login总是1,后续请求逐次+1
// clientNonce是客户端随机字符串,长度12字节,数字+字母就行
// qop总是auth
RE = md5_hex(HA1:nonce:nonceCount:clientNonce:qop:HA2)

演示代码

基于Java的示例代码,2018-10-06的AT固件验证有效
https://gitee.com/wendal/Air720Master

附上部分可以操作

module总是duster,还没发现例外

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// http://192.168.0.1/xml_action.cgi?method=get&module=duster&file=status1
// 全部状态? status1
// 流量信息 statistics
// 上网配置 wan
// 局域网配置 lan
// PIN/PUK设置 pin_puk
// USSD设置 ussd
// 联网设备 device_management_all
// 设备统计 device_management
// 日志 detailed_log
// 自定义防火墙 custom_fw
// 端口过滤 port_filter
// 端口转发 port_forwarding
// 电话本 phonebook
// 短信 message
// 管理员配置 admin
// 固件版本 firmware
// 重启 reset

上次更新 2021-01-28