阿里云物联网平台IoT Studio调用人脸识别服务示例
概述
目前IoT Studio服务开发模块提供了云市场人脸识别API的调用模块,但是还没有直接调用阿里云人脸识别API的方法,本文从设备端开始上传图片到oss服务,然后通过上行消息传递图片URL,使用NodeJS节点进行阿里云人脸识别服务的调用,将调用的结果通过云数据库MySQL进行存储。
Step By Step
一、设备端开发
1、pom.xml
<dependencies> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.8.0</version> </dependency> </dependencies>
2、Device Code Sample
import com.alibaba.taro.AliyunIoTSignUtil; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.CannedAccessControlList; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class FaceDemoUpload { public static String productKey = "a1o9N******"; public static String deviceName = "d******"; public static String deviceSecret = "7Ukl6Ka80nIEXhUwCmw7XrUC********"; public static String regionId = "cn-shanghai"; // 物模型-属性上报topic private static String pubTopic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post"; // 自定义topic,在产品Topic列表位置定义 private static String subTopic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply"; private static MqttClient mqttClient; public static void main(String[] args) { initAliyunIoTClient(); ScheduledExecutorService scheduledThreadPool = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat("thread-runner-%d").build()); scheduledThreadPool.scheduleAtFixedRate(() -> postDeviceProperties(), 10, 5, TimeUnit.SECONDS); try { mqttClient.subscribe(subTopic); // 订阅Topic } catch (MqttException e) { System.out.println("error:" + e.getMessage()); e.printStackTrace(); } // 设置订阅监听 mqttClient.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable throwable) { System.out.println("connection Lost"); } @Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { System.out.println("Sub message"); System.out.println("Topic : " + s); System.out.println(new String(mqttMessage.getPayload())); //打印输出消息payLoad } @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { } }); } /** * 初始化 Client 对象 */ private static void initAliyunIoTClient() { try { // 构造连接需要的参数 String clientId = "java" + System.currentTimeMillis(); Map<String, String> params = new HashMap<>(16); params.put("productKey", productKey); params.put("deviceName", deviceName); params.put("clientId", clientId); String timestamp = String.valueOf(System.currentTimeMillis()); params.put("timestamp", timestamp); // cn-shanghai String targetServer = "tcp://" + productKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com:1883"; String mqttclientId = clientId + "|securemode=3,signmethod=hmacsha1,timestamp=" + timestamp + "|"; String mqttUsername = deviceName + "&" + productKey; String mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, "hmacsha1"); connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword); } catch (Exception e) { System.out.println("initAliyunIoTClient error " + e.getMessage()); } } public static void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception { MemoryPersistence persistence = new MemoryPersistence(); mqttClient = new MqttClient(url, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); // MQTT 3.1.1 connOpts.setMqttVersion(4); connOpts.setAutomaticReconnect(false); connOpts.setConnectionTimeout(10); // connOpts.setCleanSession(true); connOpts.setCleanSession(false); connOpts.setUserName(mqttUsername); connOpts.setPassword(mqttPassword.toCharArray()); connOpts.setKeepAliveInterval(60); mqttClient.connect(connOpts); } /** * 汇报属性 */ private static void postDeviceProperties() { try { //上报数据 //高级版 物模型-属性上报payload System.out.println("上报属性值"); //上传本地图片 // Request body C:\Users\Administrator\Desktop\timg.jpg String pic_path = "C:\\Users\\Administrator\\Desktop\\timg.jpg";//本地图片的路径 String picURL = uploadPicToOss(pic_path); String payloadJson = "{\"params\":{\"textdata\":\"" + picURL + "\"}}"; MqttMessage message = new MqttMessage(payloadJson.getBytes("utf-8")); message.setQos(1); mqttClient.publish(pubTopic, message); } catch (Exception e) { System.out.println(e.getMessage()); } } public static String uploadPicToOss(String filePath) { // Endpoint以上海为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-shanghai.aliyuncs.com"; String bucketName = "taro******"; // bucket名称 String key = "pic/timg.jpg"; // 文件路径及名称 // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "LTAIOZZg********"; String accessKeySecret = "v7CjUJCMk7j9aKduMA************"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, new File(filePath)); // 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。 ObjectMetadata metadata = new ObjectMetadata(); // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString()); metadata.setObjectAcl(CannedAccessControlList.PublicRead); putObjectRequest.setMetadata(metadata); // 上传文件。 ossClient.putObject(putObjectRequest); // 关闭OSSClient。 ossClient.shutdown(); return "https://" + bucketName + ".oss-cn-shanghai.aliyuncs.com/" + key; // 返回图片在OSS中公网可以直接访问的URL } }
二、服务开发模块搭建
1、设备触发
2、Node.js 脚本
/** * @param {Object} payload 上一节点的输出 * @param {Object} node 指定某个节点的输出 * @param {Object} query 服务流第一个节点的输出 * @param {Object} context { appKey, appSecret } */ module.exports = async function (payload, node, query, context) { const Core = require('@alicloud/pop-core'); var client = new Core({ accessKeyId: 'LTAIOZZg********', accessKeySecret: 'v7CjUJCMk7j9aKduMA************', endpoint: 'https://face.cn-shanghai.aliyuncs.com', apiVersion: '2018-12-03' }); var params = { "ImageUrl": query.props.textdata.value } var requestOption = { method: 'POST' }; var result = await client.request('GetFaceAttribute', params, requestOption); return result; }
三、云数据库MySQL
数据库建表语句:
/*------- CREATE SQL---------*/ CREATE TABLE `iotface1` ( `face_num` INT DEFAULT NULL, `gender` INT DEFAULT NULL, `glass` INT DEFAULT NULL, `expression` INT DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
部署运行
四、运行测试
1、设备端日志
2、节点日志
3、数据库输入插入查询
参考链接
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云智能事业群 EMR团队招人啦!
团队介绍 阿里云智能事业群 EMR 是阿里巴巴计算平台事业部的开源大数据生态体系核心技术团队。我们以 Apache Hadoop 和 Spark为核心打造一站式大数据分析平台,在阿里云上提供有竞争力的 E-MapReduce大数据上云服务产品套件,涵盖众多主流核心开源组件,如 Hadoop,Spark,Hive,Presto,Kafka,Hbase,Flink,Tensorflow 等。在过去一年,基于最新打造的 Jindo Spark 核心引擎,E-MapReduce 产品先后两次打破 TPC-DS 世界记录。我们的技术团队不仅包括阿里飞天大数据资深优化专家,同时围绕开源技术体系构建,包括来自Apache Hadoop/Spark/Flink/Hive 等顶级开源项目的多位PMC/Committer成员。我们热烈欢迎有志于开源技术
- 下一篇
MySQL常用优化指南,及大表优化思路(值得收藏)
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 当MySQL单表记录数过大时,增删改查性能都会急剧下降 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。 而事实上很多时候 MySQL 单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量。 字段 尽量使用 TINYINT、 SMALLINT、 MEDIUM_INT 作为整数类型而非 INT,如果非负则加上 UNSIGNED VARCHAR 的长度只分配真正需要的空间 使用枚举或整数代替字符串类型 尽量使用 TIMESTAMP 而非 DATETIME 单表不要有太多字段,建议在 20 以内 避免使用 NULL 字段,很难查询优化且占用额外索引空间 用整型来存 IP 索引 索引并不是越多越好,要根据查询有针对性的创建,考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根据 EXPLAIN 来查看是否用了索引还是全表扫描 应尽量...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Mario游戏-低调大师作品