1

私は C# で作業するのが初めてなので、多くの人にとっては簡単に思えるかもしれませんが、ここで助けが必要です。Bluetooth low energy デバイスに接続するデスクトップ アプリケーションを c# で作成し、 Set character value functionを使用してデバイスに値を送信する必要があります。このためには、特性取得関数を使用して特性バッファを取得する必要があります。

これを行うための C++ コードがあります。

USHORT charBufferSize  = 0;
HRESULT hres = BluetoothGATTGetCharacteristics( BLE_Service,NULL, 0,NULL,
                                                 &charBufferSize,BLUETOOTH_GATT_FLAG_NONE);

 if(hres==HRESULT_FROM_WIN32(ERROR_MORE_DATA)) 
   {
      Characteristic_Buffer = new BTH_LE_GATT_CHARACTERISTIC [charBufferSize ];                                                       
   }                                                       
USHORT val = 0;
// get characteristics after allocating required size 
hres = BluetoothGATTGetCharacteristics(BLE_Service,NULL,charBufferSize,
                                 Characteristic_Buffer,&val,BLUETOOTH_GATT_FLAG_NONE);

私はC#で同じことをしなければならないので、このようなことを試しました

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct BTH_LE_GATT_CHARACTERISTIC
    {
        public UInt16 ServiceHandle;
        public BTH_LE_UUID CharacteristicUuid;
        public UInt16 AttributeHandle;
        public UInt16 CharacteristicValueHandle;
        public Boolean IsBroadcastable;
        public Boolean IsReadable;
        public Boolean IsWritable;
        public Boolean IsWritableWithoutResponse;
        public Boolean IsSignedWritable;
        public Boolean IsNotifiable;
        public Boolean IsIndicatable;
        public Boolean HasExtendedProperties;
    } 

[DllImport(@"BluetoothApis.dll", SetLastError = true, CharSet = CharSet.Auto)]

public static extern Boolean BluetoothGATTGetCharacteristics(
                                                         IntPtr Device_Handle,
                                                         IntPtr Service,
                                                         UInt16 Char_Buffer_Count,
                                     ref BTH_LE_GATT_CHARACTERISTIC CharBuffer,
                                                         out UInt16 RequiredSize,
                                                         uint Flags
                                                         );
UInt16 Size_Required = 0;
UInt16 NBytes = 0;
BTH_LE_GATT_CHARACTERISTIC gattChar = new BTH_LE_GATT_CHARACTERISTIC();


Success = BluetoothGATTGetCharacteristics(Ble_Device, IntPtr.Zero, 0, IntPtr.Zero, 
                  out Size_Required, (uint)BTH_LE_FLAGS.BLUETOOTH_GATT_FLAG_NONE);

私はここで立ち往生しています。ここで、関数の 2 回目の呼び出しを行うには、C++ で行ったようにメモリを特性バッファーに割り当てる必要があります。

これを行う方法についての提案またはC#でCharacteristicバッファを取得する他の方法はありますか??

前もって感謝します

4

0 に答える 0