MQTT实战篇(转载)

前几篇文章我们介绍了MQTT协议本身,虽然非常适合物联网项目,但是在项目实施的时候有诸多不便:mosquitto等开源产品可扩展性不佳、需要自己签发X509证书、认证与授权不灵活、MQTT服务需要自己运维等。所以,在实施物联网服务的时候,应该采用云端的托管服务,以便聚焦物联网业务,而不是为了基础架构和运维烦恼。
这次我们将通过百度开放云物联网服务IoT来体验一下云端的MQTT托管服务是一个什么样的体验。

背景

百度开放云物联网(IoT)服务是一个全托管的云服务,帮助建立设备与云端之间安全可靠的双向连接,以支撑各种类型的物联网项目,而无需考虑服务的运维。
  使用物联网服务提供如下好处:

  1. 从设备到云端以及从云端到设备可靠地进行大规模消息传输。
  • 对设备认证与权限管理,并保证数据安全传输。
  • 支持多种语言开发,兼容主流硬件设备。
  • 与大数据服务无缝对接,以数据分析驱动业务进步。

为了更好地支持设备与云端之间的互联互通,百度开放云物联网服务原生支持MQTT(Message Queuing Telemetry Transport)协议。MQTT是基于二进制消息的发布/订阅编程模式的消息协议,最早由IBM提出的,如今已经成为OASIS规范。与HTTP、CoAP、XMPP等协议相比,MQTT协议有以下的优势:

  • MQTT基于TCP,在反控设备的时候比CoAP等基于UDP的协议更可靠,比如使用3G通讯的时候需要专门实现CoAP over TCP,否则反控很不稳定。
  • MQTT异步Pub/Sub实现,好比发个短信,无需等待对方确认便可以继续,而不像HTTP、CoAP那样必须等待对方应答才能返回的同步模式。
  • MQTT为物联网提供了许多体贴的设计,比如QoS,比如“遗言”等设计。
  • MQTT是二进制格式,比XMPP更轻量级。

总之,通过支持轻量级可扩展的MQTT,百度开放云物联网服务非常适合需要低功耗和网络带宽有限的物联网场景,国外的公有云供应商如AWS、Azure、Bluemix等都以各种形式加入了对MQTT的支持。
  使用物联网服务的参考架构如下:


  为了保障安全,开放云物联网服务的MQTT通讯都是通过SSL加密的,确保消息不会被监听与篡改。

要使用百度物联网服务,请到这里申请测试。目前提供的是基于命令行的用户体验,可以参考入门指南配置Python环境并下载命令行工具。

运维体验

百度物联网服务分为运维人员体验和开发人员体验两部分。首先让我们来看运维人员体验。
  首先需要创建IoT实例,以容纳多个设备、身份、策略等资源:

bce.py iot create-endpoint --endpoint-name "smart-project"

在实例下面可以创建一或多个设备:

bce.py iot create-thing --endpoint-name "smart-project" --thing-name "sensor-100"

成功创建设备后,系统返回username,是用来作为标识符与MQTT服务交互的。
  下面进行权限管理,保证设备能够对特定的主题订阅发布消息。
  首先需要创建一个或多个身份(Principal)来代表物联网服务中的认证主体。对于物联网服务,权限绑定在身份而不是设备上的,这样用户可以为每个设备创建不同的身份,或者设备共享一个身份,非常灵活:

bce.py iot create-principal --endpoint-name "smart-project" --principal-name "sensor-principle"

身份创建成功后,服务返回password。这里需要说明一下,这边的password其实是个密钥,只要能提供这个密钥,系统便会赋予相应的身份。换句话说,上面创建的sensor-100可以提供这个密钥以获得sensor-principle身份,sensor-200如果能够提供同样的密钥,系统也会把它辨识成同样的身份,拥有身份上面所对应的一切权限。
  用以下命令把这个身份绑定在设备上:

bce.py iot attach-thing-principal --endpoint-name "smart-project" --thing-name "sensor-100" --principal-name "sensor-principle"

下面创建策略(Policy),以控制对消息主题的订阅发布等操作权限。比如,用于订阅和发布某公司B楼第5层的温度的主题,实现方式如下:

bce.py iot create-policy --endpoint-name "smart-project" --policy-name "b-5-temperature-policy" --topic="building-b/floor-5/temperature" --operation=PUBLISH --operation=SUBSCRIBE

创建策略成功后,便可以绑定到身份上,拥有这个身份的设备sensor-100便继承了对主题的订阅发布权限:

bce.py iot attach-principal-policy --endpoint-name "smart-project" --policy-name "b-5-temperature-policy" --principal-name "sensor-principle"

运维人员体验至此结束,物联网服务已经包含了一个设置好了访问权限的设备。

开发体验

下面我们看一下开发人员体验。
  本质上开发人员只需要按照MQTT协议编程即可,具体的规范请参考http://mqtt.org/。实际上,由于MQTT是物联网的标准协议,有着丰富的客户端支持,比如Eclipse基金会提供的Paho支持Windows/Unix/Mac/Android/RTOS上C/C++/Java/Python/JavaScript/.Net语言的开发。
  这里我们就以NetBeans开发环境编写Java应用为例。新建一个Java应用程序类型的Maven项目,右击“依赖关系”选择添加依赖关系,查询org.eclipse.paho,并加入对org.eclipse.paho.client.mqttv3的依赖,并在main函数中加入以下代码:

String endpoint = "smart-project";
String username = "smart-project/sensor-100";
String password = "Dm3yyvOHb7zt/uRWadfasdfMc+uDbf4j960=";
String topic = "building-b/floor-5/temperature";
 
// 创建SSL连接
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init((KeyStore)null);
TrustManager[] trustManagers = tmf.getTrustManagers(); 
SSLContext ctx = SSLContext.getInstance("TLS");

ctx.init(null, trustManagers, null);
 
// 配置MQTT连接
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setSocketFactory(ctx.getSocketFactory());
 
// 创建MQTT连接
MqttClient client = new MqttClient(endpoint, "java-client");
client.connect(options);
 
// 发送消息
MqttMessage message = new MqttMessage();
message.setPayload("15".getBytes());
client.publish(topic, message);
client.disconnect();

把以上代码植入智能设备,便可以轻松安全地向云端发送消息了。从云端向智能设备发送控制命令也很直观,这里就不再赘述了。
  可以看见,采用云端的托管物联网服务,把基础架构与运维交给云服务供应商,使得物联网项目实施高效便捷了许多。百度开放云物联网服务为物联网而生,不但提供了全托管的MQTT服务,在安全性与可扩展性方面也做下足了功夫,诚意十足。

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

推荐阅读更多精彩内容