华为云用户手册

  • encode接口说明 encode接口的入参是JSON格式的数据,是平台下发的命令或应答。 平台的下行报文可以分为两种情况: 平台对设备上报数据的应答(对应图中的消息②) 表2 平台收到设备的上报数据后对设备的应答encode接口的入参结构定义 字段名 类型 参数描述 是否必填 identifier String 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 否 msgType String 固定值"cloudRsp",表示平台收到设备的数据后对设备的应答。 是 request byte[] 设备上报的数据。 是 errcode int 请求处理的结果码,物联网平台根据该参数判断命令下发的状态。 0表示成功,1表示失败。 是 hasMore int 表示平台是否还有后续消息下发,0表示没有,1表示有。 后续消息是指,平台还有待下发的消息,以hasMore字段告知设备不要休眠。hasMore字段仅在PSM模式下生效,且需要“下行消息指示”开启。 是 LwM2M协议的命令下发格式和MQTT协议的命令下发格式不一样 注:在cloudRsp场景下编解码插件检测工具显示返回null时,表示插件未定义上报数据的应答,设备侧不需要物联网平台给予响应。 示例: { "identifier": "123", "msgType": "cloudRsp", "request": [ 1, 2 ], "errcode": 0, "hasMore": 0 } 平台命令下发(对应图中的消息③) 表3 平台下发命令encode接口的入参结构定义 字段名 类型 参数描述 是否必填 identifier String 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 否 msgType String 固定值"cloudReq",表示平台下发的请求。 是 serviceId String 服务的id。 是 cmd String 服务的命令名,参见产品模型的服务命令定义。 是 paras ObjectNode 命令的参数,具体字段由产品模型定义。 是 hasMore Int 表示平台是否还有后续命令下发,0表示没有,1表示有。 后续命令是指,平台还有待下发的消息,以hasMore字段告知设备不要休眠。hasMore字段仅在PSM模式下生效,且需要“下行消息指示”开启。 是 mid Int 2字节无符号的命令id,由物联网平台内部分配(范围1-65535)。 物联网平台在通过encode接口下发命令时,把物联网平台分配的mid放入码流,和命令一起下发给设备;设备在上报命令执行结果(deviceRsp)时,再将此mid返回物联网平台。否则物联网平台无法将下发命令和命令执行结果(deviceRsp)进行关联,也就无法根据命令执行结果(deviceRsp)更新命令下发的状态(成功或失败)。 是 示例: { "identifier": "123", "msgType": "cloudReq", "serviceId": "NBWaterMeterCommon", "mid": 2016, "cmd": "SET_TEMPERATURE_READ_PERIOD", "paras": { "value": 4 }, "hasMore": 0} }
  • decode接口说明 decode接口的入参binaryData为设备发过来的CoAP报文的payload部分。 设备的上行报文有两种情况需要插件处理(消息④是模组回复的协议ACK,无需插件处理): 设备上报数据(对应图中的消息①) 字段名 类型 是否必填 参数描述 identifier String 否 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 msgType String 是 固定值"deviceReq",表示设备上报数据。 hasMore Int 否 表示设备是否还有后续数据上报,0表示没有,1表示有。 后续数据是指,设备上报的某条数据可能分成多次上报,在本次上报数据后,物联网平台以hasMore字段判定后续是否还有消息。hasMore字段仅在PSM模式下生效,当上报数据的hasMore字段为1时,物联网平台暂时不下发缓存命令,直到收到hasMore字段为0的上报数据,才下发缓存命令。如上报数据不携带hasMore字段,则物联网平台按照hasMore字段为0处理。 data ArrayNode 是 设备上报数据的内容。 表1 ArrayNode定义 字段名 类型 是否必填 参数描述 serviceId String 是 服务的id。 serviceData ObjectNode 是 一个服务的数据,具体字段在产品模型里定义。 eventTime String 否 设备采集数据时间(格式:yyyyMMddTHHmmssZ)。 如:20161219T114920Z。 示例: { "identifier": "123", "msgType": "deviceReq", "hasMore": 0, "data": [{ "serviceId": "NBWaterMeterCommon", "serviceData": { "meterId": "xxxx", "dailyActivityTime": 120, "flow": "565656", "cellId": "5656", "signalStrength": "99", "batteryVoltage": "3.5" }, "eventTime": "20160503T121540Z" }, { "serviceId": "waterMeter", "serviceData": { "internalTemperature": 256 }, "eventTime": "20160503T121540Z" }] } LwM2M协议的数据格式跟MQTT的数据格式不同。 设备对平台命令的应答(对应图中的消息⑤) 字段名 类型 参数描述 是否必填 identifier String 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 否 msgType String 固定值"deviceRsp",表示设备的应答消息。 是 mid Int 2字节无符号的命令id。在设备需要返回命令执行结果(deviceRsp)时,用于将命令执行结果(deviceRsp)与对应的命令进行关联。 物联网平台在通过encode接口下发命令时,把物联网平台分配的mid放入码流,和命令一起下发给设备;设备在上报命令执行结果(deviceRsp)时,再将此mid返回给物联网平台。否则物联网平台无法将下发命令和命令执行结果(deviceRsp)进行关联,也就无法根据命令执行结果(deviceRsp)更新命令下发的状态(成功或失败)。 是 errcode Int 请求处理的结果码,物联网平台根据该参数判断命令下发的状态。 0表示成功,1表示失败。 是 body ObjectNode 命令的应答,具体字段由产品模型定义。 注:body体不是数组。 否 示例: { "identifier": "123", "msgType": "deviceRsp", "mid": 2016, "errcode": 0, "body": { "result": 0 } }
  • 如何开发网关 网关是一个特殊的设备,除具备一般设备功能之外,还具有子设备管理、子设备消息转发的功能。SDK提供了AbstractGateway抽象类来简化网关的实现。该类提供了子设备管理功能,需要从平台获取子设备信息并保存(需要子类提供子设备持久化接口)、子设备下行消息转发功能(需要子类实现转发处理接口)、以及上报子设备列表、上报子设备属性、上报子设备状态、上报子设备消息等接口。 使用AbstractGateway类 继承该类,在构造函数里提供子设备信息持久化接口,实现其下行消息转发的抽象接口: 1 2 3 4 5 6 7 public abstract void onSubdevCommand(String requestId, Command command); public abstract void onSubdevPropertiesSet(String requestId, PropsSet propsSet); public abstract void onSubdevPropertiesGet(String requestId, PropsGet propsGet); public abstract void onSubdevMessage(DeviceMessage message); iot-gateway-demo代码介绍 工程iot-gateway-demo基于AbstractGateway实现了一个简单的网关,它提供tcp设备接入能力。关键类: SimpleGateway:继承自AbstractGateway,实现子设备管理和下行消息转发 StringTcpServer:基于netty实现一个TCP server,本例中子设备采用TCP协议,并且首条消息为鉴权消息 SubDevicesFilePersistence:子设备信息持久化,采用json文件来保存子设备信息,并在内存中做了缓存 Session:设备会话类,保存了设备id和TCP的channel的对应关系 SimpleGateway类 添加或删除子设备处理 添加子设备:AbstractGateway的onAddSubDevices接口已经完成了子设备信息的保存。我们不需要再增加额外处理,因此SimpleGateway不需要重写onAddSubDevices接口 删除子设备:我们不仅需要修改持久化信息,还需要断开当前子设备的连接。所以我们重写了onDeleteSubDevices接口,增加了拆链处理,然后调用父类的onDeleteSubDevices。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Override public int onDeleteSubDevices(SubDevicesInfo subDevicesInfo) { for (DeviceInfo subdevice : subDevicesInfo.getDevices()) { Session session = nodeIdToSesseionMap.get(subdevice.getNodeId()); if (session != null) { if (session.getChannel() != null) { session.getChannel().close(); channelIdToSessionMap.remove(session.getChannel().id().asLongText()); nodeIdToSesseionMap.remove(session.getNodeId()); } } } return super.onDeleteSubDevices(subDevicesInfo); } 下行消息处理 网关收到平台下行消息时,需要转发给子设备。平台下行消息分为三种:设备消息、属性读写、命令。 设备消息:这里我们需要根据deviceId获取nodeId,从而获取session,从session里获取channel,就可以往channel发送消息。在转发消息时,可以根据需要进行一定的转换处理。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @Override public void onSubdevMessage(DeviceMessage message) { //平台接口带的都是deviceId,deviceId是由nodeId和productId拼装生成的,即 //deviceId = productId_nodeId String nodeId = IotUtil.getNodeIdFromDeviceId(message.getDeviceId()); if (nodeId == null) { return; } //通过nodeId获取session,进一步获取channel Session session = nodeIdToSesseionMap.get(nodeId); if (session == null) { log.error("subdev is not connected " + nodeId); return; } if (session.getChannel() == null){ log.error("channel is null " + nodeId); return; } //直接把消息转发给子设备 session.getChannel().writeAndFlush(message.getContent()); log.info("writeAndFlush " + message); } 属性读写: 属性读写包括属性设置和属性查询。 属性设置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 @Override public void onSubdevPropertiesSet(String requestId, PropsSet propsSet) { if (propsSet.getDeviceId() == null) { return; } String nodeId = IotUtil.getNodeIdFromDeviceId(propsSet.getDeviceId()); if (nodeId == null) { return; } Session session = nodeIdToSesseionMap.get(nodeId); if (session == null) { return; } //这里我们直接把对象转成string发给子设备,实际场景中可能需要进行一定的编解码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(propsSet)); //为了简化处理,我们在这里直接回响应。更合理做法是在子设备处理完后再回响应 getClient().respondPropsSet(requestId, IotResult.SUCCESS); log.info("writeAndFlush " + propsSet); } 属性查询: 1 2 3 4 5 6 7 @Override public void onSubdevPropertiesGet(String requestId, PropsGet propsGet) { //不建议平台直接读子设备的属性,这里直接返回失败 log.error("not supporte onSubdevPropertiesGet"); deviceClient.respondPropsSet(requestId, IotResult.FAIL); } 命令:处理流程和消息类似,实际场景中可能需要不同的编解码转换。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Override public void onSubdevCommand(String requestId, Command command) { if (command.getDeviceId() == null) { return; } String nodeId = IotUtil.getNodeIdFromDeviceId(command.getDeviceId()); if (nodeId == null) { return; } Session session = nodeIdToSesseionMap.get(nodeId); if (session == null) { return; } //这里我们直接把command对象转成string发给子设备,实际场景中可能需要进行一定的编解码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(command)); //为了简化处理,我们在这里直接回命令响应。更合理做法是在子设备处理完后再回响应 getClient().respondCommand(requestId, new CommandRsp(0)); log.info("writeAndFlush " + command); } 上行消息处理 上行处理在StringTcpServer的channelRead0接口里。如果会话不存在,需要先创建会话: 如果子设备信息不存在,这里会创建会话失败,直接拒绝连接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Override protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception { Channel incoming = ctx.channel(); log.info("channelRead0" + incoming.remoteAddress() + " msg :" + s); //如果是首条消息,创建session //如果是首条消息,创建session Session session = simpleGateway.getSessionByChannel(incoming.id().asLongText()); if (session == null) { String nodeId = s; session = simpleGateway.createSession(nodeId, incoming); //创建会话失败,拒绝连接 if (session == null) { log.info("close channel"); ctx.close(); } } 如果会话存在,则进行消息转发: 1 2 3 4 5 6 7 else { //如果需要上报属性则调用reportSubDeviceProperties DeviceMessage deviceMessage = new DeviceMessage(s); deviceMessage.setDeviceId(session.getDeviceId()); simpleGateway.reportSubDeviceMessage(deviceMessage, null); } 到这里,网关的关键代码介绍完了,其他的部分看源代码。整个demo是开源的,用户可以根据需要进行扩展。比如修改持久化方式、转发中增加消息格式的转换、实现其他子设备接入协议。 iot-gateway-demo的使用 在平台上为网关注册开户。 修改StringTcpServer的main函数,替换构造参数,然后运行该类。 1 2 3 simpleGateway = new SimpleGateway(new SubDevicesFilePersistence(), "ssl://iot-acc.cn-north-4.myhuaweicloud.com:8883", "5e06bfee334dd4f33759f5b3_demo", "mysecret"); 在平台上看到该网关在线后,添加子设备。 此时网关上日志打印: 2023-01-05 19:14:32 INFO SubDevicesFilePersistence:83 - add subdev: 456gefw3fh 运行TcpDevice类,建立连接后,输入子设备的nodeId。 此时网关设备日志打印: 2023-01-05 19:15:13 INFO StringTcpServer:118 - channelRead0/127.0.0.1:60535 msg :subdev2 2023-01-05 19:15:13 INFO SimpleGateway:68 - create new session okSession{nodeId='456gefw3fh', channel=[id: 0x42c9dc24, L:/127.0.0.1:8080 - R:/127.0.0.1:60535], deviceId='5e06bfee334dd4f337589c1de_subdev2'} 在平台上看到子设备上线。 子设备上报消息 查看日志看到上报成功 查看消息跟踪 在平台上找到网关,选择 设备详情-消息跟踪,打开消息跟踪。继续让子设备发送数据,等待片刻后看到消息跟踪:
  • 接收下发命令 在Demo中提供了接收平台下发命令的功能,在MQTT建链完成并成功订阅Topic后,可以在管理控制台设备详情中命令下发或使用应用侧Demo对该设备ID进行命令下发。下发成功后,在Demo中接收到平台下发给设备的命令。 例如下发参数名为smokeDetector: SILENCE,参数值为1的命令。 图6 命令下发 命令下发成功后,Demo收到平台下发的命令,浏览器调试界面的console栏显示如下: 图7 显示 由于是同步命令需要端侧回复响应可参考接口。
  • 导入代码样例 下载quickStart(websocket).zip样例,并解压。 修改Demo里的关键工程配置参数。其中MqttOverWebsocketDemo.html需要配置host地址、设备ID和设备密钥,用于启动Demo时连接平台。 host地址:即域名,请参考平台对接信息获取; 设备ID和设备密钥:在物联网平台注册设备或调用创建设备接口后获取。 var host = '****'; //IoT平台mqtt对接地址 var deviceId = '****'; //请填写在平台注册的设备ID var secret = '****'; //请填写在平台注册的设备密钥
  • 接收下发命令 在Demo中提供了接收平台下发命令的功能,在MQTT建链完成并成功订阅Topic后,可以在管理控制台设备详情中命令下发或使用应用侧Demo对该设备ID进行命令下发。下发成功后,在Demo中接收到平台下发给设备的命令。 例如下发参数名为smokeDetector: SILENCE,参数值为50的命令。 命令下发成功后,Demo收到的消息是50,命令运行主界面显示如下: 由于是同步命令需要端侧回复响应可参考接口。
  • 热门问题 设备管理服务和设备接入服务合一后的差异点是什么? 如何获取对接物联网平台的地址? 如何获取新域名和老域名接入的地址/证书? 新旧域名接入的鉴权方式有什么区别? 命令/属性下发总是超时? 应用侧如何获取appid和secret? Java SDK中有多个demo,该参考哪一个demo? C版 SDK中有多个demo,该参考哪一个demo? 如果是TCP协议,或者自定义协议如何接入平台? 设备显示上报数据成功,在控制台未看到数据? 应用服务器调用接口失败怎么处理? 应用服务器如何获取设备上报到物联网平台的数据? 如何制作订阅推送调测证书? 调用订阅接口时,回调地址如何获取? 订阅后消息推送失败如何处理? 物联网卡无法正常接入设备接入平台? 为何上报中文数据,平台会乱码呈现?
  • 业务迁移 设备有对接设备发放(设备适配了设备发放能力)。如果设备第一次发放成功接入后,根据业务需要重新接入到新的实例,可以通过再次发放动态修改接入地址。 本场景涉及的功能也适用于多个商用环境间的迁移。 设备没有对接设备发放。对于设备预置的是设备接入的地址,根据业务需要,需要更改设备的接入实例(比如共享实例往专享实例迁移,设备从测试环境往商用环境迁移),可以通过设备发放实现设备的业务迁移。 具体使用示例参考设备数据迁移。 本场景涉及的功能也适用于多个商用环境间的迁移。
  • 动态完成不同批次设备初始化配置 当不同型号的设备在首次连接设备接入时需要具备不同的初始化状态,可以通过设备发放完成不同批次设备初始化配置。 具体使用示例参考: MQTT 密钥设备使用静态策略发放示例 MQTT 密钥设备使用静态策略发放是设备预注册的场景,需要为每个设备预置初始化的值。 MQTT 注册组静态策略发放示例 MQTT 注册组静态策略发放是设备注册组的场景,只需要为注册组设置一个初始化的值,那么对应这个组的设备都可以收到下发的初始化配置。一般来说:设备初始化配置会配合注册组使用。
  • 和其他服务的关系 设备发放服务与其他服务的关系如表1所示。 表1 与其他服务的关系 交互功能 相关服务 位置 创建设备时,需要使用设备接入服务创建的产品 设备接入服务(IoT Device Access,IoTDA) 创建产品 创建自定义策略时需要使用函数 函数工作流服务(FunctionGraph) 创建并初始化函数 创建证书策略使用云证书时,需要去云证书管理服务创建云证书 云证书管理服务(Cloud Certificate Manager Service,CCM) 创建私有CA 父主题: 设备发放
  • 使用限制 设备发放服务具有以下使用限制。 对象 类别/描述 限制 设备 集成Agent Lite的设备(MQTT) 不支持 原生MQTT协议设备 支持,设备需要开发设备引导接口,具备设备发放能力。 集成LiteOS的设备(LwM2M) 支持 证书 数字证书保证系统内各服务及系统与外部通信的安全性,防止通信数据在传输过程被篡改造成安全风险。 100 策略 自定义策略最多可添加的实例数 10 静态策略最多可添加的实例数 20 证书策略最多可添加的实例数 20 父主题: 设备发放
  • 前提条件 已收到购买的智能企业网关设备。 已获取设备对应的ESN。 电子标签用来标识设备的硬件信息,包括序列号、生产日期、设备型号、硬件描述信息等。智能企业网关设备的电子标签存在新旧两种,对应设备序列号(ESN)的拼接规则也不同。 老款标签:仅包含SN编号,SN编号即为设备ESN。 新款标签:包含SN编号和PN编号,用户需要将PN编号和SN编号按照一定的组合规则拼接为设备ESN。 因此,在进行激活操作时,用户需要按照实际情况,输入正确的SN编号(必填)和PN编号(选填),系统将自动拼接出对应的设备ESN。
  • 典型组网 本节以企业分支访问华为云单个VPC场景为例,介绍IEG设备侧的典型组网。 表1 典型组网 组网场景 组网说明 组网图 组网配置 设备直挂LAN侧动态(DHCP)上云 适用于企业分支/门店等新建网络场景,IEG设备作为企业分支内网关使用,直接连接二层交换机。 IEG设备支持单机和双机部署,对于本地可靠性高的用户可以在站点部署双机。 单机直挂LAN侧动态(DHCP)上云 双机直挂LAN侧动态(DHCP)上云 设备直挂静态路由上云 适用于企业分支/门店等新建网络场景,IEG设备通过静态路由协议与三层交换机对接。 单机直挂静态路由上云 双机直挂静态路由上云 设备旁挂静态路由上云 适用于客户网络已部署并运行业务,在不改变现有组网情况下实现快速上云的场景。 IEG设备连接现有的路由器设备,采用静态路由对接,将需要访问华为云的流量引导到IEG设备侧,其他流量仍沿原有路径转发。 单机旁挂静态路由上云 双机旁挂静态路由上云 设备旁挂动态路由(OSPF)上云 适用于客户网络已部署并运行业务,在不改变现有组网情况下实现快速上云的场景。 IEG设备连接现有的路由器设备,且IEG设备、现有路由器分别启用OSPF协议,打通LAN侧网络,将需要访问华为云的流量引导到IEG设备侧,其他流量仍沿原有路径转发。 单机旁挂动态路由(OSPF)上云 双机旁挂动态路由(OSPF)上云 设备直挂客户端上云和上网 适用于企业分支/门店等新建网络场景,站点上网环境简单,PC直接连接IEG设备,同时访问云上服务和Internet服务。 单机直挂客户端上云和上网 设备LAN侧多个子网上云和上网 适用于企业分支/门店等新建网络场景,IEG设备LAN需要划分多个子网,且多子网可以同时访问云上服务和Internet服务。 单机直挂LAN侧多个子网上云和上网
  • 步骤2:在云服务器上配置Nginx实现URL转发 以下步骤以访问测试域名www.example.cn跳转到华为云官网/xxx为例。 打开Nginx配置文件,修改server模块中的server_name和location参数配置。 执行以下命令编辑nginx.conf文件,请将命令中路径替换为安装nginx的实际路径。 vi /usr/local/nginx/conf/nginx.conf server_name:访问的域名 location:跳转的url地址。其中301是永久跳转,302是临时跳转,本例中使用的是302。具体差异请参考背景知识,并根据实际需求修改。 图1中域名和URL仅为示例,请根据实际需求替换域名和URL地址。 图1 修改Nginx配置前 图2 修改Nginx配置后 执行以下命令,重新加载配置文件并重启Nginx服务。 /usr/local/nginx/sbin/nginx -s reload /usr/local/nginx/sbin/nginx -s reopen
  • 背景知识 URL转发分为URL显性转发和URL隐性转发。 URL显性转发 显性URL转发采用的是301(也称之为永久性转移)或302重定向技术(也称之为暂时性转移)。将域名解析到一个云服务器IP,在云服务器上配置了此域名和URL的跳转,本节介绍的Nginx实现URL转发即URL显性转发。 301永久性转移和302暂时性转移的状态码都表示重定向,当浏览器得到服务器返回的301或302状态码后会跳转到一个新的URL地址。但301表示旧地址的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址的资源还在(仍然可以访问),这个重定向只是临时地从旧地址跳转到新地址,搜索引擎会抓取新的内容而保存旧的网址。 URL隐性转发 隐性URL转发是用的是iframe框架技术。
  • 步骤1:在云服务器上安装Nginx 本节操作使用工具为Nginx,且确认http_rewrite_module是开启的,一般默认为开启状态。 以CentOS 7系列为例,安装Nginx操作步骤如下: 安装依赖包。 yum install -y gcc-c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 下载并解压安装包。 wget http://nginx.org/download/nginx-1.20.1.tar.gz tar -zxvf nginx-1.20.1.tar.gz 安装Nginx。 更换命令中“/usr/local/nginx”为实际希望安装路径。 cd nginx-1.20.1 ./configure --prefix=/usr/local/nginx make && make install 安装完后验证是否安装成功。 cd /usr/local/nginx/sbin ./nginx -t 出现如下内容为安装成功 。 nginx: the configuration file /usr/local/nginx//conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx//conf/nginx.conf test is successful
  • 内网解析是同区域还是跨区域? 内网域名是区域级资源,在创建内网域名之前需要选择对应的区域和项目。 内网域名只在关联的VPC内生效,支持关联多个VPC,当内网域名关联多个VPC时,内网域名可以在多个VPC内生效,但并不支持跨VPC访问内网域名。 例如,创建内网域名example.com,关联VPC A和VPC B,其解析记录规划如表1所示。 表1 内网解析记录 域名 记录集类型 记录集值 ecs1.example.com A 192.168.1.3 ecs3.example.com A 192.168.2.3 解析过程如图1所示。 图1 内网解析过程 VPC A和VPC B中的所有ECS都可以访问域名example.com。 如果VPC A中的ECS2访问ecs3.example.com,内网DNS会返回解析的IP地址192.168.2.3,即VPC B中的ECS3的IP地址。但是,由于VPC A和VPC B之间并没有建立连接,所以ECS2无法通过解析到的IP地址访问VPC B中的ECS3。 父主题: 内网域名解析
  • (推荐)方案一:行业通用配置方案 网站解析: 主域名example.net添加A记录解析到网站IP,详细请参见添加A类型记录集。 子域名www. example.net添加CNAME记录解析到CDN、WAF、OBS等云服务域名,详细请参见添加CNAME类型记录集。 在网站IP配置301/302跳转,将example.net跳转到www. example.net。 邮箱解析:主域名example.net配置MX解析记录和A记录不冲突,详细请参见添加MX类型记录集。 上述A类型解析记录、CNAME类型解析记录、MX类型解析记录具体配置请参考图1。 图1 配置解析记录
  • (不推荐)方案二:规避方案 个别中小企业没有专业的技术人员或运维人员,无法配置301/302跳转,希望域名example.net既要配置CNAME记录解析到CDN、WAF、OBS等网站域名,又要用作邮箱使用,能接受特定场景邮箱不可用情况。 假如本地客户端先访问网站example.net解析,域名DNS服务商将返回example.net解析地址是CNAME类型www.example.net.c.cdnhwc1.com,本地DNS通常会按照TTL缓存CNAME记录值,此时如果要使用邮箱会请求example.net的MX解析类型,由于本地客户端已经有example.net的CNAME缓存,按照标准协议本地DNS直接返回CNAME记录值www.example.net.c.cdnhwc1.com,MX记录请求失败,影响邮箱邮件发送接收功能使用,需要等到CNAME记录值缓存到期才能恢复。 可以参考如下配置方案: 网站解析:主域名example.net添加CNAME解析到CDN、WAF、OBS等云服务域名地址。 邮箱解析:主域名example.net正常添加MX解析记录,但是需要通过不同线路来规避和CNAME解析冲突。 具体可参考图2配置。 图2 配置解析记录 上述配置方案可以规避解析冲突,但是无法规避特殊场景下邮箱解析不可用的情况,请仔细评估业务风险,谨慎使用。
  • 背景 企业购买域名用作公司网站访问,同时还要将域名作为企业办公邮箱使用,需要合理规划配置。 企业网站基于访问加速或者安全访问等方面的考虑,使用了CDN、WAF、OBS等场景,不能直接配置A记录解析到网站IP,需要添加CNAME解析到CDN、WAF、OBS等服务的CNAME地址。由于DNS标准协议不允许同域名CNAME解析和其他解析类型(例如邮箱MX)共存,而域名又要用作企业办公邮箱,所以会存在特殊情况(例如CNAME与MX解析记录冲突)导致邮箱不可用,影响企业正常办公。 本文以域名example.net域名为例,介绍该问题的解决方案。
  • 怎样修改新网域名的DNS服务器地址? 当您想要将域名迁移至华为云时,在完成云解析服务侧的配置后,需要参考本操作到域名的原服务商处将域名的DNS服务器地址修改为华为云DNS的地址。 登录http://www.xinnet.com网站。 在左侧树状导航栏,单击“域名管理”。 在“我的域名”页签,单击待修改域名“操作”列的“管理”。 进入“域名基本信息”页面。 在左侧树状导航栏,单击“修改DNS”。 进入“修改域名DNS”页面。 图1 修改域名DNS 选择“使用非新网DNS”。 设置“主DNS”和“辅DNS”为华为云DNS提供的DNS服务器地址。 ns1.huaweicloud-dns.com ns1.huaweicloud-dns.cn ns1.huaweicloud-dns.net ns1.huaweicloud-dns.org 父主题: 域名转移
  • 当记录值有多个IP地址时,域名是如何解析的? 当为域名添加A类型或者AAAA类型解析记录时,参数“值”支持填写多个IP地址,将域名解析到多个IP地址。 当解析记录的“值”包含多个IP地址时,域名解析会返回所有的IP地址,但返回IP地址的顺序是随机的,浏览器默认取第一个返回的IP地址作为解析结果。 其解析流程如下: 网站访问者通过浏览器向Local DNS发送解析请求。 Local DNS将解析请求逐级转发至权威DNS。 权威DNS在收到解析请求后,将所有IP地址以随机顺序全部返回Local DNS。 Local DNS将所有IP地址返回浏览器。 网站访问者的浏览器随机访问其中一个IP地址,通常选取返回的第一个IP地址。 根据大量测试数据显示,解析到各IP地址的比例接近相等。 例如,某网站的域名为“example.com”,部署了3台服务器,对应的IP地址分别为:192.168.1.1、192.168.1.2、192.168.1.3。 为域名“example.com”配置一条A类型记录集,将记录集值设置为3个IP地址。 图1 记录集列表(多个IP) 不同用户访问网站时,返回的解析结果如表1所示。 表1 解析结果示例 用户 返回结果 解析结果 用户A 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.1 用户B 192.168.1.2 192.168.1.1 192.168.1.3 192.168.1.2 用户C 192.168.1.3 192.168.1.1 192.168.1.2 192.168.1.3 父主题: 公网域名解析
  • 常见问题 如果在验证解析的过程中无法获取正确的域名解析IP地址,说明解析未生效、或解析被修改等原因。建议参考解析不生效怎么办进行排查。 域名过期之后续费,网站依然打不开。 可能是由于DNS解析缓存未刷新,您可以执行ipconfig /flushdns刷新缓存。或等待DNS刷新后重试。 使用ping检查域名解析正常,但是打不开网站。 域名解析正常但是网站无法访问,需要排查搭建网站的云服务器是否正确绑定域名,或网站是否完成备案。您可以参考 为什么域名解析成功但网站仍然无法访问?
  • 解析记录集添加完成后,域名解析多久生效? 添加域名的解析记录集后,将此解析同步至DNS服务器后才可以生效,这个过程所需要的时间就是解析生效时间。 新添加解析记录集,通常添加成功立即生效。 修改已经添加的解析记录,解析生效时间不会迟于修改前的解析记录的TTL值。例如修改前TTL值为300s,则在300s内新的解析就会生效。如果本地DNS不存在缓存延时,则修改后立即生效。 如果运营商强制设置了更长的域名解析记录的缓存时间,将会导致修改或删除解析记录生效的延迟,最长预计48小时,修改期间,需要保证修改前后的IP地址都能够正常提供服务。
  • 使用Ping命令检查域名解析是否生效(适用于Windows、Linux操作系统主机) 在本地主机单击“搜索”,输入cmd,打开命令窗口。 然后输入以下命令检查解析是否生效。 ping 域名 示例:检查域名example.com的解析是否生效,执行命令ping example.com 回显信息如图1所示,显示的IP地址与设置域名解析的IP地址保持一致,则说明解析已经生效。 图1 使用ping检查解析是否生效 使用Ping命令时,解析是否生效与域名能否Ping通没有直接联系,执行“ping 域名”命令后,显示的IP地址与设置域名解析的IP地址一致,则说明解析已经生效。
  • 怎样检查域名解析是否生效? 使用查询命令检测是否生效: ping 域名 nslookup -qt=类型 域名 具体的操作方法请参考: 使用Ping命令检查域名解析是否生效(适用于Windows、Linux操作系统主机) 使用nslookup命令检查域名解析是否生效(适用于Windows、Linux操作系统主机) 验证A类型解析 验证CNAME类型解析 验证MX类型解析 验证NS类型解析 验证指定权威DNS的域名解析
  • 使用nslookup命令检查域名解析是否生效(适用于Windows、Linux操作系统主机) 验证A类型解析:用于指定域名的IP地址解析。 在本地主机单击“搜索”,输入cmd,打开命令窗口。 然后输入以下命令检查解析是否生效。 nslookup -qt=a 域名 或 nslookup 域名 示例:nslookup example.com 回显信息如图2所示,显示的IP地址与设置域名解析的IP地址保持一致,则说明解析已经生效。 图2 使用nslookup检查A类型解析是否生效 验证CNAME类型解析:用于指定域名的CNAME值,适用于CDN、WAF、云速建站场景等场景。 在本地主机单击“搜索”,输入cmd,打开命令窗口。 然后输入以下命令检查解析是否生效。 nslookup -qt=cname 域名 示例:nslookup -qt=cname examplesite.com 回显信息如图3所示,显示的CNAME值与设置域名解析的CNAME值一致,则说明解析已经生效。 图3 使用nslookup检查CNAME类型解析是否生效 验证MX类型解析:用于指定邮箱服务器的地址。 在本地主机单击“搜索”,输入cmd,打开命令窗口。 然后输入以下命令检查解析是否生效。 nslookup -qt=mx 域名 示例:nslookup -qt=mx example123.com 回显信息如图4所示,显示的地址与设置域名解析的邮箱地址值一致,则说明解析已经生效。 图4 使用nslookup检查MX类型解析是否生效 验证NS类型解析:用于指定解析服务商的 DNS 地址。 在本地主机单击“搜索”,输入cmd,打开命令窗口。 然后输入以下命令检查解析是否生效。 nslookup -qt=ns 域名 示例:nslookup -qt=ns example123.top 回显信息如图5所示,显示的IP地址与设置解析域名的服务商的DNS服务器地址一致,则说明解析已经生效。 图5 使用nslookup检查NS类型解析是否生效 查询指定权威DNS的域名解析是否生效。 在本地主机单击“搜索”,输入cmd,打开命令窗口。 然后输入以下命令检查解析是否生效。 nslookup -qt=类型 域名 权威DNS地址 示例:nslookup -qt=a example123.com ns1.huaweicloud-dns.cn 回显信息如图6所示,example123.com使用权威DNS ns1.huaweicloud-dns.cn的解析已经生效。 图6 使用nslookup检查权威DNS的域名解析是否生效
  • 怎样修改GoDaddy域名的DNS服务器地址? 当您想要将域名迁移至华为云时,在完成云解析服务侧的配置后,需要参考本操作到域名的原服务商处将域名的DNS服务器地址修改为华为云DNS的地址。 登录 https://sg.godaddy.com/zh网站。 单击“My Account”,进入My Account页面。 在“Products”页签中,单击“DOMAINS”前面的,展开域名列表。 待修改域名的“Action”列,单击“Launch”。 在展开页面的“Nameservers”区域,单击“Set Nameservers”。 图1 Set Nameservers 选择“I have specific nameservers for my domains.” 设置“Nameservers1”和“Nameservers2”为华为云DNS提供的DNS服务器地址。 ns1.huaweicloud-dns.com ns1.huaweicloud-dns.cn ns1.huaweicloud-dns.net ns1.huaweicloud-dns.org 父主题: 域名转移
  • 操作步骤 以为域名“example.com”设置3条全网默认的A类型记录集为例介绍权重解析的操作步骤,3条解析记录的权重比例设置为“1:1:1”。 进入公网域名列表页面。 在“公网域名”页面的域名列表中,单击域名example.com的名称。 进入“解析记录”页面。 单击“添加记录集”,进入“添加记录集”页面。 图1 添加权重解析 在“添加记录集”页面,根据界面提示为域名“example.com”设置A记录集参数。 主机记录:设置为空,表示解析的域名为主域名“example.com”。 类型:设置为A类型记录集。 线路类型:设置为“全网默认”。 值:设置为网站第一台服务器的IP地址“192.168.1.1”。 权重:设置为“1”。 单击“确定”,完成第1条解析记录的设置。 重复执行步骤5~步骤7,完成第2条和第3条解析记录的设置。 参数取值与第1条解析记录类似,仅参数“值”需要替换为网站另外两台服务器的IP地址“192.168.1.2”和“192.168.1.3”。 至此,完成权重解析的配置,用户的访问请求会平均分配至3台网站服务器上,实现负载均衡。
  • 权重解析规划 网站有3台服务器,配置了3条A类型解析记录,分别指向各服务器的IP地址。设置不同的“权重”参数,可以控制向用户返回不同IP地址的比例。 表1 数据规划 方案 域名 记录集类型 线路类型 值 权重 说明 方案一 example.com A 全网默认 192.168.1.1 1 用户的访问请求将按照“1:1:1”的比例,平均的分摊至3台服务器上。 192.168.1.2 1 192.168.1.3 1 方案二 example.com A 全网默认 192.168.1.1 2 用户的访问请求将按照“2:3:1”的比例进行分摊。 例如,DNS收到6条访问请求,则两次返回“192.168.1.1”、三次返回“192.168.1.2”,一次返回“192.168.1.3”,返回IP地址的顺序随机。 192.168.1.2 3 192.168.1.3 1
共100000条