【MQTT教程】慧编程:光环板--MQTT扩展使用说明
# 慧编程:光环板--MQTT扩展使用说明!(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9zMS5heDF4LmNvbS8yMDIwLzAzLzMxL0dRVzMwUC5wbmc?x-oss-process=image/format,png)
# 一、前言
前几天为光环板写了一个MQTT的扩展(ps:不得不说:慧编程(mblock)的开发者平台真的很不错((https://ext.makeblock.com/)):简单,方便,入手快![表情][表情][表情])。今天从慧编程的产品那里得知:有很多用户对光环板的MQTT协议还不知道如何使用!为了让更多的用户能够学会使用MQTT扩展,于是写下了这篇MQTT的教程!
# 二、加载MQTT协议
首先,先添加我们的光环板设备

然后在指令栏中-添加扩展-MQTT

在用到我们的MQTT功能之前首先你要有一个物联网平台的账户,扩展默认的物联网平台是((iot.dfrobot.com.cn))当然也可以使用本地物联网平台。
```
登录IoT网站,注册账号。进入工作间。新建一个设备,默认名字“设备一”。
一个账号,默认一共有10000条信息的储存容量。这些容量共所有设备共享。例如,图中设备上方显示“0/1000”,那么此设备最大可储存1000条信息,已使用0条信息的储存空间。如果此设备收发的信息超过1000条,新信息将不再存入。
每个设备默认每隔1s储存一次消息。
观察到设备唯一识别码Topic以及左侧的用户信息,点击眼睛图标可以将隐藏的Iot_id和Iot_pwd显示出来。
```


***为了稍后编程需要,记下相关账号***:
iot_id: ~~Skv3zKyNb~~
iot_pwd: ~~r1lD3ztJ4b~~
topic: ~~BJpHJt1VW~~
# 三、mqtt积木块的使用说明
<u>**mqtt扩展必须在光环板联网的情况请款下才能使用!**</u>

## 1、mqtt初始化设置

`mqtt = MQTTClient('0805e3d04f3b34e7', '182.254.130.180', 1883, '', '', keepalive=0)`
这里的clientID和server 是确定的(当然可以跟你自己连接不同的服务器进行更改),iot_id和iot_pwd是我们自己的物联网用户明和密码(也就是我们刚才需要记下的那串字符)。
## 2、发布消息到主题上

`mqtt.publish('topic', 'hello')`
向物联网设备(topic)发送消息(eg可以把语音识别的内容发送到我们的物联网平台,字符串、变量值)!
## 3、连接mqtt

```python
try:
mqtt.connect()
print('Connected')
except:
print('Disconnected')
```
通过mqtt协议连接到物联网平台。
## 4、订阅主题

```python
def mqtt_callback(topic, msg):
'message' = msg.decode('utf-8', 'ignore')
pass
mqtt.set_callback(mqtt_callback)
mqtt.subscribe('topic')
```
订阅的消息通过回调传递。这是为了避免对已订阅的消息使用队列,否则可能随时收到消息(包括客户端期望其他类型的服务器响应时,因此有两种选择:要么通过回调立即传递它们,要么一直排队直到“预期”响应到达)。请注意,不需要队列是一种迷惑:在这种情况下,运行时调用堆栈形成一个隐式队列。而且与显式队列不同,它很难控制。之所以选择这种设计,是因为在通常情况下,处理订阅的消息是最有效的。但是,如果在订阅回调中发布了QoS> 0的新消息,则可能导致深度递归或无限递归(后者意味着应用程序将以`RuntimeException`终止)。
我们在使用此积木块时,可以设置一个变量来代替订阅的消息。然后用逻辑判断不同的消息值来做相应的想要操作
## 5、等待服务器状态

```python
mqtt.wait_msg()
mqtt.check_msg()
```
` wait_msg()` -等待服务器消息。订阅消息将传递到使用set_callback()设置的回调中,其他任何消息将在内部进行处理。
` check_msg()` -检查是否有来自服务器的待处理消息。如果是,则以与wait_msg()相同的方式处理,否则,立即返回。
` wait_msg()`和`check_msg()`是“主循环迭代”方法,有阻塞和无阻塞版本。应该在循环中定期调用它们;如果您没有其他要执行的前台任务(即,您的应用程序仅对已订阅的MQTT消息做出反应),则应调用`wait_msg();`如果您也要处理其他前台任务,则应调用 `check_msg()` 。
请注意,如果您仅发布消息,而无需`订阅`,则无需调用`wait_msg()` / `check_msg()`。
## 6、断开连接

`mtqq.disconnect()`
断开与服务器的连接,释放资源。
## 7、设置主线的离线消息

`mqtt.set_last_will('', '')`
设置MQTT“最后的意愿”消息。应该*在* connect()*之前*调用 。
# 四、样例程序
## 一、发送消息到服务器端

在样例一的程序中,当我们给光环板供电时,它先连接wifi,通过mqtt协议来连接到我们的物联网平台(mqtt_server)最后发送消息(hello)到物联网平台。我们打开物联网平台选择相应的设备就可以看到我们刚才发送过来的消息了,效果如下图所示:

## 二、从服务器端订阅消息

在样例二中,通过mqtt平台给光环板发送消息,光环板订阅服务器端发来的消息,然后来做开灯关灯相关操作,演示效果如下:
https://v.youku.com/v_show/id_XNDYxOTkzMDY1Mg==.html
很好,收藏了。
页:
[1]