安卓接入onenet的控制软件及调试助手

@安卓接入onenet的控制软件及调试助手

内容:文章叙述了安卓向onenet服务器上传数据,获取数据点,通过onenet向单片机发送命令的内容

关于硬件的问题大家可以问一下我学长大佬(QQ:815794369)
软件源码地址:https://pan.baidu.com/s/1hZjlW6Vnb45Kd3x5c_KQ2Q
开发软件:Android Studio (发送的格式特别严格)
**软件照片和硬件照片 通过onenet平台去控制四个灯的亮灭:
在这里插入图片描述

在这里插入图片描述
数据格式:
大家应该都用到过小黄人的串口调试z助手,下面这个图片就是通过小黄人向单片机发送开灯的指令(当然指令是自己规定的),这个数据包的格式是固定的,并且官方文档的介绍并不详细。* 后面也会介绍上传数据点和获得数据的格式

下面这个就是利用串口调试助手让单片机上的绿灯亮:

返回的结果是error;0 success 表示成功了,当然你要想更加人性化的话官方的文档里面会介绍返回的数据是什么意思,比如设备是否在线,设备是否响应之类的东西。

**发送命令格式:

  在输入框里面输入:
  POST http://api.heclouds.com/cmds?device_id=522417343 HTTP/1.1
  api-key:HQgSUzUeFhAY=Ict2ildbRkb388=
  Host:api.heclouds.com
  Content-Length:12
  
  <"greenled:1">
  //-------你只要吧device_id, api-key写成你自己产品的就可以了
  //注意,注意!!!!!!!!!!!!!!!!!!
  POST 后面有一个空格,HTTP/1.1前面有一个空格,  Content-Length:下面有一个空行,并且空行里面不能有空格,Content-Length:的大小就是<>里面的字符数,一定要准确不然就会出错
  dff这段话的意思就是表示向单片机发送数据greenled:1

在这里插入图片描述

**获取数据格式:

      在closeContent这一行后面必须要点两次换行,
      并且Connection:close下面的空行中不能有空格

      GET /devices/522417343/datastreams/Red_Led HTTP/1.1 
      api-key:HQgSUzUeFhAY=Ict2ildbRkb388=
      Host:api.heclouds.com 
      Connection:close
       
      //--这个 Connection:close下面必须要有一个一个空行,并且空行里面不能有空格,
      不然就会出错。
        表示获取Red_Led
       获取的是onenet平台上Red_Led最新的一次数据

**上传数据格式:

 POST /devices/522417343/datapoints?type=3 HTTP/1.1 
 api-key:HQgSUzUeFhAY=Ict2ildbRkb388=
 Host:api.heclouds.com
 Content-Length:40

  {"GreenLed":22,"RedLed":33,"BlueLed":44}
  一定要注意json数据的长度是包含大括号的长度
  并且在最后一行的数据前面一定要有一个空行 并且这个
  空行是不能有空格的

**onenet上面的数据展示:
onenet上面的数据展示:如果你没有在onenet上面创建数据流模板就发送数据流模板就开始发送数据的话平台会自己帮你创建一个,但是没有创建就获取数据的话就有可能会出错。
在这里插入图片描述
**注意:
上传数据和发送命令是不一样的

**我觉得上传数据就是往平台上上传数据,但是发送命令就是给单片机发送指令

软件代码:
:只是贴出来开灯关灯页面的代码

package com.example.hp_9470m.onenet_light;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class SecondActivity extends AppCompatActivity {

private SendThread sendthread;
String receive_Msg;

private  int  main_contral = 0 , red_contral = 0 ,green_contral = 0 ,blue_contral = 0 ,yellow_contral = 0 ;
private String mip,port,id,apikey;

private  First_event first_event;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    setTitle("远程灯光控制");


    //从xml文件里面获得设备id和apikey
    SharedPreferences pref = getSharedPreferences("data" , MODE_PRIVATE);

     mip = pref.getString("ip" , "");
     port = pref.getString("port" , "");
     id = pref.getString("id" , "");
      apikey = pref.getString("apikey" , "");

  System.out.println("ip"+mip);
    System.out.println("port"+port);
    System.out.println("id"+id);
    System.out.println("apiket"+apikey);


    //把端口转化为数字
    int mport = Integer.parseInt(port);




    /***************连接*****************/
    sendthread = new SendThread(mip, mport,mHandler);
    Thread1();
    new Thread().start();
    /**********************************/

    //获取调试助手哪里发送过来的消息,替他发送出去
    EventBus.getDefault().register(this);


    //实例化按钮
    final Button main = (Button)  findViewById(R.id.Main);

    //目前还没有办法实现全部关灯 ,就是不知道怎样同时发送多条命令
    main.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
         if (main_contral == 0 ){
             //sendthread.send("0");

             try {
                 //红灯开
             sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                     "api-key:"+apikey+"\n" +
                     "Host:api.heclouds.com\n" +
                     "Content-Length:10\n" +
                     "\n" +
                     "<\"redled:1\">");

                 Thread.sleep(500);   //如果发送太快服务器接受不到


                 //绿灯开
                 sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                         "api-key:"+apikey+"\n" +
                         "Host:api.heclouds.com\n" +
                         "Content-Length:12\n" +
                         "\n" +
                         "<\"greenled:1\">");

                 Thread.sleep(500);

                 //蓝灯开
                 sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                         "api-key:"+apikey+"\n" +
                         "Host:api.heclouds.com\n" +
                         "Content-Length:11\n" +
                         "\n" +
                         "<\"blueled:1\">");
                 Thread.sleep(500);


                 //黄灯开
                 sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                         "api-key:"+apikey+"\n" +
                         "Host:api.heclouds.com\n" +
                         "Content-Length:13\n" +
                         "\n" +
                         "<\"yellowled:1\">");





             } catch (InterruptedException e) {
                 e.printStackTrace();
             }


             main_contral = 1 ;
             main.setBackgroundResource(R.drawable.open);
         }else{
           //sendthread.send("1");


             try {
                 //红灯关
                 sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                         "api-key:"+apikey+"\n" +
                         "Host:api.heclouds.com\n" +
                         "Content-Length:10\n" +
                         "\n" +
                         "<\"redled:0\">");

                 Thread.sleep(500);


                 //绿灯关
                 sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                         "api-key:"+apikey+"\n" +
                         "Host:api.heclouds.com\n" +
                         "Content-Length:12\n" +
                         "\n" +
                         "<\"greenled:0\">");

                 Thread.sleep(500);

                 //蓝灯关
                 sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                         "api-key:"+apikey+"\n" +
                         "Host:api.heclouds.com\n" +
                         "Content-Length:11\n" +
                         "\n" +
                         "<\"blueled:0\">");
                 Thread.sleep(500);


                 //黄灯关
                 sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                         "api-key:"+apikey+"\n" +
                         "Host:api.heclouds.com\n" +
                         "Content-Length:13\n" +
                         "\n" +
                         "<\"yellowled:0\">");





             } catch (InterruptedException e) {
                 e.printStackTrace();
             }

             main_contral = 0 ;
             main.setBackgroundResource(R.drawable.close);
         }
        }
    });

    //四个小的开关
    final Button red = (Button) findViewById(R.id.Red);
    final Button green = (Button) findViewById(R.id.Green);
    final Button blue = (Button) findViewById(R.id.Blue);
    final Button yellow = (Button) findViewById(R.id.Yellow);


    red.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (red_contral == 0 ){
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:10\n" +
                        "\n" +
                        "<\"redled:1\">");
                red_contral = 1 ;
                red.setBackgroundResource(R.drawable.red_open);
            }else{
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:10\n" +
                        "\n" +
                        "<\"redled:0\">");
                red_contral = 0 ;
                red.setBackgroundResource(R.drawable.red_close);
            }

        }
    });

    green.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (green_contral == 0 ){
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:12\n" +
                        "\n" +
                        "<\"greenled:1\">");
                green_contral = 1 ;
                green.setBackgroundResource(R.drawable.green_open);

            }else{
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:12\n" +
                        "\n" +
                        "<\"greenled:0\">");
                green_contral = 0 ;
                green.setBackgroundResource(R.drawable.green_close);
            }

        }
    });


    blue.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (blue_contral == 0 ){
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:11\n" +
                        "\n" +
                        "<\"blueled:1\">");
                blue_contral = 1 ;
                blue.setBackgroundResource(R.drawable.blue_open);
            }else{
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:11\n" +
                        "\n" +
                        "<\"blueled:0\">");
                blue_contral = 0 ;
                blue.setBackgroundResource(R.drawable.blue_close);
            }

        }
    });

    yellow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (yellow_contral == 0 ){
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:13\n" +
                        "\n" +
                        "<\"yellowled:1\">");
                yellow_contral = 1 ;
                yellow.setBackgroundResource(R.drawable.yellow_open);
            }else{
                sendthread.send("POST http://api.heclouds.com/cmds?device_id="+id+" HTTP/1.1\n" +
                        "api-key:"+apikey+"\n" +
                        "Host:api.heclouds.com\n" +
                        "Content-Length:13\n" +
                        "\n" +
                        "<\"yellowled:0\">");
                yellow_contral = 0 ;
                yellow.setBackgroundResource(R.drawable.yellow_close);
            }

        }
    });




}


//引入menu

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main ,menu);
    return  true;
}


//menu的点击事件

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.Detial:
            Intent intent = new Intent(SecondActivity.this , MainActivity.class);
            startActivity(intent);
            break;
        case R.id.Third:
            Intent intent2 = new Intent(SecondActivity.this , ThirdActivity.class);
            startActivity(intent2);
            break;
            default:
    }
    return  true;
}


//使用eventbus让第三个活动可以发送信息  ,当然这个紧急

@Override
protected void onDestroy() {
    super.onDestroy();

    //取消注册事件
    EventBus.getDefault().unregister(this);
}

//在这里添加EventBUs的消息处理事件
@Subscribe(threadMode = ThreadMode.MAIN)    //这里如果不添加注释就会闪退
public void fasong(First_event first_event){

    sendthread.send(first_event.getMessage());

}



/*接收线程*******************************************************************************/
/**
 * 开启socket连接线程
 */   void Thread1(){
 //     sendthread = new SendThread(mIp, mPort, mHandler);
    new Thread(sendthread).start();//创建一个新线程
}

//下面这个方法在活动里面是可以使用的,但是在碎片里面怎么就用不了了  难道是因为我把他放在了子线程里面吗

//这个是在碎片里面接受数据  看看学长是怎么写de

//我日我好像知道了  这个就是说你不能在子线程里面去接收数据  说以你要在主线程里面去接收到这些信息
//然后通过busevent传送过来


//这里其实是可以用的但是  只可以接收十进制的数据,如果是以16进制传过来的数据就会崩溃
Handler mHandler = new Handler()
{
    public void handleMessage(Message msg)
    {



        super.handleMessage(msg);
        if (msg.what == 0x00) {

            Log.i("mr_收到的数据: ", msg.obj.toString());
            receive_Msg = msg.obj.toString();
            String l = receive_Msg;
            //  String s1 = l.substring(0,30 );
           // Toast.makeText(SecondActivity.this , l , Toast.LENGTH_SHORT).show();

            //使用Second_eventBUs 吧数据传送到调试助手那个活动
            EventBus.getDefault().post(new Second_event(l));

        }
    }
};


//在这个活动点击返回的时候让他返回桌面
//下面这个是  仅仅是返回桌面但是不销毁活动

//当然上面的方法也是可以使用的
public boolean onKeyDown (int keyCode , KeyEvent event) {


    if (keyCode == KeyEvent.KEYCODE_BACK) {

        Intent home = new Intent(Intent.ACTION_MAIN);
        home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        home.addCategory(Intent.CATEGORY_HOME);
        startActivity(home);

        return true;

    }
    return super.onKeyDown(keyCode, event);
}
}
  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 要连接OneNet,您需要在Android Studio中使用HTTP请求来访问OneNet API。您需要使用您的OneNet API密钥和设备ID来进行身份验证和访问数据。您可以使用OkHttp或Retrofit等库来进行HTTP请求。以下是一个简单的示例代码片段,用于获取OneNet设备的最新数据: ``` OkHttpClient client = new OkHttpClient(); String apiKey = "YOUR_API_KEY"; String deviceId = "YOUR_DEVICE_ID"; Request request = new Request.Builder() .url("http://api.heclouds.com/devices/" + deviceId + "/datastreams") .addHeader("api-key", apiKey) .build(); Response response = client.newCall(request).execute(); String responseData = response.body().string(); // 解析响应数据 JSONObject jsonObject = new JSONObject(responseData); JSONArray datastreams = jsonObject.getJSONArray("datastreams"); JSONObject latestDatastream = datastreams.getJSONObject(); JSONObject latestData = latestDatastream.getJSONObject("datapoints").getJSONObject(); String latestValue = latestData.getString("value"); ``` 请注意,此示例代码仅用于演示目的。在实际应用中,您需要根据您的需求进行修改和优化。 ### 回答2: Android Studio是一种为开发Android应用程序而生的集成开发环境。OneNet是由中国电信联合众多合作伙伴共同打造的面向IoT领域的综合云服务平台。通过将Android Studio连接到OneNet,我们可以将Android应用程序与OneNet上的物联网设备进行连接,从而实现物联网应用的开发和调试。 要开始使用Android Studio进行OneNet连接,您首先需要在OneNet网站上注册一个账户,并在OneNet控制台上创建一个数据流和一个设备。这个设备可以是一台传感器设备、智能家居设备或者其他任何可以连接到OneNet平台的设备。 接下来,您需要下载并安装OneNet SDK,以便在Android应用程序中使用OneNet的API。您可以在Github网站上找到最新版本的OneNet SDK,并将其拉入您的项目中。一旦您将SDK安装到项目中,您就可以使用OneNet提供的API来访问OneNet平台上的设备和数据流。 在使用Android Studio连接OneNet时,您需要创建一个HTTP请求来访问OneNet平台。您需要使用OneNet提供的API来确保您的请求合法,并在请求的header中传递设备ID和API Key等认证信息。一旦您成功连接到OneNet平台,您就可以使用OneNet API来读取、写入和订阅数据流,从而实现对物联网设备的控制和管理。 总之,通过将Android Studio连接到OneNet,您可以轻松构建高效的物联网应用程序。不仅可以帮助您优化设备的控制和管理,还可以为您提供更精确的数据分析和业务决策支持。 ### 回答3: 将Android Studio与OneNet连接,可以实现在应用程序中收集和传输OneNet中的数据。要实现这个目标,请遵循以下步骤: 1. 注册OneNet账户并创建设备 首先,在OneNet官网注册账户并创建一个设备。在设备页面,您可以获得该设备的API KEY,后面需要用到。 2. 下载SDK 在您的项目中,添加OneNet SDK库。您可以从官方网站下载OneNet的SDK,或从Android Studio使用Gradle,直接添加SDK库依赖: ``` compile 'com.chinamobile.iot.onenet:iothttp:0.2.2' ``` 3. 在应用程序中指定权限 在AndroidManifest.xml文件中增加网络访问的权限: ``` <uses-permission android:name="android.permission.INTERNET"/> ``` 4. 连接OneNet设备 创建一个与OneNet设备进行通信的类,如: public class OneNet { private final static String TAG = OneNet.class.getSimpleName(); private final static String API_KEY = "xxxxxxx";// OneNet API KEY private final static String DEVICE_ID = "xxxxxxxx";// OneNet 设备 ID private HttpManager manager; private Device device; public OneNet() { manager = HttpManager.getHttpManager(); device = new Device(API_KEY, DEVICE_ID); } public void getDataStreams(final Callback<List<Datapoint>> callback){ Request request = new Request.Builder() .url(device.generateUrl() + "/datastreams") .build(); manager.sendRequest(request, callback); } public void addDataPoints(final List<Datapoint> datapoints, final Callback<String> callback) { Request request = new Request.Builder() .url(device.generateUrl() + "/datapoints") .post(generateRequestBody(datapoints)) .build(); manager.sendRequest(request, callback); } private RequestBody generateRequestBody(final List<Datapoint> datapoints) { JSONObject jsonObject = new JSONObject(); JSONArray jsonArray = new JSONArray(); for(Datapoint datapoint : datapoints) { JSONObject object = new JSONObject(); try { object.put("id", datapoint.getId()); object.put("at", datapoint.getAt()); object.put("value", datapoint.getValue()); } catch (JSONException e) { Log.e(TAG, "[generateRequestBody] error, " + e.getMessage()); } jsonArray.put(object); } try { jsonObject.put("datastreams", jsonArray); } catch (JSONException e) { Log.e(TAG, "[generateRequestBody] error, " + e.getMessage()); } RequestBody requestBody = RequestBody.create(HttpManager.getContentType(), jsonObject.toString()); return requestBody; } } 5. 在Activity中使用 创建一个Activity来获取OneNet数据并显示它们,如: public class MainActivity extends Activity { private OneNet oneNet; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); oneNet = new OneNet(); oneNet.getDataStreams(new Callback<List<Datapoint>>() { @Override public void onSuccess(List<Datapoint> response) { TextView textView = (TextView) findViewById(R.id.text_view); StringBuilder builder = new StringBuilder(); for (Datapoint datapoint : response) { builder.append("ID: ").append(datapoint.getId()) .append(", at: ").append(datapoint.getAt()) .append(", value: ").append(datapoint.getValue()) .append("\n"); } textView.setText(builder.toString()); } @Override public void onFailure(Exception e) { Log.e(OneNet.class.getSimpleName(), "[getDataStreams] error, " + e.getMessage()); } }); } @Override protected void onDestroy() { super.onDestroy(); } } 到此为止,您可以使用Android Studio和OneNet连接来获取设备中的数据,并在应用程序中显示它们。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值