80,471
社区成员




//发送方法
private void send(){
//启动定时器,2秒后执行,每2秒执行一次
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
try{
byte[] b = {0,1,0,0};
mOutputStream.write(b,0,3);
}catch(Exception e){
e.printStackTrace();
}
}
};
timer.schedule(task,2000,2000);
}
//接收具体方法的
private void rec(){
//启动定时器,2秒后执行,每2秒执行一次
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
int size;
byte[] buffer = new byte[1024];
if(mInputStream == null){
return;
}
try {
size = mInputStream.read(buffer);
if(size > 0){
String recinfo = new String(buffer,0,size);
//将返回的数据通过广播发送
Intent intent = new Intent();
intent.setAction(MainActivity.TEMPSERVICE);
intent.putExtra("count",recinfo);
sendBroadcast(intent);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
timer.schedule(task,2000,2000);
}
package android_serialport_api;
import android.util.Log;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class SerialPort {
private static final String TAG = "SerialPort";
private FileDescriptor mFd;
private FileInputStream mFileInputStream;
private FileOutputStream mFileOutputStream;
public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {
//检查访问权限,如果没有读写权限,进行文件操作,修改文件访问权限
if (!device.canRead() || !device.canWrite()) {
try {
//通过挂在到linux的方式,修改文件的操作权限
Process su = Runtime.getRuntime().exec("/system/xbin/su");
String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";
su.getOutputStream().write(cmd.getBytes());
if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) {
throw new SecurityException();
}
} catch (Exception e) {
e.printStackTrace();
throw new SecurityException();
}
}
mFd = open(device.getAbsolutePath(), baudrate, flags);
if (mFd == null) {
Log.e(TAG, "native open returns null");
throw new IOException();
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}
// Getters and setters
public InputStream getInputStream() {
return mFileInputStream;
}
public OutputStream getOutputStream() {
return mFileOutputStream;
}
// JNI(调用java本地接口,实现串口的打开和关闭)
/**串口有五个重要的参数:串口设备名,波特率,检验位,数据位,停止位
其中检验位一般默认位NONE,数据位一般默认为8,停止位默认为1*/
/**
* @param path 串口设备的据对路径
* @param baudrate 波特率
* @param flags 校验位
*/
private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
static {//加载jni下的C文件库
System.loadLibrary("serial_port");
}
}
package com.daogukeji.testday01.activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.TextView;
import com.daogukeji.testday01.R;
import com.daogukeji.testday01.service.tempIntentService;
public class MainActivity extends AppCompatActivity {
public static final String TEMPSERVICE = "com.daogukeji.testday01.service.tempIntentService";//广播标志
TextView text1;
//温湿度广播接收器
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(TEMPSERVICE)){
text1.setText("温度:"+intent.getExtras().getString("count")+"度");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text1 = (TextView) findViewById(R.id.text1);
//启动服务
IntentFilter tempFilter = new IntentFilter();//意图过滤器
tempFilter.addAction(TEMPSERVICE);//添加
registerReceiver(tempReceiver,tempFilter);//注册广播
Intent tempIntent = new Intent(MainActivity.this,tempIntentService.class);//发送意图
startService(tempIntent);//启动服务
}
@Override
public void onDestroy(){
super.onDestroy();
unregisterReceiver(tempReceiver);//注销广播接收器
}
}
package com.daogukeji.testday01.service;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
import com.daogukeji.testday01.activity.MainActivity;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Timer;
import java.util.TimerTask;
import android_serialport_api.SerialPort;
/**
* Created by dell on 2017/6/16.
* 温湿度数据类
*/
public class tempIntentService extends IntentService{
private String TAG = "tempIntentService";//
private Timer timer;//定时器
private TimerTask task;
private int count;
//串口相关参数
private SerialPort mSerialPort;
protected InputStream mInputStream;
protected OutputStream mOutputStream;
private String prot = "ttyS3";
private int baudrate = 9600;
//无参构造
public tempIntentService(){
super("temtIntentService");
}
//有参构造
public tempIntentService(String name){
super(name);
}
//onHandleIntent执行耗时任务
@Override
public void onHandleIntent(Intent intent){
if(null != intent){//若有意图
OpenSerial();
send();
rec();
}
}
//打开串口方法
private void OpenSerial() {
try {
mSerialPort = new SerialPort(new File("/dev/" + prot), baudrate,
0);
mInputStream = mSerialPort.getInputStream();
mOutputStream = mSerialPort.getOutputStream();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//发送方法
private void send(){
//启动定时器,2秒后执行,每2秒执行一次
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
try{
byte[] b = {0,1,0,0};
mOutputStream.write(b,0,3);
}catch(Exception e){
e.printStackTrace();
}
}
};
timer.schedule(task,2000,2000);
}
//接收具体方法的
private void rec(){
//启动定时器,2秒后执行,每2秒执行一次
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
int size;
byte[] buffer = new byte[1024];
if(mInputStream == null){
return;
}
try {
size = mInputStream.read(buffer);
if(size > 0){
String recinfo = new String(buffer,0,size);
//将返回的数据通过广播发送
Intent intent = new Intent();
intent.setAction(MainActivity.TEMPSERVICE);
intent.putExtra("count",recinfo);
sendBroadcast(intent);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
timer.schedule(task,2000,2000);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}