物联网平台 - HTTP定位

简介: 设备通过发送HTTP请求到设备位置服务来进行辅助定位。支持移动基站定位、WiFi AP定位、设备IP地址定位(IPv4、IPv6)。

Step By Step

一.创建"地理位置"物模型

二.设备接入并获取token

三.发送HTTP请求


一.创建"地理位置"物模型

添加地理位置物模型属性,权限为读写。

image.png

二.设备接入并获取token

  1. pom.xml文件中,添加以下依赖,引入阿里fastjson包
  2. 进行设备认证以获取设备token、使用获取的token进行持续地数据上报
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.68</version></dependency>
packagejavasdk;/** Copyright © 2019 Alibaba. All rights reserved.*/importjava.io.BufferedOutputStream;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.URL;
importjava.nio.charset.StandardCharsets;
importjava.util.Set;
importjava.util.SortedMap;
importjava.util.TreeMap;
importjavax.crypto.Mac;
importjavax.crypto.spec.SecretKeySpec;
importjavax.net.ssl.HttpsURLConnection;
importcom.alibaba.fastjson.JSONObject;
/*** 设备使用HTTP协议接入阿里云物联网平台。 * 协议规范说明,请参见《HTTP协议规范》。* 数据格式,请参见《HTTP连接通信》。*/publicclassIotHttpClient {
// 地域ID,以华东2(上海)为例。privatestaticStringregionId="cn-shanghai";
// 定义加密方式,MAC算法可选以下算法:HmacMD5、HmacSHA1,需和signmethod一致。privatestaticfinalStringHMAC_ALGORITHM="hmacsha1";
// token有效期7天,失效后需要重新获取。privateStringtoken=null;
/*** 初始化HTTP客户端。** @param productKey,产品key。* @param deviceName,设备名称。* @param deviceSecret,设备密钥。*/publicvoidconenct(StringproductKey, StringdeviceName, StringdeviceSecret) {
try {
// 注册地址。URLurl=newURL("https://iot-as-http."+regionId+".aliyuncs.com/auth");
HttpsURLConnectionconn= (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "application/json");
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流。PrintWriterout=newPrintWriter(conn.getOutputStream());
// 发送请求参数。out.print(authBody(productKey, deviceName, deviceSecret));
// flush输出流的缓冲。out.flush();
// 获取URLConnection对象对应的输入流。BufferedReaderin=newBufferedReader(newInputStreamReader(conn.getInputStream()));
// 读取URL的响应。Stringresult="";
Stringline="";
while ((line=in.readLine()) !=null) {
result+=line;
            }
System.out.println("----- auth result -----");
System.out.println(result);
// 关闭输入输出流。in.close();
out.close();
conn.disconnect();
// 获取token。JSONObjectjson=JSONObject.parseObject(result);
if (json.getIntValue("code") ==0) {
token=json.getJSONObject("info").getString("token");
            }
        } catch (Exceptione) {
e.printStackTrace();
        }
    }
privateStringauthBody(StringproductKey, StringdeviceName, StringdeviceSecret) {
// 构建认证请求。JSONObjectbody=newJSONObject();
body.put("productKey", productKey);
body.put("deviceName", deviceName);
body.put("clientId", productKey+"."+deviceName);
body.put("timestamp", String.valueOf(System.currentTimeMillis()));
body.put("signmethod", HMAC_ALGORITHM);
body.put("version", "default");
body.put("sign", sign(body, deviceSecret));
System.out.println("----- auth body -----");
System.out.println(body.toJSONString());
returnbody.toJSONString();
    }
/*** 设备端签名。** @param params,签名参数。* @param deviceSecret,设备密钥。* @return 签名十六进制字符串。*/privateStringsign(JSONObjectparams, StringdeviceSecret) {
// 请求参数按字典顺序排序。Set<String>keys=getSortedKeys(params);
// sign、signmethod和version除外。keys.remove("sign");
keys.remove("signmethod");
keys.remove("version");
// 组装签名明文。StringBuffercontent=newStringBuffer();
for (Stringkey : keys) {
content.append(key);
content.append(params.getString(key));
        }
// 计算签名。Stringsign=encrypt(content.toString(), deviceSecret);
System.out.println("sign content="+content);
System.out.println("sign result="+sign);
returnsign;
    }
/*** 获取JSON对象排序后的key集合。** @param json,需要排序的JSON对象。* @return 排序后的key集合。*/privateSet<String>getSortedKeys(JSONObjectjson) {
SortedMap<String, String>map=newTreeMap<String, String>();
for (Stringkey : json.keySet()) {
Stringvlaue=json.getString(key);
map.put(key, vlaue);
        }
returnmap.keySet();
    }
/*** 使用HMAC_ALGORITHM加密。** @param content,明文。* @param secret,密钥。* @return 密文。*/privateStringencrypt(Stringcontent, Stringsecret) {
try {
byte[] text=content.getBytes(StandardCharsets.UTF_8);
byte[] key=secret.getBytes(StandardCharsets.UTF_8);
SecretKeySpecsecretKey=newSecretKeySpec(key, HMAC_ALGORITHM);
Macmac=Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
returnbyte2hex(mac.doFinal(text));
        } catch (Exceptione) {
e.printStackTrace();
returnnull;
        }
    }
/*** 二进制转十六进制字符串。** @param b,二进制数组。* @return 十六进制字符串。*/privateStringbyte2hex(byte[] b) {
StringBuffersb=newStringBuffer();
for (intn=0; b!=null&&n<b.length; n++) {
Stringstmp=Integer.toHexString(b[n] &0XFF);
if (stmp.length() ==1) {
sb.append('0');
            }
sb.append(stmp);
        }
returnsb.toString().toUpperCase();
    }
publicstaticvoidmain(String[] args) {
StringproductKey="";
StringdeviceName="";
StringdeviceSecret="";
IotHttpClientclient=newIotHttpClient();
client.conenct(productKey, deviceName, deviceSecret);
    }
}

三.发送HTTP请求

本文以IPV4定位展示

Topic: /sys/"+productKey+"/"+deviceName+"/_thing/service/post

Payload: {"id":"123","version":"1.0","params":{"identifier":"Location.Position","serviceParams":{"type":"ip","ip":"10.1.1.1"}},"method":"_thing.service.post"}

/*** 发送消息。** @param topic,发送消息的Topic。* @param payload,消息内容。*/publicvoidpublish(Stringtopic, byte[] payload) {
try {
// 注册地址。URLurl=newURL("https://iot-as-http."+regionId+".aliyuncs.com/topic"+topic);
HttpsURLConnectionconn= (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "application/octet-stream");
conn.setRequestProperty("password", token);
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流。BufferedOutputStreamout=newBufferedOutputStream(conn.getOutputStream());
out.write(payload);
out.flush();
// 获取URLConnection对象对应的输入流。BufferedReaderin=newBufferedReader(newInputStreamReader(conn.getInputStream()));
// 读取URL的响应。Stringresult="";
Stringline="";
while ((line=in.readLine()) !=null) {
result+=line;
            }
System.out.println("----- publish result -----");
System.out.println(result);
// 关闭输入输出流。in.close();
out.close();
conn.disconnect();
        } catch (Exceptione) {
e.printStackTrace();
        }
    }

image.png


参考文档

HTTP定位

HTTPS连接通讯

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
机器学习/深度学习 传感器 人工智能
物联网常用协议:MQTT、CoAP、LwM2M、HTTP、LoRaWAN和NB-IoT
物联网常用协议:MQTT、CoAP、LwM2M、HTTP、LoRaWAN和NB-IoT
物联网常用协议:MQTT、CoAP、LwM2M、HTTP、LoRaWAN和NB-IoT
|
JSON 物联网 数据格式
HTTP协议接入物联网平台(Getman模拟)
本文将使用Getman模拟设备模拟HTTP请求,进行接入测试
HTTP协议接入物联网平台(Getman模拟)
|
26天前
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
51 5
|
移动开发 网络协议 物联网
STM32+果云GA6-GPRS/GSM模块+MQTT+HTTP协议连接中移OneNet上传GPS数据定位
STM32+果云GA6-GPRS/GSM模块+MQTT+HTTP协议连接中移OneNet上传GPS数据定位
1083 0
STM32+果云GA6-GPRS/GSM模块+MQTT+HTTP协议连接中移OneNet上传GPS数据定位
|
2月前
|
网络协议 物联网 网络性能优化
物联网江湖风云变幻!MQTT CoAP RESTful/HTTP XMPP四大门派谁主沉浮?
【9月更文挑战第3天】物联网(IoT)的兴起催生了多种通信协议,如MQTT、CoAP、RESTful/HTTP和XMPP,各自适用于不同场景。本文将对比这些协议的特点、优缺点,并提供示例代码。MQTT轻量级且支持QoS,适合大规模部署;CoAP基于UDP,适用于低功耗网络;RESTful/HTTP易于集成但不适合资源受限设备;XMPP支持双向通信,适合复杂交互应用。通过本文,开发者可更好地选择合适的物联网通信协议。
40 2
|
5月前
|
传感器 物联网
物联网协议概述:MQTT、CoAP 和 HTTP
【6月更文挑战第3天】探索物联网的三大协议——MQTT、CoAP 和 HTTP。MQTT 是高效的消息传递使者,适用于大规模、不稳定网络环境;CoAP 小巧灵活,适合资源有限的设备;HTTP 则是熟悉的网络通信老将。根据不同场景选择合适的协议,让物联网设备有效交流。示例代码展示它们的使用方式。
163 0
|
XML 网络协议 物联网
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。
201 0
|
XML JSON 编解码
物联网协议对比(HTTP、websocket、XMPP、COAP、MQTT和DDS协议)
物联网协议对比(HTTP、websocket、XMPP、COAP、MQTT和DDS协议)
物联网协议对比(HTTP、websocket、XMPP、COAP、MQTT和DDS协议)
JavaWeb - HTTP 请求 Header 之 Location 定位解决方案
JavaWeb - HTTP 请求 Header 之 Location 定位解决方案
495 0
|
物联网 开发工具 Java
物联网平台实用技巧:通过服务端订阅(HTTP/2)获取设备状态
物联网很多业务场景中,时常需要获取设备的实时状态,以便根据不同的状态(在线或离线)做不同的处理。阿里云物联网平台提供服务端订阅功能来获取设备的状态信息。本文介绍通过HTTP/2通道订阅获取设备状态的方法
4323 0

相关产品

  • 物联网平台