2016-05-15 3 views
0

おはよう。私はiOSアプリケーションを構築しており、MQTTを使用してメッセージをMQTTサーバーにサブスクライブ/パブリッシュできるようにしたかったのです。 MQTTライブラリを調べると、私の目的にふさわしいと思われたI found this library CloudMQTTを使用してすでにMQTTサーバーをオンラインにしています。 CocoaPodを動作させる方法と、Podfileに依存関係を追加する方法を理解した後、ついにそれを起動して実行しました。私の最初のビューのviewDidLoad機能では、私は私の.hファイルに次の行を追加することで、私のMQTTサーバーに接続しようとしました:iOS - MQTTクライアント・フレームワークは接続/作業します

viewDidLoad機能では、

@interface VBViewController : UIViewController<MQTTSessionDelegate> 

と私の.mファイルで、私はこれをしませんでした

MQTTCFSocketTransport *transport = [[MQTTCFSocketTransport alloc] init]; 
transport.host = @"mPortNumber.cloudmqtt.com"; 
transport.port = portNumber; 

session = [[MQTTSession alloc] init]; 
session.transport = transport; 

session.delegate=self; 

[session connectAndWaitTimeout:30]; 

[session subscribeToTopic:@"username/messagesFolder/#" atLevel:2 subscribeHandler:^(NSError *error, NSArray<NSNumber *> *gQoss){ 
    if (error) { 
     NSLog(@"Subscription failed %@", error.localizedDescription); 
    } else { 
     NSLog(@"Subscription sucessfull! Granted Qos: %@", gQoss); 
    } 
}]; 

ただし、実行時にサブスクリプションの失敗/成功のメッセージが表示されませんでした。間違ったポート番号を使用した可能性があるので、提供された3つのポート、単純なポート、SSLポート、およびWebSocketsポートを使用しました。作業していない人の後に、スラッシュで再生することによってフォルダディレクトリを変更しようとしましたが、それもうまくいかなかったのです。

私はまた、メッセージの送受信を試みましたが、それもうまくいきませんでした。

まだiOSデベロッパーライセンスを更新していないため、エミュレータを使用しています。私はこの単純なことを理解するために10の展開をすべて吹き飛ばしたくはありません。それが私のMQTTサーバーへの接続失敗の原因になるでしょうか?私は、エミュレータがインターネットに接続してSafariを使って閲覧することができるので、それは疑いの余地があります。

私はMQTTメソッドの初期化/インポート方法について何か不足していますか?どんな助力も非常に感謝しています。

答えて

1

connectAndWaitTimeoutを使用してもコールバックは発生しません。

/** 
@return nothing and returns immediately. To check the connect results, register as an MQTTSessionDelegate and 
- watch for events 
- watch for connect or connectionRefused messages 
- watch for error messages 
or use the connectHandler block 
*/ 

また、あなたが正常に接続するために、暗号化を必要としないことを確認してください:

はコメントで指定されたとおり、あなたが得るconnectWithConnectHandler(connectHandler: MQTTConnectHandler!)を使用してみてください。

0

私はついにそれを作った。親切にthis project as referenceを使用してください。私のMQTTブローカーはCloudMQTTによって提供されました。最大10台のデバイス接続でサーバーを無料で登録することができます。 「ルール」または「メッセージフォルダ」を設定できるユーザーを作成する必要があることに注意してください。また、以下の内容に注意してください:

server : mPortNumber.cloudmqtt.com 
port : 1XXXX 

と同様に、ユーザー名、パスワード、および、先ほど作成したフォルダを。その後、

host : mPortNumber.cloudmqtt.com/m14.cloudmqtt.com (whatever was provided) 
port : 1XXXX/13123 (use the ordinary one and NOT the SSL/Websocket Port) 
tls : NO 
base : yourFolderName 

そしてviewDidLoad機能でこのコードブロックを探して、そのように更新します:

NSURL *bundleURL = [[NSBundle mainBundle] bundleURL]; 
NSURL *mqttPlistUrl = [bundleURL URLByAppendingPathComponent:@"mqtt.plist"]; 
self.mqttSettings = [NSDictionary dictionaryWithContentsOfURL:mqttPlistUrl]; 
self.request = self.mqttSettings[@"request"]; 
self.response = self.mqttSettings[@"response"]; 

/* 
* MQTTClient: create an instance of MQTTSessionManager once and connect 
* will is set to let the broker indicate to other subscribers if the connection is lost 
*/ 
if (!self.manager) { 
    self.manager = [[MQTTSessionManager alloc] init]; 
    self.manager.delegate = self; 
    self.manager.subscriptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:MQTTQosLevelExactlyOnce] forKey:[NSString stringWithFormat:@"%@/#", self.request]]; 
    [self.manager connectTo:self.mqttSettings[@"host"] 
         port:[self.mqttSettings[@"port"] intValue] 
         tls:[self.mqttSettings[@"tls"] boolValue] 
        keepalive:60 
         clean:true 
         auth:true 
         user:@"username" 
         pass:@"password" 
        willTopic:[NSString stringWithFormat:@"%@/", 
          self.request] 
         will:[@"offline" dataUsingEncoding:NSUTF8StringEncoding] 
        willQos:MQTTQosLevelExactlyOnce 
      willRetainFlag:FALSE 
       withClientId:nil]; 
     } else { 
    [self.manager connectToLast]; 
} 
/* 
* MQTTCLient: observe the MQTTSessionManager's state to display the connection status 
*/ 
[self.manager addObserver:self 
       forKeyPath:@"state" 
        options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew 
        context:nil]; 

今、あなたのiOSアプリケーションでは、あなたはmqtt.plistファイルを更新する必要があるだろう

私たちがどの状態にいるか把握するには、observeValueForKeyPath関数も必要です。

メッセージの送信とメッセージ処理機能をコピーして、メッセージを公開し、受信したメッセージを処理できるようにするだけです。

0

私は同じ問題を抱えていました。私は、subscribeToTopic呼び出しを

- (void)connected:(MQTTSession *)session 

メソッド(MQTTSessionDelegateから)に移動して解決しました。接続の直後に呼び出されたときにサブスクリプションが動作しないようです。

関連する問題