声波通讯让传统的各种linux设备,单片机设备等等能编程的设备与智能手机之间有了数据传输的能力,这在智能家居、医疗设备、工业应用等各个行业有了大力应用的机会。
声波通讯让电脑与手机连通:电脑一般都有音箱或者扬声器,而手机具有麦克风。这样数据通过声波就很容易的打通电脑与手机之间的通讯。比如说我们每次电脑与手机之间传输文件都是要先连接usb数据线,而且经常连不上,不要说电脑小白了,就连我是专门搞IT的连接数据线的时候都经常不灵,需要不停的插拔手机与数据、或者手机与数据线,甚至重启电脑,这些问题我经常都不知道是什么原因让线又不灵了。而声波很容易就搞定这些问题了:电脑播放声波,这样1秒就能让电脑连接上手机,就可以传输任何东西了。
电脑与手机可能还有很多的应用场景,这里另外分享一个,大家有一些好的想法可以分享出来讨论讨论,说不定有一些好的创意可以发展成好的项目。在今年年初的时候,以色列的SlickLogin被google收购,google看中的项目是什么呢?简单一点说,他们就是使用声波做安全认证。详细的产品功能流程是这样的:在电脑上进行某个网页或某个产品等进行登陆的时候,要让网站通过用户电脑的扬声器播放一段特殊的声音(人耳无法听到的高频声音,给人的感觉几乎就是静音的),只要将手机放在电脑前,便可通过高频声音完成验证过程,无须再输入认证码。
声波通讯库特征
简单说一下android/iphone/windows/linux声波通讯库特征:
可传输数字,字母,汉字等任意字符
支持双向传输
支持设置声音传输频段
支持设置声音采样率
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android, iphone, windows, linux, arm, mipsel都有示例
库大小(android版):jar+so一起大概90k左右。.a链接的话加入声波通讯后可能使原可执行文件增加40k-60k
微信小程序版演示,请点这里(效果超牛的声波通信,声音指纹识别)。
Android工程示例:
Android工程项目使用步骤:
1,添加录音权限:
AndroidManifest.xml文件中添加:<uses-permission android:name="android.permission.RECORD_AUDIO" />
2,加入库到工程中:
armeabi\libvoiceRecog.so和voiceRecog.jar加入到库路径下(一般为libs目录)
3,导入so库:
static {
System.loadLibrary("voiceRecog");
}
Ios版工程示例:
在下载的工程源码中,在工程目录下有libcvoiceRecognize.a是真机版的库,libcvoiceRecognize_simulator.a是模拟器版的库,自己在xcode环境中根据自己的需要链接不同的库即可。
Windows工程示例
可传输任意数据内容,包括数字,字母,各种语言字符:
支持双向传输:
双向传递时一般设置为“不接收自己发送的信号”模式。
各平台的demo工程需注意:
windows音频支持:
有麦克风,音量,是否静音,不要打开“增强音效”功能
Linux工程示例
Linux下识别数字,字母,ssid和密码组成的wifi信息:
编程接口
发送端接口:
/************************************************************************
android/iphone/windows/linux声波通讯库
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android, iphone, windows, linux, arm, mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者: 夜行侠 QQ:3116009971 邮件:3116009971@qq.com
************************************************************************/
#ifdef VOICE_RECOG_DLL
#define VOICERECOGNIZEDLL_API __declspec(dllexport)
#else
#define VOICERECOGNIZEDLL_API
#endif
#ifndef VOICE_PLAY_H
#define VOICE_PLAY_H
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*vp_pPlayerStartListener)(void *_listener);
typedef void (*vp_pPlayerEndListener)(void *_listener);
/************************************************************************/
/* 创建编码端发送对象
/************************************************************************/
VOICERECOGNIZEDLL_API void * vp_createVoicePlayer();
/************************************************************************/
/* 发送端编码并发送数据
/* 该函数以异步的形式工作,不阻塞主线程,判断是否发送完成由下面的vp_isStopped
/* _data为任意数据,以十六进制的形式发送
/* _dataLen为需发送的数据内容长度
/************************************************************************/
VOICERECOGNIZEDLL_API void vp_play(void *_player, char *_data, int _dataLen, int _playCount, int _muteInterval);
//设置播放监听器
VOICERECOGNIZEDLL_API void vp_setPlayerListener(void *_player, void *_listener, vp_pPlayerStartListener _startListener, vp_pPlayerEndListener _endListener);
/************************************************************************/
/* 设置声波发送端音量
/* _volume为0-1之间的浮点数,0为无声,1为最大
/************************************************************************/
VOICERECOGNIZEDLL_API void vp_setVolume(void *_player, double _volume);
/************************************************************************/
/* 设置声波发送端频段
/************************************************************************/
VOICERECOGNIZEDLL_API void vp_setFreqs(void *_player, int *_freqs, int _freqCount);
/************************************************************************/
/* play函数以异步的方式播放并发送,在销毁对象之前需确保播放已经完成
/************************************************************************/
VOICERECOGNIZEDLL_API int vp_isStopped(void *_player);
/************************************************************************/
/* 销毁声波发送端对象
/************************************************************************/
VOICERECOGNIZEDLL_API void vp_destoryVoicePlayer(void *_player);
//应用层发送方接口
//返回4bit个数
int vp_encodeData(char *_data, int _dataLen, char *_result);
VOICERECOGNIZEDLL_API void vp_playString(void *_player, char *_str, int _playCount, int _muteInterval);
/************************************************************************/
/* 发送端编码并发送wifi信息,以mac,pwd的形式
/************************************************************************/
VOICERECOGNIZEDLL_API void vp_playWiFi(void *_player, char *_mac, int _macLen, char *_pwd, int _pwdLen, int _playCount, int _muteInterval);
/************************************************************************/
/* 发送端编码并发送wifi信息,以ssid,pwd的形式
/************************************************************************/
VOICERECOGNIZEDLL_API void vp_playSSIDWiFi(void *_player, char *_ssid, int _ssidLen, char *_pwd, int _pwdLen, int _playCount, int _muteInterval);
/************************************************************************/
/* 发送端编码并发送手机标志信息,(imei,手机名字)
/************************************************************************/
VOICERECOGNIZEDLL_API void vp_playPhone(void *_player, char *_imei, int _imeiLen, char *_phoneName, int _nameLen, int _playCount, int _muteInterval);
#ifdef __cplusplus
}
#endif
#endif
接收端接口:
/************************************************************************
android/iphone/windows/linux声波通讯库
声波通讯库特征:
准确性95%以上,其实一般是不会出错的。
接口非常简单,有完整的示例,3分钟就可以让你的应用增加声波通讯功能
抗干扰性强,基本上无论外界怎么干扰,信号都是准确的
基本的编码为16进制,而通过编码可传输任何字符
性能非常强,没有运行不了的平台,而且通过内存池优化,长时间解码不再分配新内存,可7*24小时运行
可支持任何平台,常见的平台android, iphone, windows, linux, arm, mipsel都有示例
详情可查看:http://blog.csdn.net/softlgh
作者: 夜行侠 QQ:3116009971 邮件:3116009971@qq.com
************************************************************************/
#ifdef VOICE_RECOG_DLL
#define VOICERECOGNIZEDLL_API __declspec(dllexport)
//#else
//#ifdef WIN32
//#define VOICERECOGNIZEDLL_API __declspec(dllimport)
#else
#define VOICERECOGNIZEDLL_API
//#endif
#endif
#ifndef VOICE_RECOG_H
#define VOICE_RECOG_H
#ifdef __cplusplus
extern "C" {
#endif
enum VRErrorCode
{
VR_SUCCESS = 0, VR_NoSignal = -1, VR_ECCError = -2, VR_NotEnoughSignal = 100
, VR_NotHeaderOrTail = 101, VR_RecogCountZero = 102
};
enum DecoderPriority
{
CPUUsePriority = 1//不占内存,但CPU消耗比较大一些
, MemoryUsePriority = 2//不占CPU,但内存消耗大一些
};
typedef enum {vr_false = 0, vr_true = 1} vr_bool;
typedef void (*vr_pRecognizerStartListener)(void *_listener, float _soundTime);
//_result如果为VR_SUCCESS,则表示识别成功,否则为错误码,成功的话_data才有数据
typedef void (*vr_pRecognizerEndListener)(void *_listener, float _soundTime, int _result, char *_data, int _dataLen);
//创建声波识别器
VOICERECOGNIZEDLL_API void *vr_createVoiceRecognizer(enum DecoderPriority _decoderPriority);
VOICERECOGNIZEDLL_API void *vr_createVoiceRecognizer2(enum DecoderPriority _decoderPriority, int _sampleRate);
//销毁识别器
VOICERECOGNIZEDLL_API void vr_destroyVoiceRecognizer(void *_recognizer);
//设置解码频率
//总共需16+3个频率,依次为1个开始字符, 0-f的16进制字符,1个重复标志字符,1个结束字符
//_freqs数组是静态的,整个解码过程中不能释放
VOICERECOGNIZEDLL_API void vr_setRecognizeFreqs(void *_recognizer, int *_freqs, int _freqCount);
//设置识别到信号的监听器
VOICERECOGNIZEDLL_API void vr_setRecognizerListener(void *_recognizer, void *_listener, vr_pRecognizerStartListener _startListener, vr_pRecognizerEndListener _endListener);
//开始识别
//这里一般是线程,这个函数在停止识别之前不会返回
VOICERECOGNIZEDLL_API void vr_runRecognizer(void *_recognizer);
//暂停信号分析
VOICERECOGNIZEDLL_API void vr_pauseRecognize(void *_recognizer, int _microSeconds);
//停止识别,该函数调用后vr_runRecognizer会返回
//该函数只是向识别线程发出退出信号,判断识别器是否真正已经退出要使用以下的vr_isRecognizerStopped函数
VOICERECOGNIZEDLL_API void vr_stopRecognize(void *_recognizer);
//判断识别器线程是否已经退出
VOICERECOGNIZEDLL_API vr_bool vr_isRecognizerStopped(void *_recognizer);
//要求输入数据要求为44100,单声道,16bits采样精度,小端编码的音频数据
//小端编码不用特别处理,一般你录到的数据都是小端编码的
VOICERECOGNIZEDLL_API int vr_writeData(void *_recognizer, char *_data, int _dataLen);
//应用层解码接口
int vr_decodeData(char *_hexs, int _hexsLen, int *_hexsCostLen, char *_result, int _resultLen);
VOICERECOGNIZEDLL_API vr_bool vr_decodeString(int _recogStatus, char *_data, int _dataLen, char *_result, int _resultLen);
//传输层中数据类型标志
enum InfoType
{
IT_WIFI = 0//说明传输的数据为WiFi
, IT_SSID_WIFI = 1//ssid编码的WIFI
, IT_PHONE = 2//说明传输的数据为手机注册信息
, IT_STRING = 3//任意字符串
};
VOICERECOGNIZEDLL_API enum InfoType vr_decodeInfoType(char *_data, int _dataLen);
//wifi解码
struct WiFiInfo
{
char mac[8];
int macLen;
char pwd[80];
int pwdLen;
};
VOICERECOGNIZEDLL_API vr_bool vr_decodeWiFi(int _result, char *_data, int _dataLen, struct WiFiInfo *_wifi);
struct SSIDWiFiInfo
{
char ssid[32];
int ssidLen;
char pwd[80];
int pwdLen;
};
VOICERECOGNIZEDLL_API vr_bool vr_decodeSSIDWiFi(int _result, char *_data, int _dataLen, struct SSIDWiFiInfo *_wifi);
struct PhoneInfo
{
char imei[18];
int imeiLen;
char phoneName[20];
int nameLen;
};
VOICERECOGNIZEDLL_API vr_bool vr_decodePhone(int _result, char *_data, int _dataLen, struct PhoneInfo *_phone);
#ifdef __cplusplus
}
#endif
#endif
详情可查看:http://blog.csdn.net/softlgh
作者: 夜行侠 微信号:softlgh, QQ:3116009971, 邮件:3116009971@qq.com
android/iphone/windows/linux/微信 声波通信库及源码:
百度盘下载:https://pan.baidu.com/s/1co0TaQ5KAFFc-MBdrIA6MA
相关参考:
效果超牛的基于声波通信和声音指纹的微信互动平台(微信小程序版)