| 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>
 
 
  |