1 準(zhǔn)備工作
設(shè)備端可以使用C,C++麸塞,Android等語言開發(fā)休蟹,后臺服務(wù)使用Java SpringBoot構(gòu)建者冤;消息服務(wù)使用阿里云物聯(lián)網(wǎng)平臺兴垦;下面主要介紹企業(yè)服務(wù)器和物聯(lián)網(wǎng)平臺的通信徙赢。
步驟1:通過HTTP/2協(xié)議訂閱設(shè)備端消息
步驟2:通過提供的SDK api接口發(fā)布消息字柠,給設(shè)備端訂閱。
首先申請阿里云賬戶狡赐,在阿里云平臺新建產(chǎn)品和設(shè)備獲取三元組信息
1.1 新建產(chǎn)品和設(shè)備
1.2設(shè)備三元組
1.3開啟訂閱服務(wù)
選擇產(chǎn)品中的服務(wù)端訂閱菜單窑业,點(diǎn)擊設(shè)置
有三個(gè)選型,可以根據(jù)需要進(jìn)行選擇
2 服務(wù)器端訂閱
2.1 接入HTTP/2 SDK
請確保JDK版本為8
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>iot-client-message</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
2.2 消息訂閱
通過阿里云賬號AccessKey進(jìn)行身份認(rèn)證枕屉,建立SDK與物聯(lián)網(wǎng)平臺的連接常柄,并訂閱設(shè)備topic,接手設(shè)備端消息
logger.info("==========init AioT properties===========");
// endPoint: https://${uid}.iot-as-http2.${region}.aliyuncs.com
// uid是阿里云賬戶id egionId是物聯(lián)網(wǎng)平臺服務(wù)所在地域代碼
String endPoint = "https://" + aiotConfig.getUserUid() + ".iot-as-http2." + aiotConfig.getRegionId() + ".aliyuncs.com";
// 連接配置
Profile profile = Profile.getAccessKeyProfile(endPoint, aiotConfig.getRegionId(), aiotConfig.getAccessKey(), aiotConfig.getAccessSecret());
// 構(gòu)造客戶端
MessageClient client = MessageClientFactory.messageClient(profile);
// 數(shù)據(jù)接收
client.connect(messageToken -> {
Message m = messageToken.getMessage();
return MessageCallback.Action.CommitSuccess;
});
MessageCallback messageCallback = new MessageCallback() {
@Override
public Action consume(MessageToken messageToken) {
Message message = messageToken.getMessage();
logger.info("receive : " + new String(message.getPayload()));
//訂閱消息處理服務(wù) payload數(shù)據(jù)體
aiotPublishService.pub(message);
return MessageCallback.Action.CommitSuccess;
}
};
//設(shè)備端消息訂閱 topic
client.setMessageListener("/ProductKey/DeviceName/user/update ",messageCallback);
2.3 消息發(fā)布
物聯(lián)網(wǎng)平臺提供的云端SDK搀擂,通過提供的API發(fā)布消息
2.3.1 maven依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-iot</artifactId>
<version>6.11.0</version>
</dependency>
<!-- 公共依賴包西潘,訂閱消息也需要引入 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.5.1</version>
</dependency>
2.3.1 服務(wù)端消息發(fā)布
/**
* 服務(wù)的消息發(fā)布
* @param mesg
* @throws IOException
*/
public static void pub(String mesg) {
MessagePack msgpack = new MessagePack();
byte[] values = msgpack.write(mesg);
PubRequest request = new PubRequest();
request.setProductKey("a12zcpFg9L2");
request.setMessageContent(Base64.encodeBase64String(values));
//消息發(fā)布topic
request.setTopicFullName("/a12zcpFg9L2/TestFace01/user/get");
request.setQos(0); //目前支持QoS0和QoS1
try {
//創(chuàng)建連接
DefaultAcsClient client = conn();
PubResponse response = client.getAcsResponse(request);
System.out.println(response.getSuccess());
System.out.println(response.getErrorMessage());
}catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
public static DefaultAcsClient conn() throws ClientException{
//通過阿里云accessKey管理獲取
String accessKey = "accessKey";
String accessSecret = "accessSecret";
DefaultProfile.addEndpoint("cn-shanghai", "cn-shanghai", "Iot", "iot.cn-shanghai.aliyuncs.com");
IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret);
DefaultAcsClient client = new DefaultAcsClient(profile); //初始化SDK客戶端
return client;
}
總結(jié)
阿里云物聯(lián)網(wǎng)平臺提供產(chǎn)品和設(shè)備管理,提供Java SDK方便開發(fā)哨颂。通過設(shè)備三元組(ProductKey喷市,DeviceName,DeviceSecret)威恼,實(shí)現(xiàn)設(shè)備端和服務(wù)端的認(rèn)證东抹,通過消息訂閱與發(fā)布,實(shí)現(xiàn)通信沃测,協(xié)議使用MQTT和HTTP/2 ; 數(shù)據(jù)傳輸協(xié)議使用MessgePack缭黔,比Json更小,效率高蒂破,節(jié)約成本馏谨。