Kommunikation iPhone - Mac (mit Datenaustausch)

  • Kommunikation iPhone - Mac (mit Datenaustausch)

    Hallo zusammen!

    Hat vielleicht jemand Zeit, mir mal einen kurzen Überblick zu geben, wie ich eine bidirektionale WI-FI-Kommunikation zwischen einem iPhone und einem Mac aufsetze? Vermutlich am sinnvollsten mit Bonjour, oder?

    Ich habe mir das App "BonjourWeb" von Apple angesehen, ich glaube, ich verstehe auch grob, wie es geht, aber das Beispiel ist so dermaßen voll mit dem ganzen UI-Kram, dass sich mir die genauen Abläufe nicht klar werden.

    Außerdem habe ich auf dem Mac das CocoaHTTPServer Sample von Apple am Start. Wird auch vom iPhone erkannt. Gut.

    Aber ich verstehe halt nicht:
    1. Den grundsätzlichen Ablauf.
    2. Wie kann ich ohne den ganzen UI-Kram (s.oben) auf das NSNetServiceBrowser-Objekt zugreifen, um zu prüfen, was drin steht?
    3. Wie funktioniert das mit den Input- und Output-Streams? Wie sende ich über einen Output-Stream an den Mac, nachdem ich ihn im RunLoop bekannt gemacht habe? Und umgekehrt ...
    4. Muss ich einen HTTP-Server auf dem Mac vorhalten, auch wenn ich nur Daten pumpen möchte, oder geht auch nur ein TCP-Socket?

    Vielen Dank für die Mühe im Voraus!
    Frank
  • Hallo,

    du nutzt die Bonjour-API, um mit dem iPhone einen Service anzubieten. Das Programm auf dem Mac schaut dann, ob es den Service des iPhones findet. Ist der Service gefunden kennen sich die beiden und der Datenaustausch kann beginnen.

    Du brauchst keinen HTTP-Server dafür.

    Du kannst einfach mit alloc init ein NSNetServiceBrowser erzeugen und die Delegatemethoden implementieren.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Vielen Dank.

    und die Delegatemethoden implementieren

    Das heißt also, dass ich keinen Input-/OutputStream in den Loop einklinken muss, sondern mir werden, nachdem ich den NSNetServiceBrowser instantiiert und die Methoden "nach"gebaut habe, die "Stream" serverseitig ausgeliefert?

    Inhaltlich verstanden. Ich frage mich nur, warum das "BonjourWeb" so kompliziert ist ...? Naja, egal.

    du nutzt die Bonjour-API, um mit dem iPhone einen Service anzubieten.

    Wenn ich Dich richtig verstehe, mache ich eigentlich auf beiden Geräte spiegelbildlich dasselbe, oder? CocoaHTTPStream kann dann also weg.

    Und deswegen ist es dann auch egal, ob das iPhone oder der Mac den Server spielt, weil es eigentlich gar keine Client-Server-Struktur ist, sondern über Bonjour eine Client/Server-Client/Server-Struktur, bei der die Geräte je beide Funktionen übernehmen?

    Vielen Dank. Ich hatte schon die Hoffnung, dass es /vergleichsweise/ einfach ist.

    Grüße
    Frank
  • Original von fwtag
    Vielen Dank.

    und die Delegatemethoden implementieren

    Das heißt also, dass ich keinen Input-/OutputStream in den Loop einklinken muss, sondern mir werden, nachdem ich den NSNetServiceBrowser instantiiert und die Methoden "nach"gebaut habe, die "Stream" serverseitig ausgeliefert?

    Inhaltlich verstanden. Ich frage mich nur, warum das "BonjourWeb" so kompliziert ist ...? Naja, egal.

    du nutzt die Bonjour-API, um mit dem iPhone einen Service anzubieten.

    Wenn ich Dich richtig verstehe, mache ich eigentlich auf beiden Geräte spiegelbildlich dasselbe, oder? CocoaHTTPStream kann dann also weg.

    Und deswegen ist es dann auch egal, ob das iPhone oder der Mac den Server spielt, weil es eigentlich gar keine Client-Server-Struktur ist, sondern über Bonjour eine Client/Server-Client/Server-Struktur, bei der die Geräte je beide Funktionen übernehmen?

    Vielen Dank. Ich hatte schon die Hoffnung, dass es /vergleichsweise/ einfach ist.

    Grüße
    Frank


    Ja. Eine Seite bietet den Service an. Die andere Seite nutzt den dann. Wie genau die Nutzung aussieht ist nicht Aufgabe von Bonjour. Bonjour ist nur für die Herstellung des Kontaktes da. Irgendwo gabs da ein gutes minimales Beispiel... finde es gerade nicht. Such mal nach Bonjour +syncing bei Google. Vielleicht findest du es wieder.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • @fwtag

    Das ist keine Frage von einfach oder nicht. Bonjour ist dafür da, Dienste zu erkennen. Es ist ein Recovery-Service, nicht ein Kommunikationsservice. Deshalb ist es nicht schwierig mittels Bonjour zu kommunizieren, sondern nicht dessen Aufgabe.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Hallo alle,

    noch einmal eine Bitte um Hilfe, denn ich komme nicht wirklich weiter.

    Ich möchte eine Applikation für das iPhone erstellen, das mit einer weiteren Applikation auf dem Mac kommunizieren kann. Daher auch meine ganzen Fragen zu Bonjour etc.

    Ich habe nun beim Wühlen auf der ADC-Seite das Modell der Distributed Objects gefunden, die meine Anforderungen erfüllen würden: Ich greife remote vom iPhone auf Methoden auf dem Mac zu.

    Nur - DOs gibt es gar nicht auf dem iPhone, oder?!

    Kann mir jemand ein gutes How-To oder Coding-Beispiel empfehlen, wie ich diese Anforderung trotzdem lösen kann - wie es z. B. bei diesen vielen Remote Controls für das iPhone ja bereits gemacht wird? Ich brauche das wirklich von A-Z, denn nur so verstehe ich es. Ich bin Hobby--Coder und kein Informatik-Profi und solche Codes à la:

    Quellcode

    1. [self setUpSocket:socket]; // 2

    2. Calls a setup method defined elsewhere in this object. This object might connect the socket to a custom BSD socets-bases service (...)

    (Original aus der Apple "NSNetServices and CFNetServices Programming Guide")

    lassen mich eher verzweifeln, als dass sie mir helfen ... ;)
  • Ich glaube, ich bekomme das (langsam) hin.

    Noch eine Frage: Welchen type (z. B. "_http._tcp.") sollte der socket am Besten haben, wenn ich damit nur Bytes ohne großen Protokoll-Schnickschnack hin und her schieben möchte?


    @psog: Mir gefällt der Ansatz und die Umsetzung von "Birdie"
  • Hallo alle!

    Ich habe ein wirklich nützliches und schlankes Tool ausgegraben, das eine wunderbar funktionierende Klasse implementiert, die eine asynchrone Kommunikation zwischen Mac und iPhone (oder was auch immer) implementiert: AsyncSocket.

    Dabei ist ein Projekt namens "EchoServer", das nichts anderes tut, als einen Server auf einem gegebenen Port einrichtet und alles, was reinkommt, zurück-echo-d.

    Wenn jemand sich das mal ansehen möchte, habe ich auch gleich zwei Fragen dazu - vielleicht weiß ja jemand Rat:

    1. Im EchoServer gebe ich als Port "12345" an und das iPhone verbindet sich perfekt auf diesen Port. Aber der Rückweg, der automatisch initialisiert wird, zieht sich (mit der IP des iPhone) einen Standard-System-Port, der gerade frei ist (z. B. 50210). Wie kann ich wohl erreichen, dass beide Richtungen denselben Port verwenden?

    2. Spannend ist, dass bei meinem Testprojekt im Zuge der Initialisierung die Willkommensmeldung problemlos vom EchoServer zurück an das iPhone geschickt wird. Wenn ich aber dann meine Meldung an den EchoServer sende (auch kein Problem) und er sie zurückspiegelt, kommt sie nicht bei mir an. Jedenfalls verzweigt der Delegate nicht in die entsprechende Methode "didReadBytes". Habt Ihr eine Idee?

    Danke + Grüße
    Frank