This is a simple example showing how to use the [Paho MQTT Python client](https://eclipse.org/paho/clients/python/) to send data to Azure IoT Hub. You need to assemble the rights credentials and configure TLS and the MQTT protocol version appropriately.

send_iot-hub_paho_mqtt.py

#!/usr/bin/python

import paho.mqtt.publish as publish
import paho.mqtt.client as mqtt
import ssl auth = {
'username':"ciscohackhub.azure-devices.net/lora1",
'password':"SharedAccessSignature sr=ciscohackhub.azure-devices.net%2Fdevices%2Flora1&sig=xxxx&se=1463048772"
} tls = {
'ca_certs':"/etc/ssl/certs/ca-certificates.crt",
'tls_version':ssl.PROTOCOL_TLSv1
} publish.single("devices/lora1/messages/events/",
payload="hello world",
hostname="ciscohackhub.azure-devices.net",
client_id="lora1",
auth=auth,
tls=tls,
port=8883,
protocol=mqtt.MQTTv311)

 

 The following code will subscribe on topic f and republish on topic f2

import paho.mqtt.client as mqtt
message = 'ON'
def on_connect(mosq, obj, rc):
mqttc.subscribe("f", 0)
print("rc: " + str(rc)) def on_message(mosq, obj, msg):
global message
print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
message = msg.payload
mqttc.publish("f2",msg.payload); def on_publish(mosq, obj, mid):
print("mid: " + str(mid)) def on_subscribe(mosq, obj, mid, granted_qos):
print("Subscribed: " + str(mid) + " " + str(granted_qos)) def on_log(mosq, obj, level, string):
print(string) mqttc = mqtt.Client()
# Assign event callbacks
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
# Connect
mqttc.connect("localhost", 1883,60) # Continue the network loop
mqttc.loop_forever()

  用戶端程式偶爾需要發佈訊息,不須與 mqtt broker 保持連線的情形,可用 single() 或 multiple() 方法。這種作法比較省電

import paho.mqtt.publish as publish

# publish a message then disconnect.
host = "localhost"
topic = "tw/rocksaying"
payload = "hello mqtt" # If broker asks user/password.
auth = {'username': "", 'password': ""} # If broker asks client ID.
client_id = "" publish.single(topic, payload, qos=1, hostname=host) #publish.single(topic, payload, qos=1, host=host,
# auth=auth, client_id=client_id)

  當用戶端程式,例如感應器服務程式,經常或短週期地持續發佈訊息時,則應用連線式設計。

# coding: utf-8
import sys, os, time
reload(sys)
sys.setdefaultencoding('utf-8') import paho.mqtt.client as mqtt # If broker asks client ID.
client_id = "" client = mqtt.Client(client_id=client_id) # If broker asks user/password.
user = ""
password = ""
client.username_pw_set(user, password) client.connect("localhost") topic = "tw/rocksaying"
payload = "你好 mqtt" for i in xrange(10):
client.publish(topic, "%s - %d" % (payload, i))
time.sleep(0.01)
# 當 qos = 0, 若訊息間隔太短,就可能會漏發訊息。這是正常現象。

  實作時,可先用 mosquitto_sub 訂閱主題,以監看訊息是否送出。

訂閱主題

本節實作一個類似 mosquitto_sub 的程式,訂閱主題 “tw/rocksaying/#” 。它也是一個服務程式的基礎骨架。

# coding: utf-8
import sys, os, time, signal
reload(sys)
sys.setdefaultencoding('utf-8')
import paho.mqtt.client as mqtt client = None
mqtt_looping = False TOPIC_ROOT = "tw/rocksaying" def on_connect(mq, userdata, rc, _):
# subscribe when connected.
mq.subscribe(TOPIC_ROOT + '/#') def on_message(mq, userdata, msg):
print "topic: %s" % msg.topic
print "payload: %s" % msg.payload
print "qos: %d" % msg.qos def mqtt_client_thread():
global client, mqtt_looping
client_id = "" # If broker asks client ID.
client = mqtt.Client(client_id=client_id) # If broker asks user/password.
user = ""
password = ""
client.username_pw_set(user, password) client.on_connect = on_connect
client.on_message = on_message try:
client.connect("localhost")
except:
print "MQTT Broker is not online. Connect later." mqtt_looping = True
print "Looping..." #mqtt_loop.loop_forever()
cnt = 0
while mqtt_looping:
client.loop() cnt += 1
if cnt > 20:
try:
client.reconnect() # to avoid 'Broken pipe' error.
except:
time.sleep(1)
cnt = 0 print "quit mqtt thread"
client.disconnect() def stop_all(*args):
global mqtt_looping
mqtt_looping = False if __name__ == '__main__':
signal.signal(signal.SIGTERM, stop_all)
signal.signal(signal.SIGQUIT, stop_all)
signal.signal(signal.SIGINT, stop_all) # Ctrl-C mqtt_client_thread() print "exit program"
sys.exit(0)

  

用戶端服務

大部份 MQTT 用戶端服務程式需要同時監看與發佈訊息。例如一個感應器服務程式,它一邊得監看主題以接收來自其他程式的動作請求;另一邊得讀取感應器狀態後發佈到主題上。

Paho 提供的範例程式使用 loop_start() 方法進入內建的待命執行緒,再讓設計者於主執行緒中讀取感應器狀態與發佈訊息。如下所示:

mqttc.loop_start()  # enter a looping thread.

# main thread
while True:
temperature = sensor.blocking_read()
mqttc.publish("paho/temperature", temperature)

  

mqtt client python example的更多相关文章

  1. python mqtt client publish操作

    使用Python库paho.mqtt.client 模拟mqtt client 连接broker,publish topic. #-*-coding:utf-8-*- import paho.mqtt ...

  2. M2Mqtt is a MQTT client available for all .Net platform

    Introduction M2Mqtt is a MQTT client available for all .Net platform (.Net Framework, .Net Compact F ...

  3. go ---MQTT client

    Paho GO Client   语言 GO 协议 EPL AND EDL 官网地址 http://www.eclipse.org/paho/ API类型 Asynchronous  描述 Paho ...

  4. mqtt client api: 阻塞API

    fusesource版本:mqtt-client-1.11.jar下载地址:https://github.com/fusesource/mqtt-client fusesource提供三种mqtt c ...

  5. Redis client Python usage

    http://www.yiibai.com/redis/redis_sorted_sets.html mport redis r_server = redis.Redis('localhost') # ...

  6. MQTT Client library for C (MQTT客户端C语言库-paho)

    原文:http://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/index.html 来自我的CSDN博客   最近在使用Paho的MQTT客 ...

  7. MQTT Server搭建(apache-apollo)和MQtt Client搭建

    目标 本文就MQTT server和client搭建做以下总结,方便测试及开发使用,能基于MQTT软件发送和接收消息. 介绍 MQTT是基于tcp的消息发送,目前JAVA方面有两种实现,分别是mqtt ...

  8. php mqtt client

    <?php /* phpMQTT */ class phpMQTT { private $socket; /* holds the socket */ private $msgid = 1; / ...

  9. Asynchronous MQTT client library for C (MQTT异步客户端C语言库-paho)

    原文:http://www.eclipse.org/paho/files/mqttdoc/MQTTAsync/html/index.html MQTT异步客户端C语言库   用于C的异步 MQTT 客 ...

随机推荐

  1. Wannafly挑战赛11

    就做了两个数学题 链接:https://www.nowcoder.com/acm/contest/73/A来源:牛客网 白兔的分身术 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2 ...

  2. HDU——1009FatMouse' Trade(贪心+结构体+排序)

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 内存分配(new/delete,malloc/free,allocator,内存池)

    以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...

  4. SJTU Summer Camp

    Day -2,-1 提前坐飞机来到了上海,在旁边的酒店住下来,晚上去了外滩,在黄浦江边吹着晚风,依旧感慨万千,在衡中高三的一年竟然已经过去,经常出现在噩梦中的高考也已成为历史,然而命运可能并未就此改变 ...

  5. Microsoft IIs tilde directory enumeration

    漏洞标题: iis 短文件名列举漏洞     检测: https://code.google.com/p/iis-shortname-scanner-poc/   查看扫描出来的目录,全是404 ,比 ...

  6. APUE 学习笔记(九) 高级I/O

    1. 非阻塞I/O 低速系统调用时可能会使进程永远阻塞的一类系统调用,包括以下调用: (1)某些文件类型你(网络socket套接字.终端设备.管道)暂无可使用数据,则读操作可能会使调用者永远阻塞 (2 ...

  7. 快充 IC BQ25896 的 input current monitor

    BQ25896 沒有顯示 input current 的 register, 但可以讀 ILIM pin 的 電壓 做計算求出 input current.

  8. Linux 之 xunsearch

    Linux 之 xunsearch 参考教程:[千峰教育] 一.xunsearch简介: 开源免费.高性能.多功能.简单易用的专业全文检索技术方案. 官网(http://xunsearch.com). ...

  9. Glide加载图片问题记录

    Glide加载图片相比于Picasso而言性能较好,又比Fresco轻巧,而且又支持加载gif动图,是Google 推荐.专注平滑的滚动.简单易用.可扩展的一款图片加载框架.但是使用时还是会遇到一些问 ...

  10. js 时间戳与yyyy-mm-dd或yyyy-MM-dd HH-mm-ss互相转换

    首先是获取当前系统时间转换为时间戳 var timestamp = Date.parse(new Date());//获取当前时间 timestamp = timestamp / 1000; 然后是时 ...