1

Xamarin.iOS で ExternalAccessory API を使用する方法を知っている人はいますか?

Xamarin Studio のバージョンは 4.0.12 (ビルド 3)、Xamarin.Android のバージョンは 4.8.1、Xamarin.iOS のバージョンは 6.4.5.0、Xcode はバージョン 5.0 (5A1413) で、6.1 と 7.0 の両方の iPad/iPhone をターゲットにしようとしました。

私はインターネットを歩き回りましたが、ドキュメントはあまりありません。MonoTouch のドキュメントでさえ、リンクが壊れています。

私が望むのは、接続されているBluetoothデバイスをリストし、そのうちの1つを名前で取得してから接続して、ソケットを開いてデータの送信を開始できるようにすることです。これはシリアル通信を使用するデバイスであり、はい、Apple 外部アクセサリ プロトコル ID を持っています。

私はこれを試しました:

var am = EAAccessoryManager.SharedAccessoryManager;

InvaidCastException という例外がスローされるだけです。

手がかりはありますか?

ありがとう!本当に助かります。

PS: Xamarin の詳細

Xamarin Studio
Version 4.0.12 (build 3)
Installation UUID: 7348d641-ed6d-4c8a-b59a-116674e06dfd
Runtime:
    Mono 3.2.0 ((no/7c7fcc7)
    GTK 2.24.20
    GTK# (2.12.0.0)
    Package version: 302000000

[...]

Apple Developer Tools
Xcode 5.0 (3332.25)
Build 5A1413

[...]

Xamarin.iOS
Version: 6.4.5.0 (Trial Edition)
Hash: 1336a36
Branch: 
Build date: 2013-10-09 11:14:45-0400

Build Information
Release ID: 400120003
Git revision: 593d7acb1cb78ceeeb482d5133cf1fe514467e39
Build date: 2013-08-07 20:30:53+0000
Xamarin addins: 25a0858b281923e666b09259ad4746b774e0a873

Operating System
Mac OS X 10.8.5
Darwin Gutembergs-MacBook-Pro.local 12.5.0 Darwin Kernel Version 12.5.0
    Mon Jul 29 16:33:49 PDT 2013
    root:xnu-2050.48.11~1/RELEASE_X86_64 x86_64
4

2 に答える 2

5

あなたはこれを解決したように見えますが、基本を示すいくつかのコード スニペットを示したいと思いました (この場合は Sphero に接続して緑色にします)。

EAAccessoryManager mgr = EAAccessoryManager.SharedAccessoryManager;
var accessories = mgr.ConnectedAccessories;
foreach(var accessory in accessories)
{
    myLabel.Text = "Got me an accessory";
    Console.WriteLine(accessory.ToString());
    Console.WriteLine(accessory.Name);
    var protocol = "com.orbotix.robotprotocol";

    if(accessory.ProtocolStrings.Where(s => s == protocol).Any())
    {
        myLabel.Text = "Got me a Sphero";

        var session = new EASession(accessory, protocol);
        var outputStream = session.OutputStream;
        outputStream.Delegate = new MyOutputStreamDelegate(myLabel);
        outputStream.Schedule(NSRunLoop.Current, "kCFRunLoopDefaultMode");
        outputStream.Open();
    }
}

public class MyOutputStreamDelegate : NSStreamDelegate
{
    UILabel label;
    bool hasWritten = false;

    public MyOutputStreamDelegate(UILabel label)
    {
        this.label = label;
    }
    public override void HandleEvent(NSStream theStream, NSStreamEvent streamEvent)
    {
        if(streamEvent == NSStreamEvent.HasSpaceAvailable && ! hasWritten)
        {
            //Set the color of the Sphero
            var written = ((NSOutputStream)theStream).Write(new byte[] {0xFF, 0xFF, 0x02, 0x20, 0x0e, 0x05, 0x1F, 0xFF, 0x1B, 0x00, 0x91}, 11);
            if(written == 11)
            {
                label.Text = "Sphero should be green";
            }
            hasWritten = true;
        }
    }
}
于 2013-09-20T21:14:49.597 に答える