导入SDK
前往下载SDK;然后你回获得SDK对应jar包和SDK
SDK: ysmq-subscribe-sdk-1.0.2-RELEASE.jar
demo: ysmq-subscribe-sdk-demo-1.0.1.rar解压sdk-demo的压缩包. 解压后导入Eclipse/Intellij,导入后如图所示:
这时候项目是有错的,因为没有导入sdk的jar包.
- 导入SDK的依赖: pom结构如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j-version>1.7.25</slf4j-version>
</properties>
<dependencies>
<!-- http -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.39</version>
</dependency>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-version}</version>
</dependency>
</dependencies>
主要依赖三个包:
依赖项目 | 作用 |
---|---|
okHttp | http请求 |
fastjson | json解析 |
slf4j-log4j12 | 日志框架 |
- 在项目中导入sdk的 jar包.
右键项目选择 Build path -> Configure Build path,如图:
选择Add External JARs... 选择你放jar包的位置,导入即可:
导入后,项目如图:
已经没有报错了,sdk demo 中有四个类. log4j是slf4j日志框架的配置文件.
SDK使用
我们先来看看demo中的这个类:ReadCommitMessagePatternMain
1.首先是一些基本的配置:
// 设置你的appKey
private static String appKey = "";
// 设置你的appSecret
private static String appSecret = "";
// 设置group,group只能是group1->group5,其他会报出参数错误
private static String group = "group3";
// 打印日志的log可以适配你自己的打印日志的框架.
private static Log log = LogFactory.getLog(ReadCommitMessagePatternMain.class);
- 初始化StandardConsumerMessage 类,在这个类中设置你的消费消息的回调接口:
public static void init() {
// 设置你的appkey,appSecret,group
StandardConsumerMessage consumerMessage = new StandardConsumerMessage(appKey, appSecret, group);
// 设置调用接口的间隔时间,ms
consumerMessage.setConsumeIntervalTime(1000);
// 设置消费消息的回调接口,建议把消息放入本地队列,不要在回调函数里做业务处理.
consumerMessage.setConsumerCallBack(new ConsumerCallBack() {
public void consumerCall(List<Object> msg) {
if (msg.size() > 100) {
// 消息太多,只打印前100个
log.info("msgSize:{},msg:{}", msg.size(), msg.subList(0, 100));
} else {
log.info("msgSize:{},msg:{}", msg.size(), msg);
}
for (Object object : msg) {
// class com.alibaba.fastjson.JSONObject
log.info("my readMessageHandle object:{},class:{}", object, object.getClass());
}
}
});
consumerMessage.initClient();
}
注意代码中的 consumerMessage.setConsumerCallBack() 方法,在这里边设置你消费消息的回调函数.
/**
* <p>
* 消费消息的回调
* </p>
*/
public interface ConsumerCallBack {
void consumerCall(List<Object> msg);
}
回调接口中的 void consumerCall(List
下边是一个自定义回调接口的简单示例:
new ConsumerCallBack() {
public void consumerCall(List<Object> msg) {
if (msg != null) {
if (msg.size() > 100) {
// 消息太多,只打印前100个
log.info("msgSize:{},msg:{}", msg.size(), msg.subList(0, 100));
} else {
log.info("msgSize:{},msg:{}", msg.size(), msg);
}
for (Object object : msg) {
// class com.alibaba.fastjson.JSONObject
log.info("my readMessageHandle object:{},class:{}", object, object.getClass());
}
}
}
}
Object的类是com.alibaba.fastjson.JSONObject 这个类
是一个json格式的对象:
public class JSONObject extends JSON implements Map<String, Object>
这个JSONObject 里边具体的结构如下:
{
"header": {
"type": "device",//用户订阅的消息类型
"deviceId": "427734203",//设备序列号
"channelNo":"1"//设备通道号
},
"content": {//设备上传的消息,原封不动的放在这里
"test": "msg_content"
}
}
header ---> 消息头
content -->设备上传的消息
附录:消息字段返回字段
type为ys.alarm即表示萤石云告警消息,以下是告警消息结构体:
字段名 | 类型 | 描述 |
---|---|---|
header | Object | 设备信息 |
type | String | 消息类型:ys.alarm表示设备告警消息 |
deviceId | String | 设备序列号 |
channelNo | String | 设备通道号 |
messageId | String | 消息唯一ID |
body | Object | 设备上传的消息 |
devSerial | String | 设备序列号 |
channel | Integer | 设备通道号 |
channelType | Integer | 设备通道类型: 1-视频通道信息; 2-IO通道 |
alarmType | String | 告警类型, 见 附录:萤石设备告警消息类型 |
alarmId | String | 设备自己生成的UUID, 用来标识唯一的告警,统一告警的开始、结束采用统一alarmId |
relationId | String | 告警关联ID,由发起联动方产生,用来表示联动的关联关系 |
status | Integer | 告警状态 1-开始 |
location | String | 告警位置信息:长度不能超过80字节 |
describe | String | 告警描述,需要推送给客户的信息 |
alarmTime | String | 告警时间,格式: yyyy-MM-ddTHH:mm:ss |
customType | String | 自定义协议类型,命名规则:设备型号_协议标识 如:CS-A1-32W_XX |
crypt | Integer | 图片加密类型:0-不加密,1-用户加密,2-平台加密 |
requestTime | Long | 服务端记录的请求时间 |
pictureList | List | 告警图片相关信息 |
shortUrl | String | 告警图片短地址 |
id | String | 平台生成的告警Id |
url | String | 告警图片URL |
type为ys.onoffline即表示萤石云上下线消息,以下是上下线消息结构体:
字段名 | 类型 | 描述 |
---|---|---|
header | Object | 设备信息 |
type | String | 消息类型:ys.onoffline表示设备上下线消息 |
deviceId | String | 设备序列号 |
channelNo | String | 设备通道号 |
messageId | String | 消息唯一ID |
body | Object | 设备上传的消息 |
subSerial | String | 设备序列号 |
occurTime | String | 设备上线(离线)时间,格式: yyyy-MM-dd HH:mm:ss |
regTime | String | 设备上一次注册时间,格式: yyyy-MM-dd HH:mm:ss |
natIp | String | 设备外网IP |
devType | String | 设备类型 |
deviceName | String | 设备名称 |
msgType | String | 消息类型:OFFLINE-设备离线消息,ONLINE-设备上线消息 |