ESP-EYE AI人脸识别 开发板结合 IoT 物联网平台实战!
虽然已融入打工人队伍多年,但学生时代,老师站在后窗外的阴影依然挥之不去。在刷头条,看B站的时候,总是担心着老板来了!直到有了ESP-EYE 低成本的人脸识别开发板,结合云上IoT物联网服...
一、技术方案
首先,众筹一块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开发板上。
五、部署监控
辛苦了一整天,大功告成!让我们找个隐蔽的角落,部署起来,守株待老板们!
终于,老板来了!
而且是老板三连,是来发年终奖了吧!
往期推荐
更多推荐
所有评论(0)