本文Demo主要针对GeekOpen提供的开放智能插座进行的软件二次开发,不涉及任何硬件知识,也无需修改智能插座固件,一般开发者15分钟即可实现对设备的操控。智能插座通过MQTT协议连接阿里云物联网平台,使用阿里云SDK对智能插座进行管理,包括实时查询插座的电流电压以及累计电量,并可以实时远程控制插座的通电与断电,实现对插座的用电管理,适用的业务场景包括自助洗车、共享茶室、智慧教室、智慧办公、智慧农业、智能充电等。具体业务需要开发者自己实现,GeekOpen仅提供开放的智能设备,软件开发或固件开发的过程中遇到任何问题,请与GeekOpen技术服务团队联系。
阿里云物联网平台Java SDK使用说明
物联网平台提供的Java SDK,可帮助开发人员通过Java程序更便捷地操作物联网平台。开发人员可以添加包含Maven依赖的SDK,也可以下载安装包到本地直接安装。其他语言版本Demo,请参考阿里云或前往 GeekOpen 下载: GeekOpen 智能硬件开放平台,支持软件二次开发与硬件定制开发! (geek-open.com)
第一步:pom.xml添加依赖
<!-- 新版IoT Java SDK的Maven依赖坐标 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>iot20180120</artifactId>
<version>3.0.8</version>
</dependency>
<!--阿里云Java SDK公共包Maven依赖坐标-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.2.2</version>
</dependency>
第二步:阿里云RAM访问控制参数获取
前往阿里云官网,进入RAM访问控制页面,创建AccessKey 即可获取 accessKey 与 accessKeySecret
第三步:阿里云物联网平台获取产品与设备参数
前往阿里云官网, 阿里云物联网平台获取产品与设备参数,productKey、topicFullName
第四步:运行Demo工程
前往阿里云官网, 阿里云物联网平台获取产品与设备参数,productKey、topicFullName

第五步:通过Postman 测试 api,控制插座的通电、断电,查询插座电压、功率与累计电量
引用阿里云物联网平台提供的SDK之后 ,使用 Client建立客户端,然后使用PubRequest发送消息即可实现对设备的消息指令发送,控制设备。
插座断电 http://localhost:8080/api/iot/close

插座通电 http://localhost:8080/api/iot/open
Client
Config config = new Config();
config.accessKeyId = accessKey;
config.accessKeySecret = accessKeySecret;
config.regionId = "cn-shanghai";
Client client = new Client(config);
附:智能插座接入阿里云物联网平台,java源码
下载地址
IotController.java
package com.geekopen.iot.aliyundemo.controllers;
import com.geekopen.iot.aliyundemo.services.IotService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Random;
@RestController
@RequestMapping ("/api/iot")
public class IotController {
@Autowired
private IotService iotService;
private String topic = "/a18VyElLe8c/smart-plug-test/user/get";
/**
* 智能插座、智能开关 - 通电
* @ return
*/
@GetMapping ("/open")
@ResponseBody
public String open()
{
String message = "{\"type\":\"event\",\"key\":1}";
iotService.pub(topic,message);
return "ok";
}
/**
* 智能插座、智能开关 - 断电
* @ return
*/
@GetMapping ("/close")
@ResponseBody
public String close()
{
String message = "{\"type\":\"event\",\"key\":0}";
iotService.pub(topic,message);
return "ok";
}
/**
* 智能插座用电信息查询 - 电量采集、电压查询、功率监控
* @ return
*/
@GetMapping ("/statistic")
@ResponseBody
public String statistic()
{
String messageId = "myMessageId"+ new Random().nextInt(1,100) ;
String message = "{\"messageId\":\""+ messageId +"\",\"type\":\"statistic\"}";
iotService.pub(topic,message);
return messageId;
}
}
IotService.java
package com.geekopen.iot.aliyundemo.services;
import com.aliyun.iot20180120.Client;
import com.aliyun.iot20180120.models.PubRequest;
import com.aliyun.iot20180120.models.PubResponse;
import com.aliyun.iot20180120.models.SubscribeTopicRequest;
import com.aliyun.iot20180120.models.SubscribeTopicResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.Base64;
import java.util.List;
@Service
public class IotService {
private static final Logger log = LoggerFactory.getLogger(IotService.class);
/**
* 您的AccessKey ID。
* 阿里云账号 RAM访问控制,可以申请 AccessKey
*/
private String accessKey = "***************";
/**
* 您的AccessKey Secret。
* 阿里云账号 RAM访问控制,申请 AccessKey 获得 accessKeySecret
*/
private String accessKeySecret = "*****************";
/**
* 阿里云物联网平台 productKey,创建产品时获得
*/
private String productKey = "a18VyElLe8c";
/**
* 使用AK&SK初始化Client。
*/
private Client createClient() throws Exception {
Config config = new Config();
config.accessKeyId = accessKey;
config.accessKeySecret = accessKeySecret;
// 您的可用区ID。阿里云物联网平台公共实例使用 cn-shanghai
config.regionId = "cn-shanghai";
return new Client(config);
}
/**
* 发布消息,调用次方法,控制智能插座、智能开关等
* @param topic
* @param message
*/
public void pub(String topic, String message) {
try {
Client client = createClient();
PubRequest request = new PubRequest()
//如果使用阿里云物联网平台公共实例,则无需设置IotInstanceId
//.setIotInstanceId ("${iotInstanceId}")
.setProductKey(productKey)
.setMessageContent(Base64.getEncoder().encodeToString(message.getBytes()))
//.setMessageContent ("{\"type\":\"event\",\"key\":1}")
.setTopicFullName(topic)
.setQos(0);//目前支持QoS0和QoS1。
PubResponse response = client.pub(request);
//获取本次调用requestId。
log.info("获取本次调用requestId:"+response.getBody().getRequestId());
//调用是否成功。
log.info("调用是否成功:"+response.getBody().getSuccess());
//调用成功。
if (response.getBody().getSuccess()) {
//获取云端消息ID。
log.info("获取云端消息ID:"+response.getBody().getMessageId());
//do业务逻辑。
} else {
//调用失败。
//获取调用失败错误码。
log.info("调用失败,code:"+response.getBody().getCode());
//获取调用失败错误描述。
log.info("调用失败,message:"+response.getBody().getErrorMessage());
}
} catch (TeaException error) {
//服务端业务异常。
log.info("服务端业务异常,code:"+error.getCode());
log.info("服务端业务异常,message:"+error.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
进阶,服务端订阅
GeekOpen原创文章,转载请注明来源 http://www.geek-open.com