NB物联网之天翼物联(6)——移动电信NB的区别与兼容开发

前言

电信是最早开通NB业务的运营商,两年前我们公司就已经着手NB表具的开发工作,当时联通和移动的NB业务还没有开展,自然没有考虑兼容的问题,现在下定决心重新做一套肯定是要做一套兼容的程序!那么,收发机制完全不同的移动NB和电信NB怎样才能实现兼容呢?

找到不同点:

移动是直接向平台发送16进制字符串,平台将其自动转为16进制码流向表具发送16进制码流,如下图所示

16进制字符串
16进制码流
应用
移动平台
设备

电信是通过profile文件向平台发送配置文件中的json,再由编解码插件转为16进制码流,再发向表具,如下图所示

profile
profile
16进制码流
profile
16进制码流
应用
平台
profile封装工具
设备
编解码插件

那我们只需要将他们不同的地方做成一样的就可以完成兼容了!即应用应该向平台发送16进制码流就可以了!!应用发送16进制码流,就不需要编解码插件了,但是它又必须存在,所以我们需要插件做“没有意义”的转换!!

实现准备

profile中的service有两个列表,一个是属性列表:AcceptService,一个是命令列表:CommandService
属性列表用来接收编解码插件中decode方法解码出来的属性
命令列表用来传入编解码插件中encode方法需要传入的属性
我们在定义profile的时候要把他们尽量分开

发送命令

CommandService 中只编辑命令列表,因为我们要做到兼容,就是不管下发什么命令,我都只发送一个16进制码流,只是根据不同的命令下发的码流不同而已,所以我们只定义一个send命令,命令中只需定义一个value属性用来存放我们要发送的码流!
与之对应的是编解码插件中的encode方法,而encode方法传入一个ObjectNode(json)返回一个byte数组,我们在encode中要做的就是将json中的value字符串拿出来转换成byte数组

   public byte[] encode(ObjectNode input) throws Exception {
		String hexString = input.get("paras").get("value").asText();
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < hexString.length() - 1; i += 2) {
			list.add(hexString.substring(i, i + 2));
		}
		byte[] byteArray = new byte[list.size()];
		for (int i = 0; i < list.size(); i++) {
			int dec_num = (int) Long.parseLong(list.get(i), 16);
			byteArray[i] = (byte) dec_num;
		}
		return byteArray;
	}

接收上传数据

AcceptService 中只编辑属性列表,同样我们的编解码插件只是起一个类型转换的作用,只需在该服务下定义一个value属性,用来接收从编解码插件中返回的字符串
与之对应的是编解码插件中的decode方法,decode方法传入一个byte数组返回一个ObjectNode(json),我们在decode中要做的就是将byte数组转换成字符串放入AcceptService的value属性中

   public ObjectNode decode(byte[] binaryData) throws Exception {
		StringBuffer result = new StringBuffer();
		System.err.println( binaryData.length);
		for (int i = 0; i < binaryData.length; i++) {
			String hex = String.format("%02x", Byte.toUnsignedInt(binaryData[i]));
			result.append(hex);
		}
        //组装body体,只能为ObjectNode对象
		ObjectMapper mapper = new ObjectMapper();
		ObjectNode root = mapper.createObjectNode();
		ArrayNode arrynode = mapper.createArrayNode();
		ObjectNode batteryNode = mapper.createObjectNode();
		batteryNode.put("serviceId", "AcceptService");
		ObjectNode batteryData = mapper.createObjectNode();
		batteryData.put("value", result.toString());
		batteryNode.put("serviceData", batteryData);
		arrynode.add(batteryNode);
		root.put("msgType", "deviceReq");
		root.put("data", arrynode);
		return root;
	}

测试

如下图所示新增一个虚拟设备
在这里插入图片描述
选中CommandService服务下的send命令,在value中填入16进制字符串:
在这里插入图片描述
如上图所示,我们完成了发送什么,设备端就接收到什么,测试接收服务在上图“请输入十六进制码流”的窗体没输入设备上传的数据,在应用模拟器中就能够看到接受到的内容!!

总结

如上我们就实现了电信NB和移动NB的兼容,即他们都是应用根据不同的业务场景,编辑不同的16进制字符串,然后向平台发送一个16进制字符串,然后平台通过转换向产品发送一个16进制码流;接收数据都是接收16进制字符串然后解析字符串得到想要的数据!
两种机制各有好处,作为一个中立的开发者来说:论开发效率,移动的模式甩电信10条街 - - ||

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值