zoukankan      html  css  js  c++  java
  • 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位,包含大小写字母、特殊字符各一

  • 相关阅读:
    (转)获取/设置IFRAME内对象元素的几种JS方法
    XML校验之sun.tools.internal.xjc.Driver
    iframe自适应高度 (转)
    iframe根据内容自动增长 zz (转载)
    java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.getMergedRegion
    jQuery取得select选中的值
    Mysql 语句大全
    Mysql 基础语句
    System.getProperty()方法大全
    一个对象什么时候才能被回收?
  • 原文地址:https://www.cnblogs.com/sjqlwy/p/communication_with_galileo.html
Copyright © 2011-2022 走看看