1.創建賬號
天翼平臺
2.創建產品

3.添加設備
4.在應用管理中新增應用

5.應用服務對接
SDK使用說明 中國電信物聯網開放平臺NB網關2.0API參考
@Data
@ApiModel(value = "設備資料推送請求")
public class DevicePushRequest {
@ApiModelProperty(name = "tenantId", value = "租戶ID")
private String tenantId;
@ApiModelProperty(name = "productId", value = "產品ID")
private String productId;
@ApiModelProperty(name = "deviceId", value = "設備ID", required = true)
private String deviceId;
@ApiModelProperty(name = "messageType", value = "訊息型別=dataReport")
private String messageType;
@ApiModelProperty(name = "IMEI", value = "NB終端設備識別號")
private String IMEI;
@ApiModelProperty(name = "IMSI", value = "NB終端sim卡標識")
private String IMSI;
@ApiModelProperty(name = "deviceType", value = "設備標識")
private String deviceType;
@ApiModelProperty(name = "topic", value = "資料上報主題")
private String topic;
@ApiModelProperty(name = "assocAssetId", value = "合作伙伴ID")
private String assocAssetId;
@ApiModelProperty(name = "timestamp", value = "時間戳", required = true)
private long timestamp;
@ApiModelProperty(name = "upPacketSN", value = "上行報文序號")
private int upPacketSN;
@ApiModelProperty(name = "upDataSN", value = "資料上報報文序號")
private int upDataSN;
@ApiModelProperty(name = "serviceId", value = "服務ID")
private String serviceId;
@ApiModelProperty(name = "protocol", value = "協議型別")
private String protocol;
@ApiModelProperty(name = "payload", value = "訊息負載", required = true)
private JSONObject payload;
}
@Data
public class CreateDevice {
private String deviceName;
private String deviceSn;
private String imei;
private String operator;
private Integer productId;
private CreateDeviceOther other;
}
@Data
public class CreateDeviceOther {
private Integer autoObserver;
private String imsi;
private String pskValue;
}
@Data
public class DeviceCreateOnIotReq {
private String deviceName;
private String imei;
private String imsi;
}
@Api(tags = "電信IoT應用模塊")
@Slf4j
@RestController
@RequestMapping("api/ct_wing/v1")
public class CtWingController {
@Autowired
private CtWingService ctWingService;
@ApiOperation("設備資料變化接收")
@PostMapping("deviceDataChange")
public JsonData deviceDataChangeReq(@ApiParam(value = "設備資料", required = true) @RequestBody JSONObject changeReq) {
try {
ctWingService.devicePushRecord(changeReq);
} catch (Exception e) {
log.error("deviceDataChangeReq()->error: {}", e.getMessage());
}
return JsonData.buildSuccess();
}
@ApiOperation(value = "Feign: 注冊設備到IOT平臺")
@PostMapping(value = "/device/register")
public JsonData registerDevice(@RequestBody DeviceCreateOnIotReq deviceCreateOnIotReq) {
return ctWingService.createDevice(deviceCreateOnIotReq);
}
@ApiOperation(value = "Feign: 洗掉設備在IOT平臺")
@PostMapping(value = "/device/remove")
public JsonData removeDevice(@RequestParam("deviceId") String deviceId) {
return ctWingService.removeDevice(deviceId);
}
}
/**
* 設備推送資料
* 1.結構化處理
* 2.校驗資料
* 3.存盤到redis中的list結構
*
* @param changeReq
*/
@Override
public void devicePushRecord(JSONObject changeReq) {
if (changeReq != null) {
String msgType = changeReq.getString("messageType");
if (StringUtils.isNotBlank(msgType) && "dataReport".equals(msgType)) {
DevicePushRequest devicePushRequest = null;
try {
devicePushRequest = JSONObject.parseObject(changeReq.toJSONString(), DevicePushRequest.class);
} catch (Exception e) {
log.error("devicePushRecord()->error: {}", e.getMessage());
}
if (devicePushRequest != null) {
// 獲取設備實際上報的資料
String payload = devicePushRequest.getPayload().getString("APPdata");
if (StringUtils.isNotBlank(payload)) {
// 按協議校驗
if (protoFactory.validateDevice(base64StrToHexStr(payload))) {
// 校驗通過后存盤到redis,從左邊存值
redisTemplate.opsForList().leftPush(CacheConst.IOT_DEVICE_KEY, devicePushRequest);
}
} else {
log.error("devicePushRecord()->payload is null.");
}
}
}
}
}
/**
* 處理設備資料,支持不同的協議互動
*/
@Override
public void dealWithDeviceData() {
devicePushRequests.clear();
// 從右邊取值,先進先出
Object devicePushReq;
while ((devicePushReq = redisTemplate.opsForList().rightPop(CacheConst.IOT_DEVICE_KEY)) != null) {
devicePushRequests.add(devicePushReq);
}
for (Object obj : devicePushRequests) {
protoFactory.dealWithDevice(JSONObject.parseObject(JSONObject.toJSONString(obj), DevicePushRequest.class));
}
}
/**
* 設備注冊
*/
@Override
public JsonData createDevice(DeviceCreateOnIotReq deviceCreateOnIotReq) {
CreateDevice device = new CreateDevice();
device.setDeviceName(deviceCreateOnIotReq.getDeviceName());
device.setImei(deviceCreateOnIotReq.getImei());
device.setOperator("wfzn");
device.setProductId(productId);
CreateDeviceOther other = new CreateDeviceOther();
other.setAutoObserver(0);
other.setImsi(deviceCreateOnIotReq.getImsi());
device.setOther(other);
//不支持通過imei查詢設備,所以直接注冊設備,通過應答來判斷是否重復注冊
JsonData jsonData = new JsonData();
try {
CreateDeviceResponse deviceResponse;
try {
deviceResponse = createDeviceOnIot(device);
} catch (Exception e) {
return null;
}
jsonData = validateIotResponse(deviceResponse);
} catch (Exception e) {
JsonData.buildResult(BizCodeEnum.IOT_REGISTER_SAME);
}
return jsonData;
}
@Override
public JsonData removeDevice(String deviceId) {
JsonData jsonData = new JsonData();
try {
DeleteDeviceResponse deviceResponse = deleteDeviceOnIot(deviceId);
jsonData = validateIotResponse(deviceResponse);
} catch (Exception e) {
JsonData.buildResult(BizCodeEnum.IOT_REGISTER_DELETE_FAIL);
}
return jsonData;
}
/**
* 洗掉iot注冊
*
* @param deviceId
* @return
*/
private DeleteDeviceResponse deleteDeviceOnIot(String deviceId) {
AepDeviceManagementClient client = AepDeviceManagementClient.newClient()
.appKey(appKey)
.appSecret(appSecret)
.build();
DeleteDeviceRequest request = new DeleteDeviceRequest();
request.setParamMasterKey(masterKey);
request.setParamDeviceIds(deviceId);
request.setParamProductId(productId);
DeleteDeviceResponse response = null;
try {
response = client.DeleteDevice(request);
} catch (Exception e) {
e.printStackTrace();
} finally {
client.shutdown();
}
return response;
}
/**
* 校驗Iot回應
*
* @param deviceResponse
* @return
* @throws UnsupportedEncodingException
*/
private JsonData validateIotResponse(BaseApiResponse deviceResponse) {
String deviceId = null;
if (deviceResponse.getStatusCode() == 200) {
JSONObject body = JSONObject.parseObject(new String(deviceResponse.getBody(), StandardCharsets.UTF_8));
if ("0".equals(body.get("code").toString())) {
if (deviceResponse instanceof CreateDeviceResponse) {
deviceId = JSONObject.parseObject(body.get("result").toString()).get("deviceId").toString();
log.info("create iot device success: {}", deviceId);
} else if (deviceResponse instanceof DeleteDeviceResponse) {
return JsonData.buildSuccess("success");
}
} else {
return JsonData.buildError(body.get("msg").toString());
}
} else {
return JsonData.buildError("StatusCode: " + deviceResponse.getStatusCode());
}
return JsonData.buildSuccess(deviceId);
}
/**
* 注冊設備到ctWing平臺
*
* @param content
* @return
*/
private CreateDeviceResponse createDeviceOnIot(CreateDevice content) {
AepDeviceManagementClient client = AepDeviceManagementClient.newClient()
.appKey(appKey)
.appSecret(appSecret)
.build();
CreateDeviceRequest request = new CreateDeviceRequest();
request.setParamMasterKey(masterKey);
request.setBody(JSONObject.toJSONBytes(content));
CreateDeviceResponse response = null;
try {
response = client.CreateDevice(request);
} catch (Exception e) {
e.printStackTrace();
} finally {
client.shutdown();
}
return response;
}

對應產品和應用資訊,去IOT平臺創建的產品和應用里面看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/388010.html
標籤:其他
