| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 | <!DOCTYPE HTML><html>	<head>		<meta charset="utf-8"/>		<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>		<meta name="HandheldFriendly" content="true"/>		<meta name="MobileOptimized" content="320"/>		<title>Hello H5+</title>		<script type="text/javascript" src="../js/common.js"></script>		<script type="text/javascript">var bds = []; // 可连接设备列表var deviceId = null, bconnect = false;var bss = [];	// 连接设备服务列表var serviceId = null;var bscs = [];	// 连接设备服务对应的特征值列表var characteristicId = null;var bscws = [];  // 可写特征值列表var wcharacteristicId = null;// 重设数据 function resetDevices(d,s){	d||(bds=[],deviceId=null,document.getElementById('deivce').value='');	s||(bss=[],serviceId=null,document.getElementById('service').value='');	bscs=[],bscws=[],characteristicId=null,wcharacteristicId=null,document.getElementById('characteristic').value='',document.getElementById('wcharacteristic').value='';}// 页面初始化操作 document.addEventListener('plusready', function(e){	// 监听蓝牙适配器状态变化	plus.bluetooth.onBluetoothAdapterStateChange(function(e){		outLine('onBluetoothAdapterStateChange: '+JSON.stringify(e));	});	//  监听搜索到新设备 	plus.bluetooth.onBluetoothDeviceFound(function(e){		var devices = e.devices;		outLine('onBluetoothDeviceFound: '+devices.length);		for(var i in devices){			outLine(JSON.stringify(devices[i]));			var device = devices[i];			if(device.deviceId/*&&device.name&&device.name.length>0&&device.name!='null'*/){				bds.push(device);			}		}		if(!bconnect && bds.length>0){	// 默认选择最后一个			var n = bds[bds.length-1].name;			if(!n || n.length<=0){				n = bds[bds.length-1].deviceId;			}			document.getElementById('deivce').value = n;			deviceId = bds[bds.length-1].deviceId;		}	});	//  监听低功耗蓝牙设备连接状态变化 	plus.bluetooth.onBLEConnectionStateChange(function(e){		outLine('onBLEConnectionStateChange: '+JSON.stringify(e));		if(deviceId == e.deviceId){	// 更新连接状态			bconnect = e.connected;		}	});	// 监听低功耗蓝牙设备的特征值变化 	plus.bluetooth.onBLECharacteristicValueChange(function(e){		outLine('onBLECharacteristicValueChange: '+JSON.stringify(e));		var value = buffer2hex(e.value);		outLine('value(hex) = '+value);		if(characteristicId == e.characteristicId){			// 更新到页面显示			document.getElementById('readvalue').value = value;		}else if(wcharacteristicId == e.characteristicId){			plus.nativeUI.toast(value);		}	});}, false);function buffer2hex(value){	var t='';	if(value){		var v=new Uint8Array(value);		for(var i in v){			t += '0x'+v[i].toString(16)+' ';		}	}else{		t='无效值';	}	return t;}// 打开蓝牙 function openBluetooth(){	outSet('打开蓝牙适配器:');	plus.bluetooth.openBluetoothAdapter({		success: function(e){			outLine('打开成功!');		},		fail: function(e){			outLine('打开失败! '+JSON.stringify(e));		}	});}// 开始搜索蓝牙设备 function startDiscovery(){	outSet('开始搜索蓝牙设备:');	resetDevices();	plus.bluetooth.startBluetoothDevicesDiscovery({		success: function(e){			outLine('开始搜索成功!');		},		fail: function(e){			outLine('开始搜索失败! '+JSON.stringify(e));		}	});}// 停止搜索蓝牙设备 function stopDiscovery(){	outSet('停止搜索蓝牙设备:');	plus.bluetooth.stopBluetoothDevicesDiscovery({		success: function(e){			outLine('停止搜索成功!');		},		fail: function(e){			outLine('停止搜索失败! '+JSON.stringify(e));		}	});}// 选择蓝牙设备 function selectDevice(){	if(bds.length <= 0){		plus.nativeUI.toast('未搜索到有效蓝牙设备!');		return;	}	var bts=[];	for(var i in bds){		var t = bds[i].name;		if(!t || t.length<=0){			t = bds[i].deviceId;		}				bts.push({title:t});	}	plus.nativeUI.actionSheet({title:"选择蓝牙设备",cancel:"取消",buttons:bts}, function(e){		if(e.index>0){			document.getElementById('deivce').value = bds[e.index-1].name;			deviceId = bds[e.index-1].deviceId;			outLine('选择了"'+bds[e.index-1].name+'"');		}	});}// 连接蓝牙设备 function connectDevice(){	if(!deviceId){		plus.nativeUI.toast('未选择设备!');		return;	}	outSet('连接设备: '+deviceId);	plus.bluetooth.createBLEConnection({		deviceId: deviceId,		success: function(e){			outLine('连接成功!');		},		fail: function(e){			outLine('连接失败! '+JSON.stringify(e));		}	});}// 获取设备服务 function getServices(){	if(!deviceId){		plus.nativeUI.toast('未选择设备!');		return;	}	if(!bconnect){		plus.nativeUI.toast('未连接蓝牙设备!');		return;	}	resetDevices(true);	outSet('获取蓝牙设备服务:');	plus.bluetooth.getBLEDeviceServices({		deviceId: deviceId,		success: function(e){			var services = e.services;			outLine('获取服务成功! '+services.length);			if(services.length>0){				for(var i in services){					bss.push(services[i]);					outLine(JSON.stringify(services[i]));				}				if(bss.length>0){	// 默认选择最后一个服务					document.getElementById('service').value = serviceId = bss[bss.length-1].uuid;				}			}else{				outLine('获取服务列表为空?');			}		},		fail: function(e){			outLine('获取服务失败! '+JSON.stringify(e));		}	});}// 选择服务 function selectService(){	if(bss.length <= 0){		plus.nativeUI.toast('未获取到有效蓝牙服务!');		return;	}	var bts=[];	for(var i in bss){		bts.push({title:bss[i].uuid});	}	plus.nativeUI.actionSheet({title:"选择服务",cancel:"取消",buttons:bts}, function(e){		if(e.index>0){			document.getElementById('service').value = serviceId = bss[e.index-1].uuid;			outLine('选择了服务: "'+serviceId+'"');		}	});}// 获取服务的特征值 function getCharacteristics(){	if(!deviceId){		plus.nativeUI.toast('未选择设备!');		return;	}	if(!bconnect){		plus.nativeUI.toast('未连接蓝牙设备!');		return;	}	if(!serviceId){		plus.nativeUI.toast('未选择服务!');		return;	}	resetDevices(true, true);	outSet('获取蓝牙设备指定服务的特征值:');	plus.bluetooth.getBLEDeviceCharacteristics({		deviceId: deviceId,		serviceId: serviceId,		success: function(e){			var characteristics = e.characteristics;			outLine('获取特征值成功! '+characteristics.length);			if(characteristics.length>0){				for(var i in characteristics){					var characteristic = characteristics[i];					outLine(JSON.stringify(characteristic));					if(characteristic.properties){						if(characteristic.properties.read){							bscs.push(characteristics[i]);						}						if(characteristic.properties.write){							bscws.push(characteristics[i]);							if(characteristic.properties.notify||characteristic.properties.indicate){								plus.bluetooth.notifyBLECharacteristicValueChange({	//监听数据变化									deviceId: deviceId,									serviceId: serviceId,									characteristicId: characteristic.uuid,									success: function(e){										outLine('notifyBLECharacteristicValueChange '+characteristic.uuid+' success.');									},									fail: function(e){										outLine('notifyBLECharacteristicValueChange '+characteristic.uuid+' failed! '+JSON.stringify(e));									}								});							}						}					}				}				if(bscs.length>0){	// 默认选择最后特征值					document.getElementById('characteristic').value = characteristicId = bscs[bscs.length-1].uuid;				}				if(bscws.length>0){	// 默认选择最后一个可写特征值					document.getElementById('wcharacteristic').value = wcharacteristicId = bscws[bscws.length-1].uuid;				}			}else{				outLine('获取特征值列表为空?');			}		},		fail: function(e){			outLine('获取特征值失败! '+JSON.stringify(e));		}	});}// 选择特征值(读取) function selectCharacteristic(){	if(bscs.length <= 0){		plus.nativeUI.toast('未获取到有效可读特征值!');		return;	}	var bts=[];	for(var i in bscs){		bts.push({title:bscs[i].uuid});	}	plus.nativeUI.actionSheet({title:'选择特征值',cancel:'取消',buttons:bts}, function(e){		if(e.index>0){			document.getElementById('characteristic').value = characteristicId = bscs[e.index-1].uuid;			outLine('选择了特征值: "'+characteristicId+'"');		}	});}// 读取特征值数据 function readValue(){	if(!deviceId){		plus.nativeUI.toast('未选择设备!');		return;	}	if(!bconnect){		plus.nativeUI.toast('未连接蓝牙设备!');		return;	}	if(!serviceId){		plus.nativeUI.toast('未选择服务!');		return;	}	if(!characteristicId){		plus.nativeUI.toast('未选择读取的特征值!');		return;	}	outSet('读取蓝牙设备的特征值数据: ');	plus.bluetooth.readBLECharacteristicValue({		deviceId: deviceId,		serviceId: serviceId,		characteristicId: characteristicId,		success: function(e){			outLine('读取数据成功!');		},		fail: function(e){			outLine('读取数据失败! '+JSON.stringify(e));		}	});}// 选择特征值(写入) function selectwCharacteristic(){	if(bscws.length <= 0){		plus.nativeUI.toast('未获取到有效可写特征值!');		return;	}	var bts=[];	for(var i in bscws){		bts.push({title:bscws[i].uuid});	}	plus.nativeUI.actionSheet({title:'选择特征值',cancel:'取消',buttons:bts}, function(e){		if(e.index>0){			document.getElementById('wcharacteristic').value = wcharacteristicId = bscws[e.index-1].uuid;			outLine('选择了特征值: "'+wcharacteristicId+'"');		}	});}// 写入特征值数据 function writeValue(){	if(!deviceId){		plus.nativeUI.toast('未选择设备!');		return;	}	if(!bconnect){		plus.nativeUI.toast('未连接蓝牙设备!');		return;	}	if(!serviceId){		plus.nativeUI.toast('未选择服务!');		return;	}	if(!wcharacteristicId){		plus.nativeUI.toast('未选择写入的特征值!');		return;	}	var value = document.getElementById('writevalue').value;	if(!value || value==''){		plus.nativeUI.toast('请输入需要写入的数据');		document.getElementById('writevalue').focus();		return;	}	// 转换为ArrayBuffer写入蓝牙	str2ArrayBuffer(value, function(buffer){		outSet('写入蓝牙设备的特征值数据: ');		plus.bluetooth.writeBLECharacteristicValue({			deviceId: deviceId,			serviceId: serviceId,			characteristicId: wcharacteristicId,			value: buffer,			success: function(e){				outLine('写入数据成功!');			},			fail: function(e){				outLine('写入数据失败! '+JSON.stringify(e));			}		});	});}function str2ArrayBuffer(s,f) {    var b = new Blob([s],{type:'text/plain'});    var r = new FileReader();    r.readAsArrayBuffer(b);    r.onload = function(){if(f)f.call(null,r.result)}}// 断开蓝牙设备function disconnectDevice(){	if(!deviceId){		plus.nativeUI.toast('未选择设备!');		return;	}	resetDevices(true);	outSet('断开蓝牙设备连接:');	plus.bluetooth.closeBLEConnection({		deviceId: deviceId,		success: function(e){			outLine('断开连接成功!');		},		fail: function(e){			outLine('断开连接失败! '+JSON.stringify(e));		}	});}// 关闭蓝牙function closeBluetooth(){	outSet('关闭蓝牙适配器:');	resetDevices();	plus.bluetooth.closeBluetoothAdapter({		success: function(e){			outLine('关闭成功!');			bconnect = false;		},		fail: function(e){			outLine('关闭失败! '+JSON.stringify(e));		}	});}		</script>		<link rel="stylesheet" href="../css/common.css" type="text/css" charset="utf-8"/>	</head>	<body>		<br/>		<div class="button" onclick="openBluetooth()">初始化蓝牙模块</div>		<div class="button" onclick="startDiscovery()">开始搜索蓝牙设备</div>		<div class="button" onclick="stopDiscovery()">停止搜索蓝牙设备</div>		设备:<input id="deivce" type="text" disabled="disabled"></input>		<a href="#" onclick="selectDevice()">选择设备</a>		<div class="button" onclick="connectDevice()">连接蓝牙设备</div>		<div class="button" onclick="getServices()">获取设备服务</div>		服务:<input id="service" type="text" disabled="disabled"></input>		<a href="#" onclick="selectService()">选择服务</a>		<div class="button" onclick="getCharacteristics()">获取服务的特征值</div>		读取特征值:<input id="characteristic" type="text" disabled="disabled"></input>		<a href="#" onclick="selectCharacteristic()">选择</a>		<div class="button" onclick="readValue()">读取特征值数据</div>		读取数据:<input id="readvalue" type="text" disabled="disabled" style="width:60%"></input>		<hr/>		<br/>		写入特征值:<input id="wcharacteristic" type="text" disabled="disabled"></input>		<a href="#" onclick="selectwCharacteristic()">选择</a>		<div class="button" onclick="writeValue()">写入特征值数据</div>		写入数据:<input id="writevalue" type="text" style="width:60%;-webkit-user-select:text" value="test"></input>		<div class="button" onclick="disconnectDevice()">断开蓝牙设备</div>		<div class="button" onclick="closeBluetooth()">关闭蓝牙模块</div>		<div id="outpos"/>		<div id="output">Bluetooth用于管理蓝牙设备,搜索附近蓝牙设备、连接实现数据通信等。		</div>	</body></html>
 |