2013年5月29日星期三

Python egg


Python Enterprise Application Kit(PEAK)的基础知识在本专栏的前两部分中已经进行了介绍:“可爱的 Python: Python Enterprise Application Kit” 和 “深入 PEAK 的新特性”。简而言之,PEAK 是用来在 Python 中进行快速组件开发和代码重用的强大框架。
本文介绍了 setuptools 框架的内容,它是 PEAK 的一个副项目,它提供了比 distutils 更加简单的包管理和发行功能。
setuptools 模块很会 “规避”。例如,如果我们下载一个使用 setuptools 而不是使用 distutils 构建的包,那么安装就应该可以像我们期望的一样工作:通常使用 python setup.py install 就可以。为了实现这种功能,使用 setuptools 绑定在一起的包就会在归档文件中包含一个很小的引导模块 ez_setup.py。此处惟一需要注意的是 ez_setup.py 试图在后台下载并安装所需要的setuptools —— 当然,这需要有一个连接网络的机器。如果 setuptools 早已在本地机器上安装了,那么这个后台步骤就不再需要执行;但是如果它需要手工进行安装,那么很多透明性就都丢失了。不过,大部分系统现在都有一个 Internet 连接了;为没有连接网络的机器多执行几个特殊步骤也并非特别麻烦。
setuptools 的真正优点并不在于实现 distutils 所能实现的功能 —— 尽管它 的确 增强了 distutils 的功能并简化了setup.py 脚本中的内容。setuptools 最大的优势是它在包管理能力方面的增强。它可以使用一种更加透明的方法来查找、下载并安装依赖包;并可以在一个包的多个版本中自由进行切换,这些版本都安装在同一个系统上;也可以声明对某个包的特定版本的需求;还可以只使用一个简单的命令就能更新到某个包的最新版本。给人印象最为深刻的是,即使有些包的开发人员可能还从未考虑过任何 setuptools 兼容性问题,我们依然可以使用这些包。
下面让我们详细探讨一下。
工具 ez_setup.py 是一个简单的脚本,它可以引导 setuptools 中其余部分。有点让人困惑的是,完整 setuptools 包中所提供的 easy_install 脚本与 ez_setup.py 所实现的功能是相同的。不过前者假设 setuptools 早已安装了,因此它会跳过幕后的安装过程。这两个版本都可以接受相同的参数和开关。
这个过程中的第一个步骤是下载一个小脚本 ez_setup.py

清单 1. 下载引导脚本
% wget -q http://peak.telecommunity.com/dist/ez_setup.py

然后,就可以不带任何参数运行脚本来安装 setuptools 中其余部分了(如果不作为一个单独的步骤来执行这个步骤,在首次安装其他包时,它还是会被完成)。会看到类似于下面的内容(当然,这要取决于所使用的版本):

清单 2. 引导 setuptools
% python ez_setup.py
Downloading http://cheeseshop.python.org/packages/2.4/s/
  setuptools/setuptools-0.6b1-py2.4.egg#md5=b79a8a403e4502fbb85ee3f1941735cb
Processing setuptools-0.6b1-py2.4.egg
creating /sw/lib/python2.4/site-packages/setuptools-0.6b1-py2.4.egg
Extracting setuptools-0.6b1-py2.4.egg to /sw/lib/python2.4/site-packages
Removing setuptools 0.6a11 from easy-install.pth file
Adding setuptools 0.6b1 to easy-install.pth file
Installing easy_install script to /sw/bin
Installing easy_install-2.4 script to /sw/bin

Installed /sw/lib/python2.4/site-packages/setuptools-0.6b1-py2.4.egg
Processing dependencies for setuptools

完毕。这就是我们需要确保在系统上安装 setuptools 而需要做的工作。
对于很多 Python 包来说,要安装这些包,需要做的就是将这些包的名字作为一个参数传递给 ez_setup.py 或 easy_install。既然目前已经使用引导脚本加载了 setuptools,那就可以使用内部更加简化的 easy_install(实际上它与我们选择的版本的区别很小)了。
例如,假设希望安装 SQLObject 包。过程非常简单,如清单 3 所示。注意消息中说 SQLObject 依赖于一个名为 FormEncode 的包;所幸的是,这会被很好地解决:

清单 3. 安装一个典型的包
% easy_install SQLObject
Searching for SQLObject
Reading http://www.python.org/pypi/SQLObject/
Reading http://sqlobject.org
Best match: SQLObject 0.7.0
Downloading http://cheeseshop.python.org/packages/2.4/S/
  SQLObject/SQLObject-0.7.0-py2.4.egg#md5=71830b26083afc6ea7c53b99478e1b6a
Processing SQLObject-0.7.0-py2.4.egg
creating /sw/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg
Extracting SQLObject-0.7.0-py2.4.egg to /sw/lib/python2.4/site-packages
Adding SQLObject 0.7.0 to easy-install.pth file
Installing sqlobject-admin script to /sw/bin

Installed /sw/lib/python2.4/site-packages/SQLObject-0.7.0-py2.4.egg
Processing dependencies for SQLObject
Searching for FormEncode>=0.2.2
Reading http://www.python.org/pypi/FormEncode/
Reading http://formencode.org
Best match: FormEncode 0.5.1
Downloading http://cheeseshop.python.org/packages/2.4/F/
  FormEncode/FormEncode-0.5.1-py2.4.egg#md5=f8a19cbe95d0ed1b9d1759b033b7760d
Processing FormEncode-0.5.1-py2.4.egg
creating /sw/lib/python2.4/site-packages/FormEncode-0.5.1-py2.4.egg
Extracting FormEncode-0.5.1-py2.4.egg to /sw/lib/python2.4/site-packages
Adding FormEncode 0.5.1 to easy-install.pth file

Installed /sw/lib/python2.4/site-packages/FormEncode-0.5.1-py2.4.egg

正如可以从这些消息中看到的一样,easy_install 要在 www.python.org/pypi/ 上查找有关这个包的信息,然后查找真正可以下载它的地方(此处 egg 包就在 cheeseshop.python.org 上;后面将介绍有关 egg 的更多内容)。
现在不仅仅可以安装某个包的最新版本(这是默认操作)。如果愿意,还可以为 easy_install 提供一个特定的版本需求。现在让我们尝试安装 SQLObject 的一个 post-beta 版本。

清单 4. 安装某个包的最小版本
% easy_install 'SQLObject>=1.0'
Searching for SQLObject>=1.0
Reading http://www.python.org/pypi/SQLObject/
Reading http://sqlobject.org
No local packages or download links found for SQLObject>=1.0
error: Could not find suitable distribution for
  Requirement.parse('SQLObject>=1.0')

如果(在本文编写时情况就是如此)SQLObject 的最新版本小于 1.0,那么这会什么也不安装。
SQLObject 是可以识别 setuptools 的;但是如果要安装一个尚未兼容 setuptools 的包又该如何呢?例如,在本文之前,我从没有对自己的 “Gnosis Utilities” 使用过 setuptools。不过,现在让我们来尝试安装一下这个包,已知的只有它所在的 HTTP(或 FTP、SVN、CVS)位置(setuptools 可以理解所有这些协议)。我的下载 Web 站点上有各个 Gnosis Utilities 的版本,它们的命名采用了常见的版本风格:

清单 5. 安装不识别 setuptools 的包
% easy_install -f http://gnosis.cx/download/Gnosis_Utils.More/ Gnosis_Utils
Searching for Gnosis-Utils
Reading http://gnosis.cx/download/Gnosis_Utils.More/
Best match: Gnosis-Utils 1.2.1
Downloading http://gnosis.cx/download/Gnosis_Utils.More/
  Gnosis_Utils-1.2.1.zip
Processing Gnosis_Utils-1.2.1.zip
Running Gnosis_Utils-1.2.1/setup.py -q bdist_egg --dist-dir
  /tmp/easy_install-CCrXEs/Gnosis_Utils-1.2.1/egg-dist-tmp-Sh4DW1
zip_safe flag not set; analyzing archive contents...
gnosis.__init__: module references __file__
gnosis.magic.__init__: module references __file__
gnosis.xml.objectify.doc.__init__: module references __file__
gnosis.xml.pickle.doc.__init__: module references __file__
gnosis.xml.pickle.test.test_zdump: module references __file__
Adding Gnosis-Utils 1.2.1 to easy-install.pth file

Installed /sw/lib/python2.4/site-packages/Gnosis_Utils-1.2.1-py2.4.egg
Processing dependencies for Gnosis-Utils

所幸的是 easy_install 可以把这一切都完成得很好。它会查看给定的下载目录,识别出可用的最高版本,展开这个包,然后将其重新打包为 “egg” 格式,后者就可以用来进行安装了。导入 gnosis 现在可以在一个脚本中运行。但是假设现在需要对 Gnosis Utilities 之前的某个特定版本来测试一个脚本又该怎么做呢?这也非常简单:

清单 6. 安装一个 “naive” 包的特定版本
% easy_install -f http://gnosis.cx/download/Gnosis_Utils.More/
  "Gnosis_Utils==1.2.0"
Searching for Gnosis-Utils==1.2.0
Reading http://gnosis.cx/download/Gnosis_Utils.More/
Best match: Gnosis-Utils 1.2.0
Downloading http://gnosis.cx/download/Gnosis_Utils.More/
  Gnosis_Utils-1.2.0.zip
[...]
Removing Gnosis-Utils 1.2.1 from easy-install.pth file
Adding Gnosis-Utils 1.2.0 to easy-install.pth file

Installed /sw/lib/python2.4/site-packages/Gnosis_Utils-1.2.0-py2.4.egg
Processing dependencies for Gnosis-Utils==1.2.0

现在通常已经安装了两个版本的 Gnosis Utilities,当前活动版本是 1.2.0。将活动版本切换回 1.2.1 也非常简单:

清单 7. 在系统范围修改 “活动” 版本
% easy_install "Gnosis_Utils==1.2.1"
Searching for Gnosis-Utils==1.2.1
Best match: Gnosis-Utils 1.2.1
Processing Gnosis_Utils-1.2.1-py2.4.egg
Removing Gnosis-Utils 1.2.0 from easy-install.pth file
Adding Gnosis-Utils 1.2.1 to easy-install.pth file

Using /sw/lib/python2.4/site-packages/Gnosis_Utils-1.2.1-py2.4.egg
Processing dependencies for Gnosis-Utils==1.2.1

当然,这一次只能使一个版本是活动的。不过通过在各个脚本上面放上这样两行类似内容,就可以让脚本选择自己希望使用的版本:

清单 8. 在脚本中使用某个版本的包
from pkg_resources import require
require("Gnosis_Utils==1.2.0")

通过使用上述要求,setuptools 就可以在运行 import 语句时添加一个特定的版本(如果指定了大于比较,就是最新的可用版本)。
我会更希望让用户不需要知道 Gnosis Utilities 的下载目录就可以安装它。这 通常都可以 工作,因为 Gnosis Utilities 在 Python Cheeseshop 上有一个信息清单。不幸的是,因为没有考虑 setuptools ,所以我在 python.org 上为我的 Gnosis Utilities 建立了一个 “不匹配” 的入口 http://www.python.org/pypi/Gnosis%20Utilities/1.2.1。具体地说,这个归档文件是根据类似于 Gnosis_Utils-N.N.N.tar.gz 的模式进行命名的(这些工具也打包成了 .zip 和 .tar.bz2 文件,最新的几个版本还打包成了 win32.exe 的安装程序,所有这些文件 setuptools 都可以很好地处理)。不过 Cheeseshop 上的项目名的拼写与 “Gnosis Utilities” 稍微有点不同。实际上,在 Cheeseshop 的一个很小的管理版本的更改就会将 http://www.python.org/pypi/Gnosis_Utils/1.2.1-a 创建为一个发布后版本。发行版归档文件本身并没有什么变化,不过是在 Cheeseshop 里增加了一点元数据。只需要少量努力,就可以使用更加简单的安装程序(注意,出于测试目的,我运行了一个 easy_install -m 来删除所安装的包)。

清单 9. 简单增加对 setuptools 的识别
% easy_install Gnosis_Utils
Searching for Gnosis-Utils
Reading http://www.python.org/pypi/Gnosis_Utils/
Reading http://www.gnosis.cx/download/Gnosis_Utils.ANNOUNCE
Reading http://gnosis.cx/download/Gnosis_Utils.More/
Best match: Gnosis-Utils 1.2.1
Downloading [...]

我把这个过程剩余的部分忽略掉了,因为这与您前面看到的内容没什么两样。惟一的区别在于 easy_install 要在 Cheeseshop(换言之 www.python.org/pypi/)上寻找可以匹配指定名字的元数据,并使用这些信息来查找真正的下载位置。在这种情况中,所列出的 .ANNOUNCE 文件没有包含任何有帮助的内容,不过 easy_install 还会继续查看另一个所列的 URL,这会证明它是一个下载目录。
egg 是一个包含所有包数据的文件包。在理想情况中,egg 是一个使用 zip 压缩的文件,其中包括了所有需要的包文件。但是在某些情况下,setuptools 会决定(或被开关告知)包不应该是 zip 压缩的。在这些情况下,egg 只是一个简单的未曾压缩的子目录,但是里面的内容是相同的。使用单一的版本可以方便地进行转换,并可以节省一点磁盘空间,但是 egg 目录从功能和组织结构上来说都是相同的。一直使用 JAR 文件的 Java™ 技术的用户会发现 egg 非常熟悉。
由于最新的 Python 版本中(需要 2.3.5+ 或 2.4)导入挂钩的更改,可以简单地通过设置 PYTHONPATH 或 sys.path 并像往常一样导入相应的包来使用 egg。如果希望采用这种方法,就不需要使用 setuptools 或 ez_setup.py 了。例如,在本文使用的工作目录中,我就为 PyYAML 包放入了一个 egg。现在我就可以使用这个包了,方法如下:

清单 10. PYTHONPATH 上的 egg
% export PYTHONPATH=~/work/dW/PyYAML-3.01-py2.4.egg
% python -c 'import yaml; print yaml.dump({"foo":"bar",1:[2,3]})'
1: [2, 3]
foo: bar

不过,PYTHONPATH 的(或者脚本或 Python shell 会话内的 sys.path的)这种操作有些脆弱。egg 的发现最好是在新一点的 .pth 文件中进行。在 site-packages/ 或 PYTHONPATH 中的任何 .pth 文件都会进行解析来执行其他导入操作,其方法类似于检查可能包含包的那些目录位置一样。如果使用 setuptools 来处理包的管理功能,那么在安装、更新、删除包时,就需要修改一个名为 easy-install.pth 的文件。而且可以按照自己喜欢的方式对这个 .pth 进行命名(只要其扩展名是 .pth 即可)。例如,下面是我的 easy-install.pth 文件的内容:

清单 11. 用作 egg 位置配置的 .pth 文件
% cat /sw/lib/python2.4/site-packages/easy-install.pth
import sys; sys.__plen = len(sys.path)
setuptools-0.6b1-py2.4.egg
SQLObject-0.7.0-py2.4.egg
FormEncode-0.5.1-py2.4.egg
Gnosis_Utils-1.2.1-py2.4.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:];
  p=getattr(sys,'__egginsert',0); sys.path[p:p]=new;
  sys.__egginsert = p+len(new)

这种格式有点特殊:它近似于一个 Python 脚本,但却不完全是。需要说明的是,可以在那里添加额外列出的 egg;更好的情况是,easy_install 会在运行时实现这种功能。也可以在 site-packages/ 下创建任意多个 .pth 文件;每个都可以列出有哪些 egg 是可用的。
上面所述的这种安装 setuptools naive 包的能力(请参阅 清单 6)只部分有效。也就是说,包 Gnosis_Utils 的确安装上了,但是并不完整。所有常见的功能都可以工作,但是在自动生成 egg 时却忽略了很多支持文件 —— 大部分是扩展名为 .txt 的文档和扩展名为 .xml 的测试文件(还有一些其他的 README、.rnc、.rng、.xsl 和围绕子包的文件)。在安装时,所有这些支持文件都 “最好要有”,而没有严格要求一定要有。不过,我们仍然希望能够包含所有的支持文件。
Gnosis_Utils 使用的 setup.py 脚本实际上非常复杂。除了列出基本的元数据之外,在第 467 行代码中,它还对 Python 版本的功能和 bug 进行完整测试;解决旧版本的 distutils 中的一些故障;回溯跳过对不支持部分的安装(例如,如果 pyexpat 在 Python 发行版中并没有包括);处理 OS 行结束符的转换;创建多个归档/安装程序类型;根据测试结果重新构建 MANIFEST 文件。能够实现处理这些工作的能力要感谢此包的另外一个维护人员 Frank McIngvale;这些能力可以让 Gnosis_Utils 能成功安装回 Python 1.5.1 的版本,当然前提是需要这么做(早期版本中的功能没有这么丰富)。不过此处我要向大家展示的脚本并没有像 distutils 脚本一样做这么复杂的事情:它只是简单地假设系统中已经安装了一个 “普通的” 最新版本的 Python。即使这么讲,setuptools 能让安装脚本变得如此简单还是非常吸引人。
在第一次尝试时,让我们来创建一个 setup.py 脚本,它是从 setuptools 手册中借用的,并试图使用它来创建一个 egg:

清单 12. setuptools setup.py 脚本
% cat setup.py
from setuptools import setup, find_packages
setup(
    name = "Gnosis_Utils",
    version = "1.2.2",
    packages = find_packages(),
)
% python setup.py -q bdist_egg
zip_safe flag not set; analyzing archive contents...
gnosis.__init__: module references __file__
gnosis.doc.__init__: module references __file__
gnosis.magic.__init__: module references __file__
gnosis.xml.objectify.doc.__init__: module references __file__
gnosis.xml.pickle.doc.__init__: module references __file__
gnosis.xml.pickle.test.test_zdump: module references __file__

这点努力就已经可以起作用;至少可以部分地起作用。使用这几行内容的确可以创建一个 egg,不过这个 egg 与使用easy_install 创建的 egg 有一些相似的缺点:缺乏对不使用 .py 命名的文件的支持。因此让我们再试一次,只是需要稍微再努力一点:

清单 13. 添加缺少的 package_data
from setuptools import setup, find_packages
setup(
    name = "Gnosis_Utils",
    version = "1.2.2",
    package_data = {'':['*.*']},
    packages = find_packages(),
)

这就是需要做的所有操作。当然,根据实际情况,通常希望对它进行一些调整。例如,它可能会列出下面的内容:

清单 14. 打包特定类型文件类型
package_data = {'doc':['*.txt'], 'xml':['*.xml', 'relax/*.rnc']}

这段内容翻译一下就是:将 .txt 文件包括在 doc/ 子包中,将 .xml 文件包括在 xml/ 子包中,将所有 .rnc 文件包括在 xml/relax/ 子包中。
本文实际上只介绍了用支持 setuptools 的发行版可以执行的定制操作的表层的知识。例如,假设您现在有一个发行版(可以是首选的 egg 格式或另外一种归档类型),您就可以使用一个命令将这个归档文件和元数据上载到 Cheeseshop 上。显然,完整的setup.py 脚本应该包含旧版本 distutils 脚本中所包含的同样详细的元数据;为了简单起见,本文跳过了这些内容,但是其参数名与 distutils 是兼容的。
尽管要完全适应 setuptools 所提供的巨大功能需要一些时间,但是实际上它确实可以让维护您自己的包和安装外来包都要比distutils 更加简单。如果您所关心的内容仅仅是安装包,那么您所需要了解的内容在本文的介绍中已经全部包括了;只是您在描述您自己的包时可能会发现一些复杂性,不过仍然没有使用 distutils 那么复杂。

iOS语法

点语法 Dot Syntax

为什么要设计点语法?
为了方便别的程序员转到ObjC开发上来
为了让程序设计简单化
隐藏了内存管理细节
隐藏了多线程/同步/加锁细节

2013年5月26日星期日

AIX SUSE

AIX(Advanced Interactive eXecutive)是IBM开发的一套UNIX操作系统。它符合Open group的UNIX 98行业标准(The Open Group UNIX 98 Base Brand),通过全面集成对32-位和64-位应用的并行运行支持,为这些应用提供了全面的可扩展性。它可以在所有的IBM ~ p系列和IBM RS/6000工作站服务器和大型并行超级计算机上运行。

Advanced Interactive eXecutive(AIX)是IBM专有UNIX操作系统的商标名。 最初,它在内部代表"Advanced IBM Unix",但或许这个名字没有得到法律部门的允许便更改为"Advanced Interactive eXecutive"。


Novell SUSE Linux Enterprise Server(SLES)是一个以Linux内核为基础的类Unix企业服务器操作系统,能运行在从X86 PC到小型机乃至超级计算机等硬件平台上,可以稳定高效的运行企业数据中心的所有主流应用业务。Novell SLES现已发展成为最受业内瞩目的、发展最为迅猛的主流服务器操作系统之一,也是全球唯一能与微软操作系统兼容的Linux操作系统。在中国市场份额已多年占据了第一的领先地位。

2013年5月15日星期三

CoreBluetooth

iOS 设备上的蓝牙是用来连接外围蓝牙配件的,如蓝牙键盘、蓝牙耳机、车载套件和立体声耳机。

一般情况下,iPhone、iPad 开启蓝牙搜索,是相互搜索不到的。

  1. 因为系统对iOS设备进行了过滤
  2. 即使能搜索到并且连接,但无法发送文件,也是没有用的,所以系统直接给屏蔽了

有两种情况,可以使iOS设备相互搜索到。

  1. “个人热点”共享的时候,开启“个人热点” 和 “蓝牙” 功能。在这时候,蓝牙的作用就是热点共享网络。
  2. 程序里面使用GameKit Framework,用framework自带的蓝牙联机游戏功能,也可以相互搜索到。


下面两张图是从Apple用户手册截取的

The CoreBluetooth.Framework is there for OSX. It's embedded inside of theIOBluetooth.framework. Download the sample mac apps from the Apple Dev Site. The one difference is that the OSX version of the CoreBluetooth.Framework does not contain theCBPeripheralManager class. You should just have your iOS device act as the peripheral and the Mac as the central. The iOS device can act as both at the same time and data can be sent both ways.

Basic Bluetooth 4.0 Terminology

  • Bluetooth Central: This is the node that is trying to connect to a data source. Think of this as the client.
  • Bluetooth Peripheral: This is the node that is providing the primary data source. Think of this as the server.
  • Characteristic: A characteristic can be considered a variable.
  • Service: A group of characteristics live under a "Service".




ios外接蓝牙设备模块


基于CC2540的温度和压力的无线监测

CC2530是用于zigbee的,而CC2540是用于蓝牙,都属于2.4GHz的传输频率。
德州仪器的CC2540 是一款高性价比、低功耗的片上系统(Soc)解决方案,适合蓝牙低耗能应用,它以低总体物料清单成本,建立强健的网络节点成为可能。
CC2540开发套件提供了完整的硬件性能测试平台和通用的软件开发环境的单模蓝牙低功耗(BLE)应用程序。该套件包括两个基于CC2540 RF评估模块、一个基于CC2540-USB加密狗、软件和硬件原型、电缆、天线和文档,运行快速,轻松地与CC2540的通用开发板(SmartRF05EB)。


Macbook 查看本机技术规格

查看 Macbook 技术规格


胎压监测系统(TPMS)


   基于一种新的蓝牙技术——蓝牙4.0(Bluetooth Low Energy)新型的胎压监测系统(TPMS)的设计方案。鉴于蓝牙4.0(Bluetooth Low Energy)的低成本、低功耗、高稳定性等特点,适用于胎压监测系统,目前业界还没有出现类似的设计方案。本设计为直接式胎压监测系统,即在车辆轮胎上安装压力和温度传感器,通过蓝牙传输方式将胎压的信息传送给搭载蓝牙4.0的iPod、iPhone以及iPad,并在所安装的APP软件上显示实时数据。由此可实时监测车辆的胎压情况,并在胎压异常情况下发出报警。
引言:
    随着商业用车和家庭用车的日益增多,汽车安全越来越受到人们的重视。美国汽车工程师协会的调查统计表明,美国每年有26万交通事故是由于轮胎气压低或漏气造成的,同时75%的轮胎故障是由于轮胎充气不足或渗漏而引起的。美国运输部国家公路交通安全管理委员会(NHTSA)制定的法规中规定:2003年11月到2006年10月31日期间,美国新出厂的轻型汽车将逐步引入胎压监测系统(Tire Pressure Monitoring System,TPMS)。可见,TPMS的研究和投产势在必行。中国作为世界汽车消费增长最快的国家,相信不久将来政府也会制定类似法规。车厂对TPMS的重要性日益重视。
    TPMS主要用于实时监测汽车轮胎温度和压力,当压力和温度超出或低于标准值范围时,系统发出蜂鸣或光报警信号,从而有效的避免交通意外的发生。

1 蓝牙4.0(Bluetooth Low Energy)技术简介
    蓝牙技术联盟(Bluetooth SIG)2010年7月宣布,正式推出最新的蓝牙规范一Bluetooth V4.0技术。该技术拥有极低的运行和待机功耗,使用一粒纽扣电池甚至可连续工作数年之久。同时还拥有低成本,跨厂商互操作性,3毫秒低延迟、100米以上超长距离、AES-128加密等诸多特色,可以用于计步器、心律监视器、智能仪表、传感器物联网等众多领域,大大扩展蓝牙技术的应用范围。其主要技术特点如下:
◇高效率的发现机制:低耗能蓝牙技只用3个信道做广播信道,允许毫秒级快速建立连接,效率远高于传统蓝牙的32个信道方式。
◇少的数据频道和宽频道间隔:传统蓝牙有79个数据信道,频道间隔是1MHz;低耗能蓝牙有40个数据信道,频道间隔是2MHz。
◇低工作电流和超低睡眠电流:传统蓝牙的工作峰值电流一般是35mA,睡眠状态电流是0.01mA。而低耗能蓝牙的工作峰值电流是小于15mA,睡眠状态电流是0.004mA。 
◇低耗能蓝牙具有抗干扰能力更强、数据发送更快、工作效率更高、可与手机/计算机连接等优势,具有无可比拟的技术和市场优势,特别适用于近距离、小数据量、非频繁操作的应用场景,如医疗、健身监视器、腕式设备/手表、家电遥控器、玩具、手机、计算机及附件、工业自动化、电子游戏等。 
◇低成本:蓝牙4.0通信模块的单位成本已经减小到三美元左右。

 2.蓝牙4.0(Bluetooth Low Energy)TPMS系统介绍:
    TPMS系统采用直接式温度压力测量系统。该系统分为两个模块:蓝牙4.0通信模块和智能终端。蓝牙4.0通信模块利用车胎内的温度压力传感器和蓝牙4.0收发器,把数据发送给智能终端。实时监测轮胎的压力和温度,数据信号无线传送到智能终端上,并显示在相应APP程序界面上。当轮胎出现漏气、胎压过高或过低、温度过高等异常情况,手机会自动报警和显示轮胎状态,从而确保汽车行驶的安全。该系统特点是成本偏高,但监测效果较好,精确可靠。每个轮胎安装了高灵敏度的感应发射器,

四轮胎压监测.jpg
安装TPMS系统的优势
o 1.防爆胎
实时监测轮胎气压和温度,防患于未然。
o 2.省燃油
保持正确的轮胎压力,降低汽车油耗。
o 3.减磨损
气压不足,会造成过度磨损(吃胎),缩短轮胎使用寿命。
o 4.低成本
只需一部搭载蓝牙4.0的智能显示终端且安装相应APP程序,链接之后,即可实时监控接收数据,省去了购买显示终端的费用,且具有相当好的便携操作性。

2.1 远程感应模块:
蓝牙4.0模块固定安装于4个车胎内部,负责数据的采集、简要处理及传输。其硬件结构包括压力温度传感器元件、MCU、蓝牙4.0通信模块、天线和供电设备,如图1所示:


图1 TPMS远程感应模块硬件结构图

传感器:选用Daytona传感器,它是一种表面微机械型电容性微机电系统(MEMS)单芯片压力传感器,包括压力变换器、正温度系数扩散电阻温度传感器和所有必需电路,用以产生一个校准的8bit温度和压力数字输出。Daytona的特点是专用于TPMS温度和压力测量:单片MEMS微机械压力感应单元;3V工作电压;低功耗、待机电流600nA;压力采样电流1.5mA;温度采样电流500uA;4种工作模式灵活运用以求节电;内置低频振荡器,可用于唤醒MCU;8位数据输出:SSOP封装;介质保护[2]。
MCU:该单片机为主要用来采集/控制/处理压力传感器与温度传感器数据功能,通过串口与蓝牙4.0通信模块连接.
蓝牙4.0通信模块:蓝牙4.0通信模块是采用TI德州仪器公司的蓝牙4.0单模式芯片CC2540。该芯片集成了增强型8051单片机(MCU)和低功耗蓝牙收发器,具有以下一些特点:
20个信道。
典型的发射功率为-23dBm一4.5dBm。
自适应跳频GFSK,最大传输速率为1Mbps。
在分组差错率为1%的情况下,其接收灵敏度为-97dBm。
邻近信道干扰>30dBm,间隔信道干扰>53dBm。
待机电流仅为0.4uA。
工作温度为-45℃到80℃。适用于恶劣的工作环境。
供电设备:使用专业的胎压监测系统电池,由于蓝牙4.0(Bluetooth Low Energy)和Daytona的低功率特点,其可有效供电2年以上。

2.2 接收显示端:
    透过搭载蓝牙4.0功能的iPod5、iPhone4S/5或者iPad3/mini,掌握你爱车的状况,即便是行驶中,也可以随时监测,显示独立每一轮胎的压力、温度资讯.你只需要拿起你的iPhone再搭配上嵌入蓝牙4.0通信模块的胎压监测器,在弹指之间,透过直觉式的界面设计,即可从容不迫的轻易的得知轮胎状况。

胎压监测app.jpg
APP程序特点:
1.即时胎压胎温查看 异常变化主动警示
2.时尚主题选择
3.可建立爱车参数
4.TPMS功能设置


3 系统网络结构和协议
    蓝牙网络层(NWK)仅支持星形拓扑结构,即其网络由一个单独设备——搭载蓝牙的智能终端进行接收显示。终端设备直接和蓝牙4.0通信模块通信。位于4个轮胎里的蓝牙4.0通信模块由简单功能设备(RFD)组成。接收显示模块为搭载蓝牙4.0的移动终端设备。当终端开启激活蓝牙功能之后,它就可以开始建立一个自己的网络。通过选择一个PAN标识符可实现其唯一性,即在某个网络的覆盖范围内,该标识符不能被其它网络所使用。当选定PAN标识符以后,PAN协调器就可以允许其它设备加入该网络当中。在本系统中,蓝牙4.0通信模块有其唯一的64位IEEE地址,当终端发射端扫描到具有匹配的64位扩展地址的设备时,便允许其加入网络,并进行数据传输。所有的星形网络各自独立运行,就可以避免在车辆行驶中与其它蓝牙4.0设备产生干扰,造成数据丢失。

4 软件设计
首先应初始化系统,设置压力、温度的门阈值以及远程感应模块的设备ID。系统启动后,移动智能终端首先发送命令帧给蓝牙4.0通信模块,唤醒蓝牙模块的接收器。蓝牙4.0通信模块收到命令帧,返回确认帧,以告知车内接收智能终端已激活接收机。蓝牙4.0通信模块激活后,传感器首先采集数据,传递给MCU进行处理,然后通过蓝牙4.0通信模块将数据传输给接收显示模块,然后自动转入休眠状态。移动终端的接收装置在收到数据以后,MCU处理数据,并上传到应用程序软件上。通过与标准温度和压力数据门阈值的比较,判断是否产生告警,并把处理结果存储在MCU的RAM中,以供及时查询。最后将结果显示于移动终端显示屏上,以供驾驶员观测。系统每3秒钟激活一次远程感应模块采集数据;每30秒蓝牙4.0通信模块向移动智能终端传送一次数据。
系统的软件设计主要采用嵌入式操作系统,用C语言进行编程和调试。其软件流程如图3所示:

图3 TPMS软件流程图

5 系统误码率分析
蓝牙4.0(Bluetooth Low Energy)对于不同的信噪比的可以选用不同的消息传输速率,从而有效地降低误码率。由于本系统的蓝牙4.0通信模块放置于胎内,环境较为恶劣。运用低比特率、2字节消息的数据传输,可以保证较高的可靠性。对于本系统分析所得的消息误码率与信噪比的关系见图4:


                         
图4 消息误码率VS信噪比

小结:通信技术和传感器技术的迅速发展,TPMS的结构也随之不断的更新,在降低功耗和成本的同时,也需要提供数据传输的可靠性和安全性。本系统主要是基于蓝牙4.0(Low Energy Bluetooth)技术的TPMS,能实时监控的车胎内的温度和压力,并能可靠地将数据发送到手机端,有效在各个方面提高TPMS的性能,具有一定的创新性,进一步增强了系统的实用价值。

Bluetooth Low Energy

蓝牙4.0(Bluetooth Low Energy)技术简介

蓝牙技术联盟(Bluetooth SIG)2010年7月宣布,正式推出最新的蓝牙规范一Bluetooth V4.0技
术。该技术拥有极低的运行和待机功耗,使用一粒纽扣电池甚至可连续工作数年之久。同时
还拥有低成本,跨厂商互操作性,3毫秒低延迟、100米以上超长距离、AES-128加密等诸多
特色,可以用于计步器、心律监视器、智能仪表、传感器物联网等众多领域,大大扩展蓝牙
技术的应用范围。其主要技术特点如下:

◇高效率的发现机制:低耗能蓝牙技只用3个信道做广播信道,允许毫秒级快速建立连接,效
率远高于传统蓝牙的32个信道方式。

◇少的数据频道和宽频道间隔:传统蓝牙有79个数据信道,频道间隔是1MHz;低耗能蓝牙有40个数据信道,频道间隔是2MHz。

◇低工作电流和超低睡眠电流:传统蓝牙的工作峰值电流一般是35mA,睡眠状态电流是0.01mA。而低耗能蓝牙的工作峰值电流是小于15mA,睡眠状态电流是0.004mA。

◇低耗能蓝牙具有抗干扰能力更强、数据发送更快、工作效率更高、可与手机/计算机连接等优势,具有无可比拟的技术和市场优势,特别适用于近距离、小数据量、非频繁操作的应用场景,如医疗、健身监视器、腕式设备/手表、家电遥控器、玩具、手机、计算机及附件、工业自动化、电子游戏等。

◇低成本:蓝牙4.0通信模块的单位成本已经减小到三美元左右。

  • 蓝牙4.0包含 "Classic Bluetooth," "Bluetooth High Speed," 和"Bluetooth Low Energy"三种协议,分别对应不同的速度,特别是高速模式基于Wi-Fi工作,比传统的蓝牙连接更具效率,而Bluetooth Low Energy (BLE)则主要用于传送命令之用,它的特点是低功耗、远距离,最大传输距离160英尺,比RFID更有效。

  • 蓝牙4.0依旧向下兼容,包含经典蓝牙技术规范和最高速度24Mbps的蓝牙高速技术规范。三种技术规范可单独使用,也可同时运行。


  • 蓝牙4.0将三种规格集一体,包括传统蓝牙技术、高速技术和低耗能技术,与3.0版本相比最大的不同就是低功耗。“4.0版本的功耗较老版本降低了90%”。

  • 蓝牙4.0是蓝牙3.0+HS规范的补充,专门面向对成本和功耗都有较高要求的无线方案,可广泛用于卫生保健、体育健身、家庭娱乐、安全保障等诸多领域。
  • 它支持两种部署方式:双模式和单模式。
  • 双模式中,低功耗蓝牙功能集成在现有的经典蓝牙控制器中,或再在现有经典蓝牙技术(2.1+EDR/3.0+HS)芯片上增加低功耗堆栈,整体架构基本不变,因此成本增加有限。
  • 单模式面向高度集成、紧凑的设备,使用一个轻量级连接层(Link Layer)提供超低功耗的待机模式操作、简单设备恢复和可靠的点对多点数据传输,还能让联网传感器在蓝牙传输中安排好低功耗蓝牙流量的次序,同时还有高级节能和安全加密连接。



藍牙技術 (Bluetooth 4.0 Technology)

藍牙技術聯盟 (Bluetooth Special Interest Group, SIG) 宣布推出採用低功耗版本藍牙核心規格藍牙 4.0 (Bluetooth4.0) 版本的升級版藍牙低功耗無線技術,針對低成本、低功耗的無線設備所推出,透過僅需配有鈕扣電池的無線裝置、感應器,藍牙技術將可進一步應用至如醫療保健、運動與健身、安全及家庭娛樂等市場。

藍牙設備(Bluetooth Device Types)

藍牙 4.0 規格有雙模、單模兩種應用。在雙模應用中,藍牙低功耗的功能會整合至現有 的傳統藍牙控制器中,共享傳統藍牙技術既有的射頻和功能,相較於傳統的藍牙技術增加 的成本更小。





藍牙低功耗優勢 (Advantages of BLE)

藍牙低功耗(BLE)無線技術具備超低峰值 (Peak)、平均值與待機功耗,透過標準鈕扣電池足以使用數年,是一種低成本的無線標準,可支援多種設備之間的相容性,並加強射程。


• 低成本、低功耗 長效使用

Low cost

Ultra-low peak, average, and idle mode power consumption

Ability to run for years on standard coin-cell batteries


• 聯繫手機、電腦 應用程式

Connectivity to mobile phones , laptops, etc.


• 運用手機應用程式作互動

Customer can Interactive with APPS Global availability, license-free



• 高增長、高利潤、高科技產品應用

High profit > upgrade to High-end product





市場及應用(Markets & Applications)




* 醫療保健 (Medical and health care devices)

* 運動與健身 (Sports & Fitness)

* 測量器 (Measurement)

* 安全設備 (Security & Proximity)

* 智能設備 (Smart Energy)

* 家居設備 (Home Automation)

* 汽車設備 (Automotive)

* 語音應用設備 (Audio application devices)

Linux 查看文件个数

1)查看当前目录下的文件和子文件夹中文件个数并统计
find ./ -type f | wc -l
或ll -R |grep "^-" | wc -l
 2)查看当前目录下的文件数并统计
ll  |grep "^-" | wc -l
3)查看某目录下文件夹和子文件夹个数并统计
ll -R |grep "^d" | wc -l
4)查看文件打开数
more /proc/sys/fs/file-nr 
输出的三行含义为:
   a、 已分配文件句柄的数目   b、 已使用文件句柄的数目  c、文件句柄的最大数目
查看所有进程的文件打开数
 lsof | wc -l
查看某个进程打开的文件数
lsof -p pid |wc -l
5)统计文件行数、字节数、数字
文件内容统计命令:wc
wc -lcw file1
-l 统计行数 -c 统计字节数 -w 统计字数
6)查看文件大小
某目录下文件大小
sudo du -h -s
7)查看列出以conf结尾的文件
ls /etc/|grep 'conf$'

2013年5月8日星期三

ADT 设置

http://blog.sina.com.cn/s/blog_59fb90df01018ob9.html

我是在mac os下使用的eclipse,直接下载Android官网的ADT,和window下的快捷键有点出入,其余都差不多
以下设置都是打开Preferences设置窗口,这个窗口的打开方式各个平台都不同,根据自己的实际情况打开吧。

1.设置编辑窗口的背景色
eclipse的主编辑窗口的背景色,默认为白色,个人感觉太亮,推荐保护视力的“墨绿色”,当然也可以根据个人喜好更改,如下图
eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置

2.主编辑窗口的字体字号等
也可以根据自己的爱好设置,个人把字体调大了,如下图:

eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置

开发Android,经常还会用到XMl布局文件,上面的设置,只对代码文件有效,打开xml文件发现字体还很小,xml文件字体设置如下:
eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置



3.自动代码补全设置
eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置


  android接口很多,当然需要代码提示功能,就是指“输入几个字符,后面自动补全”。
关于这个设置,我详细说明下:
eclipse默认的代码自动补全有两种方式
一是,直接使用快捷键“ctrl+空格”就会弹出提示(这个是mac平台的快捷键,其它平台不确定是不是一样的)
二是,在输入"_"或者"."之后会弹出提示。
但是我希望输入任何字符一开始就弹出提示,而不仅仅是“_.”才出现提示。
下面的设置的意思是输入哪些字符自动弹出提示,默认是“_.”,
所以我改成“._abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
这样输入以上任何字符都能弹出代码补全提示。
注意:我做android时,经常会用到"R.id",在输入大写R后的代码补全很烦人,你用过就知道,所以我干脆去掉R,当然你可以根据自己的需要把大写字母R也弄上。
设置如下:(下面的输入框太小,没显示全)
eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置

4.android测试经常需要运行
eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置

默认的快捷键似乎不是很好用,也不是习惯,我就改成自己喜欢的快捷键,
注意:要先配置要项目的“run config”才行
如下图
eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置

5.在点击运行后,如果有文件处于编辑状态,而未保存,那么就会弹出提示是否保存
一般来说我们都是要保存,所以希望点击运行后,自动保存所有文件。如下图设置:
注意:用eclipse的很多人习惯不停的按“ctrl+s”来保存,其实按照下面设置,你就再也不用经常按“ctrl+s”了。还有“ctrl+shift+s”是保存当前所有文件的快捷键。

下面3个选项的解释:
always:点击运行(run)后,自动保存所有文件
never:点击运行(run)后,依然保持所有文件的状态,就是说处于编辑的文件依然是编辑状态。这样运行的文件依然是老文件。
prompt:这个是eclipse默认的状态,就是点击运行(run)后,如果有没保存的文件,就弹出提示,是否保存

eclipse <wbr>/ <wbr>ADT(Android <wbr>Develop <wbr>Tool) <wbr>一些方便的初始设置


2013年5月2日星期四

django 教程

http://djangobook.py3k.cn/2.0/chapter06/

django: http://red-bean.com/~adrian/django_pronunciation.mp3

1.创建基于 django 的web程序


django-admin.py startproject mysite

startproject 命令创建一个目录,包含4个文件:
1

mysite/
    __init__.py
    manage.py
    settings.py
    urls.py



文件如下:

  • __init__.py :让 Python 把该目录当成一个开发包 (即一组模块)所需的文件。 这是一个空文件,一般你不需要修改它。

  • manage.py :一种命令行工具,允许你以多种方式与该 Django 项目进行交互。 键入python manage.py help,看一下它能做什么。 你应当不需要编辑这个文件;在这个目录下生成它纯是为了方便。
    5

  • settings.py :该 Django 项目的设置或配置。 查看并理解这个文件中可用的设置类型及其默认值。

  • urls.py:Django项目的URL设置。 可视其为你的django网站的目录。 目前,它是空的。

尽管这些的文件很小,但这些文件已经构成了一个可运行的Django应用。


2. urlconf
URLconf 就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。 例如,当用户访问/foo/时,调用视图函数foo_view(),这个视图函数存在于Python模块文件view.py中。


URL配置和松耦合

现在是好时机来指出Django和URL配置背后的哲学: 松耦合 原则。 简单的说,松耦合是一个 重要的保证互换性的软件开发方法。

Django的URL配置就是一个很好的例子。 在Django的应用程序中,URL的定义和视图函数之间是松 耦合的,换句话说,决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方。 这使得 开发人员可以修改一块而不会影响另一块。

例如,考虑一下current_datetime视图。 如果我们想把它的URL 从原来的 /time/ 改变到 /currenttime/ ,我们只需要快速的修改一下URL配置即可, 不用担心这个函数的内部实现。 同样的,如果我们想要修改这个函数的内部实现也不用担心会影响 到对应的URL。

此外,如果我们想要输出这个函数到 一些 URL, 我们只需要修改URL配置而不用 去改动视图的代码。 在这个例子里,current_datetime被两个URL使用。 这是一个故弄玄虚的例子,但这个方法迟早会用得上。

urlpatterns = patterns('',
    ('^hello/$', hello),
    ('^time/$', current_datetime),
    ('^another-time-page/$', current_datetime),
)
URLconf和视图是松耦合的。 我们将在本书中继续给出这一重要哲学的相关例子。
关于漂亮URL的一点建议
如果你有其它web平台的开发经验(如PHP或Java),你可能会想:嘿!让我们用查询字符串参数吧! 就像/time/plus?hours=3里面的小时应该在查询字符串中被参数hours指定(问号后面的是参数)。
你 可以 在Django里也这样做 (如果你真的想要这样做,我们稍后会告诉你怎么做), 但是Django的一个核心理念就是URL必须看起来漂亮。 URL /time/plus/3/ 更加清晰, 更简单,也更有可读性,可以很容易的大声念出来,因为它是纯文本,没有查询字符串那么 复杂。 漂亮的URL就像是高质量的Web应用的一个标志。
1
Django的URL配置系统可以使你很容易的设置漂亮的URL,而尽量不要考虑它的 反面 。



3.我们把hello视图函数作为一个对象传递,而不是调用它。 这是 Python (及其它动态语言的) 的一个重要特性: 函数是一级对象(first-class objects), 也就是说你可以像传递其它变量一样传递它们。