本文介绍如何进行 SDK 初始化,建立设备与云端的连接。

物联网平台对设备的身份认证支持设备证书、X.509、ID2等方式,对于设备证书方式还增加动态注册机制用于简化设备的证书烧录。Java SDK目前只支持设备证书的认证方式,并且暂不支持“动态注册”;客户可以访问“设备安全认证”了解这些认证方式的具体定义与区别。

设备证书的方式指设备具备阿里云物联网平台颁发的
  • ProductKey:产品的型号定义
  • DeviceName:设备的唯一标识
  • DeviceSecret:设备的共享密钥
设备连接物联网平台时需要上报自己的ProductKey、DeviceName以及使用DeviceSecret计算的签名数据,物联网平台将会根据收到的ProductKey和DeviceName以及其它数据进行签名计算,如果验证设备上报的签名正确,则认为设备是合法设备;因此Java SDK在初始化时需要提供设备的证书信息。
另外一个比较重要的参数是物联网平台的域名。物联网平台在国内的多个阿里云地域(比如上海、深圳、北京)、以及多个国家和地区(比如日本、新加坡、美国等等)进行了部署,另外物联网平台还分为公共实例与企业实例的形态,设备在连接的时候需要指定设备需要连接的物联网平台服务端的域名:
  • 公共实例

    公共实例的域名结构为:{productKey}.iot-as-mqtt.RegionID.aliyuncs.com",其中的RegionID即代表相应的站点,其取值可以从“地域和可用区”中查看,需要注意的是物联网平台这个服务并不是在所有的阿里云地域都进行了部署,因此这里填入的RegionID一定要和产品创建的地域相同,比如“华东2(上海)”的RegionID是cn-shanghai,假设产品的productKey是abc,那么最终的域名为:abc.iot-as-mqtt.cn-shanghai.aliyuncs.com。SDK中的默认域名为华东2,若设备接入阿里云华东2站点的公共实例,那么可以不用指定域名。

  • 企业实例
    用户需要在企业实例中查看实例的接入URL,请参见文档“实例管理mqtt_url

    上图中圈选部分则为物联网平台企业实例的MQTT接入域名。

SDK 初始化

SDK初始化时,会初始化跟云端的MQTT长连接通道。初始化之前请检查网络情况,如果未连接网络请提示用户先连接网络。

请注意初始化时的 'resultBlock' 回调成功并不代表MQTT长连接通道建立成功,MQTT长连接通道连接是否成功请先调用此方法 '[[LinkKitEntry sharedKit] registerChannelListener:self];',根据注册成功的 listener的[onConnectStateChange:state:] 回调方法来判断通道连接情况。

下面的代码示例如何初始化SDK接入物联网平台在华东2(上海)的公共示例:






#import <IotLinkKit/IotLinkKit.h>

    //初始化前请先注册listener侦听长连接通道的连接状态变化
    [[LinkKitEntry sharedKit] registerChannelListener:self];

    ////输入设备三元组信息
    self.productKey = self.textFieldProductKey.text ;
    self.deviceName = self.textFieldDeviceName.text   ;
    self.deviceSecret = self.textFieldDeviceSecret.text;

    LinkkitChannelConfig * channelConfig = [[LinkkitChannelConfig alloc] init];
    channelConfig.productKey = self.productKey;
    channelConfig.deviceName = self.deviceName;
    channelConfig.deviceSecret = self.deviceSecret;
    channelConfig.cleanSession = (self.cleanSession == 1);
    //channelConfig.server = @"your custom server url";//不设置server,表示使用默认的server地址
    //channelConfig.port = 1883;
    LinkkitSetupParams * setupParams = [[LinkkitSetupParams alloc] init];
    setupParams.appVersion = self.appVersion;
    setupParams.channelConfig = channelConfig;
    [[LinkKitEntry sharedKit] setup:setupParams resultBlock:^(BOOL succeeded, NSError * _Nullable error) {
        LinkkitLogDebug(@"setup error : %@", error);
        dispatch_async(dispatch_get_main_queue(), ^{
            [self ims_showHUDWithMessage:[NSString stringWithFormat:@"Linkkit 初始化 : %@",
                                          succeeded ? @"成功" : @"失败"]];
        });
    }];
            

若设备接入非华东2(上海)的物联网平台的公共实例,或者接入物联网平台的企业实例,那么需要把上面示例代码中的channelConfig.server设置为前面所描述的物联网平台服务端的域名。

SDK 反初始化

反初始化时,会断开跟云端的MQTT长连接。如果需要注销初始化,调用如下接口。

    [[LinkKitEntry sharedKit] destroy:^(BOOL succeeded, NSError * _Nullable error) {
        LinkkitLogDebug(@"kit destroy error : %@", error);
        dispatch_async(dispatch_get_main_queue(), ^{
            [self ims_showHUDWithMessage:[NSString stringWithFormat:@"Linkkit 去初始化 : %@",
                                          succeeded ? @"成功" : @"失败"]];
        });
    }];
            

其他设置

日志开关

打开SDK内部日志输出开关:






#import <IMSLog/IMSLog.h>

NSString * const IMS_DEMO_TAG = @"LinkkitDemo";

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 添加以下代码打开 SDK 的控制台Log
    [IMSLog setAllTagsLevel:IMSLogLevelAll];
    //创建日志面板助手,注入到日志框架
    //[IMSLog addAssistant:[[IMSDashboardLogAssistant alloc] init]];
    //设置在控制台显示日志
    [IMSLog showInConsole:YES];
    //设置 Demo 的日志 tag
    [IMSLog registerTag:IMS_DEMO_TAG];

    return YES;
}
            

MQTT长连接通道状态变化 listener

实现示例代码如下:

- (void)onConnectStateChange:(nonnull NSString *)connectId state:(LinkkitChannelConnectState)state {
    NSString * connectTip = nil;
    if (state == LinkkitChannelStateConnected) {
        connectTip = @"已连接";
    } else if (state == LinkkitChannelStateDisconnected) {
        connectTip = @"未连接";
    } else {
        connectTip = @"连接中";
    }
    dispatch_async(dispatch_get_main_queue(), ^{
        self.labelConnectState.text = connectTip;
    });
}

- (void)onNotify:(nonnull NSString *)connectId topic:(nonnull NSString *)topic data:(id _Nullable)data {
    NSString * downData = [NSString stringWithFormat:@"收到下推,topic : %@ \r\n", topic];
    downData = [downData stringByAppendingString:[NSString stringWithFormat:@"\r\n数据 : %@", data]];

    LinkkitLogDebug(@"kit recv  topic : %@", topic);

    dispatch_async(dispatch_get_main_queue(), ^{
        self.textViewDownData.text = downData;
    });
}

- (BOOL)shouldHandle:(nonnull NSString *)connectId 
               topic:(nonnull NSString *)topic {
    return YES;
}