前言

原创文章,转载引用务必注明链接。如有疏漏,欢迎斧正。

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更小。

  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位,包含大小写字母、特殊字符各一

Galileo Gen2 之MQTT通讯的更多相关文章

  1. 【Qt官方MQTT库的使用,附一个MqttClient例子】

    Qt官方MQTT库的使用,附一个MqttClient例子 开发环境:win7 64 + Qt5.9 记录时间:2018年3月11日 00:48:42 联系邮箱: yexiaopeng1992@126. ...

  2. 玩转MQTT-阿里云之MQTT使用

    引言 前两年买一款物联网控制板,当时把玩了一阵之后,验证了下串口通讯.MODBUS协议实现.TCP/UDP/DNS/MQTT通讯(基于GPRS)后,就放到角落里吃灰了呵. 最近收到阿里云的优惠推送,说 ...

  3. Using 1-Wire device with Intel Galileo

    Using 1-Wire device with Intel Galileo 3 Replies Many people have had trouble with getting 1-Wire de ...

  4. Intel Galileo驱动单总线设备(DHT11\DHT22)(转)

    Intel Galileo一代的IO翻转速度不够,无法直接驱动单总线设备,二代听说改进了,但没有库,于是国外开发者想出了另一种法子,转过来给大家学习下.如果后面有时间,再来翻译.原文地址:http:/ ...

  5. 使用RabbitMQ搭建MQTT服务

    由于近期公司需要搭建一套物联网采集环境,底层设备采用MQTT协议传输数据.服务器环境为linux,考虑到现有环境已经有RabbitMQ环境,Rabbit是基于AMQP协议开发的一套高效的消息传输队列. ...

  6. DFRobot万物互联大赛第一轮

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. DF搞的这个比赛还挺有趣:micro:bit × OBLOQ DF创客社区玩转物联网挑战赛,一边在写文章一边在爱奇艺上看着印度电影 ...

  7. ObjectiveC-MQTT初次接触

    首先iOS与mac端用的框架是:https://github.com/ckrey/MQTT-Client-Framework 使用CocoaPods导入 pod 'MQTTClient/Websock ...

  8. Arduino 翻译系列 - LED 灯闪烁

    原文地址 - https://www.arduino.cc/en/Tutorial/Blink 闪烁 这个例子展示了你能拿 Arduino / Genuino 板子来干的最简单的事:使开发板上的 LE ...

  9. 阿里云ACE共创空间——MQ消息队列产品测试

    一.产品背景消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架构 ...

随机推荐

  1. 【转】网页游戏能用PHP做后端开发吗? PHP Libevent扩展安装及应用

    网页游戏能用PHP做后端开发吗? 当然可以.最好走HTTP,也可以做网络编程,而且写代码超简单,1个函数就可以建一个服务器端.stream_socket_server()多线程不是什么好主意,你可以用 ...

  2. 异常为"当IDENTITY_INSERT设置为OFF时" 解决办法

    当 IDENTITY_INSERT 设置为 OFF 时,不能向表"A" 中的标识列插入显示值. 一般来说是自增ID造成的. 因此可以在数据库insert语句前加上 SET iden ...

  3. BZOJ 1057:[ZJOI2007]棋盘制作(最大01子矩阵+奇偶性)

    [ZJOI2007]棋盘制作                                          时间限制: 20 Sec 内存限制: 162 MB[题目描述]国际象棋是世界上最古老的博 ...

  4. C#如何定义一个变长的一维和二维数组

    1.假设将要定义数组的长度为程序执行过程中计算出来的MAX List<int> Arc = new List<int>(); ; i < MAX; i++) { Arc. ...

  5. SPOJ 10628 Count on a tree(Tarjan离线 | RMQ-ST在线求LCA+主席树求树上第K小)

    COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to  ...

  6. 糗事百科python爬虫

    # -*- coding: utf-8 -*- #coding=utf-8 import urllib import urllib2 import re import thread import ti ...

  7. iOS 代理为啥要用weak修饰?

    在开发中我们经常使用代理,或自己写个代理,而代理属性都用weak(assign)修饰,看过有些开发者用strong(retain),但并没发现有何不妥,也不清楚weak(assign)与strong( ...

  8. BZOJ 1132 Tro

    Tro [问题描述] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 [输入格式] 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...

  9. bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基

    题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...

  10. VIM使用技巧13

    在插入模式中,如果输入出现了微小的错误,按照常规是按esc退出插入模式,使用命令修改,其实有更为简单的解决方案: 假如:在以下代码: 1 #include <stdio.h>  2 #de ...