本文将使那些刚刚开始开发或已经应用NB-IoT技术的人了解如何与NB-IoT设备进行远程交互。
简短评论
NB-IoT轻松追随2G,并已确立其自身为蜂窝通信的节能标准,在可预见的未来,它将能够挤占2G,从而巩固了其地位。这样做的原因是能够灵活地解决设备最消耗部分之一的无线电发射器的能耗问题。如果您不深入研究,则可以与NB-IoT一起通过设置设备的通信时间表和设备与Internet上服务器的交互来灵活配置设备的操作模式。与此并行地,同时连接到一个小区的用户设备的数量以及移动运营商维持该通信本身的可操作性的成本显着增加。假定读者对NB-IoT技术有大概的了解,并且只有很少的交互经验。该文章会定期更新和更新。
NB-IoT网络的难点
连同控制无线电发射器的能力和高能效,一起出现了从服务器到模块(设备)的方向发送数据的问题。原因是可以为数十万个设备提供白色IP地址,但这会带来大量开销,并且由于网络的复杂性而降低了网络的整体可靠性。该模块接收用于运营商NAT的地址,并且由于设备数量众多,运营商很难将其“转换”出去。例如:十万个设备具有相同数量的IP地址,并且在IPv4的框架内似乎根本无法实现。过渡到IPv6可以解决此问题,但是您仍然必须为网络上设备的“白色”地址付费,这将严重影响企业客户的收入。也就是说,在一般情况下,事实证明该设备只能通过将数据传输到服务器来以单向模式工作,而无法从服务器接收数据,因为服务器实际上并不知道该设备何时首次与之联系。或者,在建立设备与服务器之间的连接后,平均不超过五分钟用于将数据从服务器传输到设备。NIDD(非IP数据传递)-为什么需要这样做?
在使用NB-IoT网络时,很难转向用于传输命令或某些数据的设备,为解决此问题,发明了一种优化少量数据传输的机制,即非IP数据传输(NIDD)。该机制通过减少报头来减小传输消息的整体大小。反过来,这也对设备的特性产生积极影响:它降低了功耗并增加了自主性(电池寿命)。结果,IP支持的拒绝导致设备更便宜,开发时间减少,物联网设备市场竞争力增强等。SCEF(服务能力披露功能)-给用户的礼物
SCEF是功能性网络元素,最早出现在3GPP Release 13中,部署在移动运营商一侧,并在SCS / AS(服务能力服务器/应用服务器)和NB-IoT设备之间提供安全的通信通道。当通过NIDD与设备通信时,SCEF提供了一个通信通道,并通过单个应用程序编程接口(来自API T8描述)提供了对NB-IoT网络的其他网络功能/服务的访问。在3GPP版本13中,只有用于与蜂窝网络接口对接的SCEF机制被标准化。因此,优化了网络负载,简化了与设备的交互,简化了设备本身的算法。SCEF还满足数据传输安全性和满足双向确认成功数据传输要求的高要求。SCEF允许您从与NB-IoT设备进行交互的复杂系统中抽象出来,包括当后者处于eDRX或PSM模式且无法在服务器->设备方向上进行数据传输时。当设备已收到注册并就协议的时间表向网络运营商的网络“同意”时,您可以使用简单的界面将数据传输到设备并从中接收数据,管理设备和AS对某些事件的“订阅”,自行设置和绑定唯一事件通用ID名称等。所有这些都通过相同的接口-T8 API。重要的是要注意,服务器(AS)不能是一个,而可以是多个,并且您可以针对某些事件或设备组灵活地配置服务器之间的信息分配。怎么运行的
组织设备访问蜂窝网络的最流行的解决方案是使用蜂窝模块,例如:在蜂窝网络上注册时,此类模块会向运营商发送一些信息,包括订户SIM卡的IMSI,运营商可以将其与订户帐户或订户本人关联(如果他可以访问运营商的个人帐户)。 SCEF屏幕的后面隐藏着与设备进行下一次通信会话的知识。仅当至少有一个从SCS / AS到该设备的订阅时,才可以在运营商网络中注册非IP设备。没有订阅-没有人将通过NIDD与该设备通信,并且该设备也不会在网络上注册。因此,知道下一个通信会话的SCEF能够根据指定的传递参数和所发送消息的生存期从设备向设备传输数据,而无需组织对数据传输和传输控制状态的其他监视。亮度
将设备中数据字节的单位封装到TCP协议中并将其传输到服务器,对于公司机队中成千上万的订户设备而言是昂贵的。SCEF允许您放弃设备上的IP并仅通过信号通道传输无IP报头的非IP数据,这有助于多次减少传输字节的成本,并从使用服务中获得更多好处。此外,SCEF不会对传输到设备以及从设备传输的数据进行任何更改,有效负载会透明传输。因此,使用NIDD不仅可以传输非结构化数据,还可以传输以JSON等易于理解的标准化格式“包装”的数据,以简化AS端的数据处理。开始工作
邮递员示例中URI(统一资源标识符)的结构
首先,您需要从操作员那里访问您的个人帐户(M2M-manager服务)。对于MTS的商业实施,提供了一个个人帐户界面,您可以在其中独立创建APN,对API的登录/密码访问并为设备分配名称ScsAsID,extID。那些。我们至少需要:- ScsAsID-您的AS ID
- APN-通常用于与网络交互的APN无法正常工作
- 登录名/密码-用于访问您的个人帐户以及与SCEF交互的数据
- URI – SCEF提供给您的网络上的HTTP地址和端口
- externalID-我们设备的ID
让我们继续练习
理论已经结束,让我们继续进行最有趣的部分-SIMCom无线解决方案生产模块SIM7020E的实践。首先,您需要配置模块本身以与NIDD一起使用。为此,首先将模块置于CFUN = 0模式并对其进行配置:AT+CFUN=0
+CPIN: NOT READY
OK
AT+ENVDM=1,tel_conn_mgr,default_pdn_flag,1,30
OK
AT*MCGDEFCONT="Non-IP","<APN>"
OK
AT+CFUN=1
OK
+CPIN: READY
AT+EGACT=1,4,"<APN>"
+EGACT:1
OK
+EGACT:1,1,1,4
在分组数据网络中检查模块的注册AT+CGREG?
+CGREG: 0,1
OK
并完成NIDD的设置AT+NIDD=0,"<APN>","<login>","<pass>"
+NIDD=0,0
OK
模块的响应将在此处包含account_id:+ NIDD = 0,<account_id>-在模块上激活NIDD时,它将很方便。AT+NIDD=1,0
+NIDD=1,0
OK
在这种情况下,account_id为0。完成。至此,模块的工作完成。让我们继续设置SCEF。重要的一点:如果没有在SCEF中进行注册,则该模块将不会在网络上获得注册!特种部队
API T8
有一个特殊文档详细说明了与SCEF的交互。该API定义了一组用于传输非IP数据的数据模型,资源和相关过程。使用SCEF和服务订阅-JSON(JavaScript对象表示法)
包含SCEF配置并通过HTTP / 1.1传输到SCEF的数据必须以JSON格式编码,并且Content-Type字段中HTTP请求本身的正文必须包含“ application / json”标头。同时,如果已将邮件传递给收件人并收到传递确认,则SCEF必须删除适当的配置,通过HTTP POST for AS使用状态代码“ 200 OK”发送邮件,并打开事件报告。邮差
我不会深入研究如何使用此实用程序,在Internet上您可以找到很多评论。我只能说它的免费版本有一些限制,但是我们并不需要太多,免费提供的功能已足以完成我们的任务。下载并打开它之后,第一个选项卡将欢迎您使用-Launchpad,我们将在其中启动我们的第一个请求,我们不会拒绝。立即进行新设备的配置。最初,我们配置了GET方法,将其切换为POST(稍后将清楚为什么有必要这样做)。在“授权”标签上,输入我们手头的“凭证”:现在创建我们的第一个请求:在请求正文中,我们指出:{
"externalId": "<ID >",
"reliableDataService": false,
"pdnEstablishmentOption": "WAIT_FOR_UE",
"duration":"2020-12-31T23:59:59Z",
"notificationDestination": "http://<IP >:<port>"
}
重要!:
- “duration” – duration SLA SCEF (SCSAS/ID) , SCEF ,
- “maximumPacketSize” – /
让我们立即注意,“ pdn EstablishmentmentOption”中可能包含以下选项:- WAIT_FOR_UE-如果设备不可用(未在网络,PSM或其他状态下注册),则进行缓冲
- INDICATE_ERROR-如果设备不可用,立即响应并返回错误
- SEND_TRIGGER-使用设备触发服务(通过SMS的备用传递渠道)。不考虑本文。
我们使用相同的参数将数据发送到设备。创建订阅时,我们可以立即将数据发送到设备,从而减少API请求的数量。所有!您可以单击发送按钮,并仔细检查我们从SCEF得到的答复:{
"externalId": "<ID >",
"duration": "2020-12-31T23:59:59Z",
"notificationDestination": "http://<IP >:<port>",
“reliableDataService": false,
"maximumPacketSize": 500,
"self": "/3gpp-nidd/v1/<ScsAsID>/configurations/<ID >",
"status": "ACTIVE"
}
在自我方面,我们主要对创建的配置的ID感兴趣,丢失它是非常不可取的,因为操作员很可能不支持所有创建的配置的请求功能。如果在一个ScsAsID框架内创建了数千个设备,则SCEF服务器上将创建过多的负载,无法广播所有设备配置。我们将其作为规则:作为ScsAsID服务的一部分,一个设备=一个订阅。因此,我们已经可以从服务器上的模块接收数据,该模块的IP地址和端口如上所述。数据从模块传输到AS
让我们尝试将数据从设备传输到AS,返回到SIM7020E模块,如果我们没有触及上一章的内容并且没有将其关闭,我们将向其发送命令:AT+NIDD=3,<account_id>,"6162636465"
OK
请注意,我们的消息以十六进制编码,并包含一个简单的序列:“ abcde”。几乎立即在作为主机的服务器(AS)上,我们将看到:POST / HTTP/1.1
OCSGHTTPProcessor: 147ff7c6-a43d-4fc9-b303-0ca50f497747
X-callback-t8-type: 3
X-callback-url: http://<IP >:<port>
X-api-network-service-node: 0
Content-Type: application/json
Content-Length: 214
Host: <IP >:<port>
Connection: Keep-Alive
User-Agent: Apache-HttpAsyncClient/4.1.3 (Java/1.8.0_181)
{"externalId":"<ID >","niddConfiguration":"/3gpp-nidd/v1/<ScsAsID>/configurations/<ID >","data":"YWJjZGU=","reliableDataService":false}
消息本身以Base64编码到达,如下所示:YWJjZGU=
如果从Base64编码转换,则会得到原始消息:abcde
之所以使用Base64编码,是因为使用ASCII编码时有时会丢失一些数据,而使用Base64会使传输更加可靠。还应注意,在这种情况下,从模块发送的信息未存储在SCEF中,而是立即通过HTTP发送到我们的服务器。数据从AS传输到模块
为了将数据从我们的AS发送到模块,让我们回到Postman并使用POST方法和Base64编码创建一个新请求。我们将发送1234567890(在Base64中:MTIzNDU2Nzg5MA ==)到我们的模块:
请注意,在“地址”字段中出现了一个附录,在其中指出了要发送消息的配置。如果我们的配置中包含多个设备,则可以使用标识符“ externalGroupID”,然后所有这些设备都将接收此数据。另一个要点是已发送消息的生存期,以秒为单位,并且范围很广。顺便说一句,如果设备此时不在线,那么我们的消息将被缓存在SCEF上,并且“ maximumLatency”行将告诉我们,如果设备在我们设置的计时器之前没有接触到消息被销毁,还剩下多少秒。下面是所请求的当前SCEF配置的外观(使用GET机制,更多内容如下):{
"externalId": "<ID >",
"duration": "2020-12-31T23:59:59Z",
"notificationDestination": "http://<IP >:<port>",
"reliableDataService": false,
"status": "ACTIVE",
"niddDownlinkDataTransfers": [
{
"externalId": "<ID >",
"reliableDataService": false,
"data": "MDEyMzQ1Njc4OTA=",
"maximumLatency": 96,
"priority": 1,
"self": "/3gpp-nidd/v1/<ScsAsID>/configurations/<ID >/downlink-data-deliveries/1"
}
}
如果在计时器到期后仍未与设备联系,则SCEF将通知您的服务器(AS)由于计时器到期而未传递该消息,并且该消息将被删除:POST / HTTP/1.1
OCSGHTTPProcessor: 14c8cab8-ecce-4868-a59e-1f784224518b
X-callback-t8-type: 4
X-callback-url: http://<IP >:<port>
X-api-network-service-node: 0
Content-Type: application/json
Content-Length: 139
Host: <IP >:<port>
Connection: Keep-Alive
User-Agent: Apache-HttpAsyncClient/4.1.3 (Java/1.8.0_181)
{"niddDownlinkDataTransfer":"/3gpp-nidd/v1/<ScsAsID>/configurations/<ID >/downlink-data-deliveries/1","status":"FAILURE"}
如果成功,SCEF将立即响应:{
"externalId": "<ID >",
"reliableDataService": false,
"status": "SUCCESS"
}
您可以添加对消息进行优先级排序的功能,以防它们被缓冲。它由“优先级”参数调节。当新消息发送到设备时,如果SCEF超过了传递缓冲区,则该消息将替换为优先级较低的消息,否则将不接受该消息进行传递。也可以从缓冲区中删除一条消息。如果邮件无法传递,并且已被缓冲,您将收到以下信息:{
"externalId": "<ID >",
"reliableDataService": false,
"self": "/3gpp-nidd/v1/<ScsAsID>/configurations/<ID >/downlink-data-deliveries/2",
"status": "BUFFERING"
}
重要!:
/<ID >/downlink-data-deliveries/1
– SCEF. , . .
收到消息后,模块将报告以下URC:+NIDD=4,0,11,0,"3031323334353637383930"
从十六进制到ASCII的翻译将是我们的信息:1234567890
只是留在这里。传递“缓冲”消息的通知:{
"niddDownlinkDataTransfer":"3gpp-nidd/v1/<ScsAsID>/configurations/<ID >/downlink-data-deliveries/1",
"status":"SUCCESS"
}
通过另一个名为“监视事件(MONTE)”的SCEF服务,可以监视设备状态。在MONTE中,可以使用类似的订阅系统接收有关事件和时间的通知(例如,设备可用时)。但是,让我们再谈一次。从SCEF获取配置
您可能已经注意到,可以从SCEF获取当前配置。来做吧。我们接受我们已经喜欢的邮递员,并使用GET方法创建以下请求:那些。我们将消息本身保留为空,在地址栏中,我们只需要指定为我们创建的配置的ID,以便接收其当前状态作为响应:{
"externalId": "<ID >",
"duration": "2020-12-31T23:59:59Z",
"notificationDestination": " http://<IP >:<port>",
"reliableDataService": false,
"status": "ACTIVE",
"niddDownlinkDataTransfers": []
}
删除SCEF上的配置
好了,最后-我们将删除我们创建的配置。为此,请使用与当前配置相同的地址栏,但将其更改为DELETE:作为回应,我们将收到:{
"externalId": " <ID >",
"duration": "2020-12-31T23:59:59Z",
" notificationDestination": " http://<IP >:<port>",
"reliableDataService": false,
"status": "TERMINATED"
}
在“状态”行中,我们将看到我们创建的配置已删除。结论
关于使用SCEF的主题可以撰写多个论文,该主题涉及广泛,并且很快将与各个领域的许多M2M设备(尤其是物联网)极为相关。我想传达给您的主要内容是如何立即使用NIDD和SCEF,以便您自己解决。但我也总是很乐意为您提供帮助:support@simcom.com(为RUS Team标记),在信中您必须指出您的联系方式和有关您项目的几句话。在以下文章中,我们将仔细分析使用蜂窝模块的其他方面,并在注释中写下您感兴趣的主题。我要特别感谢融合解决方案和多媒体服务的高级专家Sergey Novikov。萨诺夫),以帮助他们准备本文。使用的来源
NB-IoT:它如何工作?第3部分:SCEF-访问运营商ETSI TS 129 122 服务的单一窗口