###xcodeでアプリを作成し、複数beaconの電波強度(rssi)を同時に可視化したい。
現在Xcode+swift+charts(ライブラリ)を用いて、複数台のbeaconから取得した電波強度(rssi)を棒グラフで並べて比較できるようなアプリを作りたいと考えています。プログラム初心者です。
プログラムについて質問しますが、
そもそもやりたい事を実現できるアプリが既存である事をご存知の方は、そちらを教えていただけると幸いです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
自分の認識では、下記のソースコードのbeaconsのリストで受信している全てのbeaconを取得できるものだと考えているが、複数のbeaconを検出できる位置でテストしているにも関わらず、リストに一つの値しか入っていないため、棒が一本しか出ない。
自分なりの分析では、
beaconsのlistには同じUUIDの物しか入って来ないのでは?
つまりグラフを表示するコードを書く部分が適切でないのではと自分の中で推測しています。
ソースは省略しているので、大部分は下記参照。
https://qiita.com/egplnt/items/b052c0e9cbd4efc90b31
該当のソースコード(とくに質問したい箇所は//ここがとくに知りたい。参照)
SWIFT
1// 2// NextViewController.swift 3// secondbeaconapp 4// 下記の記事の電波取得を参考に棒グラフで可視化できるように改造 5// 下記の記事とほとんど同じソースなので、詳細は下記の記事参照 6// https://qiita.com/egplnt/items/b052c0e9cbd4efc90b31 7 8 9import UIKit 10import CoreLocation 11import Charts 12 13class NextViewController: UIViewController, CLLocationManagerDelegate { 14 15 //~~~~~~ 16 //省略 17 18 func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) { 19 beaconUuids = NSMutableArray() 20 beaconDetails = NSMutableArray() 21 22 //追加個所 23 var beacons_list : [Double] 24 var beacons_count_list : [String] 25 26 beacons_list = [] 27 beacons_count_list = [] 28 //ここまで 29 30 31 if(beacons.count > 0){ 32 for i in 0 ..< beacons.count { 33 let beacon = beacons[i] 34 let beaconUUID = beacon.proximityUUID; 35 let minorID = beacon.minor; 36 let majorID = beacon.major; 37 let rssi = beacon.rssi; 38 var proximity = "" 39 switch (beacon.proximity) { 40 case CLProximity.unknown : 41 print("Proximity: Unknown"); 42 proximity = "Unknown" 43 break 44 case CLProximity.far: 45 print("Proximity: Far"); 46 proximity = "Far" 47 break 48 case CLProximity.near: 49 print("Proximity: Near"); 50 proximity = "Near" 51 break 52 case CLProximity.immediate: 53 print("Proximity: Immediate"); 54 proximity = "Immediate" 55 break 56 } 57 beaconUuids.add(beaconUUID.uuidString) 58 var myBeaconDetails = "Major: (majorID) " 59 myBeaconDetails += "Minor: (minorID) " 60 myBeaconDetails += "Proximity:(proximity) " 61 myBeaconDetails += "RSSI:(rssi)" 62 print(myBeaconDetails) 63 beaconDetails.add(myBeaconDetails) 64 //label_uuid.text = proximity 65 //label_uuid.text = "UUID:(beaconUUID)" 66 //label_major.text = "Major:(majorID)" 67 //label_minor.text = "Minor:(minorID)" 68 //label_rssi.text = "Rssi:(rssi)" 69 70 //追加箇所 71 beacons_list.append(Double(rssi)) 72 } 73 74 // 75 //ここがとくに知りたい。(知りたい箇所) 76 // 77 print(beacons_list) 78 79 //追加箇所 80 barChartView.animate(yAxisDuration: 0.0) 81 barChartView.pinchZoomEnabled = false 82 barChartView.drawBarShadowEnabled = false 83 barChartView.drawBordersEnabled = false 84 85 barChartView.leftAxis.axisMaximum = 0.0 86 barChartView.leftAxis.axisMinimum = -100.0 87 barChartView.rightAxis.axisMaximum = 0.0 88 barChartView.rightAxis.axisMaximum = -100.0 89 90 barChartView.rightAxis.enabled = false 91 92 if (beacons_list.count>=1){ 93 94 for i in 0 ..< beacons_list.count{ 95 beacons_count_list.append("(i)") 96 } 97 98 print("check") 99 print(beacons_count_list) 100 101 setChart(dataPoints: beacons_count_list, values: beacons_list) 102 103 } 104 105 } 106 } 107 108 109 110 //グラフ可視化のための関数既存のqiitaのソースにない部分 111 112 override func didReceiveMemoryWarning() { 113 super.didReceiveMemoryWarning() 114 } 115 116 func setChart(dataPoints: [String], values: [Double]) { 117 barChartView.noDataText = "You need to provide data for the chart." 118 119 var dataEntries: [BarChartDataEntry] = [] 120 121 for i in 0..<dataPoints.count { 122 let dataEntry = BarChartDataEntry(x: Double(i), y: values[i]) 123 dataEntries.append(dataEntry) 124 125 } 126 127 let chartDataSet = BarChartDataSet(entries: dataEntries 128 , label: "電波強度") 129 130 let color = UIColor(red:0.188, green:0.639, blue:0.702, alpha:1.0) 131 chartDataSet.colors = [color] 132 let chartData = BarChartData(dataSet: chartDataSet) 133 barChartView.data = chartData 134 135 //ここx軸listを作成する関数なりが必要 136 137 let xaxis = XAxis() 138 xaxis.valueFormatter = BarChartFormatter(label_list: dataPoints) 139 barChartView.xAxis.valueFormatter = xaxis.valueFormatter 140 barChartView.xAxis.labelCount = dataPoints.count 141 142 } 143 144 public class BarChartFormatter: NSObject, IAxisValueFormatter{ 145 // x軸のラベル(サンプルソースは月) 146 147 var beacons_label: [String]! 148 149 init(label_list: [String]){ 150 beacons_label = label_list 151 } 152 153 // デリゲート。TableViewのcellForRowAtで、indexで渡されたセルをレンダリングするのに似てる。 154 public func stringForValue(_ value: Double, axis: AxisBase?) -> String { 155 156 return beacons_label[Int(value)] 157 } 158 159 } 160 161} 162
試したこと
複数台のbeaconが検出できる位置でアプリを起動しテストした。
しかし一つのbeaconしか検出できない。
補足情報(FW/ツールのバージョンなど)
swift 4.5
xcode 10.1
回答1件
あなたの回答
tips
プレビュー