FirstAppはOPH-5000iのBluetooth MFi と接続し、データの送受信を行うサンプルコードです。

FirstAppのダウンロード

  1. 次のリンクからFirstAppのzipファイルをダウンロードします。
  2. zipファイルを解凍すると次のファイルが得られます。
    FirstApp
    FirstApp.xcodeproj
    OPHBluetoothService.framework
  3. XcodeでFirstApp.xcodeprojを開きます。
  4. iOSデバイスとMac接続し、XcodeでFirstAppをビルドします。

FirstAppの動作手順

  1. iOS デバイスの[設定]を起動し、Bluetooth をオンにします。
  2. OPH-5000iサンプルアプリケーションでiOS12桁のBluetoothアドレスバーコードを読み取ります。
  3. 接続済みの状態になりましたら、本サンプル(FirstApp)を起動します。
  4. データを受信します
    OPH-5000iサンプルアプリケーションでバーコードを読み取ります。
    本サンプル(FirstApp)のテキストビューにOPH-5000iから送信したデータを表示されます。
  5. データを送信します。
    「Sent TestString」ボタンを押すと「TestString」文字列をOPH-5000iに送信します。

 OPHBluetoothServiceクラスは、OPH-5000iとBluetooth通信を行い、セッション管理、アクセサリ保持、I/O処理等を担当するコアクラスです。

 OPHBluetoothServiceは、GoFのSingletonパターンで実装しています。OPHBluetoothServiceクラスのインスタンスは、実行中ただ1つしか存在しません。

 OPHBluetoothServiceクラスでは、外部アクセサリとの通信にExternalAccessory.frameworkを利用します。


サンプル:ViewController.m
//
//  ViewController.m
//  FirstApp
//
//  Copyright (c) 2022年  OPTO ELECTRONICS Co.,LTD. All rights reserved.
//

#import  "ViewController.h"

@interface ViewController ()
- (IBAction)sendStringButtonClick:(id)sender;
@property (weak, nonatomic) IBOutlet  UILabel *connectStatus;
end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    _text = [[NSMutableString alloc] init];
    textView.delegate = self;
    _connectStatus.text = @"not Connected";
    [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    textView.layer.cornerRadius = 1.0;
    textView.layer.borderColor = UIColor.blackColor.CGColor;
    textView.layer.borderWidth = 1;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                                selector:@selector(_accessoryDidConnect:)
                                                    name:EAAccessoryDidConnectNotification
                                                object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                                selector:@selector(_accessoryDidDisconnect:)
                                                    name:EAAccessoryDidDisconnectNotification
                                                object:nil];

    
    _service = [OPHBluetoothService sharedController];
    [_service setDelegate:self];
    
    [_service openSession];
    if(_service.accessory.isConnected){
        _connectStatus.text = [NSString stringWithFormat:@"%@[%@] Connected",_service.accessory.modelNumber,_service.accessory.serialNumber];
    }else{
        _connectStatus.text = @"not Connected";
    }
    textView.text = @"";
}


- (BOOL)openAccessory
{
    //接続中のAccessoryを取得
    NSArray *accessoryList = [[NSMutableArray alloc] initWithArray:
                                [[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];
    
    if(accessoryList == nil || accessoryList.count == 0) return NO;
    EAAccessory *accessory = [accessoryList lastObject];
    
    OPHBluetoothService *s = [OPHBluetoothService sharedController];
    
    NSArray *protocolStrings = [accessory protocolStrings];
    
    if(protocolStrings == nil || [protocolStrings count]==0) return NO;
    BOOL result = NO;
    NSString *protocolString = [protocolStrings objectAtIndex:0];
    for (int i = 0; i<3; i++) {
        [s setupControllerForAccessory:accessory
                    withProtocolString:protocolString];
        if((result =[s openSession])){
            break;
        }
        sleep(1);
    }
    //openSession失敗
    if(result == NO){
        return NO;
    }
    s.delegate = self;
    if(_service.accessory.isConnected){
        _connectStatus.text =  [NSString stringWithFormat:@"%@[%@] Connected",_service.accessory.modelNumber,_service.accessory.serialNumber];
    }else{
        _connectStatus.text = @"not Connected";
        return NO;
    }
    
    return YES;
}

- (void)_accessoryDidConnect:(NSNotification *)notification
{
    OPHBluetoothService *sessionController = [OPHBluetoothService sharedController];
    static NSString * const OPH5000iAccessoryModelNumber = @"OPH-5000i";
    if ((sessionController.accessory.isConnected) && ([sessionController.accessory.modelNumber isEqualToString:OPH5000iAccessoryModelNumber])){
        _connectStatus.text =  [NSString stringWithFormat:@"%@[%@]Connected",sessionController.accessory.modelNumber,sessionController.accessory.serialNumber];
    }
    else{
        [self openAccessory];
    }
}

- (void)_accessoryDidDisconnect:(NSNotification *)notification
{
    if(!(_service.accessory.isConnected )){
        _connectStatus.text = @"not Connected";
    }
}

//[Send TestString]ボタン
- (IBAction)sendStringButtonClick:(id)sender
{
    NSString *writeData = @"TestString";
    [self sendDataToOph5000i:writeData];
}
#pragma mark - OPHBluetoothService writeData
//OPH-5000iに送信
-(void)sendDataToOph5000i:(NSString *)string
{
    if(_service.accessory.isConnected){
        NSData *d = [string dataUsingEncoding:NSUTF8StringEncoding];
        [_service writeData: d];
    }
    else {
        return;
    }
}

#pragma mark - OPHBluetoothService Delegate receivedData
//OPH-5000iから受信
- (void)bluetoothService:(OPHBluetoothService *)service receivedData:(NSData *)data
{
    NSString *str = [[NSString alloc] initWithData:data encoding:NSShiftJISStringEncoding];
    [_text appendFormat:@"%@\n",str];
    textView.text = _text;
    NSRange range = NSMakeRange(textView.text.length - 1, 1);
    [textView scrollRangeToVisible:range];
    str = nil;
}

//textView以外をタッチするとキーボード隠す
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if(textView.isFirstResponder){
        [textView resignFirstResponder];
    }
}
end


関連事項

最終更新日:2022/05/09