ScpControl/Bluetooth/BthDongle.Hci.cs (333 lines of code) (raw):

using System; using ScpControl.ScpCore; namespace ScpControl.Bluetooth { public partial class BthDongle { #region HCI Commands private int HCI_Command(HCI.Command command, byte[] buffer) { var transfered = 0; buffer[0] = (byte)(((uint)command >> 0) & 0xFF); buffer[1] = (byte)(((uint)command >> 8) & 0xFF); buffer[2] = (byte)(buffer.Length - 3); SendTransfer(0x20, 0x00, 0x0000, buffer, ref transfered); Log.DebugFormat("<< {0} [{1:X4}]", command, (ushort)command); return transfered; } private int HCI_Accept_Connection_Request(byte[] bdAddr, byte role) { var buffer = new byte[10]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; buffer[9] = role; return HCI_Command(HCI.Command.HCI_Accept_Connection_Request, buffer); } private int HCI_Reject_Connection_Request(byte[] bdAddr, byte reason) { var buffer = new byte[10]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; buffer[9] = reason; return HCI_Command(HCI.Command.HCI_Reject_Connection_Request, buffer); } private int HCI_Remote_Name_Request(byte[] bdAddr) { var buffer = new byte[13]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; buffer[9] = 0x01; buffer[10] = 0x00; buffer[11] = 0x00; buffer[12] = 0x00; return HCI_Command(HCI.Command.HCI_Remote_Name_Request, buffer); } private int HCI_Reset() { var buffer = new byte[3]; return HCI_Command(HCI.Command.HCI_Reset, buffer); } private int HCI_Write_Scan_Enable() { var buffer = new byte[4]; buffer[3] = 0x02; return HCI_Command(HCI.Command.HCI_Write_Scan_Enable, buffer); } private int HCI_Read_Local_Version_Info() { var buffer = new byte[3]; return HCI_Command(HCI.Command.HCI_Read_Local_Version_Info, buffer); } private int HCI_Read_BD_Addr() { var buffer = new byte[3]; return HCI_Command(HCI.Command.HCI_Read_BD_ADDR, buffer); } private int HCI_Read_Buffer_Size() { var buffer = new byte[3]; return HCI_Command(HCI.Command.HCI_Read_Buffer_Size, buffer); } private int HCI_Link_Key_Request_Reply(byte[] bdAddr) { var buffer = new byte[25]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; Buffer.BlockCopy(GlobalConfiguration.Instance.BdLink, 0, buffer, 9, GlobalConfiguration.Instance.BdLink.Length); return HCI_Command(HCI.Command.HCI_Link_Key_Request_Reply, buffer); } private int HCI_Link_Key_Request_Negative_Reply(byte[] bdAddr) { var buffer = new byte[9]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; return HCI_Command(HCI.Command.HCI_Link_Key_Request_Negative_Reply, buffer); } private int HCI_PIN_Code_Request_Negative_Reply(byte[] bdAddr) { var buffer = new byte[16]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; return HCI_Command(HCI.Command.HCI_Link_Key_Request_Negative_Reply, buffer); } private int HCI_Set_Connection_Encryption(BthHandle Handle) { var buffer = new byte[6]; buffer[3] = Handle.Bytes[0]; buffer[4] = (byte)(Handle.Bytes[1] ^ 0x20); buffer[5] = 0x01; return HCI_Command(HCI.Command.HCI_Set_Connection_Encryption, buffer); } private int HCI_User_Confirmation_Request_Reply(byte[] bdAddr) { var buffer = new byte[9]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; return HCI_Command(HCI.Command.HCI_User_Confirmation_Request_Reply, buffer); } private int HCI_IO_Capability_Request_Reply(byte[] bdAddr) { var buffer = new byte[12]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; buffer[9] = 0x01; buffer[10] = 0x00; buffer[11] = 0x05; return HCI_Command(HCI.Command.HCI_IO_Capability_Request_Reply, buffer); } private int HCI_Create_Connection(byte[] bdAddr, byte[] offset) { var buffer = new byte[16]; buffer[3] = bdAddr[0]; buffer[4] = bdAddr[1]; buffer[5] = bdAddr[2]; buffer[6] = bdAddr[3]; buffer[7] = bdAddr[4]; buffer[8] = bdAddr[5]; buffer[9] = 0x18; buffer[10] = 0xCC; buffer[11] = 0x01; buffer[12] = 0x00; buffer[13] = offset[0]; buffer[14] = (byte)(offset[1] | 0x80); buffer[15] = 0x01; return HCI_Command(HCI.Command.HCI_Create_Connection, buffer); } private int HCI_Set_Event_Mask() { var buffer = new byte[11]; // 00 25 5F FF FF FF FF FF buffer[3] = 0xFF; buffer[4] = 0xFF; buffer[5] = 0xFF; buffer[6] = 0xFF; buffer[7] = 0xFF; buffer[8] = 0x5F; // 0xFF; buffer[9] = 0x25; // 0xBF; buffer[10] = 0x00; // 0x3D; return HCI_Command(HCI.Command.HCI_Set_Event_Mask, buffer); } private int HCI_Write_Local_Name() { var buffer = new byte[251]; buffer[3] = 0x45; buffer[4] = 0x4E; buffer[5] = 0x54; buffer[6] = 0x52; buffer[7] = 0x4F; buffer[8] = 0x50; buffer[9] = 0x59; return HCI_Command(HCI.Command.HCI_Write_Local_Name, buffer); } private int HCI_Write_Extended_Inquiry_Response() { var buffer = new byte[244]; buffer[3] = 0x00; buffer[4] = 0x08; buffer[5] = 0x09; buffer[6] = 0x45; buffer[7] = 0x4E; buffer[8] = 0x54; buffer[9] = 0x52; buffer[10] = 0x4F; buffer[11] = 0x50; buffer[12] = 0x59; buffer[13] = 0x02; buffer[14] = 0x0A; return HCI_Command(HCI.Command.HCI_Write_Extended_Inquiry_Response, buffer); } private int HCI_Write_Class_of_Device() { var buffer = new byte[6]; buffer[3] = 0x04; buffer[4] = 0x02; buffer[5] = 0x3E; return HCI_Command(HCI.Command.HCI_Write_Class_of_Device, buffer); } private int HCI_Write_Inquiry_Scan_Type() { var buffer = new byte[4]; buffer[3] = 0x01; return HCI_Command(HCI.Command.HCI_Write_Inquiry_Scan_Type, buffer); } private int HCI_Write_Inquiry_Scan_Activity() { var buffer = new byte[7]; buffer[3] = 0x00; buffer[4] = 0x08; buffer[5] = 0x12; buffer[6] = 0x00; return HCI_Command(HCI.Command.HCI_Write_Inquiry_Scan_Activity, buffer); } private int HCI_Write_Page_Scan_Type() { var buffer = new byte[4]; buffer[3] = 0x01; return HCI_Command(HCI.Command.HCI_Write_Page_Scan_Type, buffer); } private int HCI_Write_Page_Scan_Activity() { var buffer = new byte[7]; buffer[3] = 0x00; buffer[4] = 0x04; buffer[5] = 0x12; buffer[6] = 0x00; return HCI_Command(HCI.Command.HCI_Write_Page_Scan_Activity, buffer); } private int HCI_Write_Page_Timeout() { var buffer = new byte[5]; buffer[3] = 0x00; buffer[4] = 0x20; return HCI_Command(HCI.Command.HCI_Write_Page_Timeout, buffer); } private int HCI_Write_Authentication_Enable() { var buffer = new byte[4]; buffer[3] = 0x00; return HCI_Command(HCI.Command.HCI_Write_Authentication_Enable, buffer); } private int HCI_Write_Simple_Pairing_Mode() { var buffer = new byte[4]; buffer[3] = 0x01; return HCI_Command(HCI.Command.HCI_Write_Simple_Pairing_Mode, buffer); } private int HCI_Write_Simple_Pairing_Debug_Mode() { var buffer = new byte[4]; buffer[3] = 0x00; return HCI_Command(HCI.Command.HCI_Write_Simple_Pairing_Debug_Mode, buffer); } private int HCI_Write_Inquiry_Mode() { var buffer = new byte[4]; buffer[3] = 0x02; return HCI_Command(HCI.Command.HCI_Write_Inquiry_Mode, buffer); } private int HCI_Write_Inquiry_Transmit_Power_Level() { var buffer = new byte[4]; buffer[3] = 0x00; return HCI_Command(HCI.Command.HCI_Write_Inquiry_Transmit_Power_Level, buffer); } private int HCI_Inquiry() { var buffer = new byte[8]; buffer[3] = 0x33; buffer[4] = 0x8B; buffer[5] = 0x9E; buffer[6] = 0x18; buffer[7] = 0x00; return HCI_Command(HCI.Command.HCI_Inquiry, buffer); } private int HCI_Inquiry_Cancel() { var buffer = new byte[3]; return HCI_Command(HCI.Command.HCI_Inquiry_Cancel, buffer); } private int HCI_Delete_Stored_Link_Key(byte[] bdAddr) { var buffer = new byte[10]; Buffer.BlockCopy(bdAddr, 0, buffer, 3, 6); buffer[9] = 0x00; return HCI_Command(HCI.Command.HCI_Delete_Stored_Link_Key, buffer); } private int HCI_Write_Stored_Link_Key(byte[] bdAddr, byte[] bdLink) { var buffer = new byte[26]; buffer[3] = 0x01; Buffer.BlockCopy(bdAddr, 0, buffer, 4, 6); Buffer.BlockCopy(bdLink, 0, buffer, 10, 16); return HCI_Command(HCI.Command.HCI_Write_Stored_Link_Key, buffer); } private int HCI_Read_Stored_Link_Key(byte[] bdAddr) { var buffer = new byte[10]; Buffer.BlockCopy(bdAddr, 0, buffer, 3, 6); buffer[9] = 0x00; return HCI_Command(HCI.Command.HCI_Read_Stored_Link_Key, buffer); } public int HCI_Disconnect(BthHandle handle) { var buffer = new byte[6]; buffer[3] = handle.Bytes[0]; buffer[4] = (byte)(handle.Bytes[1] ^ 0x20); buffer[5] = 0x13; return HCI_Command(HCI.Command.HCI_Disconnect, buffer); } #endregion } }