前提・実現したいこと
Visual Studio 2017(Xamarin.iOS)にて
bluetooth接続でプリンターへコマンドを送信すると、
1回目は成功するのですが、2回目以降はエラーとなります。
オブジェクトの初期化やコマンド送信後のClose・Disposeの処理がないので
その辺りの実装方法が知りたいです。
発生している問題・エラーメッセージ
var session = new EASession(accessory, protocol); // ここの「session.OutputStream」が2回目はnullとなって例外が発生 var outputStream = session.OutputStream;
該当のソースコード
C#
1 2public partial class PrintViewController : UIViewController, IBaseViewController 3{ 4 5// 通信処理のみ抜粋 6 7 void LabelPrint() 8 { 9 EAAccessoryManager mgr = EAAccessoryManager.SharedAccessoryManager; 10 var accessories = mgr.ConnectedAccessories; 11 ObjCRuntime.Class.ThrowOnInitFailure = false; 12 foreach (var accessory in accessories) 13 { 14 var protocol = "XX.XX.XX.XX"; // 接続機器のプロトコル 15 if (accessory.ProtocolStrings.Where(s => s == protocol).Any()) 16 { 17 var session = new EASession(accessory, protocol); 18 19 // ここの「session.OutputStream」が2回目はnullとなって例外が発生 20 var outputStream = session.OutputStream; 21 outputStream.Delegate = new MyOutputStreamDelegate(); 22 outputStream.Schedule(NSRunLoop.Current, "kCFRunLoopDefaultMode"); 23 outputStream.Open(); 24 NSRunLoop.Current.RunUntil(NSDate.Now.AddSeconds(0.1)); 25 } 26 } 27 } 28} 29 30public class MyOutputStreamDelegate : NSStreamDelegate 31{ 32 bool hasWritten = false; 33 34 public MyOutputStreamDelegate() { } 35 public override void HandleEvent(NSStream theStream, NSStreamEvent streamEvent) 36 { 37 if (streamEvent == NSStreamEvent.HasSpaceAvailable && !hasWritten) 38 { 39 byte[] data = getPrintCommond();// 印字コマンド取得(getPrintCommondはコマンド用のバイト配列を返す自作のメソッドです) 40 var written = ((NSOutputStream)theStream).Write(data); 41 hasWritten = true; 42 } 43 } 44} 45
試したこと
コマンド送信後、以下のClose処理などは記載していましたが、特に状況は変わりませんでした。
session.OutputStream.Unschedule(NSRunLoop.Current, "kCFRunLoopDefaultMode");
outputStream.Delegate = null;
outputStream.Close();
補足情報(FW/ツールのバージョンなど)
Visual Studio 2017
Xamarin.iOS Ver.12.4.0.64
端末のiOS 12.1
あなたの回答
tips
プレビュー