背景
本文主要记录使用阿里云物联网套件的方法。
以STM32驱动DHT11读取温度、湿度为例,将数据以MQTT方式推送到阿里云物联网平台上。
STM32驱动DHT11从串口获取数据请参考文章《STM32获取DHT11温度传感器数据》
云平台配置
1. 登陆管理控制台
<1> 登陆阿里云官网
<2> 产品 -> 物联网套件 -> 开通服务 or 管理控制台
2. 新建产品、设备
如图,创建了名为home_automation的产品,以及产品下面两个设备temperature_sensor和subscribe_test
以MQTT方式发布数据
官方文档:/document_detail/30539.html?spm=5176.doc30530.6.574.43QEvm
本示例采用方式二:使用HTTPS认证再连接模式;
按照官网文档说明,实现HTTPS认证并获取授权,再通过MQTT通信。
HTTPS认证
HTTPS认证方式参考代码如下:
#!/usr/bin/python # -*- coding: utf-8 -*-import jsonimport timeimport hmacimport hashlibimport requestsimport tracebackclassAliyunIot():CONF_FILE = 'config.json'def__init__(self, config_file = None):ifnot config_file:config_file = self.CONF_FILEself.__s = requests.Session()self.__config = self.__load_config(config_file)def__load_config(self, filename):withopen(filename) as f:return json.load(f, encoding='utf-8')def__del__(self):self.__s.close()defGetSign(self, secret, param):black_key_list = ['version', 'sign', 'resources', 'signmethod']p = filter(lambda x:x[0] notin black_key_list, param.items())c = ''.join([''.join(str(j) for j in i) for i insorted(p, key=lambda x:x[0])])return hmac.new(str(secret), c, hashlib.md5).hexdigest()defDeviceAuthentication(self, client_id, resources = 'mqtt'):timestamp = int(time.time())param = {'productKey': self.__config['productKey'],'deviceName': self.__config['deviceName'],'sign': None,'signmethod': 'hmacmd5','clientId': client_id,'timestamp': timestamp,'resources': resources}param['sign'] = self.GetSign(self.__config['deviceSecret'], param)pre = requests.Request('POST', url=self.__config['url'], data=param).prepare()res = self.__s.send(pre, cert=self.__config['cert'], timeout=3)if res.text:try:resp = json.loads(res.text)if resp['code'] == 200:return resp['data']except:print res.textprint'Http request failed.'print traceback.print_exc()returnNone,Noneif __name__ == '__main__':a = AliyunIot()print a.DeviceAuthentication('01')
新建config.json配置如下:
{"productKey":"xx","deviceName":"xx","deviceSecret":"xx","url":"https://iot--/auth/devicename","cert":"aliyun_iot.crt"}
参数说明:
productKey:官网产品管理获取
deviceName:设备页面获取
deviceSecret:设备页面 -> 设备证书
cert:请下载官网文档中给的,也可选择不使用证书,但要将python的Requests的verify置为false,方法可网上查阅资料。
执行脚本即可得到响应:
pi@raspberrypi:~/IoT/raspberrypi $ ./aliyun_iot.py{u'iotId': u'xxxxx', u'resources': {u'mqtt': {u'host': u'public.iot-as--', u'port': 1883}}, u'iotToken': u'xxxxxxx'}
MQTT发布消息
从串口读取数据解析出json
编辑文件iot_serial.py
#!/usr/bin/python# -*- coding: utf-8 -*-import serialimport jsonimport timeclassSerial:def__init__(self, port, baudrate = 9600):self.__ser = serial.Serial(port, baudrate, timeout=0.5)def__del__(self):self.__ser.close()defGetData(self):self.FlushInput()whileTrue:time.sleep(0.1)text = self.__ser.read(1)if text:recv = text + self.__ser.readline()return recv.strip().strip('\n').strip('_')defFlushInput(self):self.__ser.flushInput()if __name__ == '__main__':s = Serial('/dev/ttyUSB0')whileTrue:try:j = json.loads(s.GetData())print'%s\t%s' %(time.time(), j)except:continue
运行,测试串口数据读取正常
pi@raspberrypi:~/IoT/raspberrypi $ ./iot_serial.py1506334420.2 {u'temperature': 17.4, u'humidness': 35.6}1506334444.57 {u'temperature': 20.4, u'humidness': 46.4}1506334468.19 {u'temperature': 20.4, u'humidness': 43.6}
将串口读取数据利用MQTT协议发送
python安装mqtt模块:
sudo pip install paho-mqtt
编辑文件mqtt.py
#!/usr/bin/python# -*- coding: utf-8 -*-import timeimport jsonimport tracebackimport paho.mqtt.client as mqttfrom util import GetMacAddrfrom iot_serial import Serialfrom aliyun_iot import AliyunIot#此处TOPIC应该替换为自己的TOPIC = '/xxxxx/temperature_sensor/m2m'defConnectCallback(client, userdata, flags, rc):print'Connected:' + str(rc)dev_id = GetMacAddr()print dev_ida = AliyunIot()conf = a.DeviceAuthentication(dev_id)print confclient = mqtt.Client(dev_id)client.on_connect = ConnectCallbackclient.tls_set('aliyun_iot.crt')client.username_pw_set(conf['iotId'], conf['iotToken'])m = conf['resources']['mqtt']client.connect(m['host'], m['port'], 80)client.loop_start()s = Serial('/dev/ttyUSB0')whileTrue:try:msg = json.dumps(json.loads(s.GetData()))rc, mid = client.publish(TOPIC, payload=msg)if rc == 0:print'[%s]publis success, %s' %(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), msg)except:traceback.print_exc()time.sleep(1)
运行查看结果:
pi@raspberrypi:~/IoT/raspberrypi$ ./mqtt.pyConnected:0[-09-2510:18:36]publis success, {"temperature": 17.2, "humidness": 45.6}
也可以在云平台管理页面查看日志:
设备间通信M2M
官方文档:/document_detail/59147.html?spm=5176.doc30539.6.668.bSNXB3
配置规则引擎
订阅Topic
#!/usr/bin/python# -*- coding: utf-8 -*-from util import GetMacAddrfrom iot_serial import Serialfrom aliyun_iot import AliyunIotimport paho.mqtt.client as mqttTOPIC = '/JVMwetHXFGK/temperature_sensor/m2m'defConnectCallback(client, userdata, flags, rc):print'Connected:' + str(rc)client.subscribe(TOPIC)defMessageCallback(client, userdata, msg):print'%s -> %s' %(msg.topic, str(msg.payload))dev_id = GetMacAddr()dev_id='test001'a = AliyunIot('config_subscribe.json')conf = a.DeviceAuthentication(dev_id)client = mqtt.Client(dev_id)client.on_connect = ConnectCallbackclient.on_message = MessageCallbackclient.tls_set('aliyun_iot.crt')client.username_pw_set(conf['iotId'], conf['iotToken'])m = conf['resources']['mqtt']client.connect(m['host'], m['port'], 80)client.loop_forever()
其中config_subscribe.json为配置文件拷贝一份,将里面的设备名和秘钥改为另一个设备的。
运行发布消息和订阅消息程序
数据存入表格存储
创建规则
添加方法
没有内容的可以按照提示连接创建
在OTS中查看数据
安装表格存储客户端并登陆
总结
阿里云Iot套件提供了方便的接入,便捷的数据导入其他云服务,很适合大型、或海量应用高效接入。
对于智能家居方便,目前有比较好的开源平台Home Assistant可以自己搭建私有平台,且可以方便介入HomeKit等,效果非常赞。
下篇博客将简单介绍Home Assistant相关内容。