/// <summary> /// 接收数据 /// </summary> /// <param name="ar"></param> private void OnReceive(IAsyncResult ar) { int len = -1; string strID; byte[] id = new byte[4]; try { EndPoint remote = (EndPoint)(ar.AsyncState); len = ServerSocket.EndReceiveFrom(ar, ref remote); //报文格式过滤 if (buffer[0] == 0xA5 && buffer[1] == 0xA5 && buffer[len - 2] == 0x5A && buffer[len - 1] == 0x5A) { Array.Copy(buffer, 3, id, 0, 4); strID = UtilClass.byteToHexStr(id); //20180626由于武大项目采用轮询方式通信,因此不需要判断 //判断哈希表中是否存在当前ID,不存在则创建,存在则把数据加入队列 //if (htClient.ContainsKey(strID) == false) //{ // DataItem dataItem = new DataItem(); // dataItem.Init(ServerSocket, id, strID, updateDataLength, broadcastRemote); //初始化dataItem // htClient.Add(strID, dataItem); // //把设备信息存入数据库 // DbClass.addsensorinfo(strID, dataItem.HeartTime.ToString("yyyy-MM-dd HH:mm:ss"), dataItem.status.ToString()); //} //else //{ DataItem dataItem = (DataItem)htClient[strID]; //取出address对应的dataitem byte[] recData = new byte[len]; Array.Copy(buffer, recData, len); dataItem.AnalyzeData(recData); //} } //继续接收数据 ServerSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, new AsyncCallback(OnReceive), remote); } catch (Exception ex) { Console.WriteLine(ex); UtilClass.writeLog(ex.ToString()); } }