【徕卡全站仪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中的输入内容,需要敲一下回车才能执行命令,原来我之前几天的工作全部木大
在这里插入图片描述    拿到回执的数据了!

莱卡全站仪接口文档 1.5 1GEOCOM 5 1.1INTRODUCTION 5 1.2TPS1200 SYSTEM SOFTWARE 5 1.3PRINCIPLES OF GEOCOM OPERATION 6 2GENERAL CONCEPTS OF USING GEOCOM 7 2.1INTRODUCTION 7 2.2GENERAL CONCEPT OF OPERATION 7 2.3ASCII PROTOCOL 7 2.4FUNCTION CALL PROTOCOL - C/C++ 8 2.5FUNCTION CALL PROTOCOL - VBA 9 3FUNDAMENTALS OF PROGRAMMING GEOCOM 10 3.1INTRODUCTION 10 3.2ASCII PROTOCOL PROGRAMMING 10 3.3C/C++ - PROGRAMMING 12 3.4VBA - PROGRAMMING 14 3.5UNITS OF VALUES 16 3.6TPS1200 INSTRUMENT MODES OF OPERATION 16 3.7COMMON COMMUNICATION ERRORS 16 4REMARKS ON THE DESCRIPTION 19 4.1STRUCTURE OF DESCRIPTIONS 19 5COMMUNICATION SETTINGS 21 5.1USAGE 21 5.2CONSTANTS AND TYPES 21 5.3GENERAL GEOCOM FUNCTIONS 22 5.4CLIENT SPECIFIC GEOCOM FUNCTIONS 24 6ALT USER - AUS 38 6.1USAGE 38 6.2CONSTANTS AND TYPES 38 6.3FUNCTIONS 39 7AUTOMATION - AUT 43 7.1USAGE 43 7.2CANCELLING / ABORTING CURRENT FUNCTIONS 43 7.3CONSTANTS AND TYPES 43 7.4FUNCTIONS 45 8BASIC APPLICATIONS – BAP 69 8.1USAGE 69 8.2CONSTANTS AND TYPES 69 8.3FUNCTIONS 71 9BASIC MAN MACHINE INTERFACE – BMM 89 9.1USAGE 89 9.2CONSTANTS AND TYPES 89 9.3FUNCTIONS 90 10COMMUNICATIONS – COM 94 10.1USAGE 94 10.2CONSTANTS AND TYPES 94 10.3FUNCTIONS 95 11CENTRAL SERVICES – CSV 101 11.1INTRODUCTION 101 11.2USAGE 101 11.3CONSTANTS AND TYPES 101 11.4FUNCTIONS 103 12ELECTRONIC DISTANCE MEASUREMENT – EDM 113 12.1INTRODUCTION 113 12.2USAGE 113 12.3CONSTANTS AND TYPES 113 12.4FUNCTIONS 114 13FILE TRANSFER - FTR 117 13.1USAGE 117 13.2CONSTANTS AND TYPES 117 13.3FUNCTIONS 118 14IMAGE PROCESSING – IMG 127 14.1INTRODUCTION 127 14.2USAGE 127 14.3CONSTANTS AND TYPES 127 14.4FUNCTIONS 128 15MOTORISATION – MOT 131 15.1INTRODUCTION 131 15.2USAGE 131 15.3CONSTANTS AND TYPES 131 15.4FUNCTIONS 132 16SUPERVISOR – SUP 137 16.1USAGE 137 16.2CONSTANTS AND TYPES 137 16.3FUNCTIONS 138 17THEODOLITE MEASUREMENT AND CALCULATION – TMC 140 17.1INTRODUCTION 140 17.2USAGE 140 17.3CONSTANTS AND TYPES 141 17.4MEASUREMENT FUNCTIONS 144 17.5MEASUREMENT CONTROL FUNCTIONS 157 17.6DATA SETUP FUNCTIONS 160 17.7INFORMATION FUNCTIONS 177 17.8CONFIGURATION FUNCTIONS 179 18PORTING A TPS1100 APPLICATION 191 18.1INTRODUCTION 191 18.2RPC CHANGES 191 18.3DATA TYPES AND CONSTANTS CHANGES 193 18.4RETURN-CODES 193 19GEOCOM RELEASES 194 19.1 RELEASE 1.00 194 19.2 RELEASE 1.10 194 19.3 RELEASE 1.20 194 19.4 RELEASE 1.50 194 20APPENDIX 195 AReturn-Code names and return-code values 195 BHardware interface 201 B-1Serial Interface 201 B-2Debugging Utility 202 CProvided Samples 203 C-1 Program Frames 203 C-1.1 VBA Sample Program 203 C-1.2 C/C++ Sample Programs 203 C-1.3 TCC Image Grabber Sample Program 204 D List of Remote Procedure Calls (RPC) ....................................................................................................... D-205 D-1 rpc in Alphabetical order .................................................................................................................... D-205
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值