起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9429|回复: 10

[分享] 通过X5封装的CORDOVA蓝牙插件,开启蓝牙锁

  [复制链接]

851

主题

2560

帖子

5714

积分

论坛元老

Rank: 8Rank: 8

积分
5714
QQ
发表于 2017-6-30 12:37:48 | 显示全部楼层 |阅读模式
本帖最后由 wgs7909 于 2017-6-30 15:35 编辑

      好长时间没有分享技术帖了,今天给大家来点猛料。起步论坛上的第一篇关于蓝牙锁的帖子。如果对你有帮忙,或是喜欢我的帖子,就给点评分打赏一下吧!谢谢
      先上图: 微信图片_20170630123630.jpg
这把锁足足折磨了我三天,我对它是又爱又恨。。。。。废话少说。进入正题。这把锁买回来的时候,厂家给了一个安卓开发的使用案例和java SDK的jar包,包括开锁,闭锁,读取状态,连接锁,修改密码等相关方法,全是JAVA代码。安卓原生开发可以直接拿来用。但是厂家给的案例里没有IOS版本的相当程序和案例。打电话过去,对方说只有安卓版本的,如果需要IOS版本,需要自己开发。。。。。。我晕。。。。。。安卓原生开发还没玩明白呢,更别说IOS了。更重要的一点是,如果使用厂家提供的案例,我只能使用原生开发,意味着我要放弃我钟爱的WEX5,这是让我无法忍受的。
      经过一番思考和百度之后,感觉通过X5里的CORDOVA蓝牙插件应该也可以实现蓝牙锁的操作。如果真的能行,那上面的问题就可以迎刃而解了。到底能不能成功,是个未知数。因为找不到这样的案例。
      开始动手,先把X5里的蓝牙插件打包,把蓝牙插件里的案例COPY到新的项目目录里。打包的时候,把首页指向新COPY过来的案例文件(/UI2/demo/plugin/BLECentral)。起步真给力,给所有的插件都做了案例。有了这个案例,扫描,连接蓝牙设备就搞定了。接下来就是艰难的攻关阶段--向蓝牙锁发指令--开锁。      下图是手机与蓝牙锁进行数据交换的模式。理解此模式有助于开发者更快的学习和使用。
QQ截图20170630135412.jpg

    接下来看一下代码:
QQ截图20170630140616.jpg

经过反复测试,直觉告诉我数据已经被写到蓝牙设备了。但是设备没有任何反映,这个时候是最郁闷的。因为不知道我的方法对还是不对,也不知道自己的方向对还是不对。能不能打开锁更是未知。给设备写入数据,设备返回OK两个字。但是数据只能接受BASE64  或是16进制。下一个问题是如何把开锁指令变成16进制呢?

下面是厂家提供的开锁指令案例,是JAVA代码。如何变成JS呢?真的不知道啊!!!!!
  1.    /**
  2.       * created by joker on 2016-12-19
  3.       * description 操作蓝牙锁报文
  4.       */
  5.     public static byte[] buildOperateBleLock(byte command){
  6.         ByteBuffer byteBuffer = ByteBuffer.allocate(4);
  7.         byteBuffer.put(REQUEST_ID);                     //标识码
  8.         byteBuffer.put(COMMAND_OPERATE_LOCK);           //指令类型
  9.         byteBuffer.put(command);                        //控制指令

  10.         byte checksum = checkSum(byteBuffer.array());
  11.         byteBuffer.put(checksum);                       //校验码

  12.         Log.d("BleLockProtocol", new String(Hex.encodeHex(byteBuffer.array())));
  13.         return byteBuffer.array();
  14.     }
复制代码
标识码,指令类型,控制指令,这些都是常数,并且在JAVA里都是以16进制的形式表示的。声明一个ByteBuffer数组,把这些指令压入到数组里。
  1.    
复制代码
一顿百度,加上 JISHUANG 老师回帖的提醒,再后来就是疯狂的调试,终于写出了一个JS计算校验位的方法 。在写这个方法的同时,又学习了一个JS中极为不常用,但又非常重要的东西--ArrayBuffer  http://www.jb51.net/article/58281.htm   这里有ArrayBuffer的讲解,我就不在这里多讲了。
      学习了这些之后,才知道,原来通过 ble.write方法向设备写入信息的时候,数据格式是 ArrayBuffer(这是关键中的关键
      本以为这次可以成功了,可事情总是那么那么的曲折。虽然我的心都要燋了,可锁依然是那么冰凉没感觉。你要是再没感觉,我可真要投降了。
      从小倔强的我,没那么容易缴枪的。再次把厂家的文档拿来看了一遍又一遍,终于找到了一个可以突破的点,试试看吧。
      文档里说,每次数据交换前都需要先发一次密码请求。
  1.   /**
  2.      * created by joker on 2016-12-19
  3.      * description 发送蓝牙锁连接密码报文
  4.      */
  5.     public static byte[] buildAuthPassword(int pwd){
  6.         ByteBuffer byteBuffer = ByteBuffer.allocate(6);
  7.         byteBuffer.put(REQUEST_ID);                     //标识码
  8.         byteBuffer.put(COMMAND_AUTH_PWD);    //命令码
  9.         String hexpassword = String.format("%06x",pwd);
  10.         byte[] hexpassword_bytes = ByteUtil.hexStringToByteArray(hexpassword);
  11.         byteBuffer.put(hexpassword_bytes);              //密码
  12.         byte checksum = checkSum(byteBuffer.array());
  13.         byteBuffer.put(checksum);                       //校验码
  14.         Log.d("BleLockProtocol", new String(Hex.encodeHex(byteBuffer.array())));
  15.         return byteBuffer.array();
  16.     }
复制代码
我原来以为,蓝牙设备连接的时候就已经输入了密码,并且系统也保存了密码。以后每次下达指令之后,只需要连接一下就可以了。后来才发现,每次下达指令的之前,都需要先给设备发一次密码报文。(这也是一个关键中的关键点
终于明白了,鉴证奇迹的时候到了。两段代码,向设备写两次报文。
QQ截图20170630144023.jpg


我擦了,,,,,,,,,,,,,,太激动了,我什么都不说了。直接上图了。
微信图片_20170630144703.jpg
事实证明,我是对的。真的可以不用通过厂家提供的SDK,就可以直接打开蓝牙锁了。再给大家总结一下两个关键的点:一是向蓝牙锁写数据的时候,一定要用字节数组 即JS里的ArrayBuffer。另一个是校验位的计算,用JS实现ByteBuffer的位运算。这也不是一个常用的方法,需要大家理解。
以上内容纯粹是个人见解,有思路不对的地方,愿意与各位高手一起探讨。



评分

参与人数 5威望 +75 收起 理由
hbyczg + 10 很给力!
zhangql8 + 15
不羁的风 + 15 比安徒生还会写故事
Masion + 20 作文写的不错
kenminkajp + 15 赞一个!

查看全部评分

企业应用定制开发。X5开发者。
手机:15065117236
QQ:87356667

851

主题

2560

帖子

5714

积分

论坛元老

Rank: 8Rank: 8

积分
5714
QQ
 楼主| 发表于 2017-6-30 14:59:04 | 显示全部楼层
本帖最后由 wgs7909 于 2017-6-30 15:11 编辑

自己来坐个沙发。
企业应用定制开发。X5开发者。
手机:15065117236
QQ:87356667
回复 支持 反对

使用道具 举报

73

主题

345

帖子

1695

积分

金牌会员

Rank: 6Rank: 6

积分
1695
QQ
发表于 2017-6-30 15:06:06 | 显示全部楼层
先抢占沙发
回复 支持 反对

使用道具 举报

998

主题

4330

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10726
QQ
发表于 2017-6-30 15:14:33 | 显示全部楼层
赞。。。。。。。。
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复

使用道具 举报

718

主题

2841

帖子

5657

积分

论坛元老

Rank: 8Rank: 8

积分
5657
QQ
发表于 2017-6-30 18:55:10 | 显示全部楼层
历害啊,学习了,蓝牙电子称怎么实现称重呢?
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复 支持 反对

使用道具 举报

851

主题

2560

帖子

5714

积分

论坛元老

Rank: 8Rank: 8

积分
5714
QQ
 楼主| 发表于 2017-6-30 21:00:45 | 显示全部楼层
郭德成 发表于 2017-6-30 18:55
历害啊,学习了,蓝牙电子称怎么实现称重呢?

这个没研究过,以后有机会了,研究一下,再把成果发上来。
企业应用定制开发。X5开发者。
手机:15065117236
QQ:87356667
回复 支持 反对

使用道具 举报

150

主题

511

帖子

2350

积分

金牌会员

Rank: 6Rank: 6

积分
2350
QQ
发表于 2017-7-1 09:39:31 | 显示全部楼层
不错不错,我前几天也研究了读取串口转蓝牙的数据,也是焦头烂额好几天搞定
回复 支持 反对

使用道具 举报

494

主题

1317

帖子

3275

积分

论坛元老

Rank: 8Rank: 8

积分
3275
QQ
发表于 2017-8-8 13:27:25 | 显示全部楼层
wgs7909 发表于 2017-6-30 21:00
这个没研究过,以后有机会了,研究一下,再把成果发上来。

这是什么品牌的锁,在哪里买的,谢谢。
回复 支持 反对

使用道具 举报

851

主题

2560

帖子

5714

积分

论坛元老

Rank: 8Rank: 8

积分
5714
QQ
 楼主| 发表于 2017-8-12 08:29:45 | 显示全部楼层
zhangql8 发表于 2017-8-8 13:27
这是什么品牌的锁,在哪里买的,谢谢。

定制的。你上淘宝找,很多的。厂家直接定制
企业应用定制开发。X5开发者。
手机:15065117236
QQ:87356667
回复 支持 反对

使用道具 举报

发表于 2017-8-12 09:37:46 | 显示全部楼层
厉害啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-2 17:25 , Processed in 0.068396 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表