您的位置:首页 > 移动开发 > Android开发

android 音频口通信

2015-09-08 22:00 393 查看
源码地址:http://download.csdn.net/detail/h291850336/9091133
http://download.csdn.net/detail/h291850336/9090825
在csdn上大家都可以看到

  http://blog.csdn.net/xl19862005/article/details/8860699
  这篇博客上写的音频口通信,讲解了大体原理,大家要搞懂这个博客里面的一些名词比方说采样率、正弦波等等。

  以下是个人的经历,以及开发流程

   android与硬件通信是通过音频口通信的,所以android端涉及到播放声音AudioTrack类和获取音频数据AudioRecord类

  硬件方面由硬件人员开发,但是这跟android开发人员关系不大,只要和硬件商量好数据如何通信即可。

  大家通过阅读源码可以发现,android音频数据都是short[]类型的,这里就是android人员主要关注的地方,android开发人员需要将正弦波所对应的short[]数组中的数据转化成有效数据。

硬件开发人员需要将十六进制数据(原始数据)转化成二进制通过音频口声道以正弦波的形式发送给android系统,android接收到short[]数据后,将正弦波转化成二进制数据,然后将二进制数据转化成十六进制的可用数据

为了降低误码率android需要将音量调到最大,这样正弦波的波形比较大误码率小

android系统通用采样率 frequency = 44100

android 解析数据通过实现史密斯算法(http://blog.csdn.net/aldenphy/article/details/45057133)实现




  

以下是输出数据到硬件的代码

package com.yunhe.audiocomm;

import java.util.HashMap;

import com.yunhe.xinnongyuncm.GHBriefActivity;

import com.yunhe.xinnongyuncm.tcp.BlowerBean;

import com.yunhe.xinnongyuncm.tcp.BlowerCurrentInfos;

import com.yunhe.xinnongyuncm.tcp.BlowerInfos;

import com.yunhe.xinnongyuncm.tcp.CenterInfos;

import com.yunhe.xinnongyuncm.tcp.DiskCmd;

import com.yunhe.xinnongyuncm.tcp.TcpManager;

import android.media.AudioFormat;

import android.media.AudioManager;

import android.media.AudioRecord;

import android.media.AudioTrack;

import android.os.SystemClock;

/**

 * 播放声音,输出数据到硬件

 * @author sm

 *

 */

public class RecordThread extends Thread {
static final int frequency = 44100;//android系统通用
@SuppressWarnings("deprecation")
static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
private AudioTrack audioTrack;

private boolean isFirst = true;

private static String[] binaryArray =   

        {"0000","0001","0010","0011",  

        "0100","0101","0110","0111",  

        "1000","1001","1010","1011",  

        "1100","1101","1110","1111"};  

@Override
public void run() {
final int recBufSize = AudioRecord.getMinBufferSize(frequency,
channelConfiguration, audioEncoding) * 2;
int plyBufSize = AudioTrack.getMinBufferSize(frequency,
channelConfiguration, audioEncoding) * 2;

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
frequency, channelConfiguration, audioEncoding, plyBufSize,
AudioTrack.MODE_STREAM);
audioTrack.play();
final short[] shortData = new short[3584];
final short[] shortData2 = new short[3584];
final short[] shortData3= new short[3584];//1792  896 448
for(int i=0;i<3584; i++ )
{
shortData[i] = (short)(32000 * Math.sin(i*Math.PI/5));//代表0
shortData2[i] = (short)(32000 * Math.sin(i*Math.PI/10));//代表1
shortData3[i] = (short)(32000 * Math.sin(i*Math.PI/20));//开始和结束波形
}
final short[] infos = new short[recBufSize];

final short[] infosCurrent = new short[recBufSize];

new Thread(
new Runnable() {

@Override
public void run() {
int numBlower = 0;
while(true)
{
if(DiskCmd.diskCmdblockQue.size() == 0 && !isFirst && GHBriefActivity.audioIsConnect)
{
isFirst = true;
try {
String cmdStr = DiskCmd.getBlowerData(numBlower + "");
if(numBlower == 0)
{
cmdStr = DiskCmd.getCenterKey();
}
if(cmdStr!=null && cmdStr.length() > 4 && cmdStr.startsWith("AF") && cmdStr.endsWith("BF"))
{
int k = 0;
for(int i=0;i<41;i++)
{
infosCurrent[k++] = shortData3[i];
}
for(int i=0;i<41;i++)
{
infosCurrent[k++] = shortData3[i];
}
for (int i = 0; i < cmdStr.length(); i++) {
String temStr = "";
if((cmdStr.charAt(i) -'0')>=0 && (cmdStr.charAt(i) -'0')<=9)
{
   temStr = binaryArray[cmdStr.charAt(i) - '0'];
}else
{
temStr = binaryArray[(cmdStr.charAt(i) - '0') -7];
}

for(int t=0;t<4;t++)
{
if(temStr.charAt(t) == '0')
{
for(int h=0;h<11;h++)
{
infosCurrent[k++] = shortData[h];
}
}else
{
for(int h=0;h<21;h++)
{
infosCurrent[k++] = shortData2[h];
}
}
}
}
for(int i=0;i<41;i++)
{
infosCurrent[k++] = shortData3[i];
}
for(int i=0;i<41;i++)
{
infosCurrent[k++] = shortData3[i];
}

synchronized (audioTrack) {
SystemClock.sleep(CenterInfos.sendCircle);
audioTrack.write(infosCurrent, 0, recBufSize);
numBlower ++;
for(int ii=0;ii<recBufSize;ii++)
{
infosCurrent[ii] = 0;
}
}

if(numBlower>20)
{
numBlower = 0;
}

}
} catch (Exception e) {

}
}
}
}
}
).start();

while (true){
try {
if(DiskCmd.diskCmdblockQue.size() == 0 || !GHBriefActivity.audioIsConnect)
{
isFirst = false;
continue;
}
isFirst = true;
String cmdStr = DiskCmd.diskCmdblockQue.take();
System.out.println("toDisk:" + cmdStr);
if(cmdStr!=null && cmdStr.length() > 4 && cmdStr.startsWith("AF") && cmdStr.endsWith("BF"))
{
if(cmdStr.startsWith("AF02") && cmdStr.endsWith("BF"))
{
//修改放风机参数

// String num, temHigh,temLow,singleTime,pauseTime,initalDis,maxDis;

// num = str16To10(cmdStr.substring(4, 6));

// temHigh = str16To10(cmdStr.substring(6, 8));

// temLow = str16To10(cmdStr.substring(8, 10));

// singleTime = str16To10(cmdStr.substring(10, 14));

// pauseTime = str16To10(cmdStr.substring(14, 18));

// initalDis = str16To10(cmdStr.substring(18, 22));

// maxDis = str16To10(cmdStr.substring(22, 24));

// BlowerBean bean = BlowerInfos.getInstanceBlowerInfos().getOneBlowerInfo(num);

// if(bean!=null)

// {

// if(temHigh!=null && !temHigh.equals("255"))

// {

// bean.temHigh = temHigh;

// }

// if(temLow!=null && !temLow.equals("255"))

// {

// bean.temLow = temHigh;

// }

// if(singleTime!=null && !singleTime.equals("65535"))

// {

// bean.singleStep = singleTime;

// }

// if(pauseTime!=null && !pauseTime.equals("65535"))

// {

// bean.pauseStep = pauseTime;

// }

// if(initalDis!=null && !initalDis.equals("65535"))

// {

// bean.initialDistance = initalDis;

// }

// if(maxDis!=null && !maxDis.equals("65535"))

// {

// bean.maxDisatance = maxDis;

// }

// BlowerInfos.getInstanceBlowerInfos().setOneBlowerInfo(num, bean);

// }

}else if(cmdStr.startsWith("AF05") && cmdStr.endsWith("BF"))
{
String num = str16To10(cmdStr.substring(4, 6));
BlowerBean bean = BlowerInfos.getInstanceBlowerInfos().getOneBlowerInfo(num);
bean.hasCmd = "2";
BlowerInfos.getInstanceBlowerInfos().setOneBlowerInfo(num, bean);
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + cmdStr.substring(4, 6) + "2");
}

//锁定

}
else if(cmdStr.startsWith("AFA5") && cmdStr.endsWith("BF"))
{

String num = str16To10(cmdStr.substring(4, 6));
BlowerBean bean = BlowerInfos.getInstanceBlowerInfos().getOneBlowerInfo(num);
bean.hasCmd = "1";
BlowerInfos.getInstanceBlowerInfos().setOneBlowerInfo(num, bean);
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + cmdStr.substring(4, 6) + "1");
}

//锁定
cmdStr = "AF05" + cmdStr.substring(4, 6)+ "BF";
}
else if(cmdStr.startsWith("AFF5") && cmdStr.endsWith("BF"))
{
String num = str16To10(cmdStr.substring(4, 6));
BlowerBean bean = BlowerInfos.getInstanceBlowerInfos().getOneBlowerInfo(num);
bean.hasCmd = "1";
BlowerInfos.getInstanceBlowerInfos().setOneBlowerInfo(num, bean);
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + cmdStr.substring(4, 6) + "1");
}

continue;
//自动
}else if(cmdStr.startsWith("AFF1") && cmdStr.endsWith("BF"))
{
//移动并锁定或解锁
String num = str16To10(cmdStr.substring(4, 6));
String moveDis = str16To10(cmdStr.substring(6, 10));
String mode = str16To10(cmdStr.substring(10, 11));
BlowerBean bean = BlowerInfos.getInstanceBlowerInfos().getOneBlowerInfo(num);
bean.moveDistance = moveDis;
bean.hasCmd = mode;
BlowerInfos.getInstanceBlowerInfos().setOneBlowerInfo(num, bean);
HashMap<String, String> currentDatas = new HashMap<String, String>(BlowerCurrentInfos.getCurrentBlowerInfos().getAllInfos());
TcpManager.responseServerCmdQue.add("0B" + cmdStr.substring(4, 6) + str10To16(currentDatas.get(num).split(",")[0], 4));
continue;
}
int k = 0;
for(int i=0;i<41;i++)
{
infos[k++] = shortData3[i];
}
for(int i=0;i<41;i++)
{
infos[k++] = shortData3[i];
}
for (int i = 0; i < cmdStr.length(); i++) {

String temStr = "";
if((cmdStr.charAt(i) -'0')>=0 && (cmdStr.charAt(i) -'0')<=9)
{
   temStr = binaryArray[cmdStr.charAt(i) - '0'];
}else
{
temStr = binaryArray[(cmdStr.charAt(i) - '0') -7];
}

for(int t=0;t<4;t++)
{
if(temStr.charAt(t) == '0')
{
for(int h=0;h<11;h++)
{
infos[k++] = shortData[h];
}
}else
{
for(int h=0;h<21;h++)
{
infos[k++] = shortData2[h];
}
}
}
}
for(int i=0;i<41;i++)
{
infos[k++] = shortData3[i];
}
for(int i=0;i<41;i++)
{
infos[k++] = shortData3[i];
}
synchronized (audioTrack) {
SystemClock.sleep(CenterInfos.sendCircle);
audioTrack.write(infos, 0, recBufSize);
for(int ii=0;ii<recBufSize;ii++)
{
infos[ii] = 0;
}
}

}
} catch (Exception e) {

}

}
}

public synchronized void stopRecord()
{
if(audioTrack!=null)
{
audioTrack.stop();
}
}

/**
* 十进制转16进制

* @param str10
* @return
*/
private static String str10To16(String str10,int length) {
return cmdInfoLengCheck(Integer.toHexString(Integer.parseInt(str10)),length).toUpperCase();
}

/**
* 判断位数
* @param cmdStr
* @return
*/
private static String cmdInfoLengCheck(String cmdStr,int length)
{
if(cmdStr.length() == length)
{
return cmdStr;
}else if(cmdStr.length() <length)
{
String str = "";
for(int i =0;i<length-cmdStr.length();i++)
{
str+="0";
}
return str + cmdStr;
}else
{
return cmdStr.substring(0, length);
}
}

/**
* 16进制转10进制

* @param str16
* @return
*/
private static String str16To10(String str16) {
return Integer.parseInt(str16, 16) + "";
}

}

以下是解析音频数据的代码

public class ClsOscilloscope {

private static ClsOscilloscope instance;

private ClsOscilloscope()
{

}

public static ClsOscilloscope getInstance()
{
if(instance == null)
{
instance = new ClsOscilloscope();
}
return instance;
}

@SuppressWarnings("deprecation")
private static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;  

    private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;  
private static final int frequency = 44100;//分辨率  Hz

private int recBufSize = AudioRecord.getMinBufferSize(frequency,  

            channelConfiguration, audioEncoding);//录音最小buffer大小  

    private AudioRecord  audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,  

            channelConfiguration, audioEncoding, recBufSize); 
 
public static boolean isRecording = false;// 线程控制标记

/**
* 硬件返回的命令集合
*/
public static LinkedBlockingQueue<String> diskResponseCmdblockQue = new LinkedBlockingQueue<String>();

/**
* 存储音频数组
*/
private LinkedBlockingQueue<Short> pblockQue = new LinkedBlockingQueue<Short>();

/**
* 存储 01
*/
private LinkedBlockingQueue<Integer> pblockQueData = new LinkedBlockingQueue<Integer>();

/**
* 存储对01解析后的个数
*/
private LinkedBlockingQueue<Integer> pblockQueDataNum = new LinkedBlockingQueue<Integer>();

/**
* 存储命令信息
*/
private LinkedBlockingQueue<StringBuffer> pblockQueCmdInfos = new LinkedBlockingQueue<StringBuffer>();

/**
* 位默认为-1  用来标识上一个0 1
*/
private int preNum = -1;

/**
* 标识0或1的数量
*/
private int preNumCount = 0;

/**
* 间隔数据
*/
private int splitNum = 18;

/**
* 校验位5000
*/
private int smithHigh = 5000;
/**
* 校验位-5000
*/
private int smithLow = -5000;

/**
* 信息开始量
*/
private int beginNum_low = 11;
private int beginNum_high= 17;

/**
* 信息0
*/
private int data0_low = 2;
private int data0_high = 7;

/**
* 信息1
*/
private int data1_low = 7;
private int data1_high = 11;

/**
* 开始

* @param recBufSize
*            AudioRecord的MinBufferSize
*/
public void Start() {
if(!isRecording)
{
isRecording = true;
new RecordThreadDisk(audioRecord, recBufSize).start();// 开始录制线程
}

}

/**
* 停止
*/
public void Stop() {
isRecording = false;
if(audioRecord!=null)
{
try {
audioRecord.stop();
} catch (Exception e) {
}
}
}

/**
* 负责从MIC保存数据到inBuf

* @author GV

*/
class RecordThreadDisk extends Thread {
private int recBufSize;
private AudioRecord audioRecord;

public RecordThreadDisk(AudioRecord audioRecord, int recBufSize) {
this.audioRecord = audioRecord;
this.recBufSize = recBufSize;
}
boolean is5000 = false;
boolean is_5000 = false;

/**
* 处理硬件返回的命令
*/
private void dealDiskResponseCmd()
{
while(isRecording)
{
try {
final String disCmd = diskResponseCmdblockQue.take();
if(disCmd!=null && !disCmd.startsWith("AFFF") && disCmd.endsWith("BF"))
System.out.println("diskRes:" + disCmd);
if(disCmd!=null && disCmd.startsWith("AF") && disCmd.endsWith("BF"))
{
new Thread(new Runnable() {

@Override
public void run() {
if(disCmd!=null && disCmd.startsWith("AFAD") && disCmd.endsWith("BF"))
{

//地址 密钥
String address = disCmd.substring(4, 10);
String key = disCmd.substring(10, 16);
BlowerInfos.address = address;
BlowerInfos.diskKey = key;
}else if(disCmd!=null && disCmd.startsWith("AFFF") && disCmd.endsWith("BF"))
{
}else if(disCmd!=null && disCmd.startsWith("AF81") && disCmd.endsWith("BF"))
{
// 2、AFaabbcccceeffgghhvvBF(封包格式)
// aa:固定格式=01
// bb:序列号
// cccc:温度*10
// dddd:当前行程
// ee:电压*10
// ff:电流*10
// gg:异常(00、无异常,01、电流异常,02、电压异常,03、传感器异常)
// hh:当前状态
// vv:放风机类型 

//实时数据 
String num = str16To10(disCmd.substring(4, 6));
double tem =(Double.parseDouble(str16To10(disCmd.substring(6, 10)))/10);
String currentMove = str16To10(disCmd.substring(10, 14));
String press = str16To10(disCmd.substring(14, 16));
String elect = str16To10(disCmd.substring(16, 18));
String exception = str16To10(disCmd.substring(18, 20));
String state = str16To10(disCmd.substring(20, 22));
String category = str16To10(disCmd.substring(22, 24));
if(BlowerInfos.centerCategory.length() == 0)
{
BlowerInfos.centerCategory = category;
}

BlowerCurrentInfos.getCurrentBlowerInfos().putBlowerInfo(num, currentMove + "," + tem + "," + press + ","+ elect + "," + exception + "," + state);
BlowerCurrentInfos.getCurrentBlowerInfos().putCount(num, 0);
if(exception!=null && !exception.equals("0"))
{
if(exception.equals("1") || exception.equals("2") || exception.equals("3"))
{
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("08" + disCmd.substring(4, 6) + exception);
}

}
}

BlowerBean bean = BlowerInfos.getInstanceBlowerInfos().getOneBlowerInfo(num);
double curTem =(tem);
int curDis = Integer.parseInt(currentMove);
int maxTem = Integer.parseInt(bean.temHigh);
int minTem = Integer.parseInt(bean.temLow);
int willMoveDis = Integer.parseInt(bean.moveDistance);
if(bean.maxCurDis<=curDis && curDis!=0)
{
bean.maxCurDis = curDis;
bean.clearMaxCurDis = 1;
}
if(curDis == 0)
{
bean.clearMaxCurDis = 0;
bean.maxCurDis = 0;
}
if(bean.hasCmd.equals("1"))
{

int TM =0;
if(minTem < maxTem -2)
{
TM = maxTem-2;
}else
{
TM = minTem;
}

if(bean.clearMaxCurDis == 1)
{
System.out.println("getInto.....1");
if(curTem < TM)
{
//close
if(checkCmdOpenCloseSubmit(num, "3", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getCloseBlowerCmd(num));
}
if(curDis <= (bean.maxCurDis/2 + CenterInfos.disaErrorRange))
{
bean.clearMaxCurDis =2;
}

}else
{
if(curTem > maxTem)
{
bean.clearMaxCurDis = 0;
//open
if(checkCmdOpenCloseSubmit(num, "1", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getOpenBlowerCmd(num));
bean.clearMaxCurDis =0;
}

if(curDis >= (bean.maxCurDis))
{
bean.clearMaxCurDis =1;
bean.maxCurDis = curDis;
}else
{

}

}else
{
if(curDis <= (bean.maxCurDis/2 + CenterInfos.disaErrorRange) && curDis >= (bean.maxCurDis/2 - CenterInfos.disaErrorRange))
{
bean.clearMaxCurDis =2;
}else
{

}
}
}
}else
{
if(bean.clearMaxCurDis == 2)
{
System.out.println("getInto.....2");
if(curTem > (maxTem +1))
{
if(checkCmdOpenCloseSubmit(num, "1", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getOpenBlowerCmd(num));
}

if(curDis >= (bean.maxCurDis))
{
bean.maxCurDis = curDis;
bean.clearMaxCurDis =1;
}else
{

}

}
else
{
if(curTem < minTem)
{
if(checkCmdOpenCloseSubmit(num, "3", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getCloseBlowerCmd(num));
}

if(curDis == 0)
{
bean.clearMaxCurDis =0;
bean.maxCurDis = 0;
}else
{
if(checkCmdOpenCloseSubmit(num, "5", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));
}
}
}
else
{

}
}
}else
{
System.out.println("getInto.....0");
if(minTem <= curTem && maxTem >= curTem)
{
if(!state.equals("0"))
{
if(checkCmdOpenCloseSubmit(num, "5", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));
}

if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + disCmd.substring(4, 6) + "1");
}
}
//数据正常不做处理
}else if(minTem > curTem)
{

//close
if(checkCmdOpenCloseSubmit(num, "3", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getCloseBlowerCmd(num));
}

if(curDis == 0)
{
bean.clearMaxCurDis = 0;
bean.maxCurDis = 0;

// if(checkCmdOpenCloseSubmit(num, "5", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))

// {

// DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));

// }
}
}else if(maxTem < curTem)
{
//open
if(checkCmdOpenCloseSubmit(num, "1", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getOpenBlowerCmd(num));
}

if(curDis >= bean.maxCurDis)
{
bean.clearMaxCurDis = 1;
bean.maxCurDis = curDis;
if(checkCmdOpenCloseSubmit(num, "5", Integer.parseInt(bean.singleStep), Integer.parseInt(bean.pauseStep),state))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));
}
}
else
{

}
}
}

}

// if(minTem < curTem && maxTem > curTem)

// {

// if(!state.equals("0"))

// {

// DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));

// if(TcpManager.isLogin)

// {

// TcpManager.responseServerCmdQue.add("03" + disCmd.substring(4, 6) + "1");

// }

// }

// //数据正常不做处理

// }else if(minTem >= curTem)

// {

// //close

// DiskCmd.diskCmdblockQue.add(DiskCmd.getCloseBlowerCmd(num));

// }else if(maxTem <= curTem)

// {

// //open

// DiskCmd.diskCmdblockQue.add(DiskCmd.getOpenBlowerCmd(num));

// }
}else if(bean.hasCmd.equals("2"))
{

// if(willMoveDis -CenterInfos.disaErrorRange < curDis && willMoveDis +CenterInfos.disaErrorRange > curDis)

// {
if(!state.equals("0"))
{
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopCmd(num));
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + disCmd.substring(4, 6) + "2");
}
}

// }else if(willMoveDis +CenterInfos.disaErrorRange < curDis)

// {

// //close

// DiskCmd.diskCmdblockQue.add(DiskCmd.getCloseBlowerCmd(num));

// }else if(willMoveDis -CenterInfos.disaErrorRange > curDis)

// {

// //open

// DiskCmd.diskCmdblockQue.add(DiskCmd.getOpenBlowerCmd(num));

// }
}else if(bean.hasCmd.equals("3"))
{
if((willMoveDis -CenterInfos.disaErrorRange < curDis) && (willMoveDis +CenterInfos.disaErrorRange > curDis))
{
TcpManager.responseServerCmdQue.add("0B" + str10To16(num, 2) + str10To16(curDis+"", 4));
bean.hasCmd = "1";
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + disCmd.substring(4, 6) + "1");
//TcpManager.responseServerCmdQue.add("0B" + disCmd.substring(4, 6) + disCmd.substring(10, 14) + "11");
}

}else if(willMoveDis +CenterInfos.disaErrorRange < curDis)
{
//close
DiskCmd.diskCmdblockQue.add(DiskCmd.getCloseBlowerCmd(num));
}else if(willMoveDis -CenterInfos.disaErrorRange > curDis)
{
//open
DiskCmd.diskCmdblockQue.add(DiskCmd.getOpenBlowerCmd(num));
}
}else if(bean.hasCmd.equals("4"))
{
if(willMoveDis -CenterInfos.disaErrorRange < curDis && willMoveDis +CenterInfos.disaErrorRange > curDis)
{
TcpManager.responseServerCmdQue.add("0B" + str10To16(num, 2) + str10To16(curDis+"", 4));
bean.hasCmd = "2";
if(!state.equals("0"))
{
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + disCmd.substring(4, 6) + "2");
//TcpManager.responseServerCmdQue.add("0B" + disCmd.substring(4, 6) + disCmd.substring(10, 14) + "12");
}

DiskCmd.diskCmdblockQue.add(DiskCmd.getStopCmd(num));
}else
{
if(TcpManager.isLogin)
{
TcpManager.responseServerCmdQue.add("03" + disCmd.substring(4, 6) + "2");
//TcpManager.responseServerCmdQue.add("0B" + disCmd.substring(4, 6) + disCmd.substring(10, 14) + "11");
}

}

}else if(willMoveDis +CenterInfos.disaErrorRange < curDis)
{
//close
DiskCmd.diskCmdblockQue.add(DiskCmd.getCloseBlowerCmd(num));
}else if(willMoveDis -CenterInfos.disaErrorRange > curDis)
{
//open
DiskCmd.diskCmdblockQue.add(DiskCmd.getOpenBlowerCmd(num));
}
}
//更新实时界面
BlowerInfos.broadCastBlockQue.add(BlowerInfos.broadCastCurrentData);

}else if(disCmd!=null && disCmd.startsWith("AF82") && disCmd.endsWith("BF"))
{
//修改参数
String num = str16To10(disCmd.substring(4, 6));
String temHigh = str16To10(disCmd.substring(6, 8));
String temLow = str16To10(disCmd.substring(8, 10));
String singleTime = str16To10(disCmd.substring(10, 14));
String pauseTime = str16To10(disCmd.substring(14, 18));
String initialDis = str16To10(disCmd.substring(18, 22));
String maxDis = str16To10(disCmd.substring(22, 26));
BlowerBean bean = BlowerInfos.getInstanceBlowerInfos().getOneBlowerInfo(num);
if(bean!=null)
{
if(!temHigh.equals("255"))
 bean.temHigh=temHigh;
if(!temLow.equals("255"))
 bean.temLow=temLow;
if(!singleTime.equals("65535") && !singleTime.equals("0"))
 bean.singleStep=singleTime;
if(!pauseTime.equals("65535") && !pauseTime.equals("0"))
 bean.pauseStep=pauseTime;
if(!initialDis.equals("65535"))
 bean.initialDistance=initialDis;
if(!maxDis.equals("65535") && !maxDis.equals("0"))
 bean.maxDisatance=maxDis;

if(TcpManager.isLogin)
{
if(bean.hasCmd.equals("3"))
{
TcpManager.responseServerCmdQue.add("02" + disCmd.substring(4, 6) + BlowerInfos.centerCategory +
str10To16(bean.initialDistance, 4) + str10To16(bean.maxDisatance, 4) + str10To16(bean.singleStep, 4) +
str10To16(bean.pauseStep, 4) + str10To16(bean.temHigh, 2) + str10To16(bean.temLow, 2) + "1");
}if(bean.hasCmd.equals("4"))
{
TcpManager.responseServerCmdQue.add("02" + disCmd.substring(4, 6) + BlowerInfos.centerCategory +
str10To16(bean.initialDistance, 4) + str10To16(bean.maxDisatance, 4) + str10To16(bean.singleStep, 4) +
str10To16(bean.pauseStep, 4) + str10To16(bean.temHigh, 2) + str10To16(bean.temLow, 2) + "2");
}else
{
TcpManager.responseServerCmdQue.add("02" + disCmd.substring(4, 6) + BlowerInfos.centerCategory +
str10To16(bean.initialDistance, 4) + str10To16(bean.maxDisatance, 4) + str10To16(bean.singleStep, 4) +
str10To16(bean.pauseStep, 4) + str10To16(bean.temHigh, 2) + str10To16(bean.temLow, 2) + bean.hasCmd);
}
}
}
//更新实时界面
BlowerInfos.broadCastBlockQue.add(BlowerInfos.broadCastCurrentData);
}
}
}).start();
}

} catch (Exception e) {
}
}
}

/**
* 处理 0 1 个数  个数已定             获取命令集合
*/
private void dataHandle()
{
StringBuffer sb = new StringBuffer();;

while(isRecording)
{
try {
int curNum = pblockQueDataNum.take();
if(curNum>splitNum)
{
if(sb!=null && sb.length()>10)
{
pblockQueCmdInfos.add(sb);
}
sb = new StringBuffer();
}else
{
sb.append(curNum + "-");
}
} catch (Exception e) {
}
}

}

/**
* 对命令集合进行命令信息提取
*/
private void getDataCmd()
{
while(isRecording)
{
try {
StringBuffer sb = null;
sb = pblockQueCmdInfos.take();
if(sb==null)
{
continue;
}
  
String info = sb.toString();

   //前3位为标识位
String datas[] = info.split("-");
if(datas==null || datas.length<20)
{
continue;
}
StringBuffer infoUsed = new StringBuffer();
boolean isBegin = false;
int datasLength = datas.length-1;
for(int i = 0;i<= datasLength;i++)
{

if(!isBegin)
{
if(2*(i+2) +1 >= datasLength)
{
break;
}
int beginNum1 = Integer.parseInt(datas[2*i+1]);
int beginNum2 = Integer.parseInt(datas[2*i+3]);
int beginNum3 = Integer.parseInt(datas[2*i+5]);
if(beginNum1>=beginNum_low && beginNum1 <= beginNum_high && 
  beginNum2>=beginNum_low && beginNum2 <= beginNum_high &&
  beginNum3>=beginNum_low && beginNum3 <= beginNum_high)
{
if(2*i + 7 <= datasLength && Integer.parseInt(datas[2*i+7])< beginNum_low)
{
i+=2;
isBegin = true;
}
}
continue;

}

//保留注释

// if((2*(i+1)+1) >datasLength)

// {

// /**

// * 数据可用   数据长度大于0且是8的整数倍

// */

// if(infoUsed.length()>0 && infoUsed.length()%8 == 0)

// {

// cmdSubmit(infoUsed.toString());

// }

// break;

// }

//

int num1 = Integer.parseInt(datas[2*i + 1]);
int num2 = Integer.parseInt(datas[2*(i+1)+1]);
if(num1>=data0_low && num1<=data0_high  && num2>=data0_low && num2<=data0_high)
{
infoUsed.append("0");
}else if(num1>=data1_low && num1<=data1_high  && num2>=data1_low && num2<=data1_high)
{
infoUsed.append("1");
}
else
{
/**
* 数据可用   数据长度大于0且是8的整数倍
*/
if(infoUsed.length()>0 && infoUsed.length()%4 == 0)
{
String useStr = infoUsed.toString();
String sStr = "";
try {
for(int t=0;t<useStr.length()/4;t++)
{
sStr += Integer.toHexString(Integer.valueOf(useStr.substring(t*4, t*4 +4),2));
}

diskResponseCmdblockQue.add(sStr.toUpperCase());
} catch (Exception e) {
}
}
break;
}
i++;
}
} catch (Exception e) {

}
}

}

public void run() {
try {

/**
* 处理硬件返回的命令线程
*/
new Thread(new Runnable() {

@Override
public void run() {
dealDiskResponseCmd();
}
}).start();

/**
* 0 1 解析线程
*/
new Thread(new Runnable() {

@Override
public void run() {
try {
while (isRecording) {
short s = pblockQue.take();
if(s>=smithHigh)
{
is5000 = true;
pblockQueData.add(1);
}else
{
if(is5000 && s>-smithLow)
{
pblockQueData.add(1);
}else
{
is5000 = false;
pblockQueData.add(0);
}
}

}
} catch (Exception e) {

}
}
}).start();

/**
* 命令解析线程
*/
new Thread(new Runnable() {

@Override
public void run() {
dataHandle();
}
}).start();

/**
* 处理解析出来的命令
*/
new Thread(new Runnable() {

@Override
public void run() {
getDataCmd();
}
}).start();

/**
* 0 1 数量解析线程
*/
new Thread(new Runnable() {

@Override
public void run() {
try {
while (isRecording) {
int s = pblockQueData.take();
if(preNum != -1)
{
if(preNum == s)
{
preNumCount ++;
}
else
{
pblockQueDataNum.add(preNum);
pblockQueDataNum.add(preNumCount);
preNum = s;
preNumCount = 1;

}
}else
{
preNum = s;
preNumCount = 1;
}
}
} catch (Exception e) {

}
}
}).start();

/**
* 原始数据获取线程
*/

short[] buffer = new short[recBufSize];
audioRecord.startRecording();// 开始录制
while (isRecording) {
// 从MIC保存数据到缓冲区
int bufferReadResult = audioRecord.read(buffer, 0,
recBufSize);
for (int i = 0; i <bufferReadResult ; i++) {
pblockQue.put(buffer[i]);

}
}

} catch (Throwable t) {
}
}
};

/**
*  自动状态下判断命令是否执
* @param num
* @param state
* @param sinstep
* @param pauseStep
* @param diskState
* @return
*/

private boolean checkCmdOpenCloseSubmit(String num,String state,int sinstep,int pauseStep,String diskState)
{
if(BlowerInfos.lastCmdStopOpen.get(num)!=null)
{
String[] datas= BlowerInfos.lastCmdStopOpen.get(num).split(",");
System.out.println("wwwwwwwwwwwwwwwwwwww:" + BlowerInfos.lastCmdStopOpen.get(num));
if(state.equals("1"))
{
if(datas[0].equals(state))
{
if(DateUtils.getTimeDiff(getDateStr(datas[1]))>= sinstep)
{
BlowerInfos.lastCmdStopOpen.put(num, "2" + "," + getDateStr());
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));
System.out.println("wwwwwwwwwwwwwwwwwwww:" + BlowerInfos.lastCmdStopOpen.get(num));
return false;
}else
{
if(!diskState.equals("0"))
{
return false;
}else
{
BlowerInfos.lastCmdStopOpen.put(num, "1" + "," + getDateStr());
return true;
}

}
}else if(datas[0].equals("2"))
{
if(DateUtils.getTimeDiff(getDateStr(datas[1]))>= pauseStep)
{
BlowerInfos.lastCmdStopOpen.put(num, "1" + "," + getDateStr());
return true;
}else
{
if(diskState.equals("0"))
{
return false;

}else
{
BlowerInfos.lastCmdStopOpen.put(num, "2" + "," + getDateStr());
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));
return false;
}

}
}
else
{
BlowerInfos.lastCmdStopOpen.put(num, state + "," + getDateStr());
return true;
}
}else if(state.equals("3"))
{

if(datas[0].equals(state))
{

if(DateUtils.getTimeDiff(getDateStr(datas[1]))>= sinstep)
{
BlowerInfos.lastCmdStopOpen.put(num, "4" + "," + getDateStr());
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));
return false;
}else
{
if(diskState.equals("0"))
{
BlowerInfos.lastCmdStopOpen.put(num, "3" + "," + getDateStr());
return true;
}
else
{
return false;
}

}
}else if(datas[0].equals("4"))
{
if(DateUtils.getTimeDiff(getDateStr(datas[1]))>= pauseStep)
{
BlowerInfos.lastCmdStopOpen.put(num, "3" + "," + getDateStr());
return true;
}else
{
if(diskState.equals("0"))
{
return false;
}else
{
BlowerInfos.lastCmdStopOpen.put(num, "4" + "," + getDateStr());
DiskCmd.diskCmdblockQue.add(DiskCmd.getStopAutoCmd(num));
return false;
}

}
}
else
{
BlowerInfos.lastCmdStopOpen.put(num, state + "," + getDateStr());
return true;
}

}else if(state.equals("5"))
{
BlowerInfos.lastCmdStopOpen.put(num, "5" + "," + getDateStr());
return true;
}

}else
{
BlowerInfos.lastCmdStopOpen.put(num, state + "," + getDateStr());
return true;
}
return false;
}

private String getDateStr()
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
//Date date = sdf.parse("2005-11-12 02:23:22");
String str = sdf.format(new Date());
return str;

}

private Date getDateStr(String str)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
try {
return sdf.parse(str);
} catch (ParseException e) {
return new Date();
}

}

/**
* 16进制转10进制

* @param str16
* @return
*/
private static String str16To10(String str16) {
return Integer.parseInt(str16, 16) + "";
}

/**
* 十进制转16进制

* @param str10
* @return
*/
public static String str10To16(String str10, int length) {
return cmdInfoLengCheck(Integer.toHexString(Integer.parseInt(str10)),
length).toUpperCase();
}

/**
* 判断位数
* @param cmdStr
* @return
*/
private static String cmdInfoLengCheck(String cmdStr,int length)
{
if (cmdStr.length() == length) {
return cmdStr;
} else if (cmdStr.length() < length) {
String str = "";
for (int i = 0; i < length - cmdStr.length(); i++) {
str += "0";
}
return str + cmdStr;
} else {
return cmdStr.substring(0, length);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息