【徕卡全站仪Geocom开发】开发日志#01

前言

不知道能写多久的开发日志,先将就着写着看看,也算是对自己当前的总结和未来的鞭策吧。

  1. 本人从21年10月份开始接触前端开发,22年3月份开始接触app开发,对一些原生的安卓语言可能不太了解甚至可能会有错误,各位看官如果看的尽兴还请多多指导
  2. 项目的主要开发环境是uni-app,主要测试用机型为红米Note7(前辈走前留下来的,自己的手机是华为,折腾了半天也连不上HbuilderX的调试,小米大胜利 ),除非uni插件无法实现的功能(例如开关蓝牙等操作)否则大部分使用uni自身封装的内容,尽量少使用native.js
  3. 主要通信模式是通过蓝牙,发送命令使用ASCII协议来调用设备的部分函数

00 前置准备

    工利善其事必先利其器,本人读书时学的是土木工程,曾经实习的时候接触和使用过全站仪,知道部分基础的使用方法,所以学起来还算比较快,这个网上相关的文档链接也不少,这里随便贴一个地址:网址链接

    然后是页面的设计了,因为所在的小团队没有专门的设计师,只能由我一个苦逼的工科男来设计页面,参考一些比较好看的app来复制一下别人的样式,不过这个问题也不大,uni的插件市场的几个插件做的还算可以的。


01 蓝牙功能的使用

    本来是打算直接使用uni的蓝牙功能的,结果uni封装的只支持BLE蓝牙,徕卡全站仪的蓝牙也搜不到(搜出来有很多名称为空的设备,也不知道是不是机型的问题)

    而且uni自身貌似不支持控制蓝牙的开关,因此我就直接将前辈开发的另一个H5+App中蓝牙模块的内容移植到我自己的项目,也成功能搜寻到大部分设备了。

    值得庆幸的是,蓝牙功能模块本身没有什么大问题,唯一的问题是H5+App中前辈在封装的对象中定义了部分windows和document类,主要减少重复开关蓝牙页面的时候创建重复的BlueAdapter实例和操作部分dom元素使用的:将新创建的实例放在windwos下,构造的时候优先返回windows下的实例对象。我把这个功能封装在app初始化的时候,放在vuex里面了。


02 徕卡全站仪开发手册

    这个CSDN上也有相关的资源,我这边使用的相关手册和工具是另一个前辈通过徕卡官方申请的,在这里我就不贴相关内容和链接了,这个还算比较好找。
    然后坑爹的地方就来了,在开发手册里面有这么一行例子:

    该命令是一个查询时间的命令,发送该命令后会返回设备中时间的相关参数。我复制过来后贴在蓝牙的发送数据里面,连接后自动发送该命令,先尝试读取回收的数据。

//链接成功后的回调
deviceConnectedCallback: (address) => {
	this.allDevices.find(item => item.address == address).status = 'connected';
	setTimeout(() => {
		blueToothTool.sendData(`%R1Q,5008:1^m`);
	}, 5000)
},
//读取数据的回调
readDataCallback: (dataByteArr) => {
	console.log(dataByteArr);
}

    然后直接就拿不到数据,控制台也没有报错。然后只能跑去分析前辈的源码。

	/**
	 * 模拟java多线程读取数据
	 */

	function read(msgCount) {
		//clearInterval(setIntervalId);
		let dataArr = [];
		let hasdata = false;
		let datacount = 0;
		let block = false;
		let reading = false;
		//setIntervalId = setInterval(doReadData, 100);

		var mcount = 0;
		let start = new Date().getTime();
		let last = start;
		while ((new Date().getTime()) - start < 3000) {
			let now = new Date().getTime();
			if (now - last > 200) {
				last = now;
				let bres = doReadData();
				if (bres) {
					mcount++;
					if (mcount == msgCount) {
						break;
					}
				}
			}
		}

		function doReadData() {
			//console.log('模拟线程:'+t);
			//setTimeCount++;
			if (hasdata) return false;
			if (block) return false;

			while (invoke(btInStream, "available") != 0) {
				hasdata = true;
				let data = invoke(btInStream, "read");
				dataArr.push(data);
			}

			if (hasdata && invoke(btInStream, "available") == 0) {
				block = true;
				hasdata = false;
				//var strResponse = String.fromCharCode.apply(String, dataArr);
				//strResponse = strResponse.replace('\r','').replace('\n',';');
				//console.log('输出结果_E:' + strResponse);
				options.readDataCallback && options.readDataCallback(dataArr);
				dataArr = [];
				block = false;
				return true;
			}
			return false;
		}
	}

	/**
	 * 发送数据
	 * @param {String} dataStr
	 * @return {Boolean}
	 */
	function sendData(dataStr) {
		try {			
			let bytes = invoke(dataStr, 'getBytes','Ascii');
			btOutStream.write(bytes);
			console.log('发送数据:' + dataStr);
			read(2);
		} catch(e) {
			alert('发送失败!'+JSON.stringify(e));
			return false;
		}
		return true;
	}

    看了半天也没看出个所以然,读取数据中doReadData方法里的invoke(btInStream, “available”)始终为0,但是sendData的控制台也能成功输出数据。于是自己写了个测试程序,用两台手机做测试发现两边都能发送和接受,说明这个模块本身是没有问题的。
    后来发现一款APP,测量员。它能够通过蓝牙成功链接和操作我们单位采购的设备,这也说明采购的设备支持geocom开发,而且蓝牙确实是可以传输数据的。其实在这里不难想到直接用蓝牙数据抓包就可以解决问题了,但是我在这里一直纠结是不是我自己写的方法有问题,或者是因为机型的适配性问题,在这里浪费了大量的时间。
    在尝试很多方法之后还是选择使用抓包,在手机设置中,开发人员选项里设置蓝牙数据抓取,小米的手机还不能直接通过adb shell后的命令找到指定的log文件,不过还好还是有方法拿到指定的文件的:网址链接
    抓到数据的那一刻我就傻眼了,原来我之前做的工作90%的是对的,只是少了一个东西
    这个是别人的APP:
    这个是我的:


    然后我才理解到,原来蓝牙输入到设备的数据可能中类似于cmd中的输入内容,需要敲一下回车才能执行命令,原来我之前几天的工作全部木大
在这里插入图片描述    拿到回执的数据了!

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 全站仪GEOMCOM Manual中文版是一本关于全站仪产品的使用手册,为用户提供了全面的使用指南和技术支持。这本手册以中文写成,方便中国用户理解和使用。 手册内容包括全站仪的基本介绍、产品规格、操作方法和注意事项等方面的内容。首先介绍了全站仪的工作原理和应用范围,让用户对该产品有一个整体的了解。然后详细介绍了每个功能按钮和菜单选项的作用,以及如何进行测量、校准和数据处理等操作步骤。同时,手册还提供了一些常见问题的解答和故障排除的方法,帮助用户解决在使用过程中可能遇到的问题。 此外,手册还介绍了一些高级功能和技巧,让有经验的用户能够更好地利用全站仪的功能特点,提高工作效率和测量精度。手册中还包含了一些案例和示例,帮助用户更好地理解实际应用的步骤和方法。 总之,全站仪GEOMCOM Manual中文版是公司为了满足中国用户需求而编写的一本全面的使用手册,帮助用户更好地理解和使用全站仪产品,提高工作效率和测量精度。无论是新手还是有一定经验的用户,都可以通过这本手册快速学习并掌握全站仪的使用方法。 ### 回答2: 全站仪geocom_manual中文版是一本关于全站仪使用指南的中文版手册。全站仪是一种现代化的测量仪器,用于测量地面的各种参数和绘制地形图。全站仪具有高精度、高效率和多功能的特点,广泛应用于建筑工程、土地测绘、城市规划等领域。 geocom_manual中文版手册详细介绍了全站仪的各个功能、操作步骤和技巧。它包含了对全站仪硬件和软件的详细说明,包括仪器的基本结构、操作界面的功能、测量方法和数据处理等方面的内容。手册中还包含了大量的示意图和实际应用案例,以帮助用户更好地理解和掌握全站仪的使用方法。 通过阅读geocom_manual中文版手册,使用者可以了解到如何正确搭建全站仪的工作站、选择适当的测量仪器和配件、进行准确的测量、处理和分析测量数据等。手册还提供了一些常见问题的解答和故障排除的方法,以帮助使用者在实际操作中遇到问题时能够及时解决。 总之,全站仪geocom_manual中文版是一本对全站仪进行详尽介绍和指导的手册,它能够帮助使用者更好地了解和掌握全站仪的使用方法,提高测量工作的效率和精度。无论是初学者还是有一定经验的专业人士,都可以通过阅读这本手册来提升自己的测量技术。 ### 回答3: 全站仪geocom_manual是德国著名光学仪器生产商(Leica)所推出的全站仪产品的中文用户手册。 全站仪是一种高精度的测量仪器,常用于土地测量、建筑工程、道路施工等领域。它能够通过测量水平角度、垂直角度和斜距来确定目标点的坐标位置。 geocom_manual是这款全站仪的操作说明书,它提供了详细的使用方法、参数设置和故障排除等内容,方便用户进行正确的使用和操作。 这本手册的中文版适用于中国市场的用户,它的内容是经过专业翻译和本地化处理的,以确保用户能够准确理解和使用全站仪。手册一般包括产品简介、功能介绍、设备启动和关机、测量操作流程、数据处理和存储等内容,同时也会介绍一些常见问题和解决方法。 geocom_manual的中文版对于使用者来说非常重要,它不仅方便用户快速上手,还能帮助用户了解产品的特点、功能和性能,并掌握正确的使用方法和操作技巧。通过阅读这本手册,用户可以更好地利用全站仪进行各种测量任务,提高工作效率和精度。 总的来说,全站仪geocom_manual中文版是一本对于全站仪用户非常有价值的操作手册,它为用户提供了全面而详细的使用指导,帮助他们更好地使用该产品进行测量工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值