2017年7月

嵌入式、物联网技术交流分享

Python 包管理

distutils distutils 是 Python 标准库的一部分,其初衷是为开发者提供一种方便的打包方式, 同时为使用者提供方便的安装方式。 setuptools (easy_install) setuptools 是 Python 的基础包工具,可以帮助我们轻松的下载,构建,安装,升级,卸载 python 的软件包。setuptools 是对 distutils 的增强, 尤其是引入了包依赖管理。setuptools 可以为 Python 包创建 egg 文件, Python 与 egg 文件的关系,相当于 Java 与 jar 包的关系。setuptools 提供的 easy_install 脚本可以用来安装 egg 包。 另外, easy_install 可以自动从 PyPI 上下载相关的包,并完成安装,升级。 地址:https://pypi.python.org/pypi/setuptools 安装: 进入源文件根目录,执行 python setup.py install 安装完后 CMD 中执行 easy_install 命令,进行检测,如果提示: error: No urls, filenames, or requirements specified (see –help) 说明安装成功。 pip pip 是安装,管理 Python 包的工具。它是对 easy_install 的一种增强。 同样可以从 PyPI 上自动下载,安装包。在 pip 中,安装前所有需要的包都要先下载,所以不会出现安装了一部分,另一部分没安装的情况所有安装的包会被跟踪,所以你可以知道为什么他们被安装,同时可以卸载。无需使用 egg 文件。使用方式比 setuptools 更简单: pip install pkg_name pip uninstall pkg_name 如果已安装 setuptools,则可以直接用 easy_install 来安装 pip: easy_install pip 当然也可以下载源代码,进入根目录执行 python setup.py install 来安...

半导体

半导体(Semiconductor) 半导体是电阻率介于导体和绝缘体之间并有负的电阻温度系数的物质。在室温时,半导体的电阻率约在 $10^{-5}~10^7$ Ω·m(欧·米)之间,温度升高时电阻率指数则减小。半导体导带和价带距离适中,即禁带宽度适中,因此价带中的电子在常见能量级别的激励下,例如光、热和电压,即可进入导带,导致半导体电阻率变化。 本征半导体(Intrinsic Semiconductor) 本征半导体是完全不含杂质且无晶格缺陷的纯净半导体。主要常见代表有硅、锗这两种元素的单晶体结构。 单晶硅的每个硅原子和其周围的硅原子组成 8 电子稳定结构。一般情况下,电子-空穴对较少,具有较大的电阻率。在温度和光照的作用下,电子会变得更加活跃,载流子增多,电阻率下降。 N 型半导体(N-type semiconductors) 在本征半导体中掺入少量杂 Ⅴ 族质元元素(磷、砷、锑等),由于半导体原子(如硅原子)被杂质原子取代,杂质原子外层的五个外层电子的其中四个与周围的半导体原子形成共价键,多出的一个电子几乎不受束缚,较为容易地成为自由电子。于是,N 型半导体就成为了含电子浓度较高的半导体,其导电性主要是因为自由电子导电。该类杂质原子称为施主。多数载流子为电子。 P 型半导体 P 型半导体则通常是由在锗、硅类半导体材料中掺杂适量三价元素(Ⅲ 族元素)硼、铟、镓等而形成。由于半导体原子(如硅原子)被杂质原子取代,杂质原子外层的三个外层电子与周围的半导体原子形成共价键的时候,会产生一个“空穴”。因为三价元素的原子与周围的四价原子还差一个电子才能形成稳定的结构,所以容易“勾引”别的电子以达到稳定结构。多数载流子为空穴。 PN 结 采用不同的掺杂工艺,通过扩散作用,将 P 型半导体与 N 型半导体制作在同一块半导体(通常是硅或锗)基片上,在它们的交界面就形成空间电荷区称为 PN 结(PN junction)。PN 结中的内电场阻止了空穴向 N 区扩散,也阻止了电子向 P 区扩散,至此,扩散过程达到平衡。要想让 PN 结导通形成电流,必须消除其空间电荷区的内部电场的阻力。很显然,给它加一个反方向的更大的电场,即 P 区接外加电源的正极,N 区结负极,就可以抵消其内部自建电场,使载流子可以继续运动,从而形成线性的正向电流。而外加反向电压则相当于内建电场的阻力更大,PN 结不能导通,仅有极微弱的反向电流(由少数载流子的漂移运动形成,因少子数量有限,电流饱和)。当反向电压增大至某一数值时,因少子的数量和能量都增大,会碰撞破坏内部的共价键,使原来被束缚的电子和空穴被释放出来,不断增大电流,最终 PN 结将被击穿(变为导体)损坏,反向电流急剧增大。 PN 结特性 单向导电性 PN 结加正向电压时导通(存在导通电压,抵消 PN 结内电场),PN 结加反向电压时截止(PN 结呈现高阻性,存在反向饱和电流)。 反向击穿性 电容特性...

晶体三极管

晶体三极管(Transistor),也称为晶体管、三极管、半导体三极管、双极型晶体管。是在一块半导体基片上制作两个相距很近的 PN 结,两个 PN 结把整块半导体分成三部分,中间部分是基区,两侧部分是发射区和集电区,排列方式有 PNP 和 NPN 两种。发射区与基区之间形成的 PN 结称为发射结,而集电区与基区形成的 PN 结称为集电结,三条引线分别称为发射极 E(Emitter)、基极 B(Base)和集电极 C (Collector)。 在三极管符号中有一个箭头,箭头画在发射极 E,总是指向 N 区(N 型半导体),这是用来区分电路符号是 NPN(从基极指向射极)还是 PNP(从射极指向基极)的。 晶体三极管是电流型控制器件,而场效应晶体管则是电压型控制器件。 以上图的 NPN 三极管为例来讲。在制造三极管时,有意识地使发射区的多数载流子浓度大于基区的,同时基区做得很薄,而且,要严格控制杂质含量,这样,一旦接通电源后,由于发射结正偏,发射区的多数载流子(电子)及基区的多数载流子(空穴)很容易地越过发射结互相向对方扩散,但因前者的浓度基大于后者,所以通过发射结的电流基本上是电子流,这股电子流称为发射极电流子。由于基区很薄,加上集电结的反偏,注入基区的电子大部分越过集电结进入集电区而形成集电极电流 Ic,只剩下很少的电子在基区的空穴进行复合,被复合掉的基区空穴由基极电源 Eb 重新补给,从而形成了基极电流 Ib。根据电流连续性原理得:Ie = Ib + Ic。这就是说,在基极补充一个很小的 Ib,就可以在集电极上得到一个较大的 Ic,这就是所谓电流放大作用,Ic 与 Ib 是维持一定的比例关系,即:β = Ic / Ib。三极管的电流放大作用实际上是利用基极电流的微小变化去控制集电极电流的巨大变化。 放大原理 发射区向基区发射电子 电源 Ub 经过电阻 Rb 加在发射结上,发射结正偏,发射区的多数载流子(自由电子)不断地越过发射结进入基区,形成发射极电流 Ie。同时基区多数载流子也向发射区扩散,但由于多数载流子浓度远低于发射区载流子浓度,可以不考虑这个电流,因此可以认为发射结主要是电子流。 基区中电子的扩散与复合 电子进入基区后,先在靠近发射结的附近密集,渐渐形成电子浓度差,在浓度差的作用下,促使电子流在基区中向集电结扩散,被集电结电场拉入集电区形成集电极电流 Ic。也有很小一部分电子(因为基区很薄)与基区的空穴复合,扩散的电子流与复合电子流之比例决定了三极管的放大能力。 集电区收集电子 由于集电结外加反向电压很大,这个反向电压产生的电场力将阻止集电区电子向基区扩散,同时将扩散到集电结附近的电子拉入集电区从而形成集电极主电流 Icn。另外集电区的少数载流子(空穴)也会产生漂移运动,流向基区形成反向饱和电流,用 Icbo 来表示,其数值很小,但对温度却异常敏感。 晶体三极管在结构设计上的要点: 基区足够薄,以使发射区发来的载流子能够更容易地越过基区到达集电区; 基区掺杂浓度较小,使得在基区因空穴与电子复合而消耗掉发射区发射的载流子足够地少。 可见,晶体三极管简单地比作两个二极管的组合连接是不恰当的,三极管之所能够工作,与其结构设计是密不可分...

TM1638 按键数码管驱动芯片

TM1638 是一种带键盘扫描接口的 LED 驱动控制 IC,内部集成有 MCU 数字接口、数据锁存器、LED 驱动、键盘扫描等电路。 产品特性: 采用 CMOS 工艺 显示模式 10 段 × 8 位 键扫描(8 × 3 bit) 辉度调节电路(占空比 8 级可调) 串行接口(CLK,STB,DIO) 振荡方式:RC 振荡 内置上电复位电路 封装形式:SOP28 SEG1~SEG8 P 管开漏,只能接 LED 阳极,输出电流。 GRID1~GRID8 N 管开漏,只能接 LED 阴极,吸收电流。 由于是各 8 个脚,所以既可以驱动 8 位共阴极 LED 也可以驱动 8 位共阳极 LED。引脚接法与 RAM 中点亮 LED 的写法不同。 共阴极时可以支持 10 段,8 位。RAM 中写入一组数据(2 字节),可以控制一位的完整显示。 共阳极时可以支持 8 段,10 位。RAM 中写入一组数据(2 字节),可以控制 10 位的同一个段的显示。也就是说,如果控制一个位的显示,至少写 8 个低位字节(按一个位 8 段来说)。 这个表的含义更浅显的解释为:当某位为 1 时表示使 SEGx 输出电流且 GRIDy 输入电...

LED 数码管

LED 数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个段位和公共电极。通常,数码管由七个发光管组成 8 字形,再加上一个点,一共 8 个发光管。这些段分别由字母 a、b、c、d、e、f、g、dp 来表示,公共电极用 com 来表示。他们组成的单元称为一个显示...

结构体内存对齐规则

规则 1:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为 0 计算)。 规则 2:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。 struct route_entry { uint16_t addr; uint32_t teAddr; uint8_t relayNum; uint16_t relay[NWK_RELAY_MAXNUM]; uint8_t age; }; struct route_table { uint8_t count; struct route_entry entry[2]; uint16_t crc; }; sizeof(struct route_entry) == 24 sizeof(struct route_table) == 56...

MQTT 学习笔记

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输) 是 IBM 开发的一个即时通信协议。它是一种使用发布/订阅(publish/subscribe)模型的轻量级二进制通信协议,这使得它很适合 M2M(machine to machine)的消息传递,比如低功耗传感器或移动通信设备。 参与角色 由于是基于 publish/subscribe 模型的,所以必定存在消息的发布者和消息的订阅者两个角色,此外还应具有消息代理者(message broker),也就是服务器这一角色。 动作 发布者需要将消息推送至服务器,订阅者要有订阅的动作,然后服务器需要将消息推送给订阅者。 话题 消息以话题为归集(分类),话题将发布者与订阅者的兴趣点牵连了起来。话题就是一个 UTF-8 的字符串,可以使用斜杠(/)表示多个层级关系。话题不需要创建,直接使用就可以。 QoS QoS(Quality of Service,服务质量) 共有 3 级: 0: The broker/client will deliver the message once, with no confirmation. 1: The broker/client will deliver the message at least once, with confirmation required. 2: The broker/client will deliver the message exactly once by using a four step handshake. 通配符 + 与 # 以下带通配符的字符串可以匹配主题 a/b/c/d +/b/c/d a/+/c/d a/+/+/d +/+/+/+ # a/# a/b/# a/b/c/# +/b/c/# 只允许使用通配符订阅话题,不允许使用通配符发布消息。 消息类型 MQTT 拥有 14 种不同的消息类型: CONNECT:客户端连接到 MQTT 代理 CONNACK:连接确认 PUBLISH:新发布消息 PUBACK:新发布消息确认,是 QoS 1 给 PUBLISH 消息的回复 PUBREC:QoS 2 消息流的第一部分,表示消息发布已记录 PUBREL:QoS 2 消息流的第二部分,表示消息发布已释放 PUBCOMP:QoS 2 消息流的第三部分,表示消息发布完成 SUBSCRIBE:客户端订阅某个主题 SUBACK:对于 SUBSCRIBE 消息的确认 UNSUBSCRIBE:客户端终止订阅的消息 UNSUBACK:对于 UNSUBSCRIBE 消息的确认 PINGREQ:心跳 PINGRESP:确认心跳 DISCONNECT:客户端终止连接前优雅地通知 MQTT 代理 相关软件 当前流行的开源代理服务器(MQTT Broker)的实现有:mosquitto, HiveMQ, Apache ActiveMQ, RabbitMQ, mosca 等,MQTT 客户端也有不同操作系统和编程语言下的实现,流行的客户端库(MQTT ClientLibraries)有:Eclipse Paho(支持 C,C++, Java, JavaScript, Python, Go, C#), M2MQTT(C#), Fusesource MQTTClient(Java), MQTT.js(javascript), libmosquitto(c/c++)等等,通过以上库而开发出的 MQTT 客户端应用程序有:mosquitto_pub/mosquitto_sub(可运行于 Linux, Windows, MacOSX 操作系统),HiveMQWebsocket Client(Web browser),MyMQTT(Android),MQTTLens(Google Chrome)等等。 Mosquitto Eclipse Mosquitto™ 是一款实现了 MQTT 3.1 和 3.1.1 版本的开源消息代理软件(C 语言)。 官方网站:https://mosquitto.org/ 测试: wget http://mosquitto.org/files/source/mosquitto-1.4.13.tar.gz tar -zxvf mosquitto-1.4.13.tar.gz cd mosquitto-1.4.13 make(编译过程需要以下三个库:libssl-dev、libc-ares-dev、uuid-dev) sudo make install 编译生成的文件主要是: /usr/local/sbin/mosquitto 代理服务器主程序 /usr/local/bin/mosquitto_pub 用于发布消息的命令行客户端测试程序 /usr/local/bin/mosquitto_sub 用于订阅消息的命令行客户端测试程序 编译时可能出现的错误及解决办法: (1)./mosquitto_internal.h:27:27: fatal error: openssl/ssl.h: 没有那个文件或目录 sudo apt-get install libssl-dev libssl-dev 是将 OpenSSL 用于开发时使用的库文件、头文件等(Debian、Ubuntu) (2)./mosquitto_internal.h:40:20: fatal error: ares.h: 没有那个文件或目录 安装 libc-ares-dev sudo apt-get install libc-ares-dev libc-ares-dev 是 c-ares 的开发库,用于异步域名解析。 (3)read_handle_server.c:31:25: fatal error: uuid/uuid.h: 没有那个文件或目录 sudo apt-get install uuid-dev 它是用于生成 UUID(xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx (8-4-4-4-12))的库 测试: 终端 1: mosquitto -v 1499668521: mosquitto version 1.4.13 (build date 2017-07-10 11:52:05+0800) starting 1499668521: Using default config. 1499668521: Opening ipv4 listen socket on port 1883. 1499668521: Opening ipv6 listen socket on port 1883. 1499668525: New connection from ::1 on port 1883. 1499668525: New client connected from ::1 as mosqsub|1739-debian (c1, k60). 1499668525: Sending CONNACK to mosqsub|1739-debian (0, 0) 1499668525: Received SUBSCRIBE from mosqsub|1739-debian 1499668525: sensors/devicename/temperature (QoS 0) 1499668525: mosqsub|1739-debian 0 sensors/devicename/temperature 1499668525: Sending SUBACK to mosqsub|1739-debian 1499668529: New connection from ::1 on port 1883. 1499668529: New client connected from ::1 as mosqpub|1740-debian (c1, k60). 1499668529: Sending CONNACK to mosqpub|1740-debian (0, 0) 1499668529: Received PUBLISH from mosqpub|1740-debian (d0, q0, r0, m0, 'sensors/devicename/temperature', ... (5 bytes)) 1499668529: Sending PUBLISH to mosqsub|1739-debian (d0, q0, r0, m0, 'sensors/devicename/temperature', ... (5 bytes)) 1499668529: Received DISCONNECT from mosqpub|1740-debian 1499668529: Client mosqpub|1740-debian disconnected. 终端 2: mosquitto_sub -d -t sensors/devicename/temperature Client mosqsub|1739-debian sending CONNECT Client mosqsub|1739-debian received CONNACK Client mosqsub|1739-debian sending SUBSCRIBE (Mid: 1, Topic: sensors/devicename/temperature, QoS: 0) Client mosqsub|1739-debian received SUBACK Subscribed (mid: 1): 0 Client mosqsub|1739-debian received PUBLISH (d0, q0, r0, m0, 'sensors/devicename/temperature', ... (5 bytes)) 31deg 终端 3: mosquitto_pub -d -t sensors/devicename/temperature -m 31deg Client mosqpub|1740-debian sending CONNECT Client mosqpub|1740-debian received CONNACK Client mosqpub|1740-debian sending PUBLISH (d0, q0, r0, m1, 'sensors/devicename/temperature', ... (5 bytes)) Client mosqpub|1740-debian sending DISCONNECT 运行时可能遇到的问题及解决办法: (1)mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory 解决办法: sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1 Eclipse Paho The Eclipse Paho project provides open-source client implementations of MQTT and MQTT-SN messaging protocols aimed at new, existing, and emerging applications for the Internet of Things (IoT). 项目包含了多种语言的 MQTT 客户端库。 EMQ EMQ 杭州小莉科技 EMQ 2.0 完整支持 MQTT V3.1/V3.1.1 版本协议规范,并扩展支持 WebSocket、Stomp、CoAP、MQTT-SN 或私有 TCP 协议。EMQ 2.0 消息服务器支持单节点 100 万连接与多节点分布式集群。 VerneMQ VerneMQ is a high-performance, distributed MQTT broker. It scales horizontally and vertically on commodity hardware to support a high number of concurrent publishers and consumers while maintaining low latency and fault tolerance. VerneMQ is the reliable message hub for your IoT platform or smart products.VerneMQ is based on Erlang OTP, the best technology currently available to build highly scalable messaging systems. This enables VerneMQ to scale horizontally and vertically by fully utilizing multicore architectures....