Galileo Gen2 之MQTT通讯

前言

原创文章,转载引用务必注明链接。如有疏漏,欢迎斧正。
Galileo系统:完整版Yocto,内核版本3.8.7-yocto-standard;宿主机:Windows 7 64 bit
这期主要讲如何与Galileo G2进行交互。主要学习MQTT协议。文首两幅示意图是我自己画的。

这里手机和Galileo通过网络(无线或者有线网)连接,当然也可以选用BLE或者ZigBee之类。然后是通讯协议的选择,固然TCP/IP协议很成熟,但是对于物联网嵌入式应用来说,略显臃肿。目前物联网常用的协议包括CoAP、MQTT、XMPP、RESTful HTTP等,这里介绍应用最为广泛的MQTT协议。关于各种协议之间的差别,可以查看这篇文章

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。
MQTT协议的基本概念:
【MQTT协议特点】——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
【MQTT协议角色】——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者_pub(lisher),代理器(服务器)-broker和订阅者-subcriber。
【MQTT协议消息-m(essage)】——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。
【MQTT协议主题-t(opic)】——MQTT中的主题可理解为相同类型或相似类型的消息集合。


Via
注意:以下仅作功能演示,暂时不要用于生产环境。记得开启密码验证。

1、 Galileo G2 安装mosquito

Galileo G2的系统镜像及软件仓库里没有预编译的mosquito程序包,需要手动编译。好在编译步骤并不复杂,过程比较顺利没有出错。

1.1 更新系统并下载程序源代码

opkg update && mkdir ~/mqtt && cd ~/mqtt
wget http://mosquitto.org/files/source/mosquitto-1.4.9.tar.gz
# 目前最新版是1.4.9,可以去链接中的mosquito.org官网查看。

1.2 解压缩源代码文件

tar xzf mosquitto-1.4.9 && cd mosquitto-1.4.9

1.4 进行编译

make WITH_SRV=no
# 编译过程大约需要5min

1.5 安装编译好的mosquito

# 安全起见创建mosquito用户
adduser mosquitto
# 安装
cp client/mosquitto_pub /usr/bin
cp client/mosquitto_sub /usr/bin
cp lib/libmosquitto.so.1 /usr/lib
cp src/mosquitto /usr/bin

2、安装手机控制端

这里以安卓为例,使用MQTT Dashboard程序,MQTT Broker 用http://www.mqtt-dashboard.com/演示,端口号1883。当然,也可以在Galileo上启用broker,以下截图部分借用之前我发表的博客文章。

MQTT Dashboard是我用过几个后能满足要求的APP,谷歌商店有,如果无法访问Google Play可以从这里下载手动或者使用apkpure.com提供的软件市场,包含了大部分谷歌商店的应用内容。我上传的百度网盘地址:链接: http://pan.baidu.com/s/1c2oL6DE 密码: 4kb2

手机客户端初始界面:

Subcribe界面很简单,就是简单的接收信息。

Publish界面(这些控件都可以自定义):

Caution

公共MQTT Broker服务器仅作演示用,因为很容易被别人嗅探到内容最好搭建自己的Broker或者使用后文即将介绍的PubNub服务

MQTT dashboard是我试用几个之后符合要求,自定义强的方案,如果有对其他方案感兴趣的可以PM我

3、Galileo服务端

这个类似微信公众号后台,负责对命令进行响应、发送反馈信息。

在嵌入式设备上自己写服务端,除了C、C++、汇编语言之外,还有其他选择:

  1. eLua

    Lua本来就很小,Embedded Lua更小。

    eLua

  2. Micro Python

    人生苦短,继续用 Python。

  3. Espruino

    Javascript 凭借 NodeJs 入侵服务器攻势正猛,同时抢滩登陆嵌入式。

(作者:tangram 链接:https://www.zhihu.com/question/27835930/answer/41125908)

后文我们将选择一门编程语言进行演示。

4、基本的MQTT交互功能演示

从Galileo上发送消息给订阅者们(这里是我的安卓手机):

手机收到了:

天气预报小示例

每小时从百度API获取一次天气,如果下雨,就向手机推送信息提醒带伞或者控制小灯来显示天气情况(绿色——晴天;红色——下雨;蓝色——阴天)。

因为平时喜欢使用shell脚本编程,这里用curl来调用百度API

从百度API上随便找一个免费的天气服务,记下自己的apikey,下面有详细的调用方法,这里用curl调用。查询天气脚本内容如下:

#/bin/sh
curl --get -s --include 'http://apis.baidu.com/apistore/weatherservice/weather?citypinyin=nanjing' -H 'apikey:你的APIKEY' |grep -q "u96e8" && /usr/bin/mosquitto_pub -t galileo -m "It was going to rain!" -h broker.hivemq.com

增加执行权限并添加计划任务。
效果就是每小时获取南京的天气,如果有雨,就向订阅者发送信息。

  • |、&&、||操作符比较有意思,有兴趣的可以看看。
  • 注意-s 和 -q选项哟。“u96e8”是unicode”雨“的意思

5、下一步计划

5.1 完善“使用mqtt协议控制台灯”

官方提供了三种IDE集成开发环境:

  • Intel® XDK IoT Edition(JavaScript/Node.js)
  • Intel® System Studio IoT Edition(C/C++/Java)
  • Arduino

两种控制IO接口的库:

下一步将演示使用Intel XDK IoT Editon, 通过node.js和MQTT broker平台PubNub搭建响应端,通过手机控制台灯开关,以及读取传感器数值。

5.2 使用wyliodrin

之前使用Udoo Neo的时候看到这个项目,很不错,烧录程序、编程可以摆脱数据线的束缚了,基本完成了,有些问题待解决,近期分享出来。

5.3 编译Yocto镜像

之前一段时间在折腾这个,但是遇到了许多问题,下面将会把这个搞定,不然很多事情做不了。

6、拓展阅读

非常棒的MQTT协议入门与理解,这个博客真的非常棒,感谢博主的分享!

https://software.intel.com/en-us/blogs/2015/02/20/building-and-running-mosquitto-mqtt-on-intel-edison

https://communities.intel.com/thread/64058

https://software.intel.com/en-us/iot/hardware/devkit

官方提供了三种IDE集成开发环境:

  • Intel® XDK IoT Edition(JavaScript*/Node.js)

  • Intel® System Studio IoT Edition(C/C++/Java)

  • Arduino

两种控制IO接口的库:

密码要求比较高,至少8位,包含大小写字母、特殊字符各一

posted @ 2018-07-20 22:32  思兼  阅读(...)  评论(...编辑  收藏