20

UDPをオンにするためにパケットを送信するアプリを作成していLED bulbます。Ad-hocによって作成されたに接続しているときに、すべてのアクションを実行できましたWifi bridge

Wifi bridge次に、メイン ルータに接続できるように を設定します。Wifi bridgeこの手順を実行するように AT コマンドを設定しましたが、送信したコマンドに対する応答を から受信できません。

手順は次のとおりです。

  • ステップ 1 : UDP メッセージを LAN ブロードキャスト IP アドレス "10.10.100.255" およびポート 48899 => "Link_Wi-Fi" に送信します。LAN
    上のすべての Wifi ブリッジが詳細を応答します。応答は「10.10.100.254、ACCF232483E8」です

  • ステップ 2 : (wifi ブリッジの設定を変更するためのオプション): 次に、「+ok」を LimitlessLED Wifi ブリッジに送信します。手順 1 で返された応答 IP アドレスに UDP メッセージを送信する "10.10.100.254" => "+ok"

  • ステップ 3 : (wifi ブリッジの設定を変更するためのオプション): その後、モジュールに AT コマンド (\r\n で終わる) を送信できます。

UDP パケットを送信するためのコードは次のとおりです。

-(void)configureWifi{

    counter++;
    NSString *host = @"10.10.100.255";
    if ([host length] == 0)
    {
        [self logError:@"Address required"];
        return;
    }

    int port = 48899; //[portField.text intValue];
    if (port <= 0 || port > 65535)
    {
        [self logError:@"Valid port required"];
        return;
    }
    NSString *msg = @"Link_Wi-Fi";
    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"the message sent is %@", data);
    [udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:tag];

}

ソケットをセットアップしてデータを受信するために、次の 2 つのデリゲート メソッドを使用しています。

 - (void)setupSocket
{
    // Setup our socket.
    // The socket will invoke our delegate methods using the usual delegate paradigm.
    // However, it will invoke the delegate methods on a specified GCD delegate dispatch queue.
    // 
    // Now we can configure the delegate dispatch queues however we want.
    // We could simply use the main dispatc queue, so the delegate methods are invoked on the main thread.
    // Or we could use a dedicated dispatch queue, which could be helpful if we were doing a lot of processing.
    // 
    // The best approach for your application will depend upon convenience, requirements and performance.
    // 
    // For this simple example, we're just going to use the main thread.

    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *error = nil;

    if (![udpSocket bindToPort:0 error:&error])
    {
        [self logError:FORMAT(@"Error binding: %@", error)];
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        [self logError:FORMAT(@"Error receiving: %@", error)];
        return;
    }

    [self logInfo:@"Ready"];
}

データを受信するには、UDP パケットの送信後に呼び出されるメソッドです。GCDAsyncUdpSocketこれは、UDP パケットを送受信するためにプロジェクトで使用したクラスのデリゲート メソッドです。

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
                                               fromAddress:(NSData *)address
                                         withFilterContext:(id)filterContext
{
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    if (msg)
    {
        [self logMessage:FORMAT(@"RECV: %@", msg)];
    }
    else
    {
        NSString *host = nil;
        uint16_t port = 0;
        [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];

        [self logInfo:FORMAT(@"RECV: Unknown message from: %@:%hu", host, port)];
    }
}

応答を受信できたら、ブリッジを構成するために次の AT コマンドを送信できます。

ありがとう。どんな助けでも大歓迎です。

4

2 に答える 2

2

使用することをお勧めするトラブルシューティング手順は次のとおりです。

1-私はあなたが使用していると仮定しているので、変数が非同期通信全体で強力な参照を持っているARCことを確認してください。udpSocket解放されている場合は、コールバックがないことを説明できます。

2- コミュニケーションが実際にあなたが思っているように行われていることを確認してください。などのソフトウェアを使用Wiresharkして、ネットワーク上で交換されるパケットをキャプチャします。これにより、呼び出し時にパケットが送信されるsendData:ことを確認でき、応答が返ってきているかどうかも確認できます。

3- をGCDAsyncUdpSocket正しく使用していることを確認してください。メッセージをブロードキャストしたいことを考えるとbindToPort:error:setupSocketメソッドを呼び出すべきではありません。代わりに、 を呼び出す必要がありますenableBroadcast:error:。ブロードキャスト後にパケットを受信することも考慮して、connectToHost:onPort:error:メソッドを使用してソケットの状態を変更し、双方向通信を許可する必要があります。それが完了したら、 の使用法を に置き換えることができsendData:toHost:port:withTimeout:tag:ますsendData:withTimeout:tag:。最後に、beginReceiving:着信パケットに対してデリゲートが呼び出されるように呼び出すことができます。

4- それでも問題が解決しない場合は、十分に文書化された GCDAsyncUdpSocket の文書をよく読むことをお勧めします。

于 2015-04-24T05:43:36.207 に答える
1

Wireshark または任意のネットワーク キャプチャ ツールを使用して、問題のトラブルシューティングを行うことができます。私たちは以前、Wireshark を広範囲に使用した同様の種類のプロジェクトで作業していました。パケットがデバイス (Z-Wave) に到達すると、何らかの Ack が送信されます。これは、パケットが送信されていることを確認するのに役立ちます。

于 2015-05-06T21:34:17.600 に答える