Georg fährt extra nach Berlin um Steve Ballmer zu treffen

8 Tage Windows Phone 8 | Tag #7: NFC & Bluetooth

Die­ser Arti­kel ist Tag #7 der Serie 8 Tage Win­dows Pho­ne 8 von Geert van der Cruijsen.

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: 8 days of Win­dows Pho­ne 8 — Day 7: Pro­xi­mi­ty Capa­bi­li­ties.

8 Tage Windows Phone 8

Will­kom­men zurück zu mei­ner Blog-Serie 8 Tage Win­dows Pho­ne 8. Heu­te, im vor­letz­ten Arti­kel, befas­sen wir uns mit den Nah­feld­sen­so­ren, nament­lich Blue­tooth und NFC. Wich­tig bei die­sem Arti­kel ist, dass ich den Code mit dem Emu­la­tor nicht tes­ten konn­te, da Blue­tooth und NFC nur mit einem rich­ti­gen Gerät getes­tet wer­den kön­nen. Da ich beim Schrei­ben die­ser Arti­kel kein Gerät zur Ver­fü­gung hat­te, kann es sein, dass die Bei­spie­le nicht hun­dert­pro­zen­tig funktionieren.

day7

Bluetooth

Um Blue­tooth oder NFC zu nut­zen, müs­sen Sie als ers­tes eine ent­spre­chen­de Fähig­keit im WMAppManifest.xml hinzufügen.

proximitycapability

Nach­dem wir das getan haben, sind wir bereit, eine Anwen­dung zu bau­en, wel­che mit einem ande­ren Gerät über Blue­tooth kom­mu­ni­ziert. Die Kom­mu­ni­ka­ti­on über Blue­tooth funk­tio­niert durch eine Art Client/Server Ver­bin­dung. Ein Tele­fon wird der Ser­ver, zu wel­chem sich das ande­re Tele­fon ver­bin­den kann. Damit kön­nen bei­de Tele­fo­ne kommunizieren.

Um den Ser­ver und den Cli­ent auf­zu­set­zen, fügen wir zwei But­tons hin­zu — einem zum Start des Ser­vers und einen für den Client.

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   <Button x:Name="ServerButton" Click="ServerButton_Click_1" Content="server"></Button>
   <Button x:Name="ClientButton" Click="ClientButton_Click_1" Content="client"></Button>
</StackPanel>

Im Click Event des But­tons für den Ser­ver fügen wir den fol­gen­den Code hin­zu, um ein Peer­Fin­der Objekt zu erstel­len, wel­ches auf ein­ge­hen­de Ver­bin­dungs­ver­su­che hört. Wenn sich ein ande­res Gerät mit unse­rem Tele­fon ver­bin­det, wird ein Con­nec­tion­Re­ques­ted Event gefeu­ert. Im Event­Hand­ler zei­gen wir ein­fach eine Mes­sa­ge­Box, um zu bestä­ti­gen, dass sich das ande­re Gerät ver­bun­den hat.

private void ServerButton_Click_1(object sender, RoutedEventArgs e)
{
   PeerFinder.Start();
   PeerFinder.ConnectionRequested += PeerFinder_ConnectionRequested;
}
 
async void PeerFinder_ConnectionRequested(object sender, ConnectionRequestedEventArgs args)
{
   MessageBox.Show("Connected");
   _ss = await PeerFinder.ConnectAsync(args.PeerInformation);
}

Um die Ver­bin­dung mit dem Ser­ver her­zu­stel­len, müs­sen wir die Cli­ent-Sei­te imple­men­tie­ren. Im ent­spre­chen­den Click Event fügen wir den fol­gen­den Code hin­zu, um nach Ser­ver-Tele­fo­nen zu suchen und uns zu ver­bin­den, wenn wir eins gefun­den haben. Wir ver­wen­den wie­der den Peer­Fin­der, um nach Ver­bin­dungs­part­nern zu suchen. Wenn die Metho­de Find­All­Peers zurück kommt, prü­fen wir, ob es einen akti­ven Ser­ver gibt, indem wir mit der Eigen­schaft Count die Anzahl der Ergeb­nis­se abfra­gen. Wenn Count grö­ßer 0 ist, ver­bin­den wir uns mit die­sem Part­ner und prü­fen sei­nen DisplayName.

protected async void ClientButton_Click_1(object sender, RoutedEventArgs e)
{
   PeerFinder.Start(); 
   var p = await PeerFinder.FindAllPeersAsync(); 
   if (p.Count > 0) 
   { 
      _ss = await PeerFinder.ConnectAsync(p[0]);
      string phoneName = p[0].DisplayName;
   }
}

Nun, da wir zwei Tele­fo­ne ver­bun­den haben, kön­nen wir eine Nach­richt von einem Tele­fon zum ande­ren schi­cken. Wir fügen der Main­Page einen wei­te­ren But­ton und den fol­gen­den Code im Click Event hin­zu. Damit schi­cken wir eine Nach­richt von einem Tele­fon zum anderen.

private async void SendMessageButton_Click_1(object sender, RoutedEventArgs e)
{
   if (_ss == null)
      throw new Exception("Socket not initialized");

   DataWriter dw = new DataWriter(ss.OutputStream);
   dw.WriteString("Hello Windows Phone 8");
   await dw.StoreAsync();
}

Wir ver­wen­den den Stream­So­cket, wel­chen wir bei Her­stel­lung der Ver­bin­dung initia­li­siert hat­ten, um die Nach­richt zu schi­cken. Wenn der Stream­So­cket nicht initia­li­siert ist, feu­ern wir eine Excep­ti­on. Andern­falls kön­nen wir wei­ter­ma­chen. Wir erstel­len einen DataWri­ter basie­rend auf dem Out­put­Stream des Stream­So­cket und ver­wen­den die Metho­de Wri­teString, um die Nach­richt über den DataWri­ter zu schi­cken. Jetzt kön­nen wir die Metho­de Store­Async auf­ru­fen, um die Daten tat­säch­lich an das ver­bun­de­ne Tele­fon zu senden.

Als letz­tes müs­sen wir die Nach­richt auf dem Tele­fon noch emp­fan­gen. Wir ver­bin­den den Stream­So­cket des Peer­Fin­der und rufen eine neue pri­va­te Metho­de WaitForMessage.

In die­ser asyn­chro­nen Metho­de öff­nen wir einen Dat­aRea­der basie­rend auf dem Input­Stream des Stream­So­cket. Aus dem Dat­aRea­der kön­nen wir zunächst die Län­ge der zu emp­fan­gen­den Nach­richt abfra­gen und anschlie­ßend die Nach­richt selbst aus­le­sen. Damit sind wir fer­tig mit der Über­tra­gung einer Nach­richt über Bluetooth.

async void PeerFinder_ConnectionRequested(object sender, ConnectionRequestedEventArgs args)
{
   MessageBox.Show("Connected");
   _ss = await PeerFinder.ConnectAsync(args.PeerInformation);
   string message = await WaitForMessage(); 
}

private async Task<string> WaitForMessage()
{
   DataReader dr = null;

   while (true)
   {
      if (dr == null)
         dr = new DataReader(_ss.InputStream);

      await dr.LoadAsync(4);
      uint messageLen = (uint)dr.ReadInt32();
      await dr.LoadAsync(messageLen);
      return dr.ReadString(messageLen);
   }
}

NFC

Der zwei­te Nah­feld­sen­sor in Win­dows Pho­ne ist NFC. Mit NFC ist es mög­lich, NFC Tags zu lesen oder zwi­schen Tele­fo­nen zu kom­mu­ni­zie­ren. In fol­gen­den Abschnitt wol­len wir uns näher damit befas­sen, wie man per NFC zwi­schen Tele­fo­nen kom­mu­ni­zie­ren kann. Um Nach­rich­ten per NFC zu sen­den und zu emp­fan­gen, fügen wir wie­der mal zwei But­tons zu unse­rer MainPage.xaml hinzu.

<Button x:Name="NfcSendButton" Click="NfcSendButton_Click_1" Content="nfc send"></Button>
<Button x:Name="NfcReceiveButton" Click="NfcReceiveButton_Click_1" Content="nfc receive"></Button>

Im Click Event des Send But­tons fügen wir den fol­gen­den Code hin­zu. Wir erstel­len eine Instanz der Klas­se Pro­xi­mi­ty­De­vice. Dann müs­sen wir nur noch die Metho­de Publish­Mes­sa­ge auf die­sem Objekt auf­ru­fen. Im Bei­spiel sen­den wir einen String. Es ist aber auch mög­lich, binä­re Daten zu übertragen.

private void NfcSendButton_Click_1(object sender, RoutedEventArgs e)
{
   ProximityDevice pd = ProximityDevice.GetDefault();

   if (pd != null) 
   { 
      pd.PublishMessage("8days", "Hello World!");
   }
}

Nach­dem wir die Nach­richt gesen­det haben, müs­sen wir als letz­tes für heu­te nur noch die Nach­richt emp­fan­gen. Fügen Sie den fol­gen­den Code zum Click Event des Recei­ve But­tons hin­zu. Wir erstel­len wie­der eine Instanz der Klas­se Pro­xi­mi­ty­De­vice und regis­trie­ren uns für ein­ge­hen­de Nach­rich­ten. Das war’s. Wenn jetzt eine Nach­richt ein­trifft, wird die Metho­de NfcRe­cei­ve auf­ge­ru­fen und wir kön­nen die Nach­richt auslesen.

private void NfcReceiveButton_Click_1(object sender, RoutedEventArgs e)
{
   ProximityDevice pd = ProximityDevice.GetDefault();
   if (pd != null)
   {
      long Id = pd.SubscribeForMessage("8days", NfcReceive);
   }
}
 
private void NfcReceive(ProximityDevice sender, ProximityMessage message)
{
   var m = message.DataAsString;
}

Wie Sie sehen, ist die Umset­zung von NFC in Win­dows Pho­ne 8 wirk­lich ein­fach. Ich kann es nicht erwar­ten, bis Ent­wick­ler anfan­gen, die­se Fea­tures in ihren Anwen­dun­gen zu nut­zen. Alle momen­tan ange­kün­dig­ten Win­dows Pho­ne 8 Gerä­te haben NFC Fähig­kei­ten — die Vor­aus­set­zun­gen sind also gelegt.

proximity

Mor­gen, am letz­ten Tag der Serie, wer­den wir uns mit den Fea­tures zur Brief­ta­sche beschäf­ti­gen und wie man In-App Käu­fe realisiert.

Das Bei­spiel­pro­jekt zum heu­ti­gen Arti­kel kön­nen Sie hier her­un­ter­la­den: http://sdrv.ms/QSJ2yx.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert