Я обнаружил проблему с отправкой данных маяка на сервер и последующим сохранением их в базе данных. Он получает 4 данных маяка в базу данных (по одному за раз в операторе SQL). Здесь один фрагмент данных - это связка из beacon.getbluetoothname, beacon.getrssi и beacon.getdistance. Я использую библиотеку маяков android.
Моя первоначальная цель - быстрее отправлять данные маяков на сервер. И моя основная проблема - это отправка дубликатов данных в БД. Я хочу равномерно отправлять данные с четырех маяков. если вы поместите данные в sndmsg (), они будут отправлены на сервер. server - это сервер eclipse. а DB - mysql. (mariaDB)
Я знаю, что избыточные данные происходят из-за низкой скорости передачи. я хочу улучшить скорость. это предел библиотеки или маяка (плутокона) Есть ли способ решить проблему?
введите здесь описание изображения
public class MainActivity extends AppCompatActivity implements
BeaconConsumer
{
private String TAG = MainActivity.class.getSimpleName();
private BeaconManager beaconManager;
private List<Beacon> beaconList = new ArrayList<>();
TextView textView ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SystemRequirementsChecker.checkWithDefaultDialogs(this);
beaconManager = BeaconManager.getInstanceForApplication(this);
textView = (TextView)findViewById(R.id.tvId);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.bind(this);
mHandler = new Handler();
et = findViewById(R.id.EditText01);
Button btn = findViewById(R.id.Button01);
final TextView tv = findViewById(R.id.TextView01);
msgTV = findViewById(R.id.chatTV);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (et.getText().toString() != null || !et.getText().toString().equals("")) {
ConnectThread th =new ConnectThread();
th.start();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.addMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
}
@Override
public void didExitRegion(Region region) {
Log.d(TAG,"Exit : " + region.getId1());
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
}
});
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
beaconList.clear();
for (Beacon beacon : beacons) {
beaconList.add(beacon);
}
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
}
catch (RemoteException e) {
}
}
public void OnButtonClicked(View view){
handler.sendEmptyMessage(0);
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
for(Beacon beacon : beaconList)
{
textView.setText("ID : " + beacon.getBluetoothName() + " / " + "Distance : "
+ beacon.getDistance()+ "m\n" + " rssi:"
+ beacon.getRssi() + "txpower : " + beacon.getTxPower() );
}
handler.sendEmptyMessageDelayed(0, 30);
}
};
private Handler mHandler;
Socket socket;
private String ip = "192.168.0.3"; // IP 주소
private int port = 7000; // PORT번호
EditText et;
TextView msgTV;
@Override
protected void onStop() {
super.onStop();
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
class ConnectThread extends Thread{
@SuppressLint("DefaultLocale")
public void run(){
try{
while (true) {
InetAddress serverAddr = InetAddress.getByName(ip);
socket = new Socket(serverAddr, port);
//입력 메시지
String sndMsg = null;
//String ClientID = et.getText().toString();
for (Beacon beacon : beaconList) {
String rssi = Integer.toString(beacon.getRssi());
String dis1 = String.format("%.3f", beacon.getDistance());
double dis = 0.0;
double ratio = Double.valueOf(rssi) * (1.0) / beacon.getTxPower();
if (ratio < 1.0) {
dis = Math.pow(ratio, 10);
} else {
dis = (0.89976) * Math.pow(ratio, 7.7095) + 0.111;
}
//ClientID = et.getText().toString();
sndMsg = (et.getText().toString() + "," + beacon.getBluetoothName() + "," + rssi + "," + dis);
//데이터 송신
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println(sndMsg);
//데이터 수신
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String read = input.readLine();
//화면 출력
mHandler.post(new msgUpdate(read));
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("=============", read);
}
socket.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
// 받은 메시지 출력하는 클래스
class msgUpdate implements Runnable {
private String msg;
public msgUpdate(String str) {
this.msg = str;
}
public void run() {
msgTV.setText(msg);
}
}
}