iOS SDK提供了与云端长连接的基础能力接口,用户可以直接使用这些接口完成自定义Topic相关的功能。提供的基础能力包括:发布、订阅、取消订阅、订阅下行。可以通过这部分接口实现云端数据的上下行。

调用上行请求接口,SDK封装了上行发布相关接口。

/**
 上行数据,直接透传,不会再按alink业务报文协议封装
 @param topic 消息topic
 @param dat 需透传的数据
 @param completeCallback 数据上行结果回调
 */
-(void)uploadData:(NSString *)topic data:(NSData *)dat complete:(LKExpressOnUpstreamResult)completeCallback;


/**
 上行数据,不会有回执。SDK会按alink标准协议封装业务报文。
 @param topic 消息topic,完整的topic
 @param params 业务参数
 @param completeCallback 数据上行结果回调
 */
-(void)publish:(NSString *) topic params:(NSDictionary *)params complete:(LKExpressOnUpstreamResult)completeCallback;
        

示例

1、
NSDictionary * params = @{@"key1":@"val1", @"key2":@"val2"};
NSString * topic = @"/productKey/deviceName/update";//其中productKey/deviceName要换成真实的值

[[LKIoTExpress sharedInstance] publish:topic 
                               params:params 
                             complete:^(NSError * _Nonnull error) {
                                     dispatch_async(dispatch_get_main_queue(), ^{
                                         if (error == nil) {
                                             //"publish成功"
                                         } else {
                                             //"publish失败"]
                                         }
                                     });
                                 }];
//调用 [publish:params:complete:]时,SDK对数据会按 Alink协议格式再行封装
{
 "id":"msgId" //消息id
 "system": {
    "version": "1.0",  // 必填,消息版本,目前为1.0
     "time": ""  // 必填,消息发生的时间,毫秒,
 },
 "request": {
 },
 "params": {
    //为入参Pamras的内容
 }
 }

2、
NSData *data = [NSJSONSerialization dataWithJSONObject:params 
                                               options:NSJSONWritingPrettyPrinted 
                                                 error:nil];
[[LKIoTExpress sharedInstance] uploadData:topic 
                                     data:data 
                                 complete:^(NSError * _Nonnull error) {
                                     dispatch_async(dispatch_get_main_queue(), ^{
                                         if (error == nil) {
                                             //"upload成功"
                                         } else {
                                             //"upload失败"]
                                         }
                                     });
                                 }];
// 调用 [uploadData:data:complete]时,数据不会封装,直接透传

        

订阅、取消订阅

由于此连接通道是基于Mqtt协议的。而Mqtt协议是基于订阅、发布模型。如A方往TopicA上publish了一段数据,那么B方如果要能收到此段数据,则需要先行订阅TopicA。如果不希望再收到TopicA上的数据,则可以取消订阅TopicA。



/**
 移动网关订阅topic的接口
 @param topic 订阅的消息的topic,由具体业务确定,需要传完整的topic区段,形如:
 /sys/${productKey}/${deviceName}/app/abc/cba
 @param completionHandler 订阅流程结束的callback,如果error为空表示订阅成功,否则订阅失败
 */
- (void)subscribe:(NSString *)topic complete: (void (^)(NSError  * _Nullable error))completionHandler;


/**
 移动网关取消订阅topic的接口
 @param topic 订阅的消息的topic,由具体业务确定,需要传完整的topic区段,形如:
 /sys/${productKey}/${deviceName}/app/abc/cba
 @param completionHandler 取消订阅流程结束的callback,如果error为空表示订阅成功,否则订阅失败
 */
- (void)unsubscribe : (NSString *)topic complete: (void (^)(NSError  * _Nullable error))completionHandler;
            

下行数据监听

订阅Topic成功后,还需要注册listener来监听,SDK才会把此Topic的数据上抛。

@protocol LKExpressDownListener<NSObject>
-(void)onDownstream:(NSString *) topic data: (id _Nullable) data;///<topic-消息topic,data-消息内容,NSString 或者 NSDictionary

-(BOOL)shouldHandle:(NSString *)topic;///<数据使用onDownstream:data:上抛时,可以先过滤一遍,如返回NO,则不上传,返回YES,则会使用onDownstream:data:上抛
@end

[[LKIoTExpress sharedInstance] addDownstreamListener:LKExpressDownListenerTypeGw listener:(id<LKExpressDownListener>)downListener];
//downListener在本SDK中 是 weak reference,所以需要调用者保证生命周期。
//LKExpressDownListenerTypeGw,请务必使用此值