SCO sample application [VGC-RM95S]
家族のスマホでデバイスチェンジの試験をやってみた。アプリケーション側は以下のシーケンスで問題ないようだ。
=======================================
/* SCO device open */
hDevice = CreateFile(deviceInterfaceDetailData->DevicePath, ...);
/* RFCOMM socket open */
m_socketClient = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
sa.addressFamily = AF_BT;
sa.serviceClassId=ServerGuid;
sa.btAddr=m_saClient.btAddr;
sa.port = SDPGetPort(btaddr, (LPGUID) &ServerGuid);
// SCO server accept address setting
DeviceIoControl(hDevice, &address, ...);
// RFCOMM client connect
connect (m_socketClient, (SOCKADDR *)&sa, sizeof(sa));
========================================
IoControl の SCO ドライバ内部では、デバイスチェンジの時に、以下のような Unregister と Register で接続要求を受け付けるアドレスを変更する。
DevCtx = GetServerDeviceContext(WdfIoQueueGetDevice(Queue));
BthSrvUnregisterScoServer(DevCtx);
BthSrvRegisterScoServer(DevCtx);
L2CAP のサンプルどおりだと起動時に ADDRESS_ANY で Register するようになっているが、SCO ではエラーになるので target_address = 0xffffffffffff; をダミーで登録するようにしてみた。
brb->BtAddress = target_address;
ドライバ内部は、本当に細かな操作が必要になってくる。ちょっと気を抜くと BSOD となってしまう。
コメント 0