日志存档:2011年07月

为什么有的 USB 线缆不能为手机充电?

2011/07/28 | 20:54 | 分类:电子与无线电 | 标签: | 5,122次阅读

  我手头有若干移动设备附带的 USB 数缆,它们一端是标准 USB 接口,另一端是 MiniUSB 或 MicroUSB 接口。USB 线缆内部通常有 4 根线(如果算上连接到金属壳的屏蔽层,则是 5 根),其中 2 根用来供电,2 根用来传输数据。有的线缆内部只有 2 根供电线。4 根线齐全的可称为“数据线”,只有 2 根的可称为“充电线”。我的一部 Huawei 手机可以使用任何一根 USB-MiniUSB 数据线或充电线充电,也可以使用任何一根 USB-MiniUSB 数据线传输数据。但我的 MOTO Milestone 却只能使用特定的两根线缆充电或传输数据,其中一根是原装的 USB-MicroUSB 数据线,另一根是某移动硬盘附带的 USB-MiniUSB 数据线外加一个 MiniUSB-MicroUSB 转接头。使用其他线缆,手机要么没有任何反应,要么充电指示灯不断闪烁。看来,MOTO 的智能手机比 Huawei 的土手机更“挑”线。可是,“挑”线的原理是什么呢?我通过查阅标准并实验,初步找到了原因。
  查阅 USB 相关标准得知,MiniUSB 和 MicroUSB 接口比标准 USB 接口多一个 pin,即用于 OTG 功能的 pin 4(ID)。根据在 OTG 中的不同用途,pin 4 有不同的接法,可能接地,即与 pin 5 短接,也可能悬空。用万用表测试并实验,发现凡是 pin 4 接地的线缆,均不能为 Milestone 充电。这有可能是 Milestone 有意设计的。
  但我还有一根 Nokia 的 USB-MicroUSB 数据线,pin 4 悬空,却不能给 Milestone 充电,这又是为什么?是它的电阻太大了吗?测量一下,单根供电线的电阻约为 3Ω,对比测量 MOTO 原装数据线,只有 1Ω 左右。同时注意到这根 Nokia 数据线比较细,可能没有屏蔽层。测量发现两端接口的金属壳没有连通,基本可以证实猜测。
  最后测试一下不同线缆的充电电流如何。我没有直流钳表,于是想到 DIY 一个 USB 电流测试装置。如图所示,不多解释,这个装置从设计到实现用了不到一刻钟。测试表明,这根 Nokia 数据线的充电电流约为 180mA,而能正常充电的 2 根线缆均在 400mA 左右。对于 pin 4 接地的线缆,显示电流为 1-2mA,可能是 Milestone 中某些保护电路的效果?
为什么有的 USB 线缆不能为手机充电?
  然后就被某数学家说成是民科了……我明明是国家队的嘛……

解决 nginx 反向代理网页首尾出现神秘字符的问题

2011/07/15 | 14:06 | 分类:Web与互联网 | 标签: | 3,066次阅读

  一台内网 LAMP 服务器上运行 MediaWiki,另一台具有外网 IP 的服务器上运行 nginx,为内网服务器提供反向代理,允许从外部访问 MediaWiki。测试发现,通过反向代理访问一般页面没有问题,但对于返回 HTTP/1.1 404 的页面,HTML 头部和尾部分别出现了额外的字符。头部多出的是 2-4 位 16 进制数,如“355b”,尾部多出的总是“0”。而且这个现象只出现在 nginx 反向代理之后的页面,不出现在 Apache 原始页面。
  使用 Wireshark 对比 nginx 和 Apache 的 respone,发现凡是出问题的页面,其传输方式均为 chunked(“Transfer-Encoding: chunked”)。查阅资料得知头部的 16 进制数(chunk 长度)、尾部的 0(chunk 终结)正是 chunked 传输方式的消息标识。Apache 的 respone 只有一个 chunk,而 nginx 的 respone 则分为 4 个 chunks,其中第 1 个 chunk 的头部、第 4 个 chunk 的尾部出现的额外字节正是 Apache 的 respone 中原始的 chunk 标识。看来,出现额外的字符是因为 nginx 对已经做过 chunked 的消息重复执行了 chunked 操作。
  解决这个问题,只需要禁止 nginx 进行多余的 chunked 过程。经查,可以在 nginx 配置文件中相应网站的 location 段中加一行“chunked_transfer_encoding off;”。

  1. location / {
  2.         proxy_pass              http://10.0.0.10/;
  3.         proxy_redirect          off;
  4.         proxy_set_header        Host            $http_host;
  5.         proxy_set_header        X-Real-IP       $remote_addr;
  6.         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  7.         chunked_transfer_encoding       off;
  8. }

  另外,也有人提供了 patch,更加智能地解决这个问题。