前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >移植python到小米路由器记录。

移植python到小米路由器记录。

作者头像
py3study
发布2020-01-08 18:44:52
2.4K0
发布2020-01-08 18:44:52
举报
文章被收录于专栏:python3

最近抢了一个小米路由器,研究了一下,总的来说现在看起来功能还很少。现在比较有用的功能就是,远程下载功能,支持迅雷,电驴等,不过现在看电影啥的都是直接在线看的,基本上也很少用。检测连接的智能设备,这个功能可以随时查看是否有人曾网,当然也可以用来在远程监控家里都有谁在用路由器。以后应该会有更多的功能扩展,不过这应该是一个漫长的过程,我先自己弄点东西上去玩玩,首先把常用的python移植上去。

记录移植的过程,给需要的人,也方便自己以后查看。

首先通过ssh连接到路由器上面,小米路由器默认是没有开启ssh的需要手动开启。开启方法如下:

登录到路由器上面,

http://miwifi.com/cgi-bin/luci/;stok=6aab8cd9505eb84bef6af9c60f7af288/web/home

把链接最后的/web/home

用下面的字符串替换

 /api/xqsystem/upgrade_rom?url=%3Bnvram+set+ssh_en%3D1%3Bnvram+commit%3B%2Fetc%2Finit.d%2Fdropbear+start%3B

如果浏览器返回 {"code":0}:就表示成功了

可以通过ssh root@192.168.31.1连接到路由器上,用密码是admin。

编译arm 上面的python网上文章很多,我主要是参考这篇http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html

本来想编译最新的2.7.6但是懒得制作补丁就直接从网站上面下载2.7.3补丁和python2.7.3来编译。

python的交叉编译和其他的交叉编译有点不一样的是需要先编译个x86版本的的python语法解释器。

代码语言:javascript
复制
./configure

make python Parser/pgen

mv python hostpython

mv Parser/pgen Parser/hostpgen

make distclean

然后打补丁交叉编译python

代码语言:javascript
复制
patch -p1 < Python-2.7.2-xcompile.patch

配置arm的交叉编译环境。

一开始我直接下的arm-4.3.3来编译,编译好后放到路由器上面提示-ash 找不到程序,查找了一下发现时编译器太旧的缘故。看了一下小米是基于openwrt开发的我这边正好也有openwrt的编译环境,于是想简单配置一下,用openwrt的编译出来的交叉编译器来编译python.

修改如下

代码语言:javascript
复制
make menuconfig

Target  System 选择"Broadcom BCM47XX/53XX with arm cpu",其他默认好了。

然后

代码语言:javascript
复制
make V=99 -j4

如果以前没有编译过openwrt可能比较慢。

编译成功后,切换到python目录下,导出编译环境变量

代码语言:javascript
复制
export PATH=$PAHT:~/openwrt/staging_dir/toolchain-arm_cortex-a9_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/
export STAGE_DIR=~/openwrt/staging_dir/

这里换成自己的openwrt目录就好了,默认的gcc 是4.6版本,我这边修改成了4.8,我是直接改.config文件的(因为不知到在哪里修改,所以就直接修改.config文件了)

代码语言:javascript
复制
CONFIG_GCC_VERSION_4_8_LINARO=y
CONFIG_GCC_VERSION="4.8-linaro"
CONFIG_GCC_VERSION_4_8=y

然后运行

代码语言:javascript
复制
make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-openwrt-linux-gcc -shared" CROSS_COMPILE=arm-openwrt-linux- CROSS_COMPILE_TARGET=yes     HOSTARCH=arm-linux BUILDARCH=x86_64-linux-gnu

编译没有问题,放到到小米设备上面结果提示找不到__ctype_b等符号,把小米的设备上面的libc.so.0导出来用arm-openwrt-linux-readelf查看发现libc.so.0导出的符号是__ctype_b_loc。在网上找了半天,都说是编译器太旧,可我用的已经是4.8比较新了,所以猜不是这个问题。

于是翻uClibc的代码,发现这个变量是通过一个__UCLIBC_HAS_XLOCALE__宏来控制的,觉得肯定是编译uClibC有开关,于是用find命令终于在 toolchain/uClibc/config-0.9.33.2/common文件找到了这个配置UCLIBC_HAS_XLOCALE,把这个开关打开

代码语言:javascript
复制
UCLIBC_HAS_XLOCALE=y

重新编译openwrt,这里需要运行make dirclean,经过漫长的过程,编译Ok后,按照上面编译python的步骤重新来一次,放到小米路由器上运行python命令果然没有问题看到了python的交互界面。

接下来就是稍微配置一下环境变量,我把python放到了路由器上的/userdisk/python目录下

修改/etc/profile 文件在里面添加。

代码语言:javascript
复制
export PYTHONHOME=/userdisk/python/
export PATH=$PATH/userdisk/python/bin

添加上面的就OK了,下一步想把goagent放上去,这个等我有时间在来移植吧。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档