package com.chinamobile.iot.onenet.sdksample.fragment; import android.os.Bundle; import android.os.Handler; import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import com.chinamobile.iot.onenet.OneNetApi; import com.chinamobile.iot.onenet.OneNetApiCallback; import com.chinamobile.iot.onenet.sdksample.R; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParser; import org.json.JSONException; import org.json.JSONObject; import java.util.Timer; import java.util.TimerTask; /** * 数据模拟器 */ public class DataSimFragment extends Fragment implements View.OnClickListener { private TextInputLayout mDeviceIdLayout; private TextInputLayout mDataStreamLayout; private TextInputLayout mMinValueLayout; private TextInputLayout mMaxValueLayout; private TextInputLayout mPeriodLayout; private Button mSendOneceButton; private Button mSendContinuousButton; private TextView mResponseLogTextView; private Timer mSendDataTimer; private boolean mSending; private Handler mHandler = new Handler(); public static DataSimFragment newInstance() { return new DataSimFragment(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_data_sim, container, false); mDeviceIdLayout = (TextInputLayout) v.findViewById(R.id.device_id); mDataStreamLayout = (TextInputLayout) v.findViewById(R.id.datastream); mMinValueLayout = (TextInputLayout) v.findViewById(R.id.min_value); mMaxValueLayout = (TextInputLayout) v.findViewById(R.id.max_value); mPeriodLayout = (TextInputLayout) v.findViewById(R.id.period); mSendOneceButton = (Button) v.findViewById(R.id.send_onece); mSendContinuousButton = (Button) v.findViewById(R.id.send_continuous); mResponseLogTextView = (TextView) v.findViewById(R.id.response_log); mSendOneceButton.setOnClickListener(this); mSendContinuousButton.setOnClickListener(this); return v; } @Override public void onClick(View v) { String deviceId = mDeviceIdLayout.getEditText().getText().toString(); String datastream = mDataStreamLayout.getEditText().getText().toString(); String minValueString = mMinValueLayout.getEditText().getText().toString(); String maxValueString = mMaxValueLayout.getEditText().getText().toString(); String periodString = mPeriodLayout.getEditText().getText().toString(); if (TextUtils.isEmpty(deviceId)) { mDeviceIdLayout.setError(getResources().getString(R.string.device_id)); mDeviceIdLayout.requestFocus(); return; } if (TextUtils.isEmpty(datastream)) { mDataStreamLayout.setError(getResources().getString(R.string.datastream)); mDataStreamLayout.requestFocus(); return; } if (TextUtils.isEmpty(minValueString)) { mMinValueLayout.setError(getResources().getString(R.string.min_value)); mMinValueLayout.requestFocus(); return; } if (TextUtils.isEmpty(maxValueString)) { mMaxValueLayout.setError(getResources().getString(R.string.max_value)); mMaxValueLayout.requestFocus(); return; } float minValue = Float.parseFloat(minValueString); float maxValue = Float.parseFloat(maxValueString); switch (v.getId()) { case R.id.send_onece: sendOnce(deviceId, datastream, minValue, maxValue); break; case R.id.send_continuous: if (!mSending) { if (TextUtils.isEmpty(periodString)) { mPeriodLayout.setError(getResources().getString(R.string.time_interval)); mPeriodLayout.requestFocus(); return; } int period = Integer.parseInt(periodString); sendContinuous(deviceId, datastream, minValue, maxValue, period); } else { mDeviceIdLayout.setEnabled(true); mDataStreamLayout.setEnabled(true); mMinValueLayout.setEnabled(true); mMaxValueLayout.setEnabled(true); mPeriodLayout.setEnabled(true); mSendOneceButton.setEnabled(true); mSendContinuousButton.setText(R.string.send_continuous); if (mSendDataTimer != null) { mSendDataTimer.cancel(); } mSending = false; } break; } } private void sendOnce(String deviceId, String datastream, float minValue, float maxValue) { float value = (float) (Math.random() * (maxValue - minValue) + minValue); JSONObject request = new JSONObject(); try { request.putOpt(datastream, value); } catch (JSONException e) { e.printStackTrace(); } OneNetApi.addDataPoints(deviceId, "3", request.toString(), new OneNetApiCallback() { @Override public void onSuccess(String response) { displayLog(response); } @Override public void onFailed(Exception e) { e.printStackTrace(); } }); } private void sendContinuous(final String deviceId, final String datastream, final float minValue, final float maxValue, int period) { TimerTask task = new TimerTask() { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { sendOnce(deviceId, datastream, minValue, maxValue); } }); } }; mSendDataTimer = new Timer(true); mSendDataTimer.schedule(task, 0, period * 1000); mSendContinuousButton.setText(R.string.stop_sending); mDeviceIdLayout.setEnabled(false); mDataStreamLayout.setEnabled(false); mMinValueLayout.setEnabled(false); mMaxValueLayout.setEnabled(false); mPeriodLayout.setEnabled(false); mSendOneceButton.setEnabled(false); mSending = true; } private void displayLog(String response) { if ((response.startsWith("{") && response.endsWith("}")) || (response.startsWith("[") && response.endsWith("]"))) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonParser jsonParser = new JsonParser(); response = gson.toJson(jsonParser.parse(response)); } mResponseLogTextView.setText(response); } }