• C级总销量迫近A4L 宝马3系乏力 2019-03-21
  • 西安楼市进入短暂调整期 摇号细则近日将出 2019-03-21
  • 北京学习十九大精神--北京频道--人民网 2019-03-15
  • 临潼区马额镇庙张村西坡组农民饮用黄泥水 2019-03-13
  • 我早就说过,任何时候都不能对美国抱有幻想。否则就是白痴。 2019-03-11
  • 安徽加大就业脱贫力度 确保贫困户至少一人就业 2019-03-07
  • 环保督察点名批评 河北两市治理大沙河河堤垃圾带 2019-02-25
  • E3 2019展会日期确定 今年E3参加人数约69200人 2019-02-25
  • 外贸创新举措 让开放惠及世界 2019-02-22
  • 好莱坞环球影城“功夫熊猫”主题剧院开放 2019-02-22
  • 阜阳五中成功举办第四届社团文化艺术节文艺汇演 2019-02-21
  • 通用航空产业军民融合实现全方位突破 2019-02-21
  • 高培勇任中国社会科学院副院长(图简历) 2019-02-11
  • 撸主脑残,重度三级,鉴定完毕。[哈哈] 2019-02-05
  • 《云冈石窟保护条例》8月实施 刻划涂污文物最高罚200元--旅游频道 2019-02-05
  • 阿里云MVP + 关注
    手机版

    基于阿里云物联网平台实现的简易出入监控

    1. 神奇公式秒杀全国11选5>
    2. 阿里云MVP>
    3. 博客>
    4. 正文

    基于阿里云物联网平台实现的简易出入监控

    擎天xm 2018-11-15 21:58:03 浏览2348 评论2

    神奇公式秒杀全国11选5 www.bjux.net 摘要: 本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景

    本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景

    场景

    在公司大门入口处布点树莓派和红外感应,实现出入口人员出入时,自动拍照并上送钉钉群机器人

    准备

    物料准备

    • 树莓派
    • HC-SR501 人体红外感应器
    • 树莓派摄像头
    • 母对母杜邦线三根

    阿里云环境准备

    • 物联网平台
    • 对象存储OSS
    • 函数计算
    • 日志服务(可?。?/li>

    操作步骤

    1 云端开发

    1.1 物联网平台

    登录阿里云控制台,进入物联网平台控制面板

    1.1.1 新建产品

    进入设备管理,创建产品,选择基础版或高级版都可以,本实例使用基础版就可以满足基本要求。
    绅士手
    系统会自动创建3个Topic,我们需要使用 /ProductName/${deviceName}/update,作为设备告警消息的上送的Topic。

    1.1.2 设备管理

    在产品中新增设备,并获得设备的3元组,在2.3节的设备代码的编写时需要使用此3元组。设备三元组是设备的唯一标示
    设备3元组

    1.1.3 新建规则引擎

    设置规则引擎的意义在于,可以将设备上送的消息数据,通过配置转发规则将处理后的数据转发到阿里云其他服务,例如RDS、TBS和函数计算等等。我们需要注意的是从设备端到规则引擎处理后的JSON数据格式的变化,下图中是基础版的演变过程:

    我们在设备端消息上送定义的JSON的格式是:

    {
        'photo': 'xxxxxxx.jpg'
    }

    新创建一个规则,数据格式选择JSON。编写处理数据的SQL

    SELECT deviceName() deviceName, photo FROM "/a1O4b4XcICc/+/update"

    配置完成后,我们可以模拟调试一下,检查规则是否正确:
    调试
    接着,配置数据转发,把数据转发到FC函数计算中。分别选择在1.3步骤中创建好的服务和函数。
    转发配置

    1.2 对象存储

    由于设备端拍摄的照片需要在钉钉中展示,因此把照片存储在OSS上是一个解决方案。

    1.2.1 新建bucket

    新建一个bucket用于存储设备上送的照片。读写权限选择公共读
    然后在bucket中创建photo目录。

    1.3 函数计算

    经过物联网平台规则引擎转发过来的JSON数据,我们通过建立函数,把它转发到钉钉机器人接口上,实现钉钉群中的消息通知

    1.3.1 新建服务

    新创建服务,如果需要记录和回溯函数执行的日志,则需要开通日志服务,配置日志仓库。

    1.3.2 新建函数

    使用空白模版新建函数,不需要触发器,运行环境选择python2.7

    1.3.3 函数代码
    # -*- coding: utf-8 -*-
    
    import logging
    import json
    import requests
    
    # 钉钉消息发送实现
    def post(data):
        webhook_url='https://oapi.dingtalk.com/robot/send?access_token=${Token}' #钉钉群机器人的webhook的URL
        headers = {'Content-Type': 'application/json; charset=utf-8'}
        post_data = json.dumps(data)
        try:
            response = requests.post(webhook_url, headers=headers, data=post_data)
            logging.info('Send success')
        except requests.exceptions.HTTPError as exc:
            logging.error("Send Error,HTTP error: %d, reason: %s" % (exc.response.status_code, exc.response.reason))
            raise
        except requests.exceptions.ConnectionError:
            logging.error("Send Error,HTTP connection error!")
            raise
        else:
            result = response.json()
            logging.info('Send Error:%s' % result)
            if result['errcode']:
                error_data = {"msgtype": "text", "text": {"content": "Send Error, reason:%s" % result['errmsg']}, "at": {"isAtAll": True}}
                logging.error("Send Error:%s" % error_data)
                requests.post(webhook_url, headers=headers, data=json.dumps(error_data))
            return result
    
    # 发送钉钉markdown消息
    def post_markdown(title,text):
        data = {
            "msgtype": "markdown",
            "markdown": {
                "title": title,
                "text": text
            },
            "at": {
                "atMobiles": [],
                "isAtAll": False
            }
        }
        post(data)
    
    # 函数计算入口
    def handler(event, context):
        logger = logging.getLogger()
        evt = json.loads(event)
        #OSS endpoint url
        post_markdown('告警','![screenshot](https://${bucket}.oss-cn-hangzhou.aliyuncs.com/photo/%s)' % evt.get('photo',''))
        logger.info('photo name is %s', evt.get('photo',''))
        return 'OK'

    2 设备端开发

    HC-SR501??楦杏Φ接腥艘贫?,会输出高电平,则触发摄像头拍照,并将照片文件存储到OSS,同时发送消息到IOT平台的/ProductName/${deviceName}/update消息队列中

    2.1 硬件安装

    1. 连接好摄像头
    2. 将HC-SR501 人体红外感应器的vcc引脚接5v,也就是pin4,I/O引脚接pin18,GND引脚接地pin6

    2.2 环境准备

    我们在树莓派上使用python2.7作为开发语言。

    1. pip install aliyun-python-sdk-iot-client
    2. pip install oss2
    3. mkdir py-demo (项目程序文件夹)
    4. cd py-demo
    5. mkdir photo (本地照片临时目录)
    6. vim monitor.py

    2.3 代码开发

    monitor.py 内容如下:

    # -*- coding: utf-8 -*-
    
    import json
    import uuid
    import logging
    from time import sleep
    from picamera import PiCamera
    import RPi.GPIO as GPIO
    import oss2
    import aliyunsdkiotclient.AliyunIotMqttClient as iot
    
    # 参数定义
    options = {
        'productKey': '${productKey}',  # 设备标识三元组
        'deviceName': '${deviceName}',  # 设备标识三元组
        'deviceSecret': '${deviceSecret}',  # 设备标识三元组
        'port': 1883,  # iot mqtt port
        'host': 'iot-as-mqtt.cn-shanghai.aliyuncs.com',  # iot mqtt endpoint
        'endpoint': '//oss-cn-hangzhou.aliyuncs.com',  # oss endpoint
        'ak': '${ak}',
        'sk': '${sk}',
        'bucket': '${bucket}',  # oss bucket
        'ir_pin': 24  # 人体红外感应器设置读取针脚标号
    }
    
    topic = '/' + options['productKey'] + '/' + options['deviceName'] + '/user/test'
    
    # 拍照存oss,并发送通知
    def takephoto2oss(client):
    
        #拍照
        photo_filename = str(uuid.uuid1()) + ".jpg"
        print('take photo :' + photo_filename)
        camera.capture('photo/' + photo_filename)
    
        #存OSS
        print('save photo to oss :' + photo_filename)
        bucket.put_object_from_file(
            'photo/' + photo_filename, 'photo/' + photo_filename)
    
        #消息上送
        payload_json = {
            'photo': photo_filename
        }
        print('send data to iot server: ' + str(payload_json))
        client.publish(topic, payload = str(payload_json))
    
    
    def on_connect(client, userdata, flags_dict, rc):
        print("Connected with result code " + str(rc))
    
    
    def on_disconnect(client, userdata, flags_dict, rc):
        print("Disconnected.")
    
    
    if __name__ == '__main__':
        # GPIO 初始化
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(options['ir_pin'], GPIO.IN)
    
        # 摄像头 初始化
        camera = PiCamera()
        camera.resolution = (640, 480)
        camera.vflip = True
        camera.hflip = True
    
        # OSS 初始化
        auth = oss2.Auth(options['ak'], options['sk'])
        bucket = oss2.Bucket(auth, options['endpoint'], options['bucket'])
    
        # IOT Mqtt 初始化
        client = iot.getAliyunIotMqttClient(options['productKey'], options['deviceName'], options['deviceSecret'], secure_mode = 3)
        client.on_connect = on_connect
        client.connect(host=options['productKey'] + '.' + options['host'], port=options['port'], keepalive = 60)
    
        while True:
            # 当高电平信号输入时报警
            if GPIO.input(options['ir_pin']) == True:
                print " Someone is coming!"
                takephoto2oss(client)
            else:
                continue
            sleep(3)

    3 测试运行

    3.1 设备端运行

    在py-demo文件夹下运行

    python monitor.py

    3.2 云端查看上送消息

    进入设备界面,观察设备状态

    在设备的Topic列表中,也可以看到发布的消息个数

    高级版的产品,还提供了消息日志,而本例中的产品是基础版,并无此功能。

    3.3 钉钉群机器人结果

    当有人出入门口的时候,钉钉群就可以收到机器人的消息推送

    3.4 后续完善

    如果大家有兴趣,还可以进一步结合阿里云的人脸识别服务,再配合继电器,实现人员考勤和出入门禁的功能

    总结

    通过阿里云物联网平台,结合阿里云提供的其他产品和服务,使用者可以快速地构建一套基于云边端一体的IOT产品,开发者只需关注业务层面的开发,而不用再花太多的精力在底层和通讯上,大大减少了开发周期,实现了产品的快速研发和迭代,节约了开发成本。

    【云栖快讯】一站式开发者服务,海量学习资源免费学  详情请点击

    网友评论

  • C级总销量迫近A4L 宝马3系乏力 2019-03-21
  • 西安楼市进入短暂调整期 摇号细则近日将出 2019-03-21
  • 北京学习十九大精神--北京频道--人民网 2019-03-15
  • 临潼区马额镇庙张村西坡组农民饮用黄泥水 2019-03-13
  • 我早就说过,任何时候都不能对美国抱有幻想。否则就是白痴。 2019-03-11
  • 安徽加大就业脱贫力度 确保贫困户至少一人就业 2019-03-07
  • 环保督察点名批评 河北两市治理大沙河河堤垃圾带 2019-02-25
  • E3 2019展会日期确定 今年E3参加人数约69200人 2019-02-25
  • 外贸创新举措 让开放惠及世界 2019-02-22
  • 好莱坞环球影城“功夫熊猫”主题剧院开放 2019-02-22
  • 阜阳五中成功举办第四届社团文化艺术节文艺汇演 2019-02-21
  • 通用航空产业军民融合实现全方位突破 2019-02-21
  • 高培勇任中国社会科学院副院长(图简历) 2019-02-11
  • 撸主脑残,重度三级,鉴定完毕。[哈哈] 2019-02-05
  • 《云冈石窟保护条例》8月实施 刻划涂污文物最高罚200元--旅游频道 2019-02-05