using InTheHand.Net; using InTheHand.Net.Bluetooth; using InTheHand.Net.Sockets; using System.Text; namespace IBox.WinFrmUI { public class BluetoothHelper { #region 单例 private static BluetoothHelper _Instance; private static readonly object locker = new object(); public static BluetoothHelper GetInstance() { if (_Instance == null) { lock (locker) { // 如果类的实例不存在则创建,否则直接返回 if (_Instance == null) { _Instance = new BluetoothHelper(); } } } return _Instance; } private int _length = 1; #endregion 单例 #region 信息状态 /// /// 信息状态 /// /// 接收、发送信息、本地信息 /// 信息内容 public delegate void ShowMessReturn(string content); public event ShowMessReturn SMR; public void OnSysMessage(string content) { if (SMR != null) SMR(content); } #endregion 信息状态 #region 属性定义 private const int BUFLEN = 1024; // 数据接收缓冲区大小 private bool IsRun = false; private BluetoothAddress bthAddr = null; private BluetoothClient myClient = null; private List LstClient = new List(); private BluetoothListener blthListener = null; private Thread listenThread = null;//监听线程 private List LstBluetooth = null; #endregion 属性定义 #region 处理方法 public BluetoothHelper() { try { var radio = BluetoothRadio.Default;//获取当前PC的蓝牙适配器 IsRun = (null != radio); } catch { } if (!IsRun) OnSysMessage("无可用蓝牙"); } ~BluetoothHelper() { if (null != blthListener) blthListener.Stop(); if (null != LstClient) { foreach (var itm in LstClient) { if (null != itm) itm.Close(); } } IsRun = false; } /// /// 搜索蓝牙 /// public List SearchBluetooth() { LstBluetooth = new List(); //搜索到的蓝牙的集合 if (!IsRun) OnSysMessage("无可用蓝牙"); else { BluetoothClient client = new BluetoothClient(); BluetoothRadio radio = BluetoothRadio.Default; //获取蓝牙适配器 radio.Mode = RadioMode.Connectable; var devices = client.DiscoverDevices();//搜索蓝牙 10秒钟 LstBluetooth.AddRange(devices); //OnSysMessage("搜索蓝牙完成"); } return LstBluetooth; } /// /// 连接蓝牙,蓝牙名称 /// /// public void SetBluetoothByName(string bluetoothName) { try { if (null == LstBluetooth) return; var curBluetooth = LstBluetooth.Find(o => o.DeviceName == bluetoothName); if (null != curBluetooth) bthAddr = curBluetooth.DeviceAddress; NewConnect(); } catch (Exception ex) { OnSysMessage("error:" + ex.ToString()); } } /// /// 连接蓝牙,蓝牙地址(十六进制字符串) /// /// public void SetBluetooth(string hexAddr) { try { var byTmp = HexToByte(hexAddr); Array.Reverse(byTmp);// 反转数组 SetBluetooth(byTmp); } catch (Exception ex) { OnSysMessage("error:" + ex.ToString()); } } /// /// 连接蓝牙,蓝牙地址 /// /// public void SetBluetooth(byte[] addr) { try { bthAddr = new BluetoothAddress(addr); NewConnect(); } catch (Exception ex) { OnSysMessage("error:" + ex.ToString()); } } /// /// 连接蓝牙,蓝牙地址 /// /// public void SetBluetooth(long laddr) { try { bthAddr = new BluetoothAddress(laddr); NewConnect(); } catch (Exception ex) { OnSysMessage("error:" + ex.ToString()); } } /// /// 连接蓝牙 /// private void NewConnect() { if (!IsRun) OnSysMessage("无可用蓝牙"); else if (null != bthAddr) { var mGUID = BluetoothService.Handsfree; if (null != myClient) myClient.Close(); myClient = new BluetoothClient(); //myClient.Connect(bthAddr,mGUID); var be = new BluetoothEndPoint(bthAddr, BluetoothService.SerialPort); myClient.Connect(be); ReceiveDataThread(myClient, false); //OnSysMessage("发起连接"); } } /// /// 发送数据,文本 /// /// public void SendData(string sData) { if (!string.IsNullOrEmpty(sData) && (sData.Contains("getbase") || sData.Contains("alarm"))) _length = 1; else _length = 100; var byTmp = Encoding.UTF8.GetBytes(sData); SendData(byTmp); } /// /// 发送数据,byte /// /// public void SendData(byte[] sData) { try { if (!IsRun) OnSysMessage("无可用蓝牙"); else if (null == sData || sData.Length < 1) OnSysMessage("发送数据不能为空"); else { var sendCnt = 0; if (null != LstClient && LstClient.Count > 0) { foreach (var itm in LstClient) { if (null != itm && itm.Connected) { var bls = itm.GetStream(); bls.Write(sData, 0, sData.Length); bls.Flush(); sendCnt++; } } } if (sendCnt < 1 && (null == myClient || !myClient.Connected)) NewConnect(); // 重连机制 if (null != myClient && myClient.Connected) { var bls = myClient.GetStream(); bls.Write(sData, 0, sData.Length); bls.Flush(); sendCnt++; } //OnSysMessage(string.Format("连接{0}发送{1}个字节", sendCnt, sData.Length)); } } catch (Exception ex) { OnSysMessage("error:" + ex.ToString()); } } /// /// 监听蓝牙连接请求 /// public void ListenerData() { //OnSysMessage("蓝牙启动监听:" + IsRun); if (null != listenThread) listenThread.Abort(); listenThread = new Thread(new ThreadStart(() => { if (IsRun) { var mGUID = BluetoothService.Handsfree; blthListener = new BluetoothListener(mGUID); blthListener.Start(); while (IsRun) { var newClient = blthListener.AcceptBluetoothClient(); //OnSysMessage("蓝牙链接:" + newClient.RemoteMachineName); ReceiveDataThread(newClient); } } })); listenThread.IsBackground = true; listenThread.Start(); } /// /// 蓝牙数据接收线程 /// /// /// private void ReceiveDataThread(BluetoothClient client, bool isInList = true) { lock (LstClient) { if (isInList) LstClient.Add(client); } var th = new Thread(new ThreadStart(() => { ReceiveData(client); lock (LstClient) LstClient.Remove(client); })); th.IsBackground = true; th.Start(); } public void Close() { if (myClient != null && myClient.Connected) { myClient.Close(); myClient.Dispose(); myClient = null; } } /// /// 数据接收 /// /// private void ReceiveData(BluetoothClient client) { try { var sl = new List(); var st = new byte[0]; while (client != null && client.Connected) { var peerStream = client.GetStream(); byte[] buffer = new byte[1]; peerStream.Read(buffer, 0, 1); st = st.Concat(buffer).ToArray(); var receive = Encoding.UTF8.GetString(st).ToString(); if (receive.Contains("[&end&]")) { var c = Encoding.UTF8.GetString(st).ToString(); st = new byte[0]; OnSysMessage(c); } } } catch (Exception ex) { // OnSysMessage("error:" + ex.ToString()); } } #endregion 处理方法 #region 辅助方法 /// /// 十六进制转byte[],无分割符 /// public byte[] HexToByte(string strHex) { byte[] byTmp = new byte[0]; if (string.IsNullOrEmpty(strHex) || (strHex.Length % 2) > 0) return byTmp; try { var len = strHex.Length / 2; byTmp = new byte[len]; for (int i = 0; i < len; i++) { var phex = strHex.Substring(2 * i, 2); byTmp[i] = Convert.ToByte(phex, 16); } } catch (Exception ex) { byTmp = new byte[0]; OnSysMessage("error:" + ex.ToString()); } return byTmp; } #endregion 辅助方法 } }