书接上回,我搭好了树莓派所需的环境以及往我的个人服务网站上添加了我的树莓派终端,过程当中也是踩了不少坑,不过总算是过来了。接下来切入正题。
目录
python环境以及包配置
基础包安装
首先我使用的编译环境是python,因为它香,当然作为一名学生党而言我希望我能更快的开发而不是在搭建环境配置变量上面浪费时间。
我的项目是基于m2m协议的(个人开发者推荐),这里采用了python的paho库,这是一个可以发布和订阅消息的mqtt库。
$ pip install paho-mqtt
安装完成后
python3
>>>import paho.mqtt
>>>
配置成功
阿里云服务器配置
阿里云物联网简介
三元组
**PublicKey、DeviceName、DeviceSecret**
PublicKey:设备在网络中的唯一标识,在通信及初始化的认证中都要用到。
DeviceName:注册设备时自定义的或者自动生成的设备名称,在通信及初始化的认证中都要用到。
DeviceSecret:物联网平台为设备颁发的设备秘钥,和DeviceName成对出现,在设备认证时会用到。
HmacSHA1签名
通过设备上传的信息,包括ClientId,DeviceName,ProductKey,timestamp,DeviceSecret
我们和服务器端同时采用哈希算法取得一个passwd,用于设备的登录验证,用户名为DeviceName,+"&"+ ProductKey。
具体关于哈希算法可参考博文
https://blog.csdn.net/lidaidai001/article/details/93599319
账户设置
首先需要一个阿里云开发者账户,注册登录后直接在首页登录物联网平台
新建产品
品类切换为自定义其余自定
之后新建物模型,物模型是设备和服务器之间通信的数据。
之后新建设备,在设备页面可以看到阿里云的三元组
点击右边的DeviceSecret即可查看。
测试代码
paho部分函数定义以及使用
1.connect(host, port=1883, keepalive=60, bind_address="")
参数 | 定义 |
---|---|
host | 主机名或IP地址 |
port | 服务器主机的网络端口。 默认为1883 |
keepalive | 与代理通信之间允许的最长时间段(以秒为单位)。 如果没有其他消息正在交换,则它将控制客户端向代理发送ping消息的速率 |
bind_address | 绑定此客户端的本地网络接口的IP地址 |
2.publish(topic, payload=None, qos=0, retain=False)
参数 | 定义 |
---|---|
topic | 该消息发布的主题 |
payload | 要发送的实际消息。如果没有给出,或设置为无,则将使用零长度消息。 传递int或float将导致有效负载转换为表示该数字的字符串。 如果你想发送一个真正的int / float,使用struct.pack()来创建你需要的负载 |
qos | 服务的质量级别 |
retain | 如果设置为True,则该消息将被设置为该主题的“最后已知良好”/保留的消息 |
3.subscribe(topic, qos=0)
参数 | 定义 |
---|---|
topic | 一个字符串,指定要订阅的订阅主题 |
qos | 期望的服务质量等级。 默认为0。 |
4.on_connect(client, userdata, flags, rc):
flags是一个包含代理回复的标志的字典;
rc的值决定了连接成功或者不成功:
值 | 情况 |
---|---|
0 | 连接成功 |
1 | 协议版本错误 |
2 | 无效的客户端标识 |
3 | 服务器无法使用 |
4 | 错误的用户名或密码 |
5 | 未经授权 |
5.on_disconnect(client, userdata, rc):
rc参数表示断开状态。
如果MQTT_ERR_SUCCESS(0),回调被调用以响应disconnect()调用。 如果以任何其他值断开连接是意外的,例如可能出现网络错误。
6.on_message(client, userdata, message):
当收到关于客户订阅的主题的消息时调用。
message是一个描述所有消息参数的MQTTMessage。
7.on_publish(client, userdata, mid):
对于Qos级别为1和2的消息,这意味着已经完成了与代理的握手。
对于Qos级别为0的消息,这只意味着消息离开了客户端。
mid变量与从相应的publish()返回的mid变量匹配,以允许跟踪传出的消息。
8.username_pw_set(username, password=None):
为代理认证设置一个用户名和一个可选的密码。必须在connect*()之前调用。
9.loop_forever(timeout=1.0, max_packets=1, retry_first_connection=False):
网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接