android底层与zigbee通信

        看着Android的发展心里很是欢喜,对于有硬件基础的我们当然可以选择Android应用+硬件产品 = 单片机+大屏幕+硬件产品+网络设备,同时价格、稳定性、通用性、美观性、开发难度,Android让我欣喜不已,不是为了逃避难度,只是真心觉得它太棒了~

这里我选择描述一下Android与zigbee,很多玩智能家居,工业控制,组网的童靴可以参考参考。

 

已经选择好了第一款平板,当然平板就作为了当前的协调器,我们要实现的功能是:(1)写一个Android应用与协调器通信,(2)使用一个节点将数据接收到电脑上

(1)写一个Android应用与协调器通信

先做一个demo界面,效果如图1所示。

制作方法参考,我得博客:13-7-13 聊天窗口的绘制与实现 (实在有问题可以留言)。

接下来,引入zigbee包,***.so文件,实现协调器(平板)与底层(节点接到电脑上)对话

将libserial_port.so文件拷贝到libs中(拷贝这个图片我就不上了),填写对应的Java类,实现对so文件的调用,下面开始代码啦~

常常我们编写代码的时候头脑一热就开始编写,但是代码是逻辑的理性的,不是感性的,最好有个框架。

 

根据框架来看,第一部分串口操作代码如下:

[java]  view plain copy
  1. /**************************************************************** 
  2.  * 编写SerialPort类,实现方法:串口初始化、输入数据、输出数据 
  3.  * @author hanzhen 
  4.  * 
  5.  */  
  6. public class SerialPort {  
  7.   
  8.     private static final String TAG = "SerialPort";  
  9.     /* 
  10.      * Do not remove or rename the field mFd: it is used by native method close(); 
  11.      */  
  12.     private FileDescriptor mFd;  
  13.     private FileInputStream mFileInputStream;  
  14.     private FileOutputStream mFileOutputStream;  
  15.     /****************************************************** 
  16.      * 实现串口初始化工作 
  17.      * @param device 
  18.      * @param baudrate 
  19.      * @param flags 
  20.      */  
  21.     public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {  
  22.           
  23.         mFd = open(device.getAbsolutePath(), baudrate, flags);  
  24.         Log.i(TAG, "-----path::"+device.getAbsolutePath());  
  25.         if (mFd == null) {  
  26.             Log.e(TAG, "native open returns null");  
  27.             throw new IOException();  
  28.         }  
  29.   
  30.         mFileInputStream = new FileInputStream(mFd);  
  31.         mFileOutputStream = new FileOutputStream(mFd);  
  32.     }  
  33.     /******************************************************* 
  34.      * 输入数据 
  35.      * @return 
  36.      */  
  37.     // Getters and setters  
  38.     public InputStream getInputStream() {  
  39.         return mFileInputStream;  
  40.     }  
  41.     /******************************************************** 
  42.      * 发送数据或输出数据 
  43.      * @return 
  44.      */  
  45.     public OutputStream getOutputStream() {  
  46.         return mFileOutputStream;  
  47.     }  
  48.     //静态装入so文件,声明JNI接口类  
  49.     // JNI  
  50.     private native static FileDescriptor open(String path, int baudrate, int flags);  
  51.     public native void close();  
  52.     static {  
  53.         System.loadLibrary("serial_port");  
  54.     }  
  55. }  

第二部分为Activity提供接口
(1)编写Application类

[java]  view plain copy
  1. /*********************************************************** 
  2.  * 编写Application类,实现方法:打开串口、关闭串口 
  3.  * @author hanzhen 
  4.  * 
  5.  */  
  6. public class Application extends android.app.Application {  
  7.   
  8.     public SerialPortFinder mSerialPortFinder = new SerialPortFinder();  
  9.     private SerialPort mSerialPort = null;  
  10.   
  11.     public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException {  
  12.         if (mSerialPort == null) {  
  13.             String path;  
  14.             int baudrate;  
  15.             path="/dev/ttySAC2";  
  16.             baudrate=9600;  
  17.             /* Open the serial port */  
  18.             mSerialPort = new SerialPort(new File(path), baudrate, 0);  
  19.         }  
  20.         return mSerialPort;  
  21.     }  
  22.   
  23.     public void closeSerialPort() {  
  24.         if (mSerialPort != null) {  
  25.             mSerialPort.close();  
  26.             mSerialPort = null;  
  27.         }  
  28.     }  
  29. }  

千万不要忘记在manifest.xml文件中装入它:android:name="com.pitaya.zigbee.Application"

(2)编写SerialPortActivity类,实现程序

[java]  view plain copy
  1. /*************************************************************** 
  2.  * 编写SerialPortActivity类,实现程序: 
  3.  *1、提供串口数据发送数据流接口 
  4.         Protected OutputStream mOutputStream; 
  5.  *2、开启接收线程 
  6.         提供接收抽象函数abstract void onDataReceived 
  7.  * @author hanzhen 
  8.  * 
  9.  */  
  10. public abstract class SerialPortActivity extends Activity {  
  11.   
  12.     private static final String TAG="SerialPortActivity";  
  13.     protected Application mApplication;  
  14.     protected SerialPort mSerialPort;  
  15.     protected OutputStream mOutputStream;  
  16.     private InputStream mInputStream;  
  17.     private ReadThread mReadThread;  
  18.   
  19.     private class ReadThread extends Thread {  
  20.   
  21.         @Override  
  22.         public void run() {  
  23.             super.run();  
  24.             while(!isInterrupted()) {  
  25.                 int size;  
  26.                 try {  
  27.                     byte[] buffer = new byte[512];  
  28.                     if (mInputStream == nullreturn;  
  29.                     size = mInputStream.read(buffer);  
  30.                     if (size > 0) {  
  31.                         Thread.sleep(30);       //保证接收完毕  
  32.                         size = mInputStream.read(buffer);  
  33.                         onDataReceived(buffer, size);  
  34.                     }  
  35.                 } catch (IOException e) {  
  36.                     e.printStackTrace();  
  37.                     return;  
  38.                 } catch (InterruptedException e) {  
  39.                     // TODO Auto-generated catch block  
  40.                     e.printStackTrace();  
  41.                 }  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46.     @Override  
  47.     protected void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         mApplication = (Application) getApplication();//Return the application that owns this activity  
  50.         Log.i(TAG, "---->let we get the zigbee info");  
  51.         try {  
  52.             Log.i(TAG, "---->open the serialPort");  
  53.             mSerialPort = mApplication.getSerialPort();  
  54.             Log.i(TAG, "---->serialPort info: "+mSerialPort.toString());  
  55.             mOutputStream = mSerialPort.getOutputStream();  
  56.             mInputStream = mSerialPort.getInputStream();  
  57.             Log.i(TAG, "---->打开接收线程: ");  
  58.             /* Create a receiving thread */  
  59.             mReadThread = new ReadThread();  
  60.             mReadThread.start();  
  61.               
  62.         }catch(Exception e){  
  63.             e.printStackTrace();  
  64.         }  
  65.     }  
  66.   
  67.     protected abstract void onDataReceived(final byte[] buffer, final int size);  
  68.   
  69.     @Override  
  70.     protected void onDestroy() {  
  71.         if (mReadThread != null)  
  72.             mReadThread.interrupt();  
  73.         mApplication.closeSerialPort();  
  74.         mSerialPort = null;  
  75.         super.onDestroy();  
  76.     }  


第三部分 界面实现zigbee数据的收发

//发送数据

[java]  view plain copy
  1. send_button.setOnClickListener(new OnClickListener() {  
  2.     public void onClick(View arg0) {  
  3.         String t = Emission.getText().toString();  
  4.         try {  
  5.             mOutputStream.write(t.getBytes());  
  6.             Message(ChatMessage.MESSAGE_TO, t);  
  7.         } catch (IOException e) {  
  8.             e.printStackTrace();  
  9.         }  
  10.     }  
  11. });  

//接收数据

[java]  view plain copy
  1. //接收数据  
  2. private static String sbuf = "";  
  3. @Override  
  4. protected void onDataReceived(final byte[] buffer, final int size) {  
  5.     // TODO Auto-generated method stub  
  6.     runOnUiThread(new Runnable() {  
  7.         public void run() {  
  8.             String zig_recept = new String(buffer, 0, size);  
  9.             Log.i(TAG, zig_recept);  
  10.             sbuf =sbuf+zig_recept;  
  11.             if(sbuf.charAt(sbuf.length()-1) =='a' ){  
  12.                 Message(ChatMessage.MESSAGE_FROM, sbuf);  
  13.                 sbuf = "";  
  14.             }                 
  15.         }  
  16.     });  
  17. }  

----------------------------------------------------------------结束-------------------------------------------------

上面完成了流程图所示的功能:

效果如图所示:

   

  图1 程序刚起动                         图2 发送字符“feiyangxiaomia”过去

         

  图3 接收到了字符“feiyangxiaomia”,发送几个helloworld    图4 接收到了字符“helloworld”

 

 

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值