云服务器内容精选

  • 非直连设备状态更新 注册观察者对非直连设备状态更新结果进行相应处理。 123456 //注册观察者AgentLiteHub agentLiteHub = AgentLiteHub.getInstance();HubService hubService = HubService.getInstance();hubService.registerObserver(agentLiteHub);//sensor状态更新agentLiteHub.updataDeviceStatus(); 非直连设备添加上时,一般情况下是“离线”状态。所以在非直连设备添加成功后,或者在非直连设备上报数据前,要调用HubService.updateDeviceStatus(int cookie, String deviceId, String status, String statusDetail)进行设备状态更新。 1 2 3 4 5 6 7 8 91011 public void updataDeviceStatus() {System.out.println(" ============= updataDeviceStatus ============== "); int cookie; Random random = new Random(); cookie = random.nextInt(65535); String sensorId = GatewayInfo.getSensorId(); System.out.println("cookie = " + cookie); System.out.println("sensorId = " + sensorId); HubService.updateDeviceStatus(cookie, sensorId, "ONLINE", "NONE");}
  • 数据上报和数据发布 设备或网关向 物联网平台 上报数据可以通过调用SDK的“设备服务数据上报”接口或“数据发布”接口: “设备服务数据上报”接口:deviceId,requstId和serviceId由SDK组装为消息的header;serviceProperties由SDK组装为消息的body。消息组装格式为JSON。 注册观察者对网关数据上报结果进行相应处理。 123456 //注册观察者AgentLiteDataTrans agentLiteDataTrans = AgentLiteDataTrans.getInstance();DataTransService dataTransService = DataTransService.getInstance();dataTransService.registerObserver(agentLiteDataTrans);//数据上报agentLiteDataTrans.gwDataReport(); 设备或网关登录成功后可以调用DataTransService.dataReport(int cookie, String requstId, String deviceId, String serviceId, String serviceProperties)接口上报数据。 1 2 3 4 5 6 7 8 910111213 public void gwDataReport() { System.out.println(" ============= gwDataReport! ============== "); int cookie; Random random = new Random(); cookie = random.nextInt(65535); String deviceId = GatewayInfo.getDeviceID(); JsonObject data = new JsonObject(); data.addProperty("storage", "10240"); data.addProperty("usedPercent", "20"); DataTransService.dataReport(cookie, null, deviceId, "Storage", data.toString());} 数据上报成功后可以在设备的“历史数据” 中看到上报的数据了。 “数据发布”接口:topic固定为“/cloud/signaltrans/v2/categories/data”;“serviceData”参数作为消息体(包括header和body),SDK只进行透传,不进行格式调整和组装。 注册观察者对网关数据上报结果进行相应处理。 123456 //注册观察者AgentLiteDataTrans agentLiteDataTrans = AgentLiteDataTrans.getInstance();DataTransService dataTransService = DataTransService.getInstance();dataTransService.registerObserver(agentLiteDataTrans);//数据发布agentLiteDataTrans.gwDataReportByMqttDataPub(); 设备或网关登录成功后可以调用DataTransService. mqttDataPub(int cookie, String topic, int qos, byte[] serviceData)接口发布数据。 “topic”是要发布数据的topic。 “qos”是mqtt协议的一个参数。 “serviceData”实际上是一个json字符串,内容是健值对(可以有多组健值对)。每个健是profile中定义的属性名(propertyName),值就是具体要上报的内容了。 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233 public void gwDataReportByMqttDataPub() { System.out.println(" ============= gwDataReportByMqttDataPub! ============== "); int cookie; Random random = new Random(); cookie = random.nextInt(65535); String deviceId = GatewayInfo.getDeviceID(); JsonObject headerData = new JsonObject(); headerData.addProperty("method", "PUT"); String fromStr = "/device/"+deviceId+"/services/Storage"; String toStr = "/data/v1.1.0/devices/"+deviceId+"/services/Storage"; headerData.addProperty("from", fromStr); headerData.addProperty("to", toStr); headerData.addProperty("access_token", GatewayInfo.getAccessToken()); SimpleDateFormat df = new SimpleDateFormat(MSG_TIMESTAMP_FORMAT); df.setTimeZone(TimeZone.getTimeZone("UTC")); String curTime = df.format(new Date(System.currentTimeMillis())); headerData.addProperty("timestamp", curTime); headerData.addProperty("eventTime", curTime); JsonObject bodyData = new JsonObject(); bodyData.addProperty("storage", "10240"); bodyData.addProperty("usedPercent", "18"); JsonObject mqttMsg = new JsonObject(); mqttMsg.add("header", headerData); mqttMsg.add("body", bodyData); DataTransService.mqttDataPub(cookie, "/cloud/signaltrans/v2/categories/data", 1, mqttMsg.toString().getBytes());}
  • 添加非直连设备 在添加非直连设备前,确认非直连设备的profile已经上传了,详见上传Profile并注册设备步骤。 修改非直连设备信息,包括“nodeId”(设备标识码)、“manufactureId”(厂商Id)、“deviceType”(设备类型)、“model”(设备模型)和“protocolType”(协议类型)。这里非直连设备的设备固有信息是测试数据,真实情况下,网关往往需要跟具体的非直连设备交互,才能得到具体的设备固有信息。 1 2 3 4 5 6 7 8 91011121314 public void addSensor() { System.out.println(" ============= addSensor! ============== "); int cookie; Random random = new Random(); cookie = random.nextInt(65535); String nodeId = "5432154321"; String manufatrueId = "Huawei"; String deviceType = "Motion"; String model = "test01"; String protocolType = "MQTT"; deviceInfo = new IotaDeviceInfo(nodeId, manufatrueId, deviceType, model, protocolType); ...} 注册观察者对添加设备结果进行相应处理。 123456 //注册观察者AgentLiteHub agentLiteHub = AgentLiteHub.getInstance();HubService hubService = HubService.getInstance();hubService.registerObserver(agentLiteHub);//sensor添加agentLiteHub.addSensor(); 在设备或网关登录成功后就可以调用HubService.addDevice(int cookie, IotaDeviceInfo deviceInfo)接口添加非直连设备。添加非直连设备成功后就能从广播中得到非直连设备的“deviceId”。 12345678 public void addSensor() { System.out.println(" ============= addSensor! ============== "); int cookie; Random random = new Random(); cookie = random.nextInt(65535); ... HubService.addDevice(cookie, deviceInfo);} 非直连设备添加成功后在“设备列表”中看到新增一条记录。
  • 命令接收 当开发者希望设备或网关只接收topic为“/gws/deviceid/signaltrans/v2/categories/”的消息,且对消息中的header进行解析时,可以调用“设备命令接收”接口。 应用服务器可以调用物联网平台的应用侧API接口给设备或网关下发命令,所以网关得随时监听命令下发的广播,以便接收到命令时进行相应业务处理。 注册观察者对命令接收进行相应处理。 123456 //注册观察者AgentLiteDataTrans agentLiteDataTrans = AgentLiteDataTrans.getInstance();DataTransService dataTransService = DataTransService.getInstance();dataTransService.registerObserver(agentLiteDataTrans);//命令接收agentLiteDataTrans.getCmdReceive(); 被动接收命令的方法getCmdReceive: 1 2 3 4 5 6 7 8 91011121314151617 private void getCmdReceive(IotaMessage iotaMsg) { System.out.println("=========receive iotCMD ============"); String deviceId = iotaMsg.getString(DataTransService.DATATRANS_IE_DEVICEID); String requestId = iotaMsg.getString(DataTransService.DATATRANS_IE_REQUSTID); String serviceId = iotaMsg.getString(DataTransService.DATATRANS_IE_SERVICEID); String method = iotaMsg.getString(DataTransService.DATATRANS_IE_METHOD); String cmd = iotaMsg.getString(DataTransService.DATATRANS_IE_CMDCONTENT); if (method.equals("REMOVE_GATEWAY")) { //rmvGateway(context); } System.out.println ("Receive cmd :" + "ndeviceId = " + deviceId + "nrequestId = " + requestId + "nserviceId = " + serviceId + "nmethod = " + method + "ncmd = " + cmd);}
  • 绑定和登录 设备或网关第一次接入物联网平台时需要进行绑定操作,从而将设备或网关与平台进行关联。开发者通过传入设备验证码以及设备信息,将设备或网关绑定到物联网平台。 修改绑定参数。 绑定时使用的设备固有信息(如设备型号等)是从“AgentLiteBind.java”文件中读取的,所以需要修改./src/main目录下“AgentLiteBind.java”文件中的如下信息: 物联网平台的设备对接地址(MQ TTS )和端口,可参考平台对接信息获取。 123 //设置配置参数private static final String PLATFORM_IP = "100.100.100.100";private static final String HTTPS_PORT = "8943"; “verifyCode”(设备验证码)和必要的设备信息,包括“nodeId”(设备标识码)、“manufactureId”(厂商Id)、“deviceType”(设备类型)、“model”(设备模型)和“protocolType”(协议类型)。“verifyCode”的值与“nodeId”保持一致,“manufactureId”(厂商Id)、“deviceType”(设备类型)、“model”(设备模型)和“protocolType”(协议类型)与Profile文件中的定义保持一致。 如果开发者通过“设备管理服务控制台”注册设备,则“verifyCode”填写为设备注册时的“preSecret”(预置密钥)。 如果通过开发中心注册设备,则“verifyCode”填写为设备注册时设置的“nodeId”(设备标识)。 1 2 3 4 5 6 7 8 91011 public void bindAction() {System.out.println(" ============= start bind ============== ");String nodeId = "1234568";String verifyCode = "1234568";String manufactrueId = "Huawei";String deviceType = "Gateway";String model = "AgentLite01";String protocolType = "LWM2M";deviceInfo = new IotaDeviceInfo(nodeId, manufactrueId, deviceType, model, protocolType); ...} 绑定设备。 注册观察者对设备绑定结果进行相应处理。 123456 //注册观察者AgentLiteBind agentLiteBind = AgentLiteBind.getInstance();BindService bindService = BindService.getInstance();bindService.registerObserver(agentLiteBind);//网关绑定agentLiteBind.bindAction(); 调用API接口BindConfig.setConfig()设置绑定配置,接着调用API接口BindService .bind(String verifyCode, IotaDeviceInfo deviceInfo)绑定设备。 12345678 public void bindAction() { System.out.println(" ============= start bind ============== "); ... //绑定配置 configBindPara(); //发起绑定请求 BindService.bind(verifyCode, deviceInfo);} 1234567 //绑定配置private static void configBindPara() {boolean res = false;res = BindConfig.setConfig(BindConfig.BIND_CONFIG_ADDR, PLATFORM_IP);res = BindConfig.setConfig(BindConfig.BIND_CONFIG_PORT, HTTPS_PORT);...} 设备或网关绑定成功,后续就不需要再绑定了,除非设备或网关被删除,才需要重新绑定。 设备绑定成功会收到BindService发出的通知,通知内容请参考Agent Lite API接口文档中设备绑定接口的返回结果说明和demo中update函数的处理。 修改登录参数。 在demo的./src/main/AgentLiteLogin.java设置物联网平台的接入IP与端口。 123 private static final String PLATFORM_IP = "100.100.100.100";private static final String MQTTS_PORT = "8883";private static final String HTTPS_PORT = "8943"; 设备登录。 注册观察者对设备登录结果进行相应处理。 123456 //注册观察者AgentLiteLogin agentLiteLogin = AgentLiteLogin.getInstance();LoginService loginService = LoginService.getInstance();loginService.registerObserver(agentLiteLogin);//网关登录agentLiteLogin.loginAction(); 调用API接口LoginConfig.setConfig()传入所需的登录信息,接着调用API接口LoginService.login()进行直连设备登录,具体API的参数使用参考Agent Lite接口文档中的设备登录接口说明。 “设备Id”(即网关Id, “ LOG IN_CONFIG_DEVICEID”),“appId”(“LOGIN_CONFIG_APPID”)和“密码”(“LOGIN_CONFIG_SECRET”),这些信息是都是从网关绑定成功的通知中得到的。 “平台HTTP地址”(“LOGIN_CONFIG_IOCM_ADDR”)和“MQTT地址”(“LOGIN_CONFIG_MQTT_ADDR”)一般是同一个地址。 12345 public void loginAction() { System.out.println(" ============= start login ============== "); configLoginPara(); LoginService.login();} 1 2 3 4 5 6 7 8 9101112131415161718 private static void configLoginPara() { if(AgentLiteUtil.isStringEmpty(GatewayInfo.getDeviceID()) || AgentLiteUtil.isStringEmpty(GatewayInfo.getAppID()) || AgentLiteUtil.isStringEmpty(GatewayInfo.getSecret())){ String jsonStr = AgentLiteUtil.readToString("./workdir/gwbindinfo.json"); JsonObject json = new Gson().fromJson(jsonStr, JsonObject.class); GatewayInfo.setDeviceID(json.get("deviceId").getAsString()); GatewayInfo.setAppID(json.get("appId").getAsString()); GatewayInfo.setSecret(json.get("deviceSecret").getAsString()); } LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_DEVICEID, GatewayInfo.getDeviceID()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_APPID, GatewayInfo.getAppID()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_SECRET, GatewayInfo.getSecret()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_IOCM_ADDR, PLATFORM_IP); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_IOCM_PORT, HTTPS_PORT); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_MQTT_ADDR, PLATFORM_IP); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_MQTT_PORT, MQTTS_PORT);}
  • 使用必读 开发环境要求: 使用的SDK版本为jdk1.8.0_45,适用的操作系统为Windows系统。 工程目录结构及文件说明: 目录结构 目录 说明 AgentLiteDemo │ ├─src │ └─com │ └─huawei │ └─agentlitedemo ├─libs │ └─agentlite-0.0.1-SNAPSHOT │ └─usp_agentlite.jar │ └─.dll └─workdir │ └─conf src 存放Agentlite Demo代码。 libs 存放Agentlite提供的jar包和第三方jar包,以及.dll动态库(工程必须的三个文件,“agentlite-0.0.1-SNAPSHOT”,“usp_agentlite.jar”,“.dll”文件)。 workdir 存放工程日志文件,由agentlite初始化资源设置。 conf 存放TLS证书文件。 如果开发者没有设备,可以直接在X86 Linux系统进行开发。
  • 初始化 在发起业务前,需要先初始化Agent Lite相关资源,调用API接口BaseService.init(),初始化Agent Lite资源,具体API的参数使用参考Agent Lite API接口文档。 调用BaseService.init(String workPath, String logPath)初始化AgentLite资源。 1 res = BaseService.init("./workdir", null);