BleApi.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System.Runtime.InteropServices;
  2. public class BleApi
  3. {
  4. // dll calls
  5. public enum ScanStatus { PROCESSING, AVAILABLE, FINISHED };
  6. /// <summary>与 BleWinrtDll SetBleScanMode 一致,须在 StartDeviceScan 前设置。</summary>
  7. public enum BleScanMode : int
  8. {
  9. DeviceInformationOnly = 0,
  10. AdvertisementWatcherFff0 = 1,
  11. Combined = 2,
  12. }
  13. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]
  14. public struct DeviceUpdate
  15. {
  16. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
  17. public string id;
  18. [MarshalAs(UnmanagedType.I1)]
  19. public bool isConnectable;
  20. [MarshalAs(UnmanagedType.I1)]
  21. public bool isConnectableUpdated;
  22. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
  23. public string name;
  24. [MarshalAs(UnmanagedType.I1)]
  25. public bool nameUpdated;
  26. /// <summary>与 BleWinrtDll DeviceUpdate::rssiDbm 对齐;仅当 rssiUpdated 时有效(System.Devices.Aep.SignalStrength,单位 dBm)。</summary>
  27. public int rssiDbm;
  28. [MarshalAs(UnmanagedType.I1)]
  29. public bool rssiUpdated;
  30. }
  31. [DllImport("BleWinrtDll.dll", EntryPoint = "SetBleScanMode")]
  32. public static extern void SetBleScanMode(BleScanMode mode);
  33. [DllImport("BleWinrtDll.dll", EntryPoint = "GetBleScanMode")]
  34. public static extern BleScanMode GetBleScanMode();
  35. [DllImport("BleWinrtDll.dll", EntryPoint = "StartDeviceScan")]
  36. public static extern void StartDeviceScan();
  37. [DllImport("BleWinrtDll.dll", EntryPoint = "PollDevice")]
  38. public static extern ScanStatus PollDevice(ref DeviceUpdate device, bool block);
  39. [DllImport("BleWinrtDll.dll", EntryPoint = "StopDeviceScan")]
  40. public static extern void StopDeviceScan();
  41. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  42. public struct Service
  43. {
  44. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
  45. public string uuid;
  46. };
  47. [DllImport("BleWinrtDll.dll", EntryPoint = "ScanServices", CharSet = CharSet.Unicode)]
  48. public static extern void ScanServices(string deviceId);
  49. [DllImport("BleWinrtDll.dll", EntryPoint = "PollService")]
  50. public static extern ScanStatus PollService(out Service service, bool block);
  51. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  52. public struct Characteristic
  53. {
  54. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
  55. public string uuid;
  56. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
  57. public string userDescription;
  58. };
  59. [DllImport("BleWinrtDll.dll", EntryPoint = "ScanCharacteristics", CharSet = CharSet.Unicode)]
  60. public static extern void ScanCharacteristics(string deviceId, string serviceId);
  61. [DllImport("BleWinrtDll.dll", EntryPoint = "PollCharacteristic")]
  62. public static extern ScanStatus PollCharacteristic(out Characteristic characteristic, bool block);
  63. [DllImport("BleWinrtDll.dll", EntryPoint = "SubscribeCharacteristic", CharSet = CharSet.Unicode)]
  64. public static extern bool SubscribeCharacteristic(string deviceId, string serviceId, string characteristicId, bool block);
  65. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  66. public struct BLEData
  67. {
  68. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
  69. public byte[] buf;
  70. [MarshalAs(UnmanagedType.I2)]
  71. public short size;
  72. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
  73. public string deviceId;
  74. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
  75. public string serviceUuid;
  76. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
  77. public string characteristicUuid;
  78. };
  79. [DllImport("BleWinrtDll.dll", EntryPoint = "PollData")]
  80. public static extern bool PollData(out BLEData data, bool block);
  81. // [合并自 dll文件] Win11 通信优化:订阅后由 DLL 推送线程投递数据,与 StopBlePushThread 成对使用
  82. [DllImport("BleWinrtDll", EntryPoint = "StartBlePushThread")]
  83. public static extern void StartBlePushThread();
  84. [DllImport("BleWinrtDll", EntryPoint = "StopBlePushThread")]
  85. public static extern void StopBlePushThread();
  86. [DllImport("BleWinrtDll.dll", EntryPoint = "SendData")]
  87. public static extern bool SendData(in BLEData data, bool block);
  88. [DllImport("BleWinrtDll.dll", EntryPoint = "Quit")]
  89. public static extern void Quit();
  90. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  91. public struct ErrorMessage
  92. {
  93. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
  94. public string msg;
  95. };
  96. [DllImport("BleWinrtDll.dll", EntryPoint = "GetError")]
  97. public static extern void GetError(out ErrorMessage buf);
  98. [DllImport("BleWinrtDll.dll", EntryPoint = "Disconnect", CharSet = CharSet.Unicode)]
  99. public static extern void Disconnect(string deviceId);
  100. }