FirstAppのダウンロード
- 次のリンクからFirstAppのzipファイルをダウンロードします。
- zipファイルを解凍すると次のファイルが得られます。
FirstApp
FirstApp.xcodeproj
OPHBluetoothService.framework - XcodeでFirstApp.xcodeprojを開きます。
- iOSデバイスとMac接続し、XcodeでFirstAppをビルドします。
FirstAppの動作手順
- iOS デバイスの[設定]を起動し、Bluetooth をオンにします。
- OPH-5000iサンプルアプリケーションでiOS12桁のBluetoothアドレスバーコードを読み取ります。
- 接続済みの状態になりましたら、本サンプル(FirstApp)を起動します。
- データを受信します
OPH-5000iサンプルアプリケーションでバーコードを読み取ります。
本サンプル(FirstApp)のテキストビューにOPH-5000iから送信したデータを表示されます。 - データを送信します。
「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