电信天翼云NB-IOT平台数据接入

1、概念

窄带物联网(Narrow Band Internet of Things, NB-IoT),NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,使用License频段,可采取带内、保护带或独立载波等三种部署方式,与现有网络共存。可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。

2、NBIOT的特点和目标

(1)超强覆盖:相对GPRS来说,增加20db的信号增益。

(2)超低功耗:对于终端功耗的目标是:基于AA(5000mAh)电池,使用寿命可超过10年。

(3)超大连接:一个扇区能够支持数万个连接,支持低延时敏感度、超低的设备成本、低设备功耗和优化的网络架构。

(4)超低成本:NB-IoT无需重新建网,射频和天线基本上都是复用的。

二、NB-IoT要点概括

1、为解决传统2G/3G/4G(GPRS)网络不能满足物联网终端设备低功耗、低成本的问题;

2、对比GPRS,减少了一些信令,寻呼周期加长,增加PSM状态,降低功耗(用实时性换取续航);

3、终端数据通过运营商基站接入核心网,汇入运营商的物联网专网,经IoT平台与用户的平台进行数据交互

三、NB-IoT的工作状态:

NB-IoT在默认状态下,存在三种工作状态,三种状态会根据不同的配置参数进行切换,笔者认为这三种状态较深刻地影响了NB-IoT的特性,如其对比传统GPRS的低功耗特性,均可以从中获得解释,同时在后续对NB-IoT的使用和相关程序的设计时,也需要根据开发的需求与产品特性对这三种工作状态进行合适的定制。

四.测试天翼云nb-iot通过mq方式获取数据引入依赖

		<dependency>
			<groupId>com.ctiot.aep</groupId>
			<artifactId>mq-msgpush-sdk</artifactId>
			<version>1.0.1</version>
		</dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.5</version>
        </dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.60</version>
		</dependency>
		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>3.1</version>
		</dependency>
        <dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.11.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>2.11.1</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

五.数据采集,通过mq,base转base64 

package com.ctiot.aep.mq.msgpush.demo;

import java.util.Base64;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.ctiot.aep.mqmsgpush.sdk.IMsgConsumer;
import com.ctiot.aep.mqmsgpush.sdk.IMsgListener;
import com.ctiot.aep.mqmsgpush.sdk.MqMsgConsumer;

/**
 * Aep MQ消息推送接收Demo
 */
public class Demo {
    public static void main(String[] args) {
        String server = "nb-iot地址"; //消息服务地址
        String tenantId = "";//租户ID
        String token = "";//身份认证token串
        String certFilePath = ""; //直接填空字符串,CA证书,JDK已经内置相关根证书,无需指定
        //创建消息接收Listener
        IMsgListener msgListener = new IMsgListener() {

            @Override
            public void onMessage(String msg) {
                Map<String, Object> payloadMap = JSONObject.parseObject(msg);
                if (payloadMap.containsKey("payload")) {
                    Map<String, Object> varMap1 = JSONObject.parseObject(payloadMap.get("payload").toString());
                    String appData = varMap1.get("APPdata").toString();
                    analysisRadar(appData);
                }
                //为了提高效率,建议对消息进行异步处理(使用其它线程、发送到Kafka等)
            }
        };

        //创建消息接收类
        IMsgConsumer consumer = new MqMsgConsumer();
        try {
            //初始化
            /**
             * @param server  消息服务server地址
             * @param tenantId 租户Id
             * @param token    用户认证token
             * @param certFilePath 证书文件路径
             * @param topicNames   主题名列表,如果该列表为空或null,则自动消费该租户所有主题消息
             * @param msgListener 消息接收者
             * @return 是否初始化成功
             */
            consumer.init(server, tenantId, token, certFilePath, null, msgListener);

            //开始接收消息
            consumer.start();

            //程序退出时,停止接收、销毁
            //consumer.stop();
            //consumer.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("exit");
    }

    public static void analysisRadar(String radarData) {
        byte[] decoded = Base64.getDecoder().decode(radarData);
        String sixteenBaseSystemData = toHex(decoded);
        String[] sixteenBaseSystemDataDivision = sixteenBaseSystemData.split("7c");
        System.out.println("---------------雷达原数据" + sixteenBaseSystemDataDivision[1]);
        //解析雷达
        System.out.println("---------------雷达实际数据" + Integer.parseInt(sixteenBaseSystemDataDivision[1].replace("3", "")));

    }

    private static final char[] DIGITS
            = {'0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    public static final String toHex(byte[] data) {
        final StringBuffer sb = new StringBuffer(data.length * 2);
        for (int i = 0; i < data.length; i++) {
            sb.append(DIGITS[(data[i] >>> 4) & 0x0F]);
            sb.append(DIGITS[data[i] & 0x0F]);
        }
        return sb.toString();
    }

}

六:我这边获取了一个测试的雷达数据的,通过base转换后,再通过分隔符截取到雷达数据

base64原数据:

{"upPacketSN":-1,"upDataSN":-1,"topic":"v1/up/ad","timestamp":1639617553508,"tenantId":"2000030821","serviceId":"","protocol":"lwm2m","productId":"15038227","payload":{"APPdata":"AAAAAAAAAAAAfDAwMDB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAHwAAAAAAAAAAAAAfAHHfAB8AAAAAHwAAA=="},"messageType":"dataReport","deviceType":"","deviceId":"e920a1b8499e446bbcd4a99f7b2847fb","assocAssetId":"","IMSI":"undefined","IMEI":"862177042290711"} 

拿到具体的设备数据Appdata里面的:

AAAAAAAAAAAAfDAwMDB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAHwAAAAAAAAAAAAAfAHHfAB8AAAAAHwAAA==

16进制:

类似:

ff86000000050000757c303030307c00000000000000000000007c000000000000000000007c000000000000000000007c01f37c007c000000007c0000

获取到真实雷达数据:

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>