树莓派英文名称Raspberry Pi中的Pi是Python的简称,这意味着Python是开发树莓派软硬件系统应用的主流编程语言。本文以树莓派GPIO扩展接口连接LED发光为例,介绍中移OneNET物联网MQTT协议远程控制树莓派Python网络编程技术。以此为基础,结合当代人工智能及机器学习、边缘计算(Edge Computing)与微型人工智能(Tiny AI)等技术可以实现多种智能物联网(AIoT)远程智能控制创新原型产品或应用系统。
文章目录
一、物联网平台简介
二、树莓派GPIO扩展接口介绍
三、树莓派控制LED发光Python编程实现
1.树莓派GPIO扩展接口与LED连接
2.树莓派控制LED发光Python实现举例
四、使用网络调试助手模拟设备发送MQTT报文连接中移OneNET物联网测试
五、中移OneNET物联网MQTT协议远程控制树莓派LED发光Python网络编程实现

一、物联网平台简介

根据物联网平台实现的功能进行划分,物联网平台包括DMP(Device Management Platform,设备管理平台)、CMP(Connectivity Management Platform,连接管理平台)、AEP(Application Enablement Platform,应用使能平台)和BAP(Business Analytics Platform)。物联网平台将通过所提供的高级分析和深度学习技术能力,来满足物联网发展的各项高阶需求。

国内的物联网平台有中国移动物联网开放平台(OneNET)、中国电信物联网开放平台、华为OceanConnect IoT、百度物联网、阿里物联网等。国外的物联网平台有Amazon AWS IoT、Microsoft Azure IoT、Cisco Jasper、IBM Watson IoT等。截止目前,还没有一家物联网平台公司能够提供从智能终端管理、连接管理到应用开发、数据分析的完整全套服务。每家物联网平台提供商都有各自专注的领域和特色优势。

1.中移物联网开放平台(OneNET)

中国移动物联网开放平台(OneNET)是中移物联网公司基于物联网技术和产业特点打造的开放平台和生态环境,适配各种网络环境和协议类型,支持多种传感器和智能硬件的快速接入和边缘计算及大数据服务,提供丰富的API和应用模板以支持各类行业应用和智能硬件研发,能够有效降低物联网应用开发和部署成本,满足物联网领域设备连接、协议适配、数据存储、数据安全、大数据分析等平台级服务需求。

2.华为OceanConnect物联网平台

华为OceanConnect物联网平台是一种物联网连接管理平台,它是面向运营商和企业/行业领域的统一开放云平台,支持SIM和非SIM场景的各种连接和连接管理通过开放的API和独有的Agent,向上集成各种行业应用,向下接入各种传感器、智能终端和网关,帮助运营商和企业/行业客户实现多种行业智能终端的快速接入,多种行业应用的快速集成。

二、树莓派GPIO扩展接口介绍

嵌入式系统开发板都设计有GPIO扩展接口,GPIO是通用输入输出接口General Purpose Input and Output的简称。通俗地说,GPIO就是一些引脚,我们可以通过对嵌入式系统编程使这些引脚输出高低电平或者通过它们读入引脚状态(高电平或者是低电平)。我们可以利用GPIO连接并增加各种电子设备,包括扩展自行设计的各种硬件设备、智能硬件、电子电路等。

目前主流的树莓派3/4主控板GPIO扩展接口共有40个引脚,图1是树莓派3B GPIO引脚排列及编号对照情况。

Pyqt 物联网项目 物联网 python_物联网


图1 树莓派3B GPIO引脚排列及编号对照

下面对图1的GPIO引脚及编号做简要说明,树莓派GPIO引脚是数字引脚,可以将它的输出设为高电平或低电平,或者通过它读取输入的高低电平。如果想读取模拟输入设备的值,需要外接ADC芯片。树莓派GPIO引脚编码有三种方式:

(1) BOARD编码:是根据板子上引脚的位置进行编号,自上而下,从左到右,依次进行编号,也称为物理引脚(Physical pins);

(2) BCM编码:是Broadcom提供的一种编码规则,它和Broadcom ARM SoC片上系统中的信道编号相对应,这些编码看起来没有什么规律,是Python等GPIO编程常用的引脚编码方式;

(3) wiringPi编码:是GNU gcc/g++等GPIO编程常用的引脚编码方式,简称wPi。

三、树莓派控制LED发光Python编程实现

1.树莓派GPIO扩展接口与LED连接

Pyqt 物联网项目 物联网 python_物联网_02


图2 树莓派GPIO引脚与LED连接原理图及接线图

树莓派GPIO引脚与LED连接原理图及接线图见图2所示。图2左侧为原理图,右侧为树莓派GPIO与LED接线图,树莓派GPIO扩展接口与LED连接可以有两种方式:图2(a)为GPIO扩展接口与LED连接方式1,该连接方式是将发光二极管LED与电阻串联后,一端接Pin12物理引脚(BCM GPIO18),另一端接Pin06物理引脚(即接地GND),注意LED两个长短引脚端要按图中的标识进行连接,不要接反;图2(b)为GPIO扩展接口与LED连接方式2,该连接方式是将发光二极管LED与电阻串联后,一端接Pin01物理引脚(即接3.3V电源),另一端接Pin12物理引脚(BCM GPIO18),同样注意LED两个长短引脚端要按图中的标识进行连接,不要接反。根据图1中的树莓派GPIO引脚排列及编号对照可知,Pin12物理引脚对应的BCM编号为18、wiringPi编码为1。

关于限流电阻的选取:以图2(a)的GPIO与LED连接方式1为例进行说明,发光二极管选用直径为5mm的红色LED,LED正向导通电压一般在1.7V~2.2V之间,LED发光亮度可根据GPIO引脚驱动电流公式I≈(VH-1.8V)/R近似选取,式中 VH ≈3.3V为GPIO引脚高电平电压,1.8V为LED正向导通时的额定电压,注意树莓派GPIO引脚最大驱动电流不超过16mA(在实际应用中,若负载较大需要增设驱动电路);R为限流电阻,其值越小LED亮度越暗,这里限流电阻选用了1kΩ电阻,如果想增大LED亮度还可选用680Ω、510Ω、220Ω等标称电阻。树莓派Pin12物理引脚(BCM GPIO 18)、Pin6物理引脚(GND)与1kΩ限流电阻及LED通过三根两端为母插头的杜邦线直接串联,这样可以省掉使用面包板接线。

2.树莓派控制LED发光Python实现举例

例:采用图2(a)的树莓派GPIO与LED连接方式1,Python控制LED闪亮发光,当程序运行后LED闪亮10次结束。

Python控制LED闪亮10次程序清单如下:

#Filename: ledblink.py
import RPi.GPIO as GPIO
from time import sleep   #import time
GPIO.setmode(GPIO.BOARD)  # BCM Coding: GPIO.setmode(GPIO.BCM)
GPIO_IN=12  #BCM Coding: GPIO_IN=18
GPIO.setup(GPIO_IN, GPIO.OUT)
for i in range(0,10):
    GPIO.output(GPIO_IN, GPIO.HIGH)  #LED on
    sleep(1)             #time.sleep(1)
    GPIO.output(GPIO_IN, GPIO.LOW)  #LED off
    sleep(1)             #time.sleep(1)
GPIO.cleanup()

关键语句注解:使用Python对GPIO扩展口连接的输入/输出设备进行程控,需要用到名为RPi.GPIO的第三方扩展包; GPIO.setmode(GPIO.BOARD)设置采用物理引脚的BOARD编码,若采用BCM编码本句改为GPIO.setmode(GPIO.BCM); GPIO_IN=12 (物理引脚Pin12),若采用BCM编码本句改为GPIO_IN=18;GPIO.setup(GPIO_IN, GPIO.OUT)将Pin12引脚设置为输出;GPIO.output(GPIO_IN, GPIO.HIGH)向Pin12输出脚输出低电平,点亮LED灯; GPIO.output(GPIO_IN, GPIO.LOW) 向Pin12输出脚输出低电平,熄灭 LED灯。

四、使用网络调试助手发送MQTT报文连接中移OneNET物联网测试

1.中移OneNET物联网设备通信协议与产品开发流程

中移OneNET物联网为用户提供了HTTP、TCP透传、Modbus、EDP(Enhanced Device Protocol)、MQTT(Message Queuing Telemetry Transport)、RTMP(Real Time Message Protocol)等设备接入通信协议,用户可根据应用需求选择合适的通信协议进行开发。

OneNET物联网开发者按照【用户注册】→【创建产品】→【接入设备】→【开发应用】→【上传发布】流程进行产品开发。用户在OneNET物联网平台上完成用户注册和创建产品后,后续的设备开发和应用对接的所有操作均在用户所创建的产品上进行。硬件接入是实现开发者实际的终端设备在OneNET物联网平台上的创建、连接和数据交互,而开发应用是通过RESTful API方式实现和OneNET物联网平台进行交互对接。

2. 使用网络调试助手模拟设备发送MQTT报文连接OneNET物联网测试

在浏览器输入OneNET网址https://open.iot.10086.cn/进入中移OneNET物联网,完成在OneNET物联网云平台的用户注册。完成用户注册后,以创建的用户名及密码登录OneNET物联网平台创建一个【多协议接入服务】的产品和设备,具体操作步骤:进入OneNET网址[https://open.iot.10086.cn/]登录后,依次选择【产品服务】→【MQTT物联网套件】(使用MQTT也可直接输入网址[https://open.iot.10086.cn/productservice/mqttkit/],选择【产品服务】→【MQTT物联网套件】);单击【立即使用】,弹出“公开协议产品列表页面”,在该页面单击【多协议接入服务】→【添加产品】,后面按页面提示说明完成产品添加,图3是添加一个产品且后面要用到的产品详情部分信息截图,可知这里创建产品名称是my_rpicontrol,产品ID是392911,设备接入采用MQTT协议。

Pyqt 物联网项目 物联网 python_Pyqt 物联网项目_03


图3 产品详情部分信息截图

【添加产品】完成后,接下来单击【添加设备】弹出“添加新设备”编辑对话框页面,按照页面提示说明填写“设备名称”(这里填写Device_1)、 “鉴权信息”(可看成是设备密码, 为后面使用方便起见,这里直接填写ABC12345)等,点击【添加】按钮完成设备添加。图4是在产品my_rpicontrol中添加一个设备且后面要用到的设备详情部分信息截图,可知设备ID是659133593,鉴权信息是ABC12345,接入方式是前面创建产品自动生成的MQTT协议。由于还没有连接设备到OneNET,因此Device_1设备显示为“离线”状态。

Pyqt 物联网项目 物联网 python_树莓派_04


图4 设备详情部分信息截图

产品和设备创建成功后,接下来,我们可以使用网络调试助手模拟设备Device_1向中移OneNET物联网发送MQTT连接报文。首先,从http://www.cmsoft.cn/resource/102.html等网站下载网络调试助手;然后执行网络调试助手程序模拟设备Device_1向OneNET发送MQTT连接报文,并在OneNET查看设备Device_1离线/在线状态。

OneNET物联网MQTT服务器IP地址和端口号为183.230.40.39: 6002。要连接要到OneNET的设备是一个三元组(设备ID, 产品ID, 密码),其中,密码即鉴权信息,可以选用设备单独的APIKey或产品的MasterAPIKey。

根据前面创建的my_rpicontrol产品(图3)和Device_1设备(图4),Device_1三元组信息如下:

设备ID (客户端ID):659133593,其对应的HEX ASCII码为36 35 39 31 33 33 35 39 33;

产品ID (用户名):392911, 其对应的HEX ASCII码为33 39 32 39 31 31;

密码(鉴权信息):ABC12345,其对应的HEX ASCII码为41 42 43 31 32 33 34 35(这里使用设备单独的APIKey,也可用所创建产品的MasterAPIKey)。

设备Device_1向OneNET发送的MQTT连接报文命令HEX(十六进制)编码格式如下:

10 27 00 04 4D 51 54 54 04 C2 00 78 00 09 设备ID 00 06 产品ID 00 08 密码

将Device_1设备ID、产品ID及密码所对应的HEX ASCII码填入以上MQTT连接报文格式中,可知Device_1设备向OneNET发送的十六进制MQTT连接报文命令编码为:

10 27 00 04 4D 51 54 54 04 C2 00 78 00 09 36 35 39 31 33 33 35 39 33 00 06 33 39 32 39 31 31 00 08 41 42 43 31 32 33 34 35

运行网络调试助手程序,网络设置:(1)协议类型选取TCP Client,(2)远程主机地址设置为OneNET MQTT服务器IP地址183.230.40.39,(3)远程主机端口设置为6002;发送设置选取HEX;复制以上MQTT连接报文命令粘贴到网络调试助手的【发送数据区】,依次单击【连接】按钮和【发送】按钮后,网络调试助手显示窗口见图5所示。

Pyqt 物联网项目 物联网 python_引脚_05


图5 网络调试助手向OneNET发送MQTT连接报文

接着,在OneNET“多协议接入”页面单击【设备列表】,选取Device_1的【详情】,可以看到Device_1设备显示为“在线”状态(见图6)。

Pyqt 物联网项目 物联网 python_Pyqt 物联网项目_06


图6 Device_1设备状态显示

经过上面系列操作,我们完成了使用网络调试助手模拟设备Device_1向中移OneNET物联网发送MQTT连接报文的测试,模拟设备Device_1成功连接到了OneNET。

五、OneNET物联网MQTT协议远程控制树莓派LED发光Python网络编程实现

前面介绍了使用网络调试助手模拟Device_1设备向中移OneNET物联网发送MQTT连接报文的测试,接下来通过无线WiFi将树莓派物理设备连接到OneNET物联网,树莓派设备名还是Device_1,这样不用再添加新设备。树莓派GPIO扩展接口+外接LED发光电路作为Device_1设备的原理图及其对应实际物理连接见图7所示(图7左侧为Device_1设备原理图,图7右侧为Device_1实际硬件设备)。

Pyqt 物联网项目 物联网 python_引脚_07


图7 树莓派GPIO扩展接口外接LED发光电路作为Device_1设备

针对图7中的树莓派设备Device_1,采用OneNET物联网MQTT协议远程控制树莓派设备Device_1中LED发光的Python网络程序清单见图8所示。

Pyqt 物联网项目 物联网 python_引脚_08


图8 OneNET物联网MQTT协议远程控制树莓派设备的LED发光Python程序

图8的Python程序文件名为onenet_iot.py,程序设置的MQTT网络参数如下:

(1) host_ip=‘183.230.40.39’:中移物联网OneNET提供的MQTT服务器IP地址

(2) port_no=6002:中移物联网OneNET提供的MQTT端口号

(3) product_id=‘392911’:用户名或产品ID,这里设置为my_rpicontrol产品ID

(4) mqtt_psw=‘ABC12345’:设备单独的APIKey或产品的MasterAPIKey,这里设置为Device_1设备APIKey

(5) device_id=‘659133593’:设备ID,这里设置为Device_1设备ID

Python程序使用了第三方MQTT 客户端库paho-mqtt。paho-mqtt是目前 Python 中使用较多的 MQTT 客户端库,它为Python 3.x客户端类提供了对MQTT v3.1.1的支持。在树莓派Linux终端,使用pip install命令安装paho-mqtt库(见图9)。

Pyqt 物联网项目 物联网 python_树莓派_09


图9 使用pip install命令安装paho-mqtt库

paho-mqtt库安装成功后,在树莓派Linux终端输入python onenet_iot.py命令执行Pyhton网络程序,选择OneNET“多协议接入”中的【下发命令】,在编辑框输入“开灯”命令并单击【发送】命令按钮(见图10),此时,可看到图7右侧的树莓派设备中的LED灯被点亮,同时在树莓派Linux终端显示接收到的“开灯”字符串信息(见图11)。

Pyqt 物联网项目 物联网 python_物联网_10


图 10 使用OneNET“多协议接入”中的【下发命令】发送“开灯"命令

Pyqt 物联网项目 物联网 python_树莓派_11


图11 树莓派Linux终端接收、显示来自OneNET的“开灯”命令字符串

Pyqt 物联网项目 物联网 python_Pyqt 物联网项目_12


图12 树莓派Linux终端显示从OneNET接收到的“结束”命令字符串

接着,再在OneNET“多协议接入”中的【下发命令】编辑框中输入“关灯”命令并单击【发送】命令按钮,此时,图7右侧的树莓派设备中的LED灯熄灭;最后,在OneNET“多协议接入”中的【下发命令】编辑框输入“结束”命令并单击【发送】命令按钮,程序执行结束,此时,树莓派Linux终端显示接收到的字符串信息见图12所示。

到此为止,我们就实现了采用Python网络编程和OneNET物联网MQTT协议远程控制树莓派LED发光的应用。以此为基础,结合当代人工智能及机器学习、边缘计算(Edge Computing)与微型人工智能(Tiny AI)等技术可以实现多种智能物联网(AIoT)远程智能控制创新原型产品或应用系统。