阿里云物联网平台安卓link sdk的封装类,实现指定topic的发布,订阅,取消订阅
MQTT类,实现指定topic的发布,订阅,取消订阅
import android.content.Context;
import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.linkkit.api.*;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttPublishRequest;
import com.aliyun.alink.linksdk.cmp.core.base.ARequest;
import com.aliyun.alink.linksdk.cmp.core.base.AResponse;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSendListener;
import com.aliyun.alink.linksdk.tmp.device.payload.ValueWrapper;
import com.aliyun.alink.linksdk.tools.AError;
import com.whz.tools.*;
import java.util.HashMap;
import java.util.Map;
public class MQTT {
ILinkKit iLinkKit;
public void init(){
this.iLinkKit=LinkKit.getInstance();
}
public void connect(String productKey,
String deviceName,
String deviceSecret,
Context context){
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
Map propertyValues = new HashMap<>();
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig(productKey,
deviceName,
deviceSecret);
LinkKitInitParams params = new LinkKitInitParams();
params.deviceInfo = deviceInfo;
params.propertyValues = propertyValues;
params.mqttClientConfig = clientConfig;
iLinkKit.init(context,params, new ILinkKitConnectListener() {
@Override
public void onError(AError error) {
}
@Override
public void onInitDone(Object data) {
}
});
}
public void pub(String PubTopic,
String PubMethod,
String RelyTopic,
String device,
int data){
MqttPublishRequest request = new MqttPublishRequest();
request.isRPC = false;
request.qos = 0;
request.topic = PubTopic;
request.replyTopic =RelyTopic;
request.payloadObj ="{\"id\":\"456\", \"version\":\"1.0\",\"method\":\""+PubMethod+"\",\"params\":{\""+device+"\""+":"+data+"} }";
iLinkKit.publish(request, new IConnectSendListener() {
@Override
public void onResponse(ARequest aRequest, AResponse aResponse) {
}
@Override
public void onFailure(ARequest aRequest, AError aError) {
}
});
}
public void sub(String SubTopic){
if (SubTopic==null)return;
Sub sub=new Sub(SubTopic,iLinkKit);
sub.start();
}
public void unSub(String UnSubTopic){
if(UnSubTopic==null)return;
UnSub unSub=new UnSub(UnSubTopic,iLinkKit);
unSub.start();
}
public void setListener(Listener listener){
iLinkKit.registerOnPushListener(listener);
}
}
工具类Listener,全局监听接口,所有下发的消息全部在此接受
import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
import com.aliyun.alink.linksdk.cmp.core.base.ConnectState;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectNotifyListener;
public class Listener implements IConnectNotifyListener{
private String data;
@Override
public void onNotify(String connectId, String topic, AMessage aMessage) {
data = new String((byte[]) aMessage.data);
}
@Override
public boolean shouldHandle(String connectId, String topic) {
return true;
}
@Override
public void onConnectStateChange(String connectId, ConnectState connectState) {
}
public String getData(){
return data;
}
}
工具类Sub、UnSub、SubListener、UnSubListener。
由于订阅、取消订阅时安卓设备可能存在掉线情况,因此需要通过Sub、UnSub线程类,进行循环多次发送订阅、取消订阅指令,直到订阅成功。
使用线程可以避免安卓循环长度过长而报错,并且提高运行速度。
订阅是否成功由工具类SubListener、UnSubListener反馈。
Sub线程类
import com.aliyun.alink.linkkit.api.ILinkKit;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttSubscribeRequest;
public class Sub extends Thread{
private String SubTopic;
private ILinkKit iLinkKit;
public Sub(String SubTopic,ILinkKit iLinkKit){
this.iLinkKit=iLinkKit;
this.SubTopic=SubTopic;
}
@Override
public void run(){
if (SubTopic==null)return;
boolean isSub=false;
MqttSubscribeRequest subscribeRequest = new MqttSubscribeRequest();
subscribeRequest.topic = SubTopic;
subscribeRequest.isSubscribe = true;
subscribeRequest.qos = 0;
SubListener subListener=new SubListener();
while (!isSub){
iLinkKit.subscribe(subscribeRequest,subListener);
isSub=subListener.getIsSub();
}
}
}
UnSub线程类
import com.aliyun.alink.linkkit.api.ILinkKit;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttSubscribeRequest;
public class UnSub extends Thread {
private String UnSubTopic;
private ILinkKit iLinkKit;
public UnSub(String UnSubTopic,ILinkKit iLinkKit){
this.iLinkKit=iLinkKit;
this.UnSubTopic=UnSubTopic;
}
@Override
public void run() {
if (UnSubTopic == null) return;
boolean isUnSub=false;
MqttSubscribeRequest UnSubscribeRequest = new MqttSubscribeRequest();
UnSubscribeRequest.topic = UnSubTopic;
UnSubscribeRequest.isSubscribe = false;
UnSubscribeRequest.qos = 0; // 支持0或者1
UnSubListener unSubListener = new UnSubListener();
while (!isUnSub) {
iLinkKit.unsubscribe(UnSubscribeRequest, unSubListener);
isUnSub=unSubListener.getIsUnSub();
}
}
}
SubListener
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSubscribeListener;
import com.aliyun.alink.linksdk.tools.AError;
public class SubListener implements IConnectSubscribeListener {
private boolean isSub=false;
@Override
public void onSuccess() {
isSub=true;
}
@Override
public void onFailure(AError aError) {
isSub=false;
}
public boolean getIsSub(){
return isSub;
}
}
UnSubListener
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectUnscribeListener;
import com.aliyun.alink.linksdk.tools.AError;
public class UnSubListener implements IConnectUnscribeListener {
private boolean IsUnSub=false;
@Override
public void onSuccess() {
IsUnSub=true;
}
@Override
public void onFailure(AError aError) {
IsUnSub=false;
}
public boolean getIsUnSub(){
return IsUnSub;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)