@@ -439,35 +439,57 @@ Brdige Demo提供了一个使用TCP设备接入网桥、于云平台进行交互
439
439
440
440
代码样例:
441
441
``` java
442
- public void init() {
442
+ public void init() {
443
443
444
- // 网桥启动初始化
445
- BridgeBootstrap bridgeBootstrap = new BridgeBootstrap ();
444
+ // 网桥启动初始化
445
+ BridgeBootstrap bridgeBootstrap = new BridgeBootstrap ();
446
446
447
- // 从环境变量获取配置进行初始化
448
- bridgeBootstrap. initBridge();
447
+ // 从环境变量获取配置进行初始化
448
+ bridgeBootstrap. initBridge();
449
449
450
- bridgeClient = bridgeBootstrap. getBridgeDevice(). getClient();
450
+ bridgeClient = bridgeBootstrap. getBridgeDevice(). getClient();
451
451
452
- // 设置平台下行数据监听器
453
- DownLinkHandler downLinkHandler = new DownLinkHandler ();
454
- bridgeClient. setBridgeCommandListener(downLinkHandler) // 设置平台命令下发监听器
455
- .setBridgeDeviceMessageListener(downLinkHandler) // 设置平台消息下发监听器
456
- .setBridgeDeviceDisConnListener(downLinkHandler); // 设置平台通知网桥主动断开设备连接的监听器
457
- }
452
+ // 设置平台下行数据监听器
453
+ DownLinkHandler downLinkHandler = new DownLinkHandler ();
454
+ bridgeClient. setBridgeCommandListener(downLinkHandler) // 设置平台命令下发监听器
455
+ .setBridgeDeviceMessageListener(downLinkHandler) // 设置平台消息下发监听器
456
+ .setBridgeDeviceDisConnListener(downLinkHandler); // 设置平台通知网桥主动断开设备连接的监听器
457
+ }
458
458
```
459
459
#### 2. 设备登录上线
460
460
设备登录上线的实现样例如下:
461
461
``` java
462
- private void login(Channel channel, DeviceLoginMessage message) {
462
+ private void login(Channel channel, BaseMessage message) {
463
+ if (! (message instanceof DeviceLoginMessage )) {
464
+ return ;
465
+ }
466
+
467
+ String deviceId = message. getMsgHeader(). getDeviceId();
468
+ String secret = ((DeviceLoginMessage ) message). getSecret();
469
+ DeviceSession deviceSession = new DeviceSession ();
470
+
463
471
int resultCode = BridgeService . getBridgeClient(). loginSync(deviceId, secret, 5000 );
472
+
464
473
// 登录成功保存会话信息
465
474
if (resultCode == 0 ) {
466
- deviceSession. setDeviceId(deviceId);
467
- deviceSession. setChannel(channel);
468
- DeviceSessionManger . getInstance(). createSession(deviceId, deviceSession);
469
- NettyUtils . setDeviceId(channel, deviceId);
475
+ deviceSession. setDeviceId(deviceId);
476
+ deviceSession. setChannel(channel);
477
+ DeviceSessionManger . getInstance(). createSession(deviceId, deviceSession);
478
+ NettyUtils . setDeviceId(channel, deviceId);
470
479
}
480
+
481
+ // 构造登录响应的消息头
482
+ MsgHeader msgHeader = new MsgHeader ();
483
+ msgHeader. setDeviceId(deviceId);
484
+ msgHeader. setFlowNo(message. getMsgHeader(). getFlowNo());
485
+ msgHeader. setDirect(Constants . DIRECT_CLOUD_RSP );
486
+ msgHeader. setMsgType(Constants . MSG_TYPE_DEVICE_LOGIN );
487
+
488
+ // 调用网桥login接口,向平台发起登录请求
489
+ DefaultActionListenerImpl defaultLoginActionListener = new DefaultActionListenerImpl (" login" );
490
+ BridgeService . getBridgeClient()
491
+ .loginAsync(deviceId, secret, message. getMsgHeader(). getFlowNo(),
492
+ defaultLoginActionListener);
471
493
}
472
494
```
473
495
设备上线时,需要从原始设备消息中解析出鉴权信息(设备ID和秘钥),再调用SDK提供的login接口向平台发起登录请求,平台收到设备的login请求后,会对设备的鉴权信息进行认证,认证通过后会通过返回码告知网桥SDK设备的登录结果。您需要根据登录结果对设备进行记录会话信息、给设备返回响应等处理。
@@ -480,21 +502,30 @@ private void login(Channel channel, DeviceLoginMessage message) {
480
502
private void reportProperties(Channel channel, BaseMessage message) {
481
503
String deviceId = message. getMsgHeader(). getDeviceId();
482
504
DeviceSession deviceSession = DeviceSessionManger . getInstance(). getSession(deviceId);
483
- if (deviceSession == null || ! deviceSession . isLoginSuccess() ) {
505
+ if (deviceSession == null ) {
484
506
log. warn(" device={} is not login" , deviceId);
485
507
sendResponse(channel, message, 1 );
486
508
return ;
487
509
}
510
+
511
+ ServiceProperty serviceProperty = new ServiceProperty ();
512
+ serviceProperty. setServiceId(" Location" );
513
+ serviceProperty. setProperties(
514
+ JsonUtil . convertJsonStringToObject(JsonUtil . convertObject2String(message), Map . class));
515
+
516
+
488
517
// 调用网桥reportProperties接口,上报设备属性数据
489
518
BridgeService . getBridgeClient()
490
519
.reportProperties(deviceId, Collections . singletonList(serviceProperty), new ActionListener () {
491
520
@Override
492
521
public void onSuccess (Object context ) {
493
522
sendResponse(channel, message, 0 );
494
523
}
524
+
495
525
@Override
496
526
public void onFailure (Object context , Throwable var2 ) {
497
- log. warn(" device={} reportProperties failed: {}" , deviceId, var2. getMessage());
527
+ log. warn(" device={} reportProperties failed: {}" , deviceId, ExceptionUtil . getBriefStackTrace(var2));
528
+
498
529
sendResponse(channel, message, 1 );
499
530
}
500
531
});
@@ -506,38 +537,45 @@ private void reportProperties(Channel channel, BaseMessage message) {
506
537
507
538
代码样例参考:
508
539
``` java
509
- public void onCommand(String deviceId, String requestId, BridgeCommand bridgeCommand) {
510
- log. info(" onCommand deviceId={}, requestId={}, bridgeCommand={}" , deviceId, requestId, bridgeCommand);
511
- DeviceSession session = DeviceSessionManger . getInstance(). getSession(deviceId);
512
- if (session == null ) {
513
- log. warn(" device={} session is null" , deviceId);
514
- return ;
515
- }
540
+ @Override
541
+ public void onCommand(String deviceId, String requestId, BridgeCommand bridgeCommand) {
542
+ log. info(" onCommand deviceId={}, requestId={}, bridgeCommand={}" , deviceId, requestId, bridgeCommand);
543
+ DeviceSession session = DeviceSessionManger . getInstance(). getSession(deviceId);
544
+ if (session == null ) {
545
+ log. warn(" device={} session is null" , deviceId);
546
+ return ;
547
+ }
516
548
517
- // 设置位置上报的周期
518
- if (Constants . MSG_TYPE_FREQUENCY_LOCATION_SET. equals(bridgeCommand. getCommand(). getCommandName())) {
519
- processLocationSetCommand(session, requestId, bridgeCommand);
549
+ // 设置位置上报的周期
550
+ if (Constants . MSG_TYPE_FREQUENCY_LOCATION_SET. equals(bridgeCommand. getCommand(). getCommandName())) {
551
+ processLocationSetCommand(session, requestId, bridgeCommand);
552
+ }
520
553
}
521
- }
522
554
```
523
555
#### 5. 设备离线
524
556
网桥检查到设备到服务端的长连接断开时,需要调用SDK的logout接口通知平台设备离线。
525
557
526
558
代码样例参考:
527
559
``` java
528
- public void channelInactive( ChannelHandlerContext ctx) throws Exception {
529
- String deviceId = NettyUtils . getDeviceId( ctx. channel());
530
- DeviceSessionManger . getInstance() . getSession(deviceId );
531
- if (deviceId == null ) {
532
- return ;
533
- }
534
- // 调用网桥的logout接口,通知平台设备离线
535
- DefaultActionListenerImpl defaultLogoutActionListener = new DefaultActionListenerImpl ( " logout " );
536
- BridgeService . getBridgeClient() . logout(deviceId, UUID . randomUUID() . toString(), defaultLogoutActionListener) ;
537
- DeviceSessionManger . getInstance() . deleteSession(deviceId);
560
+ @Override
561
+ public void channelInactive( ChannelHandlerContext ctx) throws Exception {
562
+ String deviceId = NettyUtils . getDeviceId(ctx . channel() );
563
+ if (deviceId == null ) {
564
+ return ;
565
+ }
566
+ DeviceSession deviceSession = DeviceSessionManger . getInstance() . getSession(deviceId);
567
+ if (deviceSession == null ) {
568
+ return ;
569
+ }
538
570
539
- ctx. close();
540
- }
571
+ // 调用网桥的logout接口,通知平台设备离线
572
+ DefaultActionListenerImpl defaultLogoutActionListener = new DefaultActionListenerImpl (" logout" );
573
+ BridgeService . getBridgeClient()
574
+ .logoutAsync(deviceId, UUID . randomUUID(). toString(), defaultLogoutActionListener);
575
+ DeviceSessionManger . getInstance(). deleteSession(deviceId);
576
+
577
+ ctx. close();
578
+ }
541
579
```
542
580
### 测试验证
543
581
### 1. 获取网桥接入信息
0 commit comments