OPH-5000 Bluetooth MFiによる通信のiOS側のアプリケーションの開発手順は次のとおりです。
(注意)
  • iOSライブラリ(OPHBluetoothService.framework)/iOSメソッドを使用しません。

  1. iOSアプリケーションを開発するためにApple Developerへの登録が必要です。
    詳細は次のリンクをクリックして Apple Developer のウェブサイトをご確認ください。
  2. 登録後にXcodeのダウンロードが可能となります。
    Xcodeのダウンロードは次のリンクをクリックして Xcode のウェブサイトをご確認ください。
  3. 作成したアプリをiOS実機に転送して、動作を確認する場合に iOS Developer Programに登録する必要があります。
    詳細は次のリンクをクリックして iOS Developer Program のウェブサイトをご確認ください。

以下の例では、Xcode上でプロジェクト「FirstApp」が作成されている状態からの手順を解説します。 Xcodeプロジェクトの作成は Apple developer documentation のウェブサイトをご確認ください。

また、本使用手順では、開発言語Objective-C、開発環境Xcode 12.5を使った場合の手順を解説します。

開発環境の使用手順


 開発環境には、以下の2点を対応する必要があります。
  1. ExternalAccessory.frameworkを開発環境に取り込む。
  2. Info.plistにSupported external accessory protocolsを追加し、jp.opto.opnprotocolを指定する。

OPHBluetoothService.m/hのダウンロード

通信APIの利用


 主なメソッドの使用方法について、サンプルコードを用いて解説します。
 なお、OPNBluetoothServiceクラスの使用にはOPNBluetoothService.m/OPNBluetoothService.hをプロジェクトに追加するが必要です。
 OPHBluetoothService.hはimportをします。
サンプル
#import <OPHBluetoothService.h>
  • OPHBluetoothServiceを生成・取得する

    OPH-5000iとのBluetooth通信は、全てOPHBluetoothServiceクラスを介して行います。
    OPHBluetoothServiceのsharedController()メソッドを実行することで、インスタンスを生成、取得できます。
    OPHBluetoothServiceのインスタンスは実行中ただ1つしか存在しないため、まだインスタンスが生成されていなければ生成後返却され、既に生成されていればそのインスタンスが返却されます。
    サンプル
    OPHBluetoothService  *sessionController =[OPHBluetoothService sharedController];
    

  • OPH-5000iと接続する

    OPHBluetoothServiceのsetupControllerForAccessory ()メソッドを実行することで、OPH-5000iと接続することができます。
    本サンプルでは、setupControllerForAccessory()メソッドの実行に必要な引数であるアクセサリとプロトコル文字列を取得し、接続を行っています。
    サンプル
    NSArray *accessoryList = [[NSMutableArray alloc] initWithArray:[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];
    if(accessoryList == nil || accessoryList.count == 0) return;       
    EAAccessory *accessory = [accessoryList lastObject];
    OPHBluetoothService *service =  [OPHBluetoothService sharedController];
    NSArray *protocolStrings = [accessory protocolStrings];
    if(protocolStrings == nil || [protocolStrings count]==0) return;
    NSString *protocolString = [protocolStrings objectAtIndex:0];
    [service setupControllerForAccessory:accessory withProtocolString:protocolString];
    


  • セッションをオープンする

    接続済みの場合、OPHBluetoothServiceのopenSession()メソッドを実行することで、OPH-5000iとのセッションをオープンできます。
    サンプル
    OPHBluetoothService *sessionController =  [OPHBluetoothService sharedController];
    [sessionController openSession];
    

  • セッションをクローズする

    OPHBluetoothServiceのcloseSession()メソッドを実行することで、OPH-5000iとのセッションをオープンできます。
    サンプル
    OPHBluetoothService *sessionController =  [OPHBluetoothService sharedController];
    [sessionController closeSession];
    

  • OPH-5000iと接続中か確認する

    OPHBluetoothServiceのaccessoryプロパティであるEAAccessory のisConnectedプロパティで、OPH-5000iと接続中か確認できます。YESなら接続中です。
    サンプル
    isConnected = [[[OPHBluetoothService sharedController] accessory] isConnected];
    

  • OPH-5000iに送信する

    OPH-5000iに送信する場合、OPHBluetoothServiceのwriteData()メソッドを実行することで、OPH-5000iに送信することができます。
    アクセサリインターフェース仕様によりOPH-5000i(MFiアクセサリ)がiOSデバイスから受信可能なExternal Accessory Protocol メッセージの最大長は2036 bytesです。
    サンプル
    //OPHBluetoothService.m
    - (BOOL)writeData:(NSData *)data
    {
        RELEASE_TO_NIL(_writeData)
        if (_writeData == nil) {
            _writeData = [[NSMutableData alloc] init];
        }
        #define MAX_OPH_RECEIVE_SIZE 2036
        if (data.length > MAX_OPH_RECEIVE_SIZE){
            NSLog(@"over size error.");
            return NO;
        }
        [_writeData appendData:data];
        [self _writeData];
        return YES;
    }
    ---------
    //ViewController.m
    NSData *d = [string dataUsingEncoding:NSUTF8StringEncoding];
    [_service writeData: d];
    

  • OPH-5000iから受信する

    OPHBluetoothServiceとOPH-5000iとの通信結果を処理するためには、 まず、通信結果を処理するクラスがOPHBluetoothServiceDelegateプロトコルを採用する必要があります。
    本サンプルでは、ViewControllerクラスが当該プロトコルを採用しています。
    サンプル
    @interface ViewController <OPHBluetoothServiceDelegate> {
    }
    
    次に、そのクラスをOPHBluetoothServiceのインスタンスのデリゲートに指定します。
    サンプル
    OPHBluetoothService *sessionController =  [OPHBluetoothService sharedController];
    [service setDelegate:self];
    
    最後に、そのクラスで以下のメソッドを実行し、OPH-5000iから受信することができます。 OPHBluetoothServiceのセッションのoutputStreamの受信完了後、OPH-5000iにACKを返信するする必要があります。
    サンプル
    - (void)receivedData:(NSData *)readdata
    {
        NSLog(@"receivedData : _readData : %@",_readData);
        id<OPHBluetoothServiceDelegate> delegate =
        (id<OPHBluetoothServiceDelegate>)self.delegate;
        //outputStreamの受信完了後、OPH-5000iにACKを返信する必要がある
        [self writeACK];
        if ([delegate respondsToSelector:@selector(bluetoothService:receivedData:)]) {
            [delegate bluetoothService:self receivedData:readdata];
        }
        [self performSelector:@selector(clearReadData)];
    }
    .....................
    - (void)bluetoothService:(OPHBluetoothService *)service receivedData:(NSData *)data
    {
        NSLog(@"receivedData: %@", data);
    }
    

関連事項

最終更新日:2021/10/29