小米路由器开发

用ROM刷机

ROM下载地址: http://www1.miwifi.com/miwifi_download.html

下载页->点击ROM,选择对应的路由器版本进行下载.

首先,请先准备一个U盘,并确保这个U盘的格式为FAT或FAT32.

接下来,就是具体的操作流程了。

  1. 将ROM包放在U盘的根目录下,命名为miwifi.bin
  2. 断开小米路由器的电源,将U盘插入路由器的USB接口
  3. 按下reset按钮后重新接入电源,待指示灯变为黄色闪烁状态后松开reset键
  4. 等待5~8分钟,刷机完成之后系统会自动重启并进入正常的启动状态(指示灯由黄灯常亮 变为蓝灯常亮),此时,说明刷机成功完成

如果出现异常/失败/U盘无法读取状态,会进入红灯状态,建议重试或更换U盘再试。

开启SSH

参考: https://jingyan.baidu.com/article/624e7459ae65e834e8ba5afd.html

注意:先删除掉上一步骤遗留的文件miwifi.bin, 否则会刷rom而不刷ssh.

  1. 注册小米账号, 并在路由器管理界面绑定小米账号
  2. 访问 http://miwifi.com/miwifi_open.html , 点击页面中下方的”开启SSH工具”
  3. 依次点击“下载工具包”“接受”,需要注意的是,协议中已经写明,开启ssh后得到root权限, 同时意味着放弃保修服务.
  4. 按照上一步下载时页面的提示, 将下载的ssh工具安装到小米路由器
  5. 安装完成后,使用ssh客户端登录即可,用户名是root,密码是下载ssh工具时候给出的密码

交叉编译环境搭建

我们一般不会直接在小米路由器上直接进行开发, 而是在PC机上建立交叉编译环境, 开发, 编译代码然后将其部署到小米路由器上. 这里给出的是在Linux上搭建交叉编译环境的过程.

  1. 访问 http://miwifi.com/miwifi_open.html , 点击页面中下方的”插件开发文档”, 在弹出的对话框中选择对应的产品型号下载相应的sdk

    目前小米路由器各型号与其对应的芯片, sdk版本的对照表如下表所示:

    ../_images/xiaomi_sdk.png
  2. 下载后解压, 并将 <sdk>/toolchain/bin 添加到PATH:

    export PATH=$PATH:/home/zzq/sdk_package_r3p/toolchain/bin
    

交叉编译库或工具

这里以几个例子给出交叉编译的方法.

编译libpcap

  1. 解压libpcap源码包并进入主目录

  2. 设置环境变量, 指定gcc等编译工具, 除了用export命令外, 也可以以KEY=VALUE的形式 作为参数写在./configure后面:

    export CC=mipsel-xiaomi-linux-uclibc-gcc
    export AR=mipsel-xiaomi-linux-uclibc-ar
    export RANLIB=mipsel-xiaomi-linux-uclibc-ranlib
    

    注意 对于r3p sdk, 其host与r1c sdk编译时一致, 但gcc等不一样, 如果仅指定host, 如果系统还存在r1c sdk且路径在PATH中, 则编译将通过, 但编译出的软件不能用于r3p路由器.

  3. ./configure --host=mipsel-openwrt-linux --with-pcap=linux

  4. make

注意 configure几个参数的含义

  • –build: 编译用的当前平台, 一般不用指定, configure会自动检测

  • –host: 编译出的软件将运行于的平台, 也可以不指定, 默认与–build值相同

  • –target: 编译出的软件将处理什么平台的文件, 一般编译编译器之类的软件才会使用此选项

  • 当–build值!=–host值时, 为交叉编译

  • 示例

    –build –host –target 含义
    mipsel-linux mipsel-linux mipsel-linux 在mips平台上编译给mips用的软件, 它处理mips平台文件
    i386-linux mipsel-linux mipsel-linux 在x86平台上交叉编译给mips用的软件, 它处理mips平台文件
    i386-linux i386-linux mipsel-linux 在x86平台上编译给x86用的软件, 它处理mips平台文件的软件
    mipsel-linux i386-linux mipsel-linux 在mips平台上交叉编译给x86用的软件, 它处理mips平台文件

编译helloworld

  1. 编写helloworld.c, 仅printf输出hello world字符串
  2. mipsel-xiaomi-linux-uclibc-gcc -o helloworld helloworld.c 这里用的是R3P sdk.

编译gdb

gdb-7.8.1以上版本需要C++编译器支持C++11, 而r1c sdk中的g++仅支持C++0x. r3p sdk中的g++支持C++11.

如果要在MIPS平台上运行gdb-7.8.1, 需要修改源码, 否则运行时会报错: “GDB bug: target.c (gdb_signal_from_host): unrecognized real-time signal”, 方法是修改<gdb_root>/gdb/common/signals.c, 在第346行左右添加最后一个if语句:

else if(hostsig == 128)
    return GDB_SIGNAL_UNKNOWN;

另外gdb依赖libtermcap, 在编译之前还需要交叉编译termcap, 并在编译gdb前通过LDFLAGS 指定libtermcap.a所在位置:

export LDFLAGS=-L(libtermcap.a所在的目录, 它也需要交叉编译)
export LIBS=-ltermcap

其他

在小米路由器上部署静态网页

参考: https://jingyan.baidu.com/article/b24f6c82dbcecc86bee5da77.html

小米路由器中已经提供了一个http服务器sysapihttpd, 根据参考链接修改
/etc/sysapihttpd/sysapihttpd.conf , 配置自己的html页路径, 然后运行 /etc/init.d/sysapihttpd restart 重启http服务器即可