智能家居——阿里云物联网套件体验

背景


本文主要记录使用阿里云物联网套件的方法。

以STM32驱动DHT11读取温度、湿度为例,将数据以MQTT方式推送到阿里云物联网平台上。

STM32驱动DHT11从串口获取数据请参考文章《STM32获取DHT11温度传感器数据

云平台配置


1. 登陆管理控制台


<1> 登陆阿里云官网

<2> 产品 -> 物联网套件 -> 开通服务 or 管理控制台

2. 新建产品、设备


如图,创建了名为home_automation的产品,以及产品下面两个设备temperature_sensorsubscribe_test

以MQTT方式发布数据


官方文档:https://help.aliyun.com/document_detail/30539.html?spm=5176.doc30530.6.574.43QEvm

本示例采用方式二:使用HTTPS认证再连接模式;

按照官网文档说明,实现HTTPS认证并获取授权,再通过MQTT通信。

HTTPS认证


HTTPS认证方式参考代码如下:

#!/usr/bin/python                                                                                                                               # -*- coding: utf-8 -*-import json
import time
import hmac
import hashlib
import requests
import traceback


classAliyunIot():
    CONF_FILE = 'config.json'def__init__(self, config_file = None):
        ifnot config_file:
            config_file = self.CONF_FILE
        self.__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.text
                print'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.cn-shanghai.aliyuncs.com/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-mqtt.cn-shanghai.aliyuncs.com', u'port': 1883}}, u'iotToken': u'xxxxxxx'}

MQTT发布消息


从串口读取数据解析出json

编辑文件iot_serial.py

#!/usr/bin/python# -*- coding: utf-8 -*-import serial
import json
import time

classSerial:
    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.py
1506334420.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 time
import json
import traceback
import paho.mqtt.client as mqtt


from util import GetMacAddr
from iot_serial import Serial
from aliyun_iot import AliyunIot

#此处TOPIC应该替换为自己的
TOPIC = '/xxxxx/temperature_sensor/m2m'defConnectCallback(client, userdata, flags, rc):
    print'Connected:' + str(rc)

dev_id = GetMacAddr()
print dev_id

a = AliyunIot()
conf = a.DeviceAuthentication(dev_id)
print conf

client = mqtt.Client(dev_id)
client.on_connect = ConnectCallback

client.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.py
Connected:0
[2017-09-2510:18:36]publis success, {"temperature": 17.2, "humidness": 45.6}

也可以在云平台管理页面查看日志:

设备间通信M2M


官方文档:https://help.aliyun.com/document_detail/59147.html?spm=5176.doc30539.6.668.bSNXB3

配置规则引擎


订阅Topic


#!/usr/bin/python# -*- coding: utf-8 -*-from util import GetMacAddr
from iot_serial import Serial
from aliyun_iot import AliyunIot
import paho.mqtt.client as mqtt

TOPIC = '/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 = ConnectCallback
client.on_message = MessageCallback

client.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相关内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值