一、技术方案

首先,众筹一块ESP-EYE本地人脸识别开发板;其次,录入老板人脸信息;然后,把开发板连接云端IoT物联网平台;接着,通过规则引擎把数据流转到函数计算;最后,函数计算中调用钉钉群机器人,完成老板来了告警!

二、ESP-EYE 人脸识别

ESP-EYE 是一款专注于本地图像识别的开发板,板载ESP32芯片,集成200万像素摄像头,拥有8 MByte PSRAM和4 MByte flash的丰富存储,支持Wi-Fi图像传输与Micro USB调试与供电,可广泛应用于 AI 智能物联网领域的应用开发。


2.1  烧录人脸识别程序

我们基于 Arduino 编程来降低 ESP-EYE 人脸识别程序开发难度。

首先,我们在 Preferences 中新增 arduino-esp32 配置URL:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

然后,我们在Boards Manager 中搜索并安装esp32 package(1.0.4)。

安装完成后,我们基于CameraWebServer 示例程序做二次开发。

打开 CameraWebServer 文件, 选择 CAMERA_MODEL_ESP_EYE,设置办公室的ssid和password,用于开发板联网。

修改完成后,我们在Tools 中选择Board 为 AI Thinker ESP32-CAM

点击左上角的编译和烧录按钮,等待 Arduino 程序完成编译,烧录到开发板上。稍待片刻,我们在控制台上看到如下输出,代表人脸识别程序已经成功启动。 

2.2  录入老板人脸图片

在同一局域网内,输入控制台网址,进入ESP32人脸识别程序控制台,启动视频推流,开启人脸识别,点击 Enroll Face 来完成老板们的人脸库录入。

当有老板经过,我们就会在控制台看到如下日志输出: Match Face ID: 0。

三、IoT 物联网平台开发

本地识别成功后,我们需要把老板来了的消息发送到云端,以便完成钉钉群告警。

3.1  创建产品和注册设备

我们在 IoT 物联网平台控制台,创建产品esp-eye摄像头,并添加物模型-属性:老板编号,标识符为bossId,取值范围 0~10

物模型属性:

我们在esp-eye摄像头产品下,注册一个设备,并获取到设备身份三元组,用于和云端建立连接时的身份认证。

3.2  配置规则引擎

云产品流转中,我们需要配置一条消息流转的规则引擎,把设备上报的物模型数据,流转到函数计算 pushData2DingTalk 中。

数据处理SQL编写:

转发数据到函数计算的配置:

3.3  函数计算脚本

用于接收 IoT平台 传递过来的消息,并实时推送到钉钉群中的函数计算脚本完整内容如下:

const https = require('https');
const accessToken = '钉钉机器人token';
const boss = ["唐僧","观音菩萨","如来佛祖"];

module.exports.handler = function(event, context, callback) {
    //IoT平台 传递过来的 event 数据
    var eventJson = JSON.parse(event.toString());

    const postData = JSON.stringify({
        "msgtype": "markdown",
        "markdown": {
            "text": "老板["+boss[eventJson.bossId]+"]来了,安心工作!"
        },
        "at": {
            "isAtAll": true
        }
    });

    const options = {
        hostname: 'oapi.dingtalk.com',
        port: 443,
        path: '/robot/send?access_token='+accessToken,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(postData)
        }
    };
    const req = https.request(options, (res) => {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {});
        res.on('end', () => {
            callback(null, 'success');
        });
    });

    req.on('error', (e) => {
        callback(e);
    });

    req.write(postData);
    req.end();
};

3.4  钉钉群机器人

打开摸鱼群,群管理>智能群助手,添加自定义机器人,获取到消息推送的Webhook地址,配置到函数计算脚本中。

四、ESP-EYE开发板 上云

设备上云基于 MQTT 协议,因此我们引入 PubSubClient 库,并修改 MQTT 连接的默认参数,具体如下:

设备身份三元组信息和连接参数:

/* 设备的三元组信息 */
#define PRODUCT_KEY       "替换PRODUCT_KEY"
#define DEVICE_NAME       "替换DEVICE_NAME"
#define DEVICE_SECRET     "替换DEVICE_SECRET"
#define REGION_ID         "cn-shanghai"
/* IoT物联网平台Endpoint 域名和端口号 */
#define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT         1883
#define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY
//用于身份验证的 MQTT_PASSWD和CLIENT_ID
#define CONTENT_STR_FORMAT    "clientIdesp32deviceName" DEVICE_NAME "productKey" PRODUCT_KEY "timestamp%d"
char  CLIENT_ID[80] = {'\0'};
char * MQTT_PASSWD;

WiFiClient espClient;
PubSubClient  client(espClient);

物模型通信的Topic和Payload模板:

/* topic和payload */
#define PROP_POST_TOPIC "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
#define BODY_FORMAT     "{\"id\":\"1234\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":{\"bossId\":%d}}"

当有老板人脸匹配成功后,及时上报到云端:

char jsonBuf[128];
sprintf(jsonBuf, BODY_FORMAT, face_id);

if (client.connected()) {
   boolean d = client.publish(PROP_POST_TOPIC, jsonBuf);
   Serial.print("publish:1=成功,0=失败,Code=");
   Serial.println(d);
}

最后,我们把完整版程序烧录到ESP-EYE开发板上。

五、部署监控

辛苦了一整天,大功告成!让我们找个隐蔽的角落,部署起来,守株待老板们!

终于,老板来了!

而且是老板三连,是来发年终奖了吧!

往期推荐

1、39张传感器工作原理GIF图

2、智能手持测温枪开发实践

3、自建MQTT集群迁移阿里云IoT实践

4、IoT+TSDB+Quick BI 搭建楼宇环境监控

更多推荐