全部产品
云市场

自定义MQTT Topic通信

更新时间:2018-12-19 15:56:18

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

上行接口请求

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

  1. /**
  2. 上行数据,直接透传,不会再按alink业务报文协议封装
  3. @param topic 消息topic
  4. @param dat 需透传的数据
  5. @param completeCallback 数据上行结果回调
  6. */
  7. -(void)uploadData:(NSString *)topic data:(NSData *)dat complete:(LKExpressOnUpstreamResult)completeCallback;
  8. /**
  9. 上行数据,不会有回执。SDK会按alink标准协议封装业务报文。
  10. @param topic 消息topic,完整的topic
  11. @param params 业务参数
  12. @param completeCallback 数据上行结果回调
  13. */
  14. -(void)publish:(NSString *) topic params:(NSDictionary *)params complete:(LKExpressOnUpstreamResult)completeCallback;

示例

  1. 1
  2. NSDictionary * params = @{@"key1":@"val1", @"key2":@"val2"};
  3. NSString * topic = @"/productKey/deviceName/update";//其中productKey/deviceName要换成真实的值
  4. [[LKIoTExpress sharedInstance] publish:topic
  5. params:params
  6. complete:^(NSError * _Nonnull error) {
  7. dispatch_async(dispatch_get_main_queue(), ^{
  8. if (error == nil) {
  9. //"publish成功"
  10. } else {
  11. //"publish失败"]
  12. }
  13. });
  14. }];
  15. //调用 [publish:params:complete:]时,SDK对数据会按 Alink协议格式再行封装
  16. {
  17. "id":"msgId" //消息id
  18. "system": {
  19. "version": "1.0", // 必填,消息版本,目前为1.0
  20. "time": "" // 必填,消息发生的时间,毫秒,
  21. },
  22. "request": {
  23. },
  24. "params": {
  25. //为入参Pamras的内容
  26. }
  27. }
  28. 2
  29. NSData *data = [NSJSONSerialization dataWithJSONObject:params
  30. options:NSJSONWritingPrettyPrinted
  31. error:nil];
  32. [[LKIoTExpress sharedInstance] uploadData:topic
  33. data:data
  34. complete:^(NSError * _Nonnull error) {
  35. dispatch_async(dispatch_get_main_queue(), ^{
  36. if (error == nil) {
  37. //"upload成功"
  38. } else {
  39. //"upload失败"]
  40. }
  41. });
  42. }];
  43. // 调用 [uploadData:data:complete]时,数据不会封装,直接透传

订阅/取消订阅

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

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

下行数据监听

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

  1. @protocol LKExpressDownListener<NSObject>
  2. -(void)onDownstream:(NSString *) topic data: (id _Nullable) data;///<topic-消息topic,data-消息内容,NSString 或者 NSDictionary
  3. -(BOOL)shouldHandle:(NSString *)topic;///<数据使用onDownstream:data:上抛时,可以先过滤一遍,如返回NO,则不上传,返回YES,则会使用onDownstream:data:上抛
  4. @end
  5. [[LKIoTExpress sharedInstance] addDownstreamListener:LKExpressDownListenerTypeGw listener:(id<LKExpressDownListener>)downListener];
  6. //downListener在本SDK中 是 weak reference,所以需要调用者保证生命周期。
  7. //LKExpressDownListenerTypeGw,请务必使用此值