牟晓东
我们在开发开源硬件涉及到物联网应用项目时,会用到一种为连接远程设备提供实时可靠消息服务的MQTT(Message Queuing Telemetry Transport)协议,即“消息队列遥测传输协议”。这是一种基于“客户端-服务器”的“消息发布与订阅”式即时通讯协议,开销较小且占用的网络带宽也较低,非常适合进行物联网创客项目的实施。比如我们来制作一个利用掌控板远控树莓派LED灯阵的项目,通过对掌控板的A、B键按下和摇晃掌控板三种动作,远程触发树莓派上的LED灯阵发光、熄灭和流水闪烁效果。
将掌控板通过数据线与电脑USB接口连接,运行mPython X,登录成功后进行程序的编写。
首先设置网络的连接,分别填写好WiFi名称和密码;接着从“物联网”-“MQTT”中选择第一个MQTT模块,客户端“client_id”的内容设置为“luke007”,这是树莓派的古德微机器人网站登录账号名称;服务器“server”的内容设置为古德微机器人网站的“www.gdwrobot.top”;下方的“user”和“password”保持为空,“keepalive”也保持默认的“30”不变;然后添加一个“连接MQTT”模块,作用是根据上方的参数设置模块与对应的服务器进行MQTT连接;接着,使用“显示”区域中的“OLED显示清空”“OLED第1行显示……”和“OLED显示生效”三个模块,控制掌控板的OLED显示屏输出提示信息:“MQTT连接成功!”(如图1)。
以按下掌控板的A键为例,先从“事件”区域中选择第一个“当按键A被按下时执行”,再从“MQTT”中选择“发布……至主题……”,分别输入“ON”(注意大写)和“luke007/KeyA”,作为按键A被按下时触发的第一个动作:向树莓派账号luke007发送主题为“KeyA”的消息,其值为“ON”;然后,添加一个0.5秒的等待语句。同理,再设置按键B被按下时触发“发布‘ON至主题‘luke007/KeyB”;当掌控板檢测到“被摇晃”的动作发生时,触发“发布‘ON至主题‘luke007/Shaking”(如图2)。
在浏览器中访问古德微机器人网站,登录账号luke007后开始进行“积木”编程:
第一, 从左侧“物联网”-“常用”中选择“设置物联网服务器”,保持服务器“www.gdwrobot.top”和端口号“1883”默认不变,用户名和密码保持为空;接着使用一条输出调试信息,内容为“开始监听掌控板传来的消息:”,作为程序运行的提示信息。
第二, 是三个监听主题语句(无先后次序),监听的主题为“KeyA”、“KeyB”和“Shaking”,分别对应掌控板的按键A、按键B和摇晃动作所触发的消息主题。
第三, 从“线程”中添加三个子线程,同样也是不分先后次序,线程函数名分别为“ListenKeyA”、“ListenKeyB”和“ListenShake”,分别对应监听掌控板三个动作消息后进行调用对应同名的函数(如图3)。
以函数“ListenKeyA”为例,外层的“如果……执行……”条件分支对“物联网是否收到新数据”进行判断,条件成立的话则对变量“A键”进行赋值,其值为“获取主题‘KeyA的数据”;接着输出调试信息“收到掌控板A键消息!”,表示已经收到了掌控板按键A的动作消息;然后再用内层“如果……执行……”条件分支对“‘A键的值是否为‘ON”进行判断,条件成立,说明掌控板的A键已经被按下,于是调用“LED_ON”函数(如图4),执行由5、6、12和16四支LED所组成的灯阵全部发光的动作(如图5);最后的0.1秒等待语句,作用仍然是防止程序过多占用系统资源。
与此类似,函数“ListenKeyB”和“ListenShake”是用来监听掌控板按键B是否被按下和整个掌控板是否被摇晃两个动作的(如图6),条件成立则分别调用“LED_OFF”和“LED_Water”函数,前者是熄灭LED灯阵,后者则是循环点亮和熄灭灯阵,效果类似于流水灯(如图7)。
返回mPython X界面,点击“刷入运行”按钮,将程序代码写入掌控板(稍候,右下角会有“刷入成功”、连接WiFi:“Connection WiFi……”的提示),掌控板显示屏的第一行会显示出“MQTT连接成功!”;在古德微机器人平台先点击“连接设备”,然后点击“运行”按钮,LOG调试信息区会显示提示信息:“开始监听掌控板传来的消息:”。
此时,尝试轻轻按下掌控板的A键,树莓派的LED灯阵就会亮起(LOG调试信息提示:“收到掌控板A键消息!”);轻轻按下B键,树莓派的LED灯阵就会熄灭(LOG调试信息提示:“收到掌控板B键消息!”);如果摇晃掌控板的话,树莓派的LED灯阵就会出现流水灯效果(LOG调试信息提示:“收到掌控板晃动消息!”)。如果多次测试无问题,就说明我们实现了掌控板远控树莓派LED灯阵进行开、关灯和流水灯的目标(如图8),大家不妨一试。