ThingSpeak — IoT platform

Docker安装方法

https://area51.onl/Docker/ThingSpeak

记录/查询数据

数据记录在channel上,channel可以通过api(传递用户的api key进行验证)或者在管理后台直接创建。每个channel可以有最多8个field,每次上传的数据不覆盖之前的,而是并存作为feeds,代表历史记录。获取数据的时候,可以获取整个历史记录,也可以只获取最新数据。

上传/添加数据

api_key为某个channel的api write key,field1参数表示字段1的值,同时还可以制定其他字段。所有字段都存储在mysql中,字段类型是varchar(255)

可以用GET或者POST方法。

查询数据

某通道所有历史记录(feeds)

key参数名也可以写成api_key

加results参数限制返回的feeds数量,从最新的开始算起

以上两种方法的response除了包括feeds,还会包括 channel的信息

返回最后一条feed

更多feeds查询api参考Get a Channel Feed,提供的功能包括

  1. Get Last Entry ID in a Channel
  2. Get Age of Last Entry in Channel Feed。返回最新的feed距当前时间过了多少秒
  3. Get Specific Entry in a Channel

Status

每个channel/feed除了有最多8个field用于存储数据外,还有status字段。status主要用于存储设备的状态,之所以将其独立成一个特殊的字段,而不是作为一个field来存粗,是因为thingspeak可以提供专门的api进行查询。比如Get Status Updates这个api就可查询某个通告的status状态变化记录。

即便有些设备并没有状态的概念,由于有这个api的存在,我们也可以将我们需要跟踪的某些不经常变化属性,可以是设备本身具有的属性或者通过计算得到的值,存在status字段里面。然后可以通过这个api查询其变化记录。

不过,这个api的实现有点让人无语,因为它实际上返回的是所有feeds,并没有过滤掉重复的status,它做的只是返回包括status在内的几个字段。

app,数据监控

thingspeak可以定义app,当数据满足特定条件时触发操作,app有几类

React

React app的功能概括起来很简单,基本格式就是当满足特定条件的时候执行其他app。

这个条件的定义,比较常见的,是指定特定通道的特定字段满足某些条件。尽管field在数据库中以varchar的类型存储,但是React允许我们指定包括String, Numeric等条件,也就是会自动将field的值转化为数值型再进行对比。ThingHTTP app。当调用ThingHTTP app的时候,会传递%%channel_id%%参数,以及%%trigger%%,分别代表React app中指定的通道的id以及触发动作的field的值。这些参数叫做replacement,关于replacement的使用见下面ThingHTTP一节。

React app可以设置为每次定义的条件满足时(比如每次某个通道的某个字段的值超过设定的阈值)都触发动作,或者只有第一次满足条件的时候触发。比如如果设置temperature通道的temp字段大于50时执行一个ThingHTTP动作,并且只在第一次触发,则假定设备端上报的temp数据序列是23, 34, 49, 51, 55, 35, 20, 则整个过程只有在发送temp为51这一次会执行ThingHTTP动作

ThingHTTP

一个ThingHTTP app定义一个http请求及其参数,这个http请求可以通过其他app比如React app触发,也可以通过其他应用程序发送一个POST请求到thingspeak的一个endpoint触发。

这个ThingHTTP app的请求可以用GET或POST方法,可以定义body,并且body中可以使用replacement。replacement实际上相当于占位标记,实际的值由React app或者其他应用程序中的POST请求传递。前面说过,由React app触发ThingHTTP的时候,ThingHTTP app的body中可以用%%channel_id%%及%%trigger%%代表触发动作的通道id及触发的字段值。除此之外,ThingHTTP中还可以使用任何其他自定义的占位符,比如%%message%%,这些占位符的值通过其他应用程序传递,传递的方法可以是GET方法里面的query string,也可以是POST方法里面的form data。

TalkBack

这个app可以将一系列command存储到一个队列里面,然后提供一个api让设备定期去查看是否有未执行的command,有则获取并执行。command是自定义的,一般定义为类似程序语言里面的常量,比如”OPEN_DOOR”, “CLOSE_DOOR”。

操作流程可以是手机app要操作设备,则调用api添加一个command,设备端定期查找command并执行。这样的做法,一个是浪费流量,再一个实时性肯定是不高的。

emqttd tls访问

如果采用emqttd自动创建的证书,golang客户端使用paho.mqtt.golang连接的时候会出错”Network Error : x509: certificate has expired or is not yet valid”

如果采用Let’s Encrypt创建的证书,默认放在/etc/letsencrypt/live/your-domain/目录下,虽然证书文件是任意用户都有读的权限,但是上层目录中有些是只有root用户有访问权限的。所以,如果你直接在emqttd中配置使用这一目录下的证书文件,客户端会出错

因此,需要把证书文件和key文件移到emqttd运行用户有权限访问的地方

即便如此,golang客户端使用paho.mqtt.golang连接的时候,Let’s Encrypt颁发的证书也跟服务器自己创建的证书一样,被认为是不可信的,因此需要客户端将ClientOptions.TLSConfig.InsecureSkipVerify设置为true才能连接成功。

使用Let’s Encrypt生成证书

访问网站也好,或者开发者使用tcp协议连接某些服务,那么默认传输的数据是不经过加密的。为了安全起见,可以在tcp与应用层之间加一个tls协议层,它的作用就是对应用层传递给tcp层的数据进行加密。

我们访问一个网页的时候,如果用的是https协议,那说明协议栈从下到上分别是tcp > tls > http,注意并没有https这么一个协议,https实际上是指tls + http。我们访问https网页的时候,浏览器要验证服务器的证书,而服务器的证书可以自己生成,也可以向特定的机构付费申请。如果证书不是专门机构颁发的,那么浏览器会警告用户,认为证书不是官方机构颁发的,存在风险。

且不说向官方机构申请证书的费用怎样,但申请流程并不是那么透明,需要花一定的经历去研究,搞不好还得请代理进行办理。这就影响了https的应用,很多站点觉得麻烦,就直接用http。

Let’s Encrypt就是为解决这一问题,让你可以很容易的从Let’s Encrypt获取证书。这里Let’s Encrypt扮演的角色就相当于一个证书颁发机构。具体申请方法我就不做说明了,请参考其官网。

作为证书颁发机构,他们颁发的证书之所以被认为是可信的,是因为他们自己也有一个证书,应用程序(比如浏览器,或者开发者使用的开发包)会存储这些机构的证书的信息。Let’s Encrypt作为一个比较新证书颁发机构,并不是所有应用程序都认为其是可信的。

这里对Let’s Encrypt颁发的证书在哪些应用程序中可信做个记录

截至本文发布的时间,2016-09:

Let’s Encrypt的证书在chrome最新浏览器中直接可用

Firefox的现象比较诡异,Let’s Encrypt官方的说法是Firefox 50版本(目前49,大概2016年底会出50)才会支持,我把Let’s Encrypt颁发的证书配置在nginx web服务器上,用Firefox访问也确实会提示证书不可信。但是如果我用Firefox先访问https://mosquitto.org,这个网站也是用Let’s Encrypt颁发的证书,它能够被正常访问,那么之后我再访问自己搭建的nginx网站就可以了。可能mosquitto有做什么特殊处理,或者他申请Let’s Encrypt证书的方式/参数不太一样,使得Firefox可以信任这个证书了。

另外,我还绛Let’s Encrypt颁发的证书配置在emqttd服务上,当golang客户端应用程序通过开发包paho.mqtt.golang连接这个服务的时候,会出错”Network Error : x509: certificate signed by unknown authority”。这个错误跟使用服务器自己创建的证书是一样的。

golang的net/http包发送https请求,也会出错”Network Error : x509: certificate signed by unknown authority”

树莓派修改系统桌面背景图片

树莓派系统版本

手动(UI)方法

在桌面空白处右键 => Desktop Preferences

在弹出的对话框中,选择Appearance tab,然后在Wallpaper中选择新的背景图片,Wallpaper mode中可以对背景图片的拉伸等进行配置

Terminal方法

上面手动方法中,Desktop Preferences对话框的设置都存储在文件 /home/pi/.config/pcmanfm/LXDE-pi/desktop-items-0.conf 中

因此,只需要修改这个文件,将wallpaper的值设置成新的背景图片地址就行了。用sed命令可以在terminal下直接修改

 

one-wire转RS232

one-wire是一种比较常见的传输协议,比如ds18b20温度传感器,以及有些RFID读卡器都是使用one-wire传输数据。

树莓派有one-wire接口,可以直接连这些设备,但是PC上就没有one-wire接口了。对于PC,我们可以将one-wire接口转化为RS232,PC上一般会留有RS232接口,如果没有的话使用usb转RS232也能给PC提供RS232接口。而且usb转RS232也适用于树莓派。

下面就one-wire转RS232接口的电路设计做一个简要的介绍。

硬件准备

  • 一个USB转RS232接口(公头),RS232接口有公和母之分,公的就是有针凸出来的,母的就是有孔凹进去的。PC的RS232接口也是公头的,如果PC上有RS232接口,可以不用另外接USB转RS232。
  • 一个 DB9 母头接插件/焊板
  • 一个 6.2V Zener 二极管 (1N5234)
  • 一个 3.9V Zener 二极管 (1N5228)
  • 两个 Schottky 二极管 (1N5818)
  • 一个 1.5 k 的电阻
  • 一个 两脚的接线端子
  • 一片perfboard 也叫万用板,开发板。一般分两种,一种是单纯一个点一个点的,点与点之间没有锡线连接。另一种就是有锡线将点连成几排,叫做斑马线,对于我们这里要设计的电路,使用斑马线perfboard会更方便焊接。但是我制作的时候没有经验,买了单纯是点的。
  • 一个 DS18B20 温度传感器,作为测试one-wire的设备

usb-rs232

diolts

ds18b20

这写硬件设备,除了DS18B20,其他的都能在京东的 高科美芯电子元器件专营店 找到,不是做广告,这家电东西不便宜,但是相对品种齐全一点,省得这家买点那家买点。

另外,USB转RS232转接线,有些卖家买的商品会带驱动光盘,但我买的绿联的产品在ubuntu 14.04 LTS下是免驱的,相信这种设备也不需要驱动。

DS18B20温度传感器有两种,一种是上图中的小器件,一边曲面一边平面,把平面面向自己,针脚朝下,从左到右分别是GND,DATA,VCC。还有一种是防水的,一个笔芯形状的探头,接线出来,总共三根线,红色是VCC,黑色是GND,蓝色是DATA。

电路设计

在介绍one-wire转RS232的电路之前,有必要说明一些RS232各针脚的序号。RS232也叫DB9、串口,有9个针脚,序号分别是1到9。无论是PC上的RS232接口,还是DB9接插件,USB转RS232,以及RS232的公母转换,都会对各个针脚分别标记序号。如果你有需要将各种RS232口连接在一起,比如PCRS232公头,经过一个母头对公头的线延长出来,必须保证连接的时候将序号对上,否则最后的序号可能就是错的。

除了根据标记的序号来找到各针脚,还有一个方法,以USB转RS232为例,将RS232端面向自己,5针的一排在上,从左到右分别是1到5,4针的一排在下,从左到右分别是6到9。不管中间接了多少RS232的线和接口,只要一端接PC,另一端面向自己,将向着自己的这端按照上5下4摆好,就可以根据下图所示得到各针的序号。

RS232

认准了序号,再根据序号按如下电路图将设备焊接在perfboard上,或者在焊接之前在bread board上连线测试。需要注意的是,二极管是有正负极的,负极用一根横线标记。

电路图-new

 

上图中的RS232,是从PC端的视角来看得,因此看起来和我们上面说的针脚序号是相反的,下图是焊接好的效果

IMG_20160705_131613 IMG_20160705_131555

DS18B20测试

前面已经将一个DS18B20传感器接到我们的one-wire转RS232接口上了,one-wire接口支持多个设备直接并联,因此实际上我们可以接多个DS18B20传感器。接下来,把我们的产品通过USB转RS232接到PC或者树莓派上,然后就可以在PC或树莓派上查看DS18B20检测到的温度了。

以安装了Ubuntu 14.04 LTS系统的PC为例。

首先安装digitemp

$ sudo apt-get install digitemp

试图找到digitemp命令,会发现没有,而是以digitemp开头的一系列其他命令

yanzs@ubuntu-64:~/linphone/python$ digitemp_DS
digitemp_DS2490   digitemp_DS9097   digitemp_DS9097U
yanzs@ubuntu-64:~/linphone/python$

应该是这些命令分别针对不同型号的温度传感器吧,对于DS18B20,我们要用的是digitemp_DS9097

先搜索连接的传感其设备:

yanzs@ubuntu-64:~/$ sudo digitemp_DS9097 -s /dev/ttyUSB0 -i
[sudo] password for yanzs:
DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane
GNU General Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
..
Searching the 1-Wire LAN
28FFF0DC521604EE : DS18B20 Temperature Sensor
28FF3718441603B2 : DS18B20 Temperature Sensor
ROM #0 : 28FFF0DC521604EE
ROM #1 : 28FF3718441603B2
Wrote .digitemprc
yanzs@ubuntu-64:~/$

-s选项指定RS232接口,我们这里使用USB转RS232,而USB接口的设备对应/dev/ttyUSB0。如果没用USB转RS232,而是直接接了PC的RS232接口,那么-s参数应该指定/dev/ttyS0。

-i选项表示搜索支持的设备

从输出可以看到,digitemp找到了两个DS18B20温度传感器,序列号分别为28FFF0DC521604EE和28FF3718441603B2,每个DS18B20都有一个固定的序列号,可以将其贴在设备上以做区分。搜索到设备后,digitemp将搜索到的设备信息写入文件.digitemprc文件中

然后我们就可以根据.digitemprc文件中的设备信息读取温度了

yanzs@ubuntu-64:~/linphone/python$ sudo digitemp_DS9097 -s /dev/ttyUSB0 -a
DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane
GNU General Public License v2.0 - http://www.digitemp.com
Jul 05 17:37:31 Sensor 0 C: 29.06 F: 84.31
Jul 05 17:37:32 Sensor 1 C: 29.06 F: 84.31
yanzs@ubuntu-64:~/linphone/python$

从输出可以看出,两个传感器读取到的温度都是摄氏29.06,或者华氏84.31度,如果将防水的温度传感器插入水中,可以看到两个传感器的温度差别,同样环境下一般水温会比气温低几度。

长距离传输

前面是直接将DS18B20传感器接在接线端子上了,为了将传感器接到更远的距离或者多个位置,可以5类线接接线端子,另一端拉到要测试温度的地方再接传感器,这样one-wire的传输距离三四十米是没有问题的。

pjsip/pjsua

默认情况下,sip请求,包括REGISTER和INVITE都是,发送到创建AccountConfig时指定的domain服务器,并且使用5060端口。需要指定其他端口,指定domain的时候可以使用”domain-ip:port”的形式。

树莓派UART

术语:

UART:universally asynchronous receiver/transmitter

TTL serial:transistor-transistor logic,UARTs transmit one bit at a time at a specified data rate (i.e. 9600bps, 115200bps, etc.). This method of serial communication is sometimes referred to as TTL serial (transistor-transistor logic). Serial communication at a TTL level will always remain between the limits of 0V and Vcc, which is often 5V or 3.3V. A logic high (’1′) is represented by Vcc, while a logic low (’0′) is 0V.

 

树莓派使用BLE模块HM-05 zs-040

与树莓派接线

raspberry-pi-bluetooth-02

上图中HM-05接的4个针脚从左到右分别是:RXD,TXD,GND,VCC

注意HM-05的RXD与树莓派的TXD相接,而TXD与树莓派的RXD相连,所以一端的发送连的是另一端的接收。

按照上面方法接线,并且树莓派上电之后,可以看到HM-05模块上的灯快速闪烁(大概每秒4次)。

工作模式

同样是按照上图指示的接线方式,通过上电时是否有按住靠近EN引脚的按钮,可以将HM-05置于不同的工作模式

Communication mode

直接通电,不按按钮,HM-05进入Communication mode。在这个模式下,HM-05指示灯快速闪烁,大约每秒4次。

此时,如果某个智能手机没有匹配过该HM-05模块(或者曾经匹配过,但之后又删除了),则匹配(需输入pin码1234)之后指示灯闪烁方式会改变,变成大约两秒闪一次。只不过,这种 两秒闪一次的状态下重新上电(匹配的智能手机仍在范围内)又会进入每秒4次的快闪。

不论HM-05是在每秒4次的快闪状态还是在每两秒1次的匹配成功状态,都可以通过安卓的BlueTerm进行连接,连接成功之后,HM-05指示灯每隔两秒会快速连续地闪烁两次。

AT mode

在HM-05断电状态下,按住靠EN引脚的按钮,然后上电,上电之后松开按钮。此时HM-05就进入AT mode了,在此模式下,HM-05指示灯亮2秒暗两秒,一直重复。

在AT mode,智能手机无法通过系统设置与其配对,BlueTerm也

Communication mode下的一些应用

serial console

默认情况下,树莓派会将开机信息通过串口发送出去,并且系统启动之后通过串口启动一个会话,允许外部设备通过串口登录树莓派并执行命令。HM-05就支持与树莓派进行串口通信,同时如果外部设备(比如带蓝牙功能的智能手机)又可以与HM-05进行蓝牙通信。因此我们可以实现将树莓派的开机信息通过串口在通过蓝牙传递到智能手机,并且系统启动之后由智能手机进行shell登录并执行shell命令。

步骤简介:

1. 配置树莓派的baud rate

默认情况下,树莓派读写串口的boud rate是115200,而HM-05默认的baud rate是9600,为了使树莓派与HM-05的串口通信能正常进行,需要使他们的baud rate一致,比如这里将树莓派的baud rate设置成9600。

修改文件/boot/cmdline.txt,将

改成

修改/etc/inittab,将

改成

2. 安卓智能手机使用BlueTerm连接HM-05

安卓手机需要先在系统设置界面里面先搜索并匹配蓝牙模块HM-05

然后安装BlueTerm应用,在 Menu菜单中选择”Connect device”

连接成功之后,可以看到HM-05模块的指示灯每隔两秒会快速闪烁一次

3. 重启树莓派,从手机登录树莓派shell

将树莓派重启,可以在手机的BlueTerm界面上看到树莓派系统的启动过程,并且启动完成之后还会提示你登录。使用pi用户登录,可以执行shell命令

minicom <=> 串口 <=> HM-05 <=> 手机BlueTerm应用程序

前面介绍了树莓派raspbian系统默认情况下会使用串口发送登录信息,并开启一个login console。如果我们需要让树莓派上的其他应用使用串口,就得先让系统自己不再占用串口。

设置系统不占用串口

修改文件/boot/cmdline.txt,去掉第一个console设置,如果有kgdboc的话也去掉,如将

改成

然后修改/etc/inittab,注释下面这行设置

改好后重启生效

使用minicom进行串口通信

我们可以在树莓派上安装minicom工具,用其通过串口将信息发送到蓝牙模块,蓝牙模块会将从串口收到的信息通过蓝牙发送出去,而蓝牙模块通过蓝牙收到的信息也会通过串口发送到树莓派上的应用程序。 首先安装minicom

然后可以运行minicom,让它连接串口,连接的时候需要指定通信的baud rate。我们前面说过,蓝牙模块的默认baud rate是9600,为了让minicom发送的数据能被HM-05正确接收,我们运行minicom的时候也要指定baud rate为9600

其中,-D参数就是指定串口设备。 运行minicom之后,将树莓派串口连接蓝牙模块HM-05,并使HM-05工作于communication mode。此时使用智能手机的BlueTerm应用程序连接HM-05,那么树莓派上minicom窗口上输入的文字就会发送到智能手机

 

参考文档 A cheap Bluetooth serial port for your Raspberry Pi

树莓派安装文字转语音工具espeak

介绍

espeak是一个文字转语音工具,默认情况下只支持英文,但通过配置可以添加其他语言。它的作用就是将一段文本转化成机器人发音(效果不是那么清晰,但要听懂没问题),可以保存成wav文件,也可以直接由plaback device播放。

源代码方式

安装espeak

安装完之后,可以测试一下效果

将英文”hellow”转化为语音并保存成文件

或者可以由espeak直接播放语音

我运行这一命令会出错,还没找到解决方法

添加简体中文支持

 

系统软件包方式

安装espeak

这样安装的espeak虽然版本会比较旧,但可以直接使用,包括保存成wav文件和直接播放语音

添加简体中文支持

在raspbian wheezy (Apr 21 18:07:59 BST 2015)这个系统下,安装了espeak 1.46.02之后,中文也能直接支持,使用方法如下:

参考文档:

http://www.eguidedog.net/doc/doc_install_espeak.php