【Xamarin.Forms】iBeacon 발신 앱을 크로스 플랫폼 개발한다

소스의 대부분이 공통화된 iBeacon 발신 앱을 만들자



iOS와 Android 플랫폼 모두를 위한 네이티브 앱을 개발할 때 Xamarin을 사용하면 각각의 앱을 개별적으로 개발하는 것보다 적은 수고로 개발을 진행할 수 있습니다.
특히 Xamarin.Forms에서는 플랫폼별 처리 이외의 소스를 공통화할 수 있으므로 앱 개발을 상당히 효율적으로 진행할 수 있습니다.

비콘 송수신과 같은 블루투스 저에너지(BLE)를 처리하는 처리는 플랫폼에 따라 다르므로 플랫폼별로 처리를 구현해야 합니다.
반대로 말하면, 이 부분만을 잘라내, UI를 포함한 다른 부분을 공통화해 버리는 형태로 앱을 만들 수 있습니다.

샘플 앱



샘플 앱을 GitHub에 게시했습니다.
htps : // 기주 b. 코 m / 미 c로와 PC / 이베 아콘 T 란 s보고 r
Prism for Xamarin.Forms (Prism.Forms) 템플릿을 사용하여 만들고 있습니다.

지원 플랫폼


  • iOS
  • Android
  • Windows Phone

  • 기능


  • 사용자가 입력 한 UUID, Major 및 Minor가있는 iBeacon을 준수하는 형식의 광고 패킷 발신
  • 발신시 TxPower (전파 강도) 조정

  • 화면 구성




    iOS
    안드로이드
    UWP







    플랫폼 특정 부분 구현



    iBeacon의 발신 및 중지를 제어하는 ​​프로세스는 dependency service로서 플랫폼별로 잘라내어 작성하고 있습니다.
    네이티브의 샘플 코드(iOS는 Objective-C나 Swift, Android는 Java)를 C#로 옮겨가는 감각으로 작성할 수 있습니다.
  • iOS

  • iBeaconTransmitService.cs에서 발췌
    // BLEの発信を制御するクラスのインスタンス
    private CBPeripheralManager _peripheralManager = new CBPeripheralManager();
    
    // 発信
    public void StartTransmission(Guid uuid, ushort major, ushort minor, sbyte txPower)
    {
        // BLE発信制御クラスに渡すためのiBeacon定義を作成する。
        NSUuid nsUuid = new NSUuid(uuid.ToString());
        CLBeaconRegion region = new CLBeaconRegion(nsUuid, major, minor, uuid.ToString());
        NSNumber nsnumTxPower = new NSNumber(txPower);
        NSDictionary peripheralData = region.GetPeripheralData(nsnumTxPower);
    
        // iBeaconの発信を開始する。
        _peripheralManager.StartAdvertising(peripheralData);
    }
    
    // 停止
    public void StopTransmission()
    {
        _peripheralManager.StopAdvertising();
    }
    
  • Android

  • iBeaconTransmitService.cs에서 발췌
    // iBeaconのバイト列のフォーマット
    // m:ビーコンのタイプ
    // i:identifier(UUID、Major、Minorの場所の指定)
    // p:パワーキャリブレーションの値
    private const string IBEACON_FORMAT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24";
    
    // BLEの発信を制御するクラスのインスタンス
    private BeaconTransmitter _beaconTransmitter;
    
    // 発信
    public void StartTransmission(Guid uuid, ushort major, ushort minor, sbyte txPower)
    {
        // Android用のビーコン定義を作成
        Beacon beacon = new Beacon.Builder()
                            .SetId1(uuid.ToString())
                            .SetId2(major.ToString())
                            .SetId3(minor.ToString())
                            .SetTxPower(txPower)
                            .SetManufacturer(Const.COMPANY_CODE_APPLE)
                            .Build();
    
        // iBeaconのバイト列フォーマットをBeaconParser(アドバタイズ時のバイト列定義)にセットする。
        BeaconParser beaconParser = new BeaconParser().SetBeaconLayout(IBEACON_FORMAT);
    
        // iBeaconの発信を開始する。
        _beaconTransmitter = new BeaconTransmitter(Android.App.Application.Context, beaconParser);
        _beaconTransmitter.StartAdvertising(beacon);
    }
    
    // 停止
    public void StopTransmission()
    {
        _beaconTransmitter.StopAdvertising();
    }
    
  • UWP

  • iBeaconTransmitService.cs에서 발췌
    // BLEの発信を制御するクラスのインスタンス
    private BluetoothLEAdvertisementPublisher blePublisher = new BluetoothLEAdvertisementPublisher();
    
    // 発信
    public void StartTransmission(Guid uuid, ushort major, ushort minor, sbyte txPower)
    {
        // BLE発信用のデータを格納する箱を作成
        BluetoothLEManufacturerData bleManufacturerData = new BluetoothLEManufacturerData()
        {
            CompanyId = Const.COMPANY_CODE_APPLE
        };
    
        // データを格納できるようにするため、UUID、Major、Minor、TxPowerをbyteに変換する。
        // TxPowerはオフセットをかけてから変換する。
        byte[] uuidByteArray = uuid.ToByteArray();
        byte[] majorByteArray = BitConverter.GetBytes(major);
        byte[] minorByteArray = BitConverter.GetBytes(minor);
        byte txPowerByte = (byte)((int)txPower + 256);
    
        // UUID、Major、Minorを、iBeaconのフォーマットに準拠する形に梱包する。
        byte[] ibeaconAdvertisementDataArray = new byte[]
        {
            // iBeaconと識別するための固定値
            0x02, 0x15,
            // UUID
            uuidByteArray[0], uuidByteArray[1], uuidByteArray[2], uuidByteArray[3],
            uuidByteArray[4], uuidByteArray[5], uuidByteArray[6], uuidByteArray[7],
            uuidByteArray[8], uuidByteArray[9], uuidByteArray[10], uuidByteArray[11],
            uuidByteArray[12], uuidByteArray[13], uuidByteArray[14], uuidByteArray[15],
            // Major
            majorByteArray[0], majorByteArray[1],
            // Minor
            minorByteArray[0], minorByteArray[1],
            // TxPower
            txPowerByte
        };
    
        // データをBLEで発信する。
        bleManufacturerData.Data = ibeaconAdvertisementDataArray.AsBuffer();
        blePublisher.Advertisement.ManufacturerData.Add(bleManufacturerData);
        blePublisher.Start();
    }
    
    // 停止
    public void StopTransmission()
    {
        blePublisher.Stop();
    }
    



    Windows Phone용 앱은 UWP이므로 이 샘플 앱은 Windows 10 PC에 제대로 설치할 수 있습니다.



    검증되지 않았기 때문에 동작을 보증할 수는 없지만, BLE의 송수신이 가능한 Windows 10 PC를 iBeacon으로 할 수 있을지도 모릅니다.

    좋은 웹페이지 즐겨찾기