使用原始 USB 通信初始化 LTE 调制解调器

波兰的 Aero2 移动网络提供商提供免费不限流量的 512 kbps 数据计划,可作为家庭路由器/服务器的备用链路。作者的华为 USB LTE 调制解调器(Huawei E3131)在 Linux 和 NetworkManager 下能即插即用,但在基于 FreeBSD 的 OPNsense 防火墙下运行困难,需深入追踪 USB 通信和协议才能用一行命令通过发送原始 USB 消息初始化。

Huawei E3131 是 2010 年代初至中期在欧洲和亚洲流行的 USB 调制解调器,价格便宜且提供不错的 LTE 速度,有传统基于串口的 PPP 模式和更现代的 NCM CDC Ethernet 模式(华为称为“HiLink”),制造商默认使用第二种模式,Linux 下 NetworkManager 配置设备时也如此。作者配置调制解调器为:AT^SETPORT?返回^SETPORT:;2,3,16,对应^SETPORT:A1: CDROM ^SETPORT:A2: SD ^SETPORT:A: BLUE TOOTH ^SETPORT:B: FINGER PRINT ^SETPORT:D: MMS ^SETPORT:E: PC VOICE ^SETPORT:1: MODEM ^SETPORT:2: PCUI ^SETPORT:3: DIAG ^SETPORT:4: PCSC ^SETPORT:5: GPS ^SETPORT:6: GPS CONTROL ^SETPORT:16: NCM,禁用了基于串口的 PPP MODEM

在 Linux 下,此配置创建了wwan0以太网接口(由huawei_cdc_ncm内核模块提供)和cdc-wdm字符设备/dev/cdc-wdm0ttyUSB0ttyUSB1是 GSM 调制解调器串口端口,对应DIAGPCUI接口,前者支持 AT 通信。

初始化连接时,华为在 Windows 下通常使用专有软件维持连接,在 Linux 下可通过向串口发送AT^NDISUP=1,1,"APN"命令初始化 NDIS 连接,NetworkManager 在调试模式下会有相关记录。作者尝试在 FreeBSD 下仅使用裸网络接口和 AT 通信来复制此过程但失败,后来发现所有 NDIS AT 命令实际上是发送到cdc-wdm0接口,而不是ttyUSBx,直接向/dev/cdc-wdm0发送命令可使其在几秒内连接。

WDM 为控制无线移动通信设备提供接口,现代设备使用专用协议,老设备如华为 E3131 依赖传统 AT 命令。FreeBSD 未实现 WCM 设备管理驱动,基于 FreeBSD 的 OPNsense 下只有两个无用串口u3g0和以太网接口ue0

为直接向 USB 设备发送 AT 命令,作者在 Linux 下使用usbmon模块嗅探 USB 总线 1 上的通信,发现控制命令通过端点 0(接口 0 预留用于 USB 控制通信)发送,数据为AT^NDISDUP=1,1,"APN"\r\n。作者用 pyusb 库编写脚本重现此过程,但在 Linux 下运行时需先解除设备与驱动的绑定,否则会报错“Resource busy”,解除绑定后命令发送成功但无法获取 DHCP 地址。

FreeBSD 自带的usbconfig工具可在不解除设备与模块绑定的情况下执行同步控制请求,需注意数据应以特定格式提供,正确语法为usbconfig -d 8.2 -i 0 do_request 0x21 0 0 2 16 0x41 0x54 0x5e 0x4e 0x44 0x49 0x53 0x44 0x55 0x50 0x3d 0x31 0x2c 0x31 0x0d 0x0a,此命令使调制解调器建立通信,允许 DHCP 获取地址。

阅读 9
0 条评论