android/iphone/windows/linux/微信声波通讯库

4 篇文章 0 订阅
4 篇文章 0 订阅

声波通讯让传统的各种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

直接下载

相关参考:

效果超牛的基于声波通信和声音指纹的微信互动平台(微信小程序版)

声波通讯的原理

3分钟为你的应用添加声波通讯功能

android/iphone/windows/linux/微信声波通讯库

Android/iphone/微信手机通过声波初始化智能设备的WIFI信息

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值