RM500Q等移远5G模组解锁ADB

前言说明

本文以RM500Q-GL为例,支持RM500Q,RM502Q,RM520N系列等USB和PCIE双模式的AB/AA模块,但RM500U不支持

开始解锁

  1. 静态编译AT工具sendat,如果你用其他AT工具或在Windows上通过USB转接板使用也可跳过这一步
1
2
3
4
5
6
7
8
# 该工具使用命令说明:sendat 2 'ATI'  ,2表示 /dev/ttyUSB2,'ATI' 为要执行的AT命令
git clone https://github.com/ouyangzq/sendat
cd sendat/src/
gcc -c -o main.o main.c
gcc -c -o openDev.o openDev.c
gcc -o sendat -static main.o openDev.o -lpthread
strip sendat
sudo mv sendat /usr/local/sbin/
  1. 获取解锁用的密钥
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 可直接在线运行:https://onecompiler.com/python/3znepjcsq	输入 12345678 时输出密钥 0jXKXQwSwMxYoeg
# 源码来自:https://github.com/iamromulan/qadbkey-unlock 执行 python3 qadbkey-unlock.py 后输入后面得到的 QADBKEY码

#!/usr/bin/env python3
import logging
import os
import argparse
import sys

def generateUnlockKey(sn):
"""
@param sn: the serial number to generate an unlock key for
"""
salt = "$1${0}$".format(sn)
c = crypt("SH_adb_quectel", salt)
return c[12:27]

def main():
key = input("Enter the AT+QADBKEY? response: ")
c = generateUnlockKey(key)
print('AT+QADBKEY="{0}"'.format(c))

if __name__ == "__main__":
logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.ERROR)
try:
from crypt import crypt
main()
except ImportError as e:
logging.error(e)
  1. 解锁模块的ADB功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
leux@h88k:~$ sudo sendat 2 'ATI'						# 查看当前模块信息
ATI
Quectel
RM500Q-GL
Revision: RM500QGLABR11A05M4G

OK
leux@h88k:~$ sudo sendat 2 'AT+QADBKEY?' # 通过QADBKEY码获取密钥
AT+QADBKEY?
+QADBKEY: 68285734

OK
leux@h88k:~$ sudo sendat 2 'AT+QADBKEY="Qo40jAvgk310hQi"' # 写入上步得到的密钥
leux@h88k:~$ sudo sendat 2 'AT+QCFG="usbcfg"' # 获取默认的USB配置
AT+QCFG="usbcfg"
+QCFG: "usbcfg",0x2C7C,0x0800,1,1,1,1,1,0,0

OK
leux@h88k:~$ sudo sendat 2 'AT+QCFG="usbcfg",0x2C7C,0x0800,1,1,1,1,1,1,0' # 切记不要生搬硬套,按照上面AT返回值填写,即将倒数第二个 0 改为 1 来开启ADB功能
leux@h88k:~$ sudo sendat 2 'AT+QPOWD=1' # 重启模块保存应用
  1. 安装ADB程序并访问模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt install adb 或者 opkg install adb			# Armbian或OpenWRT安装ADB命令

leux@h88k:~$ adb devices # 查看模块的ADB功能是否开启成功,有设备存在即已成功
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
28b39382 no permissions (missing udev rules? user is in the plugdev group); see [http://developer.android.com/tools/device.html]

leux@h88k:~$ adb shell # 访问模块,如下问题可用后面方法解决
adb: insufficient permissions for device: missing udev rules? user is in the plugdev group
See [http://developer.android.com/tools/device.html] for more information

# 如何解决如上adb的提示:添加如下一行,然后重启系统生效
leux@h88k:~$ sudo vi /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", MODE="0660", GROUP="plugdev", SYMLINK+="android%n"

有何作用

  1. 可以刷入一个简单的Web界面,但仅能通过转接板的网口访问地址: 192.168.225.1,不能通过USB口访问使其有点鸡肋

  2. 默认的一些主要进程及配置文件位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/usr/sbin/lighttpd -f /data/lighttpd.conf
/usr/bin/qmi_ip_multiclient /etc/data/qmi_ip_cfg.xml
/usr/bin/QCMAP_ConnectionManager /etc/data/mobileap_cfg.xml d
/usr/bin/dnsmasq --conf-file=/etc/data/dnsmasq.conf --dhcp-leasefile=/var/run/data/dnsmasq.leases --addn-hosts=/etc/data/hosts --pid-file=/var/run/data/dnsmasq.pid --interface=bridge0 --except-interface=lo -z --dhcp-range=bridge0,192.168.225.20,192.168.225.60,255.255.255.0,43200 --dhcp-hostsfile=/etc/data/dhcp_hosts --dhcp-option-force=6,192.168.225.1 --dhcp-script=/bin/dnsmasq_script.sh

/etc # cat /etc/quectel-project-version
Project Name: RM500QGL_VH
Project Rev : RM500QGLABR11A05M4G_01.001.03
Branch Name: SDX55
Custom Name: STD
Package Time: 2021-08-12,00:02
/etc # cat /etc/os-release
ID="mdm"
NAME="mdm"
VERSION="202108112312"
VERSION_ID="202108112312"
PRETTY_NAME="mdm 202108112312"
/etc # opkg -v
opkg version 0.3.6 (libsolv 0.6.35)
/etc # systemctl --version
systemd 239
-PAM +AUDIT +SELINUX +IMA -APPARMOR -SMACK +SYSVINIT -UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS -KMOD -IDN2 -IDN -PCRE2 default-hierarchy=hybrid
  1. 开启原生IPv6支持
1
2
3
4
5
6
7
8
9
10
# OpenWRT中添加开机脚本 vi /etc/hotplug.d/iface/90-ipv6gwadd 写入如下内容
# 最后在OpenWRT中将 WAN6 LAN口 中 DHCP服务器-IPv6设置内 的三个设置都设置为中继模式,WAN6口勾选指定为主接口

#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
[ "$INTERFACE" = wan ] || exit 0
sleep 15s
ipv6_gateway="$(ip -6 route show default | awk '/default/ {print $3}')" # OpenWRT中默认的IPv6网卡,wwan0
adb shell ip -6 route add $ipv6_gateway dev bridge0 metric 100 pref medium # 在5G模块中添加IPv6路由
ip -6 route add $ipv6_gateway dev br-lan # OpenWRT中添加IPv6路由
  1. 如何更新移远模块的固件
1
2
3
# 更新固件不会丢失ADB功能,但会清除数据
unzip RM500QGLABR11A06M4G_01.200.01.200.zip -d /home/leux/RM500QGL
qfirehose -f /home/leux/RM500QGL
  1. 一些知识和自带的小工具
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
leux@h88k:~$ adb pull <模块路径> <电脑路径>		# 拷贝模块数据到电脑

/tmp # mount -o remount,rw / # 读写方式挂载根系统
/tmp # mount -o remount,ro / # 恢复默认的只读挂载

# 推送静态编译的htop程序到模块
leux@h88k:~$ adb push /home/leux/htop-armv7-static /usr/bin/htop
/tmp # htop
Error opening terminal: linux.
/tmp # echo $TERM
linux
/tmp # mkdir -p /usr/share/terminfo/l/
leux@h88k:~$ adb push /usr/share/terminfo/l/linux /usr/share/terminfo/l/

# 端口 /dev/smd7 和 /dev/at_mdm0 和 /dev/smd11 似乎都可用,但要注意是否有程序在使用它们造成冲突
/tmp # echo -e 'AT \r' > /dev/smd7 # 执行AT命令
/tmp # echo -e 'ATI \r' > /dev/smd7

/tmp # cat /dev/smd7 # 可在另一个会话中查看正在执行的AT命令
AT
OK
ATI
Quectel
RM520N-GL
Revision: RM520NGLAAR01A07M4G

OK

# 启动 FTP 服务器
/tmp # tcpsvd -vE 0.0.0.0 21 ftpd /