消息服务实时消费设备状态变化和数据

阅读全文

0.准备工作

0.1 注册阿里云账号

使用个人淘宝账号或手机号,开通阿里云账号,并通过实名认证(可以用支付宝认证)

0.2 免费开通IoT物联网套件

IoT套件产品官网 https://www.aliyun.com/product/iot

消息服务官网 https://mns.console.aliyun.com/#/list/cn-shanghai

0.3 软件环境

Nodejs安装 https://nodejs.org/en/download/

Java8 安装

开发工具:Sublime Text3/ IntelliJ IDEA 

https://www.sublimetext.com/3

1.阿里云IoT控制台配置服务端订阅

阿里云IoT物联网套件开通 https://www.aliyun.com/product/iot

1.1 创建产品(基础版)

我们在阿里云IoT控制台,创建产品:空气检测,选择基础版。

1.2 在产品下添加设备

我们在阿里云IoT控制台,设备管理里空气检测产品下添加一个具体设备。

1.2 在产品下配置服务端订阅

我们在阿里云IoT控制台,为空气检测产品开通服务端订阅,勾选设备上报消息和设备状态变化通知,开通后会有MNS的区域:cn-shanghai和队列信息:aliyun-iot-a1jnUEKYhw4,如下。

通过阅读阿里云IoT文档,我们了解到队列中消息结构体如下:

复制代码

{

  "payload": "Base64 Encode的数据",

  "messagetype": "status",

  "messageid": 996000000000000001,

  "topic": "具体的设备Topic",

  "timestamp": 1526450324

}

messageid:IoT套件生成的消息ID

messagetype:指的是消息类型:设备状态status设备上报消息upload

topic:表示该消息源自套件中的哪个topic,当messageType=status时,topic为null,当messageType=upload时,topic为具体的设备Topic

payload:数据为Base64 Encode的数据。当messageType=status时,数据是设备状态数据;当messageType=upload时,data即为设备发布到Topic中的原始数据。

timestamp:队列中消息生成时间戳,并非业务的时间戳

2.设备端开发

我们采用nodejs脚本模拟设备,与IoT云端建立连接,上报数据。

2.1 获取nodejs版IoT SDK

package.json中添加npm依赖"aliyun-iot-mqtt": "0.0.4"模块

复制代码

{

  "name": "aliyun-iot",

  "dependencies": {

    "aliyun-iot-mqtt": "^0.0.4"

  },

  "author": "wongxming",

  "license": "MIT"

}

下载安装SDK

复制代码

$npm install

2.2 编写设备端应用程序代码

我们需要在控制台获取设备身份三元组:productKey,deviceName,deviceSecret,以及产品分区regionId

复制代码

/**

* package.json 添加依赖:"aliyun-iot-mqtt": "0.0.4"

node iot-mns.js

*/

const mqtt = require('aliyun-iot-mqtt');

//设备三元组

const options = {

    productKey: "RY8ExdyS6lU",

    deviceName: "officeThermometer",

    deviceSecret: "oauYYavdIV9QOt7d9WcrnIjXSNc2i26A",

    regionId: "cn-shanghai"

};

//设备与云 建立连接,设备上线

const client = mqtt.getAliyunIotMqttClient(options);

//主题topic

const topic = `${options.productKey}/${options.deviceName}/update`;

var data = {

    temperature: Math.floor((Math.random()*20)+10),

    humidity: Math.floor((Math.random()*80)+20),

};

//指定topic发布数据到云端

client.publish(topic, JSON.stringify(data));

console.log("===postData topic=" + topic)

console.log(data)

//设备下线

//client.end()

2.3 启动模拟设备脚本

复制代码

$node iot-mns.js

脚本执行后,我们在IoT云端控制台产品-日志服务里查看设备行为分析日志,根据时间顺序,我们看到

首先在10:53:05时,设备建立连接,上线;

然后在10:53:12时,设备断开连接,下线。

查看设备上行消息分析日志,根据时间顺序,我们看到

首先设备publish message,

然后流转到RuleEngine规则引擎,

最终Transmit MNS的消息队列aliyun-iot-a1jnUEKYhw4

我们切换到MNS控制台,选择华东2区域,可以看到消息队列aliyun-iot-a1jnUEKYhw4有3条活跃消息MNS控制台:https://mns.console.aliyun.com/#/list/cn-shanghai

3 消费队列中设备消息

3.1 消息服务MNS使用

我们以java开发为例,pom中添加依赖aliyun-sdk-mns,httpasyncclient,fastjson,如下:

复制代码

        

            com.aliyun.mns

            aliyun-sdk-mns

            1.1.8

            jar-with-dependencies


        

            org.apache.httpcomponents

            httpasyncclient

            4.0.1


        

            com.alibaba

            fastjson

            1.2.42



我们通过mns的sdk,创建连接,轮询获取队列消息。为了方便阅读,我们对消息的payload数据做base64解码,完整应用程序代码如下:

复制代码

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

import com.aliyun.mns.client.CloudAccount;

import com.aliyun.mns.client.CloudQueue;

import com.aliyun.mns.client.MNSClient;

import com.aliyun.mns.model.Message;

import org.apache.commons.codec.binary.Base64;

public class ComsumerDemo {

    public static String accessKeyId = "AK";

    public static String accessKeySecret = "AK秘钥";

    public static String endpoint = "mns公网Endpoint";

    public static void main(String[] args) {

        CloudAccount account = new CloudAccount(accessKeyId,accessKeySecret,endpoint);

        MNSClient client = account.getMNSClient();

        //获取消息队列

        CloudQueue queue = client.getQueueRef("aliyun-iot-a1jnUEKYhw4");

        while (true) {

            Message popMsg = queue.popMessage(10);

            if (popMsg != null) {

                System.out.println("message id: " + popMsg.getMessageId());

                System.out.println("message body: \n" + decodeBase64(popMsg.getMessageBodyAsString()));

                //删除消息

                queue.deleteMessage(popMsg.getReceiptHandle());

            }

        }

    }

    public static String decodeBase64(String jsonString) {

        try {

            JSONObject json = JSON.parseObject(jsonString);

            String payload = new String(Base64.decodeBase64(json.getString("payload")));

            json.put("payload", JSON.parseObject(payload));

            return json.toJSONString();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }

}

3.2 运行程序

控制台输出如下,我们看到1) timestamp=1526450324时,设备上线消息,

复制代码

message id: E2CF179AD5686386-2-16367878417-200000009

message body:

{

  "payload": {

    "lastTime": "2018-05-16 13:58:44.413",

    "clientIp": "42.120.74.246",

    "time": "2018-05-16 13:58:44.427",

    "productKey": "a1jnUEKYhw4",

    "deviceName": "suw8umOqgJ72yCADerZp",

    "status": "online"

  },

  "messagetype": "status",

  "messageid": 996631012001751041,

  "timestamp": 1526450324

}

2) timestamp=1526450334时,设备上报了数据,通过payload可以看到完整数据

复制代码

message id: "656A4F66B391367-1-1636787AAC0-20000000C"

message body:

{

  "payload": {

    "temperature": 14,

    "humidity": 116

  },

  "messagetype": "upload",

  "topic": "/a1jnUEKYhw4/suw8umOqgJ72yCADerZp/update",

  "messageid": 996631053735047169,

  "timestamp": 1526450334

}

3) timestamp=1526450353时,设备下线消息

复制代码

message id: E2CF179AD5686386-2-1636787F5F1-20000000A

message body:

{

  "payload": {

    "lastTime": "2018-05-16 13:59:04.381",

    "time": "2018-05-16 13:59:13.571",

    "productKey": "a1jnUEKYhw4",

    "deviceName": "suw8umOqgJ72yCADerZp",

    "status": "offline"

  },

  "messagetype": "status",

  "messageid": 996631134240534528,

  "timestamp": 1526450353

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 导语 翻译自iot in five days 8.2 MQTT是什么?MQTT(formerly MQ Telem...
    happy1993阅读 6,529评论 1 14
  • 随着物联网(Internet of Things,IoT)的兴起,机器之间(Machine-to-Machine,...
    登高且赋阅读 12,472评论 0 18
  • 假设上周六晚上,你们全家在一家饭店就餐。请你根据以下要点提示,用英语写一篇短文,描述事情发生的经过,并适当加以评论...
    咚呱英语培训阅读 782评论 0 0
  • 然而,心情并不是这样,于是想写一个听过的故事。 我有一个同事,家里养了一条很可爱的大金毛,非常善良,很多事情她都是...
    夏及0412阅读 346评论 2 2