首先介绍一下华为me909s-821,它是华为海思芯片4G模块,第一个LTE CAT4模块基于高科技车规级芯片,支持中国联通4G ,3G ,2G,中国移动4G,3G, 2G,中国电信4G,不支持中国电信3G,2G。具体参数如下:

 LTE(FDD): B1,B3,B8; LTE(TDD): B39,B40,B41(38), all bands
 with diversity
 DC-HSPA+: B1,B9,B5,B8; TD-SCDMA: B34, B39, all bands with
 diversity
 EDGE/GPRS/GSM: 1800/900MHz
 MIMO
 LTE: DL 2*2 MIMO
 HSPA+/DC-HSPA+: DL 2*2 MIMO
 Output Power
 LTE: +23dBm (3GPP TS 36.101 R8 Class 3)
 WCDMA/HSPA+: +24dBm (Power Class 3)
 TD-SCDMA/HSPA:+24dBm (Power class 2)
 EDGE 1800MHz: +26dBm (Power Class E2)
 EDGE 900MHz: +27dBm (Power Class E2)
 GSM/GPRS 1800MHz: +30dBm (Power Class 1)
 GSM/GPRS 900MHz: +33dBm (Power Class 4)
 USIM (Class B and Class C)
 Power supply
 3.2 V to 4.2V (typical: 3.8V)
 Temperature range
 Operational: -30°C to 70°C
 Extended: -40°C to 85°C*
 Dimensions: 51 mm x 30.4 mm x 3.57 mm
 Weight: approx. 12g
 AT commands
 3GPP TS 27.007 and 27.005
 Huawei extended AT command
 OS: Linux, Android, WinCE, Windows 8/10

我手里的这个模块是MiniPCIe封装,加了一个转USB的转换卡,带sim卡槽,可以直接插在windows10电脑上上网用。不过这里我是要插在openwrt路由器上上网,选用GL-inet6416,AR9331处理器。

第一步 准备编译openwrt环境

准备一台Ubuntu18.04系统电脑,最好不要低于这个版本,不然python版本不够高,无法编译。然后在终端按顺序执行以下命令。

sudo apt-get update
sudo apt-get install gcc g++ build-essential asciidoc  binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch flex bison make autoconf texinfo unzip sharutils subversion ncurses-term zlib1g-dev ccache upx lib32gcc1 libc6-dev-i386 uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev libglib2.0-dev xmlto qemu-utils automake libtool  -y    #安装openwrt编译需要的环境
mkdir openwrt          #新建一个目录
sudo chmod 777 openwrt #修改权限(重要)
cd openwrt             #进入目录
git clone https://github.com/openwrt/openwrt.git source  #下载源代码
cd source
./scripts/feeds update -a  #更新软件
./scripts/feeds install -a
make  defconfig  #测试编译环境

第二步 添加me909s-821模块驱动

要使openwrt能够驱动me909s-821,必须添加相应的驱动,可以在编译的时候从源代码添加。找到build_dir/target-mips_24kc_musl/linux-ar71xx_generic/linux-4.14.160/drivers/usb/serial/option.c,target-mips_24kc_musl/linux-ar71xx_generic这一段路经要根据你的路由器处理器型号有所不同。编辑option.c,在如下位置添加代码。

static const struct usb_device_id option_ids[] = {
        ......
    { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) },
    { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) },
    { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) },
    { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7B) },
    { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7C) },
    /*在这里开始添加HUAWEI ME909S-821驱动代码*/
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, 0x02, 0x06, 0x10) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, 0x0a, 0x06, 0x11) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, 0xff, 0x06, 0x10) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, 0xff, 0x06, 0x13) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, 0xff, 0x06, 0x12) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, 0xff, 0x06, 0x06) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, 0xff, 0x06, 0x1b) },
    /*添加的代码结束*/
        ......
};

第三步 添加必要的组件并编译

执行make menuconfig
选中如下设置项:

Kernel modules
-->USB Support
  --> kmod-usb-net
    --> kmod-usb-net-cdc-ether
  --> kmod-usb-serial
    --> kmod-usb-serial-option

这里补充一点,不要安装usb-modeswitch,否则无法正确识别模块为网卡。
执行make -j1 V=s,开始编译,编译完成后将openwrt-ar71xx-generic-gl-inet-6416A-v1-squashfs-sysupgrade.bin刷入路由器。

第四步 添加拨号脚本,拨号上网

将模块插入刷好固件的路由器USB口,插上电源。SSH登录路由器(原版openwrt默认192.168.1.1,root密码为空),执行ifconfig -a,可一看到如下图所示新增了wwan0网口,在低版本openwrt里会是usb0。

再执行ls /dev,如下图ttyUSB0~ttyUSB4,这些即为me909s-821的端口,不过只有ttyUSB0能用来4G拨号上网。

这里我们就可以确认模块已经被正常识别。下面还要添加拨号脚本。将以下脚本代码存入/etc/init.d/4g文件。

#!/bin/sh /etc/rc.common
# Example script
# Copyright (C) 2007 OpenWrt.org
 
 
START=99
 
start() {
        # commands to launch application
        if [ -f /sys/devices/platform/ehci-platform/usb1/1-1/idProduct ]; then
                idProduct=`sed -n 1p /sys/devices/platform/ehci-platform/usb1/1-1/idProduct`
                idVendor=`sed -n 1p /sys/devices/platform/ehci-platform/usb1/1-1/idVendor`
                if [ $? -eq 0  -a  -n "$idProduct" -a "$idProduct" ==  "15c1" -a  -n "$idVendor" -a "$idVendor" ==  "12d1" ]; then
                        ifup 4g
                        sleep 1
                        echo -en "AT^SYSCFGEX=\"030201\",3FFFFFFF,0,2,7FFFFFFFFFFFFFFF,,\r\n" > /dev/ttyUSB0
                        sleep 1
                        echo -en "AT+CGDCONT=1,\"IPV4V6\",\"\"\r\n" > /dev/ttyUSB0
                        sleep 1
                        echo -en 'AT^NDISDUP=1,1\r\n' > /dev/ttyUSB0
                fi
        fi
}
 
stop() {
        if [ -f /sys/devices/platform/ehci-platform/usb1/1-1/idProduct ]; then
                idProduct=`sed -n 1p /sys/devices/platform/ehci-platform/usb1/1-1/idProduct`
                idVendor=`sed -n 1p /sys/devices/platform/ehci-platform/usb1/1-1/idVendor`
                if [ $? -eq 0  -a  -n "$idProduct" -a "$idProduct" ==  "15c1" -a  -n "$idVendor" -a "$idVendor" ==  "12d1" ]; then
                        echo -en 'AT^NDISDUP=1,0\r\n' > /dev/ttyUSB0
                        sleep 1
                        ifdown 4g
                fi
        fi
}

SSH终端执行以下命令。

chmod -R 777 /etc/init.d/4g   #添加可执行权限
/etc/init.d/4g enable         #激活开机启动,以后每次打开路由器会自动拨号上网
/etc/init.d/4g start          #手动拨号上网

到这里还不能上网,还需要进入Luci界面进行进一步设置。打开“网络-->接口”,编辑WAN接口,按照下图进行设置。

保存并应用后,稍等一会就会发现WAN接口获取到了IP地址。再测试网络会发现已经可以正常联网了。但是也有一个问题还没有解决,IPV6地址无法获取,设置WAN6接口也无济于事,以后找到解决办法再行更新。
最后再讲下AT指令,这个模块就是通过AT指令拨号的,上面的拨号脚本就是执行AT指令,如何单独执行AT指令,可以登录路由器SSH,执行echo -en "AT^NDISSTATQRY?">/dev/ttyUSB0,再执行cat /dev/ttyUSB0 | awk '{if($0!="")print}'
得到下图结果:

AT^NDISSTATQRY 命令用于查询连接状态,图中所示IPV4和IPV6都已经连接成功(但是IPV6地址还知道如何获取,AT^DHCPV6?指令也无法获取V6地址)。更多AT指令可以查阅《华为me909s-821 AT命令手册》。