唯倚社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 906|回复: 1

[学习教程] 【原创】自己写一个app来控制你的继电器

[复制链接]

35

主题

176

帖子

2383

积分

LV3

Rank: 3Rank: 3

积分
2383
发表于 2018-4-20 13:05:39 | 显示全部楼层 |阅读模式

轻松玩转社区

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 fsw 于 2018-4-20 13:15 编辑

唯倚论坛首发
今天我来教大家自己写一个安卓app来控制自己的wiot1继电器
首先你需要具备一定的编程基础知识,了解java以及android studio的使用
为了直观方便,我使用TCP&UDP测试工具来模拟wiot向tlink发送收据,当然你需要在tlink创建一个设备,这些论坛都已经有教程了,我就不多说了。 FR~$KC8}6}WX6RPM6@MX~J5.png
1.首先打开我们的as创建一个工程,添加简单的布局文件,如果不会的就先去学学基础吧。
7S}13Q3828FE([VBMTR4NRT.png
[Java] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".wiot.wiotActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="10dp">

       <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="50dp"
           android:orientation="horizontal">

           <TextView
               android:layout_width="wrap_content"
               android:layout_height="50dp"
               android:text="设备序列号:"
               android:textSize="20dp"
               android:textColor="#000"/>

           <EditText
               android:id="@+id/deviceNo"
               android:layout_width="match_parent"
               android:layout_height="50dp"
               android:hint="请输入设备序列号"
               android:text="SG4GUR40N9GH0C6A"
               />

       </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:text="传感器ID:"
                android:textSize="20dp"
                android:textColor="#000"/>

            <EditText
                android:id="@+id/sensorId"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:hint="请输入传感器ID"
                android:text="200153789"
                />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:text="用户Key:"
                android:textSize="20dp"
                android:textColor="#000"/>

            <EditText
                android:id="@+id/userKey"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:hint="请输入用户Key"
                android:text="ddc7028843c441da8a54c8b5e9a9e429"
                />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:text="value:"
                android:textSize="20dp"
                android:textColor="#000"/>

            <EditText
                android:id="@+id/value"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:text="1"
                />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:text="继电器"
                android:textSize="25dp"
                android:textColor="#2e7bf5"
                android:layout_weight="1"/>

            <Switch
                android:id="@+id/sw1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                />

        </LinearLayout>
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="helloworld"/>

    </LinearLayout>
</android.support.constraint.ConstraintLayout>

2.然后在class文件内绑定布局,我们通过一个switch开关来发送设备序列号,传感器id,userkey以及value(继电器通过0和1来代表开关)
3.给switch设定一个监听器,来获取输入值,并检查switch的开关状态。
4.重头戏来了,我们最重要的是要把信息发送给tlink,然后tlink会发送给我们的传感器,我们根据tlink网站https://www.tlink.io/web/develop ... 9%E4%B8%AD%E5%BF%83所提供的api接口(http下行控制),给tlink发送数据,根据接收json格式这里我们采用HttpUrlConnection方式递交数
据。
(XN@JA(7~(D5NB6NINV0`6A.png
5.数据传送给tlink后会返回一个json数据,我们需要对发送和接收的json数据进行解析,需要通过网站https://www.sojson.com/json2entity.html生成一个Java实体,单独创建一个class文件存放
H{45ES1M7(7_S]@U5K_V)N7.png
[Java] 纯文本查看 复制代码
package com.weiecn.weiecniot.wiot;


    public class tlinkjson
    {
        private String deviceNo;

        private String sensorId;

        private String userKey;

        private String value;

        public void setDeviceNo(String deviceNo){
            this.deviceNo = deviceNo;
        }
        public String getDeviceNo(){
            return this.deviceNo;
        }
        public void setSensorId(String sensorId){
            this.sensorId = sensorId;
        }
        public String getSensorId(){
            return this.sensorId;
        }
        public void setUserKey(String userKey){
            this.userKey = userKey;
        }
        public String getUserKey(){
            return this.userKey;
        }
        public void setValue(String value){
            this.value = value;
        }
        public String getValue(){
            return this.value;
        }
    }

[Java] 纯文本查看 复制代码
package com.weiecn.weiecniot.wiot;

public class tlinkresult
{
    private String flag;

    private String msg;

    public void setFlag(String flag){
        this.flag = flag;
    }
    public String getFlag(){
        return this.flag;
    }
    public void setMsg(String msg){
        this.msg = msg;
    }
    public String getMsg(){
        return this.msg;
    }
}

6.新建一个线程利用gson对返回数据解析,
[Java] 纯文本查看 复制代码
package com.weiecn.weiecniot.wiot;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.weiecn.weiecniot.R;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;


import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


public class wiotActivity extends Activity {


    private EditText deviceNo;
    private EditText sensorId;
    private EditText userKey;
    private Switch sw1;
    private EditText value;
    private TextView mResult;

    tlinkjson t1;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wiot1);

        deviceNo = (EditText) findViewById(R.id.deviceNo);
        sensorId =(EditText) findViewById(R.id.sensorId);
        userKey = (EditText) findViewById(R.id.userKey);

        sw1=findViewById(R.id.sw1);
        value=(EditText) findViewById(R.id.value);
        mResult=(TextView)findViewById(R.id.tv_result);

        sw1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                t1=new tlinkjson();
                t1.setDeviceNo(deviceNo.getText().toString());
                t1.setSensorId(sensorId.getText().toString());
                t1.setUserKey(userKey.getText().toString());
                t1.setValue(isChecked?"1":"0");

                new Thread(){
                    @Override
                    public void run() {
                        Gson gson =new Gson(); Gson gson2 = new Gson();
                        String personStr=gson.toJson(t1);
                        String nullres="返回值为空";

                        String result=HttpPost(personStr);
                        tlinkresult res = gson2.fromJson(result, tlinkresult.class);
                       // mResult.setText(res.getMsg());
                        //Toast.makeText(wiotActivity.this,res.getMsg(),Toast.LENGTH_SHORT).show();

                         Log.i("Result",res.getMsg());
                           // mResult.setText(res.getMsg());


                    }
                }.start();
            }
        });


    }
    public  String HttpPost(String data){
        String path = "http://api.tlink.io/tlink_interface/api/device/sendSwitchValue.htm";
           try {
            URL url = new URL(path);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(5000);
            connection.setRequestMethod("POST");

            //数据准备
            //至少要设置的两个请求头
            connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
            connection.setRequestProperty("Content-Length", data.length()+"");

            //post的方式提交实际上是留的方式提交给服务器
            connection.setDoOutput(true);
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(data.getBytes());

            //获得结果码
            int responseCode = connection.getResponseCode();
            if(responseCode ==200){
                //请求成功
                InputStream is = connection.getInputStream();
                StringBuffer out = new StringBuffer();
                byte[] b = new byte[4096];
                for (int n; (n = is.read(b)) != -1;) {
                    out.append(new String(b, 0, n));
                }

                return out.toString();
            }else {

            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

至此我们的app就写完了,赶紧调试一下吧



评分

参与人数 1E币 +100 收起 理由
admin + 100 唯倚社区,感谢有你~

查看全部评分

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|weiecn ( 湘ICP备14002058号 )

GMT+8, 2018-12-17 18:41 , Processed in 0.062859 second(s), 12 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表