/// <summary> /// メッセージの表示を行います /// </summary> private void display() { //メッセージの書き込み if (MoniMesg.queue.Count > 0) { MoniMesg.qlock.WaitOne(); { BluetoothLEAdvertisementReceivedEventArgs args = (BluetoothLEAdvertisementReceivedEventArgs)MoniMesg.queue.Dequeue(); iBeacon bcon = new iBeacon(args); //if (bcon.UUID != null && bcon.UUID=="UUID") if (bcon.Name != null && bcon.Name == "EP") { // iBeacon DateTimeOffset timestamp = args.Timestamp; this.textBox1.AppendText(timestamp.ToString("HH\\:mm\\:ss\\.fff") + "\r\n"); this.textBox1.AppendText("Name= " + bcon.Name + "\r\n"); this.textBox1.AppendText("00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19\r\n"); this.textBox1.AppendText(bcon.mData + "\r\n"); this.textBox1.AppendText("温度= " + bcon.Temperature.ToString() + "\r\n"); this.textBox1.AppendText("湿度= " + bcon.Humidity.ToString() + "\r\n"); this.textBox1.AppendText("照度= " + bcon.Illuminance.ToString() + "\r\n"); this.textBox1.AppendText("気圧= " + bcon.Pressure.ToString() + "\r\n"); //DateTimeOffset timestamp = args.Timestamp; string retBeaconData; retBeaconData = "{"; retBeaconData += string.Format("uuid:'{0}'\r\n", bcon.UUID);//"00000000-0000-0000-0000-000000000000" retBeaconData += string.Format("major:{0}\r\n", bcon.Major.ToString("D")); retBeaconData += string.Format("minor:{0}\r\n", bcon.Minor.ToString("D")); retBeaconData += string.Format("measuredPower:{0}\r\n", bcon.MeasuredPower.ToString("D")); retBeaconData += string.Format("rssi:{0}\r\n", bcon.Rssi.ToString("D")); retBeaconData += string.Format("accuracy:{0}\r\n", bcon.Accuracy.ToString("F6")); retBeaconData += string.Format("proximity:'{0}'\r\n", bcon.Proximity); retBeaconData += "}"; //this.textBox1.AppendText(timestamp.ToString("HH\\:mm\\:ss\\.fff") + ":\r\n" + retBeaconData + "\r\n"); if (textBox1.TextLength >= 32000) { //string str = textBox1.Text; //string word = "-----\r\n"; //int len = str.LastIndexOf(word); //str = str.Substring(len + word.Length); //textBox1.Text = str; textBox1.Text = ""; } } } MoniMesg.qlock.Set(); } else { //if (!MoniMesg.AlertFlag) //{ // lblMessage.Text = ""; //} } Application.DoEvents(); }
//コンストラクタ2 public iBeacon(BluetoothLEAdvertisementReceivedEventArgs eventArgs) { //出力されているbyteデータから各値を抽出する var manufacturerSections = eventArgs.Advertisement.ManufacturerData; Timestamp = eventArgs.Timestamp; AdvertisementType = eventArgs.AdvertisementType; //var md = eventArgs.Advertisement.ManufacturerData.FirstOrDefault(); //var data1 = new byte[md.Data.Length]; //var manufacturerData1 = eventArgs.Advertisement.ManufacturerData[1]; Debug.WriteLine("manufacturerSections.Count= " + manufacturerSections.Count.ToString()); if (manufacturerSections.Count > 0) { var manufacturerData = manufacturerSections[0]; var data = new byte[manufacturerData.Data.Length]; iBeacon bcon = new iBeacon(); using (var reader = DataReader.FromBuffer(manufacturerData.Data)) { reader.ReadBytes(data); } Name = eventArgs.Advertisement.LocalName; Debug.WriteLine(Name); //長さをチェック if (data == null || data.Length < MinimumLengthInBytes + AdjustedLengthInBytes) { if (Name == "EP") { mData = BitConverter.ToString(data); Temperature = ((double)data[1] + (double)data[2] * 256.0) / 100.0; Humidity = ((double)data[3] + (double)data[4] * 256.0) / 100.0; Illuminance = ((double)data[5] + (double)data[6] * 256.0); Pressure = ((double)data[9] + (double)data[10] * 256.0) / 10.0; } return; } //イベントから取得 Rssi = eventArgs.RawSignalStrengthInDBm; //Name = eventArgs.Advertisement.LocalName; ManufacturerId = manufacturerData.CompanyId; //バイトデータから抽出 //公式での出力値(Windowsでは2byteずれているので補正が必要) // Byte(s) WinByte(s) Name // -------------------------- // 0-1 none Manufacturer ID (16-bit unsigned integer, big endian) // 2-3 0-1 Beacon code (two 8-bit unsigned integers, but can be considered as one 16-bit unsigned integer in little endian) // 4-19 2-17 ID1 (UUID) // 20-21 18-19 ID2 (16-bit unsigned integer, big endian) // 22-23 20-21 ID3 (16-bit unsigned integer, big endian) // 24 22 Measured Power (signed 8-bit integer) // 25 23 Reserved for use by the manufacturer to implement special features (optional) //BigEndianの値を取得 UUID = BitConverter.ToString(data, 4 + AdjustedLengthInBytes, 16); // Bytes 2-17 MeasuredPower = Convert.ToSByte(BitConverter.ToString(data, 24 + AdjustedLengthInBytes, 1), 16); // Byte 22 //もし追加データがあればここで取得 if (data.Length >= MinimumLengthInBytes + AdjustedLengthInBytes + 1) { ManufacturerReserved = data[25 + AdjustedLengthInBytes]; // Byte 23 } //.NET FramewarkのEndianはCPUに依存するらしい if (BitConverter.IsLittleEndian) { //LittleEndianの値を取得 byte[] revData; revData = new byte[] { data[20 + AdjustedLengthInBytes], data[21 + AdjustedLengthInBytes] };// Bytes 18-19 Array.Reverse(revData); Major = BitConverter.ToUInt16(revData, 0); revData = new byte[] { data[22 + AdjustedLengthInBytes], data[23 + AdjustedLengthInBytes] };// Bytes 20-21 Array.Reverse(revData); Minor = BitConverter.ToUInt16(revData, 0); } else { //BigEndianの値を取得 Major = BitConverter.ToUInt16(data, 20 + AdjustedLengthInBytes); // Bytes 18-19 Minor = BitConverter.ToUInt16(data, 22 + AdjustedLengthInBytes); // Bytes 20-21 } } else { new iBeacon(); } }