You are here

技术

技术

RTL8188CUS 网卡在树莓派 Raspbian Stretch/Kernel 4.14.x 中的情况

前文:树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

三个月之后,随着 Raspbian 把内核从 4.9.x LTS 升级到下一个 LTS 4.14.x,麻烦又来了
在这三个月里又断断续续尝试了 Pi Zero W(有内置的 BCM 无线网卡),以及 Ralink 的 RT3070 USB 网卡等,当前的结论是:
a. RT3070 做 AP 最稳定
b. Pi Zero W 的内置无线网卡能用,网上甚至有让它同时做 STA + AP 的例子,但兼容性不那么好,无法支持 chromecast 的 chrome tab 串流
c. RTL8188CUS 在 4.9.x 下尚能较稳定的工作,但到了 4.14.x 下还需要摸索摸索

  1. 内核主线里有一个 rtl8192cu 的模块,来自 realtek 的驱动源码
  2. 后来主线里又有了一个 rtl8xxxu 的模块,似乎是 realtek 自己不用心维护驱动,所以社区社区自己开干。据说这个还是靠谱的,但——直到目前还没有缺省支持 0bda:8176 (需要编译时额外增加 UNTEST 选项),以及还不支持 AP Mode
  3. 为了解决 rtl8192cu 的问题,所以有了 https://github.com/pvaret/rtl8192cu-fixes.git 项目,它编译后的模块名改成了 8192cu 以避免和主线冲突;至少直到 4.9.x 内核,还是能和 hostapd patch 后的 rtl871xdrv 一起愉快的工作
  4. 但是到了 4.14.x,rtl871xdrv 出问题了,报 ioctl[RTL_IOCTL_HOSTAPD]: Operation not supported ,可参考 https://forum.odroid.com/viewtopic.php?f=146&t=29195#p208592
  5. 话说 odroid.com 这个公司似乎是专门销售网络硬件方案的,其中 WiFi module #3 就是用 realtek 的这款芯片,所以它必须解决问题。。。
  6. 然后该公司发现,使用4.14.x主线的 rtl8192cu就能用 hostapd 的 nl80211 驱动来跑 AP,甚至无需给 hostapd 2.6 打补丁:https://forum.odroid.com/viewtopic.php?f=146&t=27287
  7. 按照它给的方法,确实能启动热点,客户机也能连上,但就最近两天的情况看并不稳定

...需要时间继续检验...

Topic: 

Ubuntu 18.04

对我等 VPS 简单应用来说,最大的好处就是 shadowsocks-libevsimple-obfs 都已经打好包了...

另外,16.04 里面的 postfix 一个很愚蠢且讨厌的 bug 看起来也解决了。。。

Topic: 

将 mp3 投/cast 到 chromecast 设备上

作为一个音箱,哪怕是冠以智能音箱的名义,也是必须要能满足用户想放什么声音,就能放出什么的需求的

所以,如果玩家没有 Spotify 之类的流媒体帐号,又或者是有独家珍藏的 MP3 file,怎样在 49$ 的设备上把声音播放出来呢?Echo dot 可以作为 bluetooth speaker 和手机配对,Google Home Mini 自然就是 chromecast 了

想到树莓派非常适合做家庭媒体中心,调研了一番从 Linux 主机 cast 到 chromecast 设备的方案。。。被 Raspbian Stretch 内置的 mkchromecast 似乎必须要一个桌面环境,抛弃。。。然后发现 stream2chromecast 出乎意料的靠谱,至少目前放个 mp3 ,命令行再控制一下音量是毫无问题的。。。

下一步就是开发 Alexa skills or Google Actions 让我可以赖在沙发上指挥这个树莓派了...

再等过两天 chromecast 到货后试一下 stream2chromecast 播放视频的能力;以及要是有功夫看看 VLC 3.0 能不能在 Raspbian Stretch 上编译通过和命令行工具 cvlc 的情况

UPDATE: 2018/03/21

  1. qyt 今天提示我有一个 My Media for Amazon Alexa,上亚马逊看了一下评分,还真的很高
  2. chromecast 2Gen 到货,stream2chromecast 投 mp4 视频毫无问题;VLC 3.0 的编译放弃了,steam2chromecast 是 python 开发的已然足够方便
Topic: 

关于路由器配置海内外流量分发

虽然搭树莓派的最初原因只是想使用 Google Home Mini,但这个跑起来后不可避免的就想用它来带其它设备上网,毕竟 iOS 装个 ss 客户端还是挺麻烦的不是?

研究一番,发现 tcp 流量分发异常简单

  1. sudo apt install ipset
  2. 然后创建中国地区的网络地址表,以及生成 ipset 的脚本;可以放在 cron 里每周更新一下
    • https://github.com/17mon/china_ip_list 下载来自 ipip.net 最专业的国内IP表
    • echo "ipset -N chnroute hash:net maxelem 65536">chnroute.sh; chmod +x chnroute.sh; for i in `cat china_ip_list.txt`; do echo "ipset add chnroute "$i >>chnroute.sh; done
  3. 每次启动系统的时候首先执行一次 chnroute.sh,最后在 iptables 设置 bypass 的命令中,增加如下一行
    • iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN

    现在可以访问一下国内的网站看看是否正确寻路出去了

看其它人的配置,往往还有 ChinaDNS 一项;仔细思索了一下它号称的原理,觉得从逻辑上投毒同正常业务的DNS海内外解析无法分辨的,如果仅仅依赖一个 chnroute.txt 完全做不到信任新浪的国内解析但不信任谷歌的国内解析。。。所以就不部署它了

Topic: 

树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第三部分,进阶路由配置,github 官方页面上相应的 iptables 配置已经介绍的很全面了;本文只描述几个特定的坑
第一部分:树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识
第二部分:树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

从源码编译 https://github.com/shadowsocks/shadowsocks-libev#linuxhttps://github.com/shadowsocks/simple-obfs 非常简单,毕竟树莓派系统是一个很完整的 Debian Stretch 变种,首先安装依赖的包,然后从源码 clone 下来按说明编译和配置即可

因为这个树莓派目的很简单,只是为了服务 Google Home Mini,不需要复杂的国内国际流量区分,所有流量统统全局路由出去;为了避免投毒只是简单的自己搭了一个 DNS 转发

  • ss-tunnel -c /etc/shadowsocks-libev/crown2.json -l 5353 -L 8.8.8.8:53 -u -f /var/run/ss-tunnel.pid
  • 如果是在 rc.local 里启动 ss-tunnel 可能出现启动不了的情况。参考 https://www.v2ex.com/t/348171 加上 "sleep 15 && " 解决问题

使用 dig www.youtube.com @127.0.0.1 -p 5353 测试一下

最后把 dnsmasq 作为真实 dns server,ss-tunnel 做 upstream,让 dnsmasq 做一层缓存;这样最终 /etc/dnsmasq.conf 配置如下

  • port=53
    no-resolv
    no-poll
    server=127.0.0.1#5353
    interface=wlan0
    dhcp-range=
    dhcp-option=option:router,192.168.x.1
    dhcp-option=option:dns-server,192.168.x.1

注意 dnsmasq 启动 DNS Server 之后,resolvconf 会自动将 /etc/resolv.conf 中的 nameserver 更改为 127.0.0.1

现在对于接入的其它设备比如 Amazon Echo dot 已经能成功接收来自 CNN/BBC 的新闻了;但对 Google 家族的硬件还不够。它不理会 DHCP 的 DNS-Server 配置,固执的使用自己的 DNS Server 进行解析

附录:在解决问题中发现的其它可能有帮助的链接

又附:本系列的后继 关于路由器配置海内外流量分发

Topic: 

树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?

注意:自从 Raspbian 更新内核到 4.14.x 后,下面说的方法已经不能用了,启动 hostapd 会报错;似乎 https://forum.odroid.com/viewtopic.php?f=146&t=29195#p209268 这里给了一个解法,测试中... 2018.06.07
前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第二部分,关于用 RTL8188CUS USB 无线网卡启动热点中的坑,使用 Pi 3B 的大可跳过这一部分;注意 RTL 8188/8192 系列USB无线网卡现在仅仅也就是日常可用而已,见最后 "Update"
第一部分:树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识
第三部分:树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

RTL8188CUS 是在 lsusb 里看到的名字,它和 RTL8192CU 用的是同一个驱动,8192cu.ko (https://wiki.debian.org/rtl819x#supported-rtl8192cu)

上文提到,AP 的工作原理是 hostapd + Kernel Driver 在数据链路层上同客户机通信完成身份认证;那么如果设备驱动没实现好、或者 hostapd 没有正确地和设备驱动交互都会导致同客户机的通信失败。
在 Raspbian Stretch/Kernel 4.9.x 里,Realtek 网卡驱动和 hostapd 都有问题!!下面是解决方案

  1. hostapd 无法同 Realtek 网卡驱动通信是老生常谈的故障了;当前最新的 hostapd 是 2.6,patch 方案参考 https://wiki.odroid.com/accessory/connectivity/wifi/wlan_ap
  2. 如果只配置一个无需密码的开放热点,现在光靠 hostapd 已经可用了;据说在老版本内核网卡驱动下,也能把 WPA2 热点跑起来。但恰恰就是我手里的 4.9.x 内核需要换掉驱动,以支持 WPA2 Hotspot
    • sudo apt install raspberrypi-kernel-headers dkms
    • git clone https://github.com/pvaret/rtl8192cu-fixes.git
    • vi rtl8192cu-fixes/include/rtw_version.h #提高版本号,否则 dkms install 有问题
    • sudo dkms add ./rtl8192cu-fixes

      Creating symlink /var/lib/dkms/8192cu/1.11/source ->
      /usr/src/8192cu-1.11

      DKMS: add completed.

    • sudo dkms build 8192cu/1.11
    • sudo dkms install 8192cu/1.11

      8192cu:
      Running module version sanity check.
      - Original module
      - Found /lib/modules/4.9.59-v7+/kernel/drivers/net/wireless/realtek/rtl8192cu/8192cu.ko
      - Storing in /var/lib/dkms/8192cu/original_module/4.9.59-v7+/armv7l/
      - Archiving for uninstallation purposes
      - Installation
      - Installing to /lib/modules/4.9.59-v7+/kernel/drivers/net/wireless//

      depmod...

      Warning: Unable to find an initial ram disk that I know how to handle.
      Will not try to make an initrd.

      DKMS: install completed.

    • sudo depmod -a
    • sudo cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/

    重启系统

在我这里这样就一切OK;可能树莓派刚刚完成重启时去连接热点会出现密码不正确的响应——也许是 driver/firmware 还没有热身完毕?但等2-3分钟就正常了。本系列最后一篇介绍如何让 Google 系列硬件通过这个无线路由上网

附录:其它相关的链接

Update: 热点运行时间长了以后,还是会发生无法连接的情况。登录到树莓派上执行 hostapd 观察输出会看到 l2_packet_send - send: No buffer space available 这样的信息,卸载再重新装载 8192cu 就又好了;说明问题出在驱动,而不是 hostapd。网上搜了一下亦有其他人碰到问题,包括清华某哥们,因为驱动无人维护,似乎无解。简单应用重启即可,或者在 2018 年的今天去买个内核支持更完善、速度也更快信号更好的外设吧
https://github.com/pvaret/rtl8192cu-fixes/issues/85
https://github.com/tuna/collection/issues/73
https://github.com/tuna/collection/issues/79
https://github.com/tuna/collection/issues/103
https://gist.github.com/huiyiqun/9c9b00631768bc5b31971235462eba62

Topic: 

树莓派做路由器 2018.03 (Part 1) 最基础的Hotspot配置知识

Update: 2018.03.14 树莓派刚发布了 Pi 3 Model B+;强烈推荐替代 3
前言:写于 2018.03,分成三篇blog,介绍为了在家里使用 Google Home Mini 而进行的一系列努力;
本文为第一部分,树莓派硬件和OS基础信息等
第二部分:树莓派做路由器 2018.03 (Part 2) hostapd 和 RTL8188CUS 网卡,如何在 Raspbian Stretch/Kernel 4.9.x 下工作?
第三部分:树莓派做路由器 2018.03 (Part 3) Google 硬件(Home/Wear/Chromecast...)上网配置

  1. 硬件简介,购前须知
    下一代树莓派,也就是 Raspberry Pi 4 将在 2019 年或更晚发布。当前这个时间点的选择是淘宝购买全新的 Raspberry Pi 3,或者闲鱼上二手 Raspberry Pi 2 Model B
    【熟悉基础类型后将来可以再考虑 Raspberry Pi Zero W】

    二者的供电消耗可参考 http://www.pidramble.com/wiki/benchmarks/power-consumption

    • 简单总结一下:CPU 跑满会多消耗 330ma,再考虑到板载无线的功耗,所以三代最高支持2.5A的输入(官方建议至少用 2A 的电)
    • 跑个最基础的 Ethernet + Wifi 路由器估计 1A 的电流也够用了

    假定搭一个 NAS,都用上 USB 2.0 的最高带宽【参考 Pi 3 Model B+ 的benchmark 看起来是 300M】,1个SSD + 1个千兆以太 + 1个300M Wifi,对供电的要求可能还是蛮高的

    全新 Raspberry Pi 3

    • 更新、更快(CPU 运算能力比 2 代快了 50% 以上)
    • 内置 Wifi + Bluetooth;官方驱动支持,无线配置起来节省时间

    二手 Raspberry Pi 2 B+

    • 优点是功耗低
    • 缺点是配置无线可能有坑,很花时间;而且买二手有风险,占额外精力

    最低需要主机 + TF卡 + 双绞线(理论上也可以通过 Wifi 进行 headless 配置,但我没有尝试)
    正式在犄角旮旯里应用还需要外壳(考虑下载pdf打印一个纸外壳?)、散热片(或许还得有风扇)、2A直流电源

  2. 操作系统,Configuration headless(without keyboard/mouse/monitor) 怎样在没有连接键鼠显示器的情况下配置树莓派
    从官网下载,选择 RASPBIAN 而不是 NOOBS;Raspbian 基于 Debian,当前是 Stretch(Debian 9);网络上有些文档可能是基于 Jessie 甚至 Wheezy 的,照搬需谨慎

    2017-11-29-raspbian-stretch-lite.img 解开后1.73G,相比 full version 少了桌面环境
    烧好之后,插入 TF 卡,把以太口插到交换机上就能自动从 DHCP 获得IP【或者写入Wifi的配置文件,启动后通过无线路由获得IP】
    然后我们从 ssh 登录进去,用户名 pi,密码 raspberry

    Windows 工具

    • SD Card Formatter
    • Etcher

    烧录 img 到 TF 之后,Windows 下将变成两个盘符,其中分区名为 boot 的可访问,需要在这里

    • touch 一个名为 ssh 的文件(据说 ssh.txt 也行)

    启动进程:

    • 如果 boot 分区存在 ssh 文件则 enable SSH
    • 如果 boot 分区存在 wpa_supplicant.conf 则复制到 /etc 配置目录去启动无线连接
    • 最后自动从 boot 分区删除这两个文件 【再次重启 ssh server 也是启用的】

    【极端情况下没有路由器,通过电脑直连网线到树莓派以太网,则可通过 boot 分区里的 cmdline.txt 指定以太口的 IP】

    至于启动后如何得到 headless 系统的 IP,网上有许多教程,包括官方文档 https://www.raspberrypi.org/documentation/remote-access/ip-address.md

    换一下 apt 镜像源,我这里主要是 archive.raspberrypi.org 慢,替换成中科大的源
    sudo apt update
    sudo apt upgrade
    sudo raspi-config 进行系统配置【如果是通过键盘显示器登录,需要用这个命令调整官方缺省的大英键盘布局——比如美版键盘的管道符 | 就敲不出来】

  3. 网络配置 of Stretch,以把 wlan0 配置为 AP 模式启动热点为例
    Stretch 不再用传统的 /etc/network/interfaces 文件管理网络接口,而是使用 dhcpcd 来维护配置
    修改 /etc/dhcpcd.conf
    • 文件第一行增加
      nohook wpa_supplicant【假定系统不用向上级联无线路由器,Hotspot Only】
    • 文件最后增加
      interface wlan0
      static ip_address=192.168.x.1

    sudo service dhcpcd restart

    这时候 wlan0 的 IP 并没有立刻设置;执行 sudo journalctl | grep wlan0 查看日志,可以看到 wlan0: waiting for carrier;
    sudo apt-get install hostapd
    等配置并启动 hostapd 之后,wlan0 的 IP 就被 dhcpcd 设置上了;日志能看到 wlan0: carrier acquired;手机端也能看到这个建立起的热点

    AP 热点的工作原理是路由器(hostapd+Kernel Driver)同客户机在数据链路层上通信完成认证,认证通过后可以认为把一根虚拟网线插到了路由器上
    接下来安装 dnsmasq(可以只启动 dhcp server,不启动 dns server) 给接入的机器配置 IP、DNS Server… 配置同普通的 Debian 没啥区别了

    • port=0【简单配置可不启动DNS能力】
    • interface=wlan0【系统启动的时候可能wlan0还不可用,只有指定才不会出错】
    • dhcp-range=你的IP地址分配范围
    • dhcp-option=option:router,192.168.x.1
    • dhcp-option=option:dns-server,114.114.114.114【下面会介绍进阶配置,避免投毒】

    最后是把 NAT 路由跑起来

    • 开启转发
      在 /etc/sysctl.conf 最后追加一行 net.ipv4.ip_forward=1
      sudo sysctl -p
    • 建立 iptables 路由规则
      sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
      想办法让每次系统重启后自动执行

hostapd 启动 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter 作为 AP 有巨坑,很不幸现在网上随树莓派二代销售的最常见的 EDUP 网卡就是这个型号。经过一番努力,终于让它在我的环境里运行了,请看下一部分

Topic: 

移动设备中Webview的点击延迟问题

是一个老的事件了,但这里记录一下

Android 上的 Chrome/Webview 很早就搞定了这个事情
https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away

iOS 上的 Safari/WKWebview 要等到 iOS 9.3 才据说修补完毕,一年前的事情
https://webkit.org/blog/6008/new-web-features-in-safari/

其它相关连接
https://webkit.org/blog/5610/more-responsive-tapping-on-ios/
https://trac.webkit.org/changeset/191072/webkit
https://bugs.webkit.org/show_bug.cgi?id=149968
https://bugs.webkit.org/show_bug.cgi?id=149854

期望 Mobile Web App 能将来做到更多

Topic: 

crosswalk 即将停止更新

4天前的博客说:crosswalk 23 将是最后一个发布版本 https://crosswalk-project.org/blog/crosswalk-final-release.html

特别惊讶 Intel 的工程师们把这样一个开源项目驱动了4年之久,它的终结也早有预感,看着 mail-list 里面的信息越来越少,发布进度也越来越落后于 chrome 的 6 周更新的节奏

crosswalk 23,是基于 chrome 53 的版本。谷歌是去年9月初正式发布,crosswalk 23 落后了几乎5个月时间

从 crosswalk 已经具备的能力而言,2017年,甚至2018年来陪伴中国安卓 PWA 开发者都不成问题。感谢 Intel

希望 Google Play 早日入华,希望 webview 组件定期更新能成为每台安卓手机的标配

又或者,希望有类似组织能接手 crosswalk 的任务,目前看也就小米或者华为可能来做这件事了!

Topic: 

Apple/Microsoft 的字体问题

研究这件事起因于希望在 Windows 的浏览器上使用 Apple 原生的 Emoji 表情,但是从 Mac 的 /System/Library/Fonts/Apple Color Emoji.ttf 拷贝到 Windows 上后无法被安装。。。于是看了一下究竟怎么回事,虽然问题最终没有彻底解决,但记录一下相关的信息:

  1. 不同于矢量轮廓描绘,Emoji 在实际应用中是以彩色图案的形态存在,尤其是Unicode后来引入皮肤颜色变化,就需要一套新的字体方案
  2. Apple 自己定义了 ttf 中的 sbix 扩展,用嵌入 PNG 图片的方案来取代轮廓描绘;后来 Google、Microsoft、Adobe/Mozilla 也先后定义了自己的 ttf 扩展方案,最后似乎都成了标准的一部分,探索在Android中使用Emoji Font的方法
  3. Adobe/Mozilla 的方案叫 SVG,或者 SVGinOT(opentype);上文提到 Google 的方案类似 Apple,也是 PNG内嵌
  4. 相对来说 Microsoft 的方案更有特色一些,它是用轮廓+调色板渲染的方式实现了 Color Emoji,思路清奇
  5. 按照微软的说法,Windows 10的最新版应该是能支持上述所有的4种字体的,https://msdn.microsoft.com/en-us/library/windows/desktop/mt765165%28v=vs...
  6. 但是浏览器有一点点特殊的地方,它还有 webfont 的支持问题。于是有一个网站可以用来检查浏览器对 webfont 的支持情况:https://pixelambacht.nl/chromacheck/ Windows10上的Edge是4种都支持,但 Chrome Windows 版本就仅仅支持微软自家的Color Emoji
  7. 怎么样替换 Windows 缺省的 Color Emoji 字体呢? http://superuser.com/questions/1062418/how-do-i-replace-windows-10s-emoji
  8. 怎么把 Apple Color Emoji 转换成 Google 格式呢(这样在 Android 和 Chrome/Linux 上就都可用了)?上面中文文档里链接了一个 xda 上的文章,提到了方案:http://forum.xda-developers.com/showthread.php?t=2563757 , 现在再看这个方案,作者说最新的 Android 系统可以直接使用 Apple 的 sbix 扩展了。。。所以我猜最新的 Linux Fontconfig 或许也能支持 Apple Color Emoji.ttf 了
  9. 但如何在 Windows 上直接把 Apple Color Emoji 转换来用上述信息还是没有解决,最终找到了两个平台上ttf格式兼容的另外一篇文章:CMap 表相关修改技术简要指南。。。看似说的很有道理,但是按里面的方法去修改重新合版仍然没有得到想要的结果
  10. 最后找到一个商业的解决方案,fontlab.com 的TransType,在 Windows 下还确实把原字体转成了两个能正常打开的字体,但是限于时间,暂时没有进一步去测试 Windows 上安装了字体后浏览器上的表现...
Topic: 

页面

Subscribe to RSS - 技术