zigbee网关 android客户端编写温度计功能

原创 2015年11月20日 13:15:22

参考如何在Android手机上画温度计?

但是不符合想要的需求。需求是温度是外界控制的,通过tcp传进来的;并且温度计的量程也太小了,最好在室温以内;最好能添加显示当前温度;温度计你最好在画面中间显示;经过修改后的画面如下:



布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

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

        <EditText
            android:id="@+id/ipport"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
           
            android:hint="@string/ipport_hint"
            android:text="@string/ipport_text" >
        </EditText>

        <Button
            android:id="@+id/StartConnect"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusableInTouchMode="true"
            android:text="@string/StartConnect_name" />

    </LinearLayout>

    <SurfaceView
        android:id="@+id/surface"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>



定义几个成员变量指示温度计的属性

	private static final int TOP = 40; // 温度计距离顶部的位置
	private static final int PIX1DEGREE = 30; // 温度计每一摄氏度占用的像素数
	private static final int BEGIN_DEGREE = 15; // 温度计量程起始温度
	private static final int END_DEGREE = 35; // 温度计量程终止温度
	private static final int WIDTH = 40; // 温度计的宽度



对draw函数进行了修改,主要把原先的定值改为可以变化的

/*
 * @author fanruitian 
 * @QQ 1021200380
 * @date 2015.11.20
 * */	
private void draw(String temp) {
		int HEIGHT = (END_DEGREE - BEGIN_DEGREE) * PIX1DEGREE; // 矩形的高度
		float tem1 = Float.parseFloat(temp);
		Canvas canvas = mHolder.lockCanvas();
		Paint mPaint = new Paint();
		mPaint.setColor(Color.BLACK);
		canvas.drawRect(0,0,canvas.getWidth(),canvas.getHeight(),mPaint);
		
		//Paint mPaint = new Paint();
		mPaint.setColor(Color.WHITE);
		// 画一个居中的距离顶部TOPpx,长宽分别为WIDTH和HEIGHT的矩形
		canvas.drawRect(canvas.getWidth() / 2 - WIDTH / 2, TOP,
				canvas.getWidth() / 2 + WIDTH / 2, TOP + HEIGHT, mPaint);
		Paint paintCircle = new Paint();
		paintCircle.setColor(Color.RED);
		Paint paintLine = new Paint();
		paintLine.setColor(Color.BLUE);
		// 画红条代表当前的温度
		int y = TOP + HEIGHT - (int) ((tem1 - BEGIN_DEGREE) * PIX1DEGREE);
		System.out.println(y);
		canvas.drawRect(canvas.getWidth() / 2 - WIDTH / 2, y, canvas.getWidth()
				/ 2 + WIDTH / 2, TOP + HEIGHT, paintCircle);
		// 在矩形的底部画一个半径为WIDTH的圆,稍稍往上WIDTH/4个像素,这样就不是相交的了
		canvas.drawCircle(canvas.getWidth() / 2, TOP + HEIGHT + WIDTH - WIDTH
				/ 4, WIDTH, paintCircle);
		int ydegree = TOP + HEIGHT;
		int tem = BEGIN_DEGREE;
		int i = 0;
		while (ydegree > TOP) {
			canvas.drawLine(canvas.getWidth() / 2 + WIDTH / 2, ydegree,
					canvas.getWidth() / 2 + WIDTH / 2 + 7, ydegree, mPaint);
			if (i % 10 == 0) {
				canvas.drawLine(canvas.getWidth() / 2 + WIDTH / 2, ydegree,
						canvas.getWidth() / 2 + WIDTH / 2 + 7, ydegree,
						paintLine);
				// canvas.drawLine(60, ydegree, 72, ydegree, paintLine);
				canvas.drawText(tem + "", canvas.getWidth() / 2 + WIDTH / 2
						+ 10, ydegree + 5, mPaint);
				tem++;
			}
			i++;
			ydegree = ydegree - PIX1DEGREE / 10;
		}
		paintCircle.setTextSize(70);
		paintCircle.setTextAlign(Paint.Align.CENTER);
		canvas.drawText(tem1 + "℃", canvas.getWidth() / 2 - 10,
				canvas.getHeight() - 55, paintCircle);
		mHolder.unlockCanvasAndPost(canvas);// 更新屏幕显示内容
	}


再就是添加一些tcp功能,用于打通网络处理字符串,启动一个线程用于接收数据处理数据

	// 线程:监听服务器发来的消息
	private Runnable mRunnable = new Runnable() {
		public void run() {
			//bConnect.setText("停止连接");
			String msgText = eIpPort.getText().toString();
			int start = msgText.indexOf(":");
			String sIP = msgText.substring(0, start);
			String sPort = msgText.substring(start + 1);
			BufferedReader mBufferedReaderClient = null;
			int port = Integer.parseInt(sPort);
			try {
				// 连接服务器
				mSocketClient = new Socket();
				mSocketClient.connect(new InetSocketAddress(sIP, port), 3000);
				// 取得输入、输出流
				mBufferedReaderClient = new BufferedReader(
						new InputStreamReader(mSocketClient.getInputStream()));
				// break;
			} catch (Exception e) {
				//bConnect.setText("开始连接");
				e.printStackTrace();

			}
			char[] buffer = new char[512];
			int count = 0;

			try {
				while (bRun) {
					if ((count = mBufferedReaderClient.read(buffer)) > 0) {
						String recvMessageClient = getInfoBuff(buffer, count);
						System.out.println(recvMessageClient);
						ProcessData(recvMessageClient);
					}
				}
			} catch (Exception e) {
				//bConnect.setText("开始连接");
				e.printStackTrace();
			}
		}

	};

为了一打开软件就能看到画面需要在合适的时候调用draw函数

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		this.draw("15");
	}


简单的测试一下,向手机发送字符串

{"From":"Endian","Addr":"8021","Type":"Message","Content":"Temperature:27.4"}

看一下手机接收的图片,如上图所示

成功

更多资料请参考 http://web.nenewind.com

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

安卓通过串口控制zigbee

安卓通过串口控制zigbee
  • bilifo
  • bilifo
  • 2016-01-13 14:04
  • 1388

在安卓中实现Zigbee串口设备采集模块

前段时间做了一个移动开发的嵌入式项目,目前有时间所以写这篇博客,第一次写,多有不对望指正 好入正题,希望通俗易懂 安卓系统是架构在Linux上的,如果要将一个串口设备让应用层APP识别,或者说将数...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

ZigBee基础实验——中断

出自 前言   上一篇介绍了CC2530的IO的基础知识,并用LED的控制来展示如何配置并控制GPIO的输出,用KEY状态的读取实验来展示如何读取GPIO的状态。从上一节的KE...

修改Zigbee的Channel、PANID、发射功率、灵敏度及其它参数

转自:http://blog.csdn.net/xiaoshengyige/article/details/7577115(Channel、PANID、发射功率)原文如下: 现对z-stack里...

UART串口软件接口的设计与分析

在利用UART进行数据操作之前,先来了解UART的操作过程是怎样的。 (1)设置I/O连接到UART。 (2)设置串口波特率。 (3)发送或接收数据。 (4)检查串口状态字或等待串口中断。 ...

C语言中strstr函数的简单实现

在C语言中库函数strstr()函数表示在一个字符串str1中查找另一个字符串str2,如果查到则返回str2在str1中首次出现的位置,如果找不到则返回null。 char* strstr...

Zigbee深入浅出之Zigbee入门

什么是Zigbee?它能干什么用? 为什么要引入zigbee? zigbee是无线设备之间的一种通信方式,类似于人和人之间的通话交流,普通话就是一种通信方式. zigbee通信方式,zigbe...

Andriod和Zigbee在智能家居系统中的应用

引言 随着物联网技术的不断发展,家居智能化已经不再是天方夜谭,越来越多的智能家居产品正在占据市场份额。智能家居就是应用电子技术、无线通信技术等,让生活环境中的家用电器、安防设备...

在8位单片机上实现JSON数据的简单解析(单片机解析JSON)

由于在一些低配的单片机上面不能直接使用C提供的系统库,项目中又需要解析服务器返回的JSON数据,以下代码可以简单的解析出JSON数据中的key: // // main.c // ...

ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

出自 1、CC2530的IO口概述   CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC、定时器或USART外设。这些I/O 口的用途...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)