作者:俏巴
概述
物联网数据分析,又称Link Analytics,是阿里云为物联网开发者提供的设备智能分析服务,全链路覆盖了设备数据生成、管理(存储)、清洗、分析及可视化等环节。有效降低数据分析门槛,助力物联网开发工作。这里分别演示通过二维数据可视化功能展示设备位置 + 通过数据分析实现定时下发数据到设备。
Step By Step
1、创建产品,导入物模型,参考链接
物模型json内容
{
"schema": "https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json",
"profile": {
<span class="hljs-string">"productKey"</span>: <span class="hljs-string">"a1kVHWEOsM2"</span>
},
"properties": [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"GeoLocation"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"地理位置"</span>,
<span class="hljs-string">"accessMode"</span>: <span class="hljs-string">"rw"</span>,
<span class="hljs-string">"required"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"struct"</span>,
<span class="hljs-string">"specs"</span>: [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Longitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"经度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-180"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"180"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Latitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"纬度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-90"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"90"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Altitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"海拔"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"9999"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"m"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"米"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CoordinateSystem"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"坐标系统"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"enum"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"1"</span>: <span class="hljs-string">"WGS_84"</span>,
<span class="hljs-string">"2"</span>: <span class="hljs-string">"GCJ_02"</span>
}
}
}
]
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentHumidity"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"湿度"</span>,
<span class="hljs-string">"accessMode"</span>: <span class="hljs-string">"rw"</span>,
<span class="hljs-string">"required"</span>: <span class="hljs-literal">false</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"100"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"%"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"百分比"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentTemperature"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"温度"</span>,
<span class="hljs-string">"accessMode"</span>: <span class="hljs-string">"rw"</span>,
<span class="hljs-string">"required"</span>: <span class="hljs-literal">false</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-40"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"120"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"℃"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"摄氏度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
}
],
"events": [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"post"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"post"</span>,
<span class="hljs-string">"type"</span>: <span class="hljs-string">"info"</span>,
<span class="hljs-string">"required"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-string">"desc"</span>: <span class="hljs-string">"属性上报"</span>,
<span class="hljs-string">"method"</span>: <span class="hljs-string">"thing.event.property.post"</span>,
<span class="hljs-string">"outputData"</span>: [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"GeoLocation"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"地理位置"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"struct"</span>,
<span class="hljs-string">"specs"</span>: [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Longitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"经度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-180"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"180"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Latitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"纬度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-90"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"90"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Altitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"海拔"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"9999"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"m"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"米"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CoordinateSystem"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"坐标系统"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"enum"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"1"</span>: <span class="hljs-string">"WGS_84"</span>,
<span class="hljs-string">"2"</span>: <span class="hljs-string">"GCJ_02"</span>
}
}
}
]
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentHumidity"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"湿度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"100"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"%"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"百分比"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentTemperature"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"温度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-40"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"120"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"℃"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"摄氏度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
}
]
}
],
"services": [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"set"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"set"</span>,
<span class="hljs-string">"required"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-string">"callType"</span>: <span class="hljs-string">"async"</span>,
<span class="hljs-string">"desc"</span>: <span class="hljs-string">"属性设置"</span>,
<span class="hljs-string">"method"</span>: <span class="hljs-string">"thing.service.property.set"</span>,
<span class="hljs-string">"inputData"</span>: [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"GeoLocation"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"地理位置"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"struct"</span>,
<span class="hljs-string">"specs"</span>: [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Longitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"经度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-180"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"180"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Latitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"纬度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-90"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"90"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Altitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"海拔"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"9999"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"m"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"米"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CoordinateSystem"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"坐标系统"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"enum"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"1"</span>: <span class="hljs-string">"WGS_84"</span>,
<span class="hljs-string">"2"</span>: <span class="hljs-string">"GCJ_02"</span>
}
}
}
]
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentHumidity"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"湿度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"100"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"%"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"百分比"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentTemperature"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"温度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-40"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"120"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"℃"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"摄氏度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
}
],
<span class="hljs-string">"outputData"</span>: []
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"get"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"get"</span>,
<span class="hljs-string">"required"</span>: <span class="hljs-literal">true</span>,
<span class="hljs-string">"callType"</span>: <span class="hljs-string">"async"</span>,
<span class="hljs-string">"desc"</span>: <span class="hljs-string">"属性获取"</span>,
<span class="hljs-string">"method"</span>: <span class="hljs-string">"thing.service.property.get"</span>,
<span class="hljs-string">"inputData"</span>: [
<span class="hljs-string">"GeoLocation"</span>,
<span class="hljs-string">"CurrentHumidity"</span>,
<span class="hljs-string">"CurrentTemperature"</span>
],
<span class="hljs-string">"outputData"</span>: [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"GeoLocation"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"地理位置"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"struct"</span>,
<span class="hljs-string">"specs"</span>: [
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Longitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"经度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-180"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"180"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Latitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"纬度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-90"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"90"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"°"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"Altitude"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"海拔"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"9999"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"m"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"米"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CoordinateSystem"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"坐标系统"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"enum"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"1"</span>: <span class="hljs-string">"WGS_84"</span>,
<span class="hljs-string">"2"</span>: <span class="hljs-string">"GCJ_02"</span>
}
}
}
]
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentHumidity"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"湿度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"0"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"100"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"%"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"百分比"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
},
{
<span class="hljs-string">"identifier"</span>: <span class="hljs-string">"CurrentTemperature"</span>,
<span class="hljs-string">"name"</span>: <span class="hljs-string">"温度"</span>,
<span class="hljs-string">"dataType"</span>: {
<span class="hljs-string">"type"</span>: <span class="hljs-string">"double"</span>,
<span class="hljs-string">"specs"</span>: {
<span class="hljs-string">"min"</span>: <span class="hljs-string">"-40"</span>,
<span class="hljs-string">"max"</span>: <span class="hljs-string">"120"</span>,
<span class="hljs-string">"unit"</span>: <span class="hljs-string">"℃"</span>,
<span class="hljs-string">"unitName"</span>: <span class="hljs-string">"摄氏度"</span>,
<span class="hljs-string">"step"</span>: <span class="hljs-string">"0.01"</span>
}
}
}
]
}
]
}
2、设备端通过开源MQTT SDK上传数据,基于开源JAVA MQTT Client连接阿里云IoT
import com.alibaba.taro.AliyunIoTSignUtil;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.util.HashMap;
import java.util.Map;
public class IoTDemoPubSubDemo {
<span class="hljs-comment">// 设备三元组信息</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> productKey = <span class="hljs-string">"a1kVH******"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> deviceName = <span class="hljs-string">"device1"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> deviceSecret = <span class="hljs-string">"XADek3EYXzzTtxJ6a****************"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> regionId = <span class="hljs-string">"cn-shanghai"</span>;
<span class="hljs-comment">// 物模型-属性上报topic</span>
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> pubTopic = <span class="hljs-string">"/sys/"</span> + productKey + <span class="hljs-string">"/"</span> + deviceName + <span class="hljs-string">"/thing/event/property/post"</span>;
<span class="hljs-comment">// 物模型-属性订阅topic</span>
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> subTopic = <span class="hljs-string">"/sys/"</span> + productKey + <span class="hljs-string">"/"</span> + deviceName + <span class="hljs-string">"/thing/service/property/set"</span>;
private <span class="hljs-keyword">static</span> MqttClient mqttClient;
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span> [] args){
initAliyunIoTClient();
<span class="hljs-comment">// 汇报属性</span>
postDeviceProperties();
<span class="hljs-keyword">try</span> {
mqttClient.subscribe(subTopic); <span class="hljs-comment">// 订阅Topic</span>
} <span class="hljs-keyword">catch</span> (MqttException e) {
System.out.println(<span class="hljs-string">"error:"</span> + e.getMessage());
e.printStackTrace();
}
<span class="hljs-comment">// 设置订阅监听</span>
mqttClient.setCallback(<span class="hljs-keyword">new</span> MqttCallback() {
@Override
public <span class="hljs-keyword">void</span> connectionLost(Throwable throwable) {
System.out.println(<span class="hljs-string">"connection Lost"</span>);
}
@Override
public <span class="hljs-keyword">void</span> messageArrived(<span class="hljs-built_in">String</span> s, MqttMessage mqttMessage) throws Exception {
System.out.println(<span class="hljs-string">"Sub message"</span>);
System.out.println(<span class="hljs-string">"Topic : "</span> + s);
System.out.println(<span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>(mqttMessage.getPayload())); <span class="hljs-comment">//打印输出消息payLoad</span>
}
@Override
public <span class="hljs-keyword">void</span> deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
}
<span class="hljs-comment">/**
* 初始化 Client 对象
*/</span>
private <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> initAliyunIoTClient() {
<span class="hljs-keyword">try</span> {
<span class="hljs-comment">// 构造连接需要的参数</span>
<span class="hljs-built_in">String</span> clientId = <span class="hljs-string">"java"</span> + System.currentTimeMillis();
<span class="hljs-built_in">Map</span><<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>> params = <span class="hljs-keyword">new</span> HashMap<>(<span class="hljs-number">16</span>);
params.put(<span class="hljs-string">"productKey"</span>, productKey);
params.put(<span class="hljs-string">"deviceName"</span>, deviceName);
params.put(<span class="hljs-string">"clientId"</span>, clientId);
<span class="hljs-built_in">String</span> timestamp = <span class="hljs-built_in">String</span>.valueOf(System.currentTimeMillis());
params.put(<span class="hljs-string">"timestamp"</span>, timestamp);
<span class="hljs-comment">// cn-shanghai</span>
<span class="hljs-built_in">String</span> targetServer = <span class="hljs-string">"tcp://"</span> + productKey + <span class="hljs-string">".iot-as-mqtt."</span>+regionId+<span class="hljs-string">".aliyuncs.com:1883"</span>;
<span class="hljs-built_in">String</span> mqttclientId = clientId + <span class="hljs-string">"|securemode=3,signmethod=hmacsha1,timestamp="</span> + timestamp + <span class="hljs-string">"|"</span>;
<span class="hljs-built_in">String</span> mqttUsername = deviceName + <span class="hljs-string">"&"</span> + productKey;
<span class="hljs-built_in">String</span> mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, <span class="hljs-string">"hmacsha1"</span>);
connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);
} <span class="hljs-keyword">catch</span> (Exception e) {
System.out.println(<span class="hljs-string">"initAliyunIoTClient error "</span> + e.getMessage());
}
}
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> connectMqtt(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> clientId, <span class="hljs-built_in">String</span> mqttUsername, <span class="hljs-built_in">String</span> mqttPassword) throws Exception {
MemoryPersistence persistence = <span class="hljs-keyword">new</span> MemoryPersistence();
mqttClient = <span class="hljs-keyword">new</span> MqttClient(url, clientId, persistence);
MqttConnectOptions connOpts = <span class="hljs-keyword">new</span> MqttConnectOptions();
<span class="hljs-comment">// MQTT 3.1.1</span>
connOpts.setMqttVersion(<span class="hljs-number">4</span>);
connOpts.setAutomaticReconnect(<span class="hljs-literal">false</span>);
// connOpts.setCleanSession(true);
connOpts.setCleanSession(<span class="hljs-literal">false</span>);
connOpts.setUserName(mqttUsername);
connOpts.setPassword(mqttPassword.toCharArray());
connOpts.setKeepAliveInterval(<span class="hljs-number">60</span>);
mqttClient.connect(connOpts);
}
<span class="hljs-comment">/**
* 汇报属性
*/</span>
private <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> postDeviceProperties() {
<span class="hljs-keyword">try</span> {
System.out.println(<span class="hljs-string">"上报属性值"</span>);
<span class="hljs-built_in">String</span> payloadJson = <span class="hljs-string">"{"params":{"CurrentHumidity":12.3,"CurrentTemperature":12.3,"GeoLocation":{"CoordinateSystem":1,"Latitude":29.93089,"Longitude":121.59923,"Altitude":10}}}"</span>;
<span class="hljs-comment">// https://yq.aliyun.com/articles/706989</span>
MqttMessage message = <span class="hljs-keyword">new</span> MqttMessage(payloadJson.getBytes(<span class="hljs-string">"utf-8"</span>));
message.setQos(<span class="hljs-number">1</span>);
mqttClient.publish(pubTopic, message);
} <span class="hljs-keyword">catch</span> (Exception e) {
System.out.println(e.getMessage());
}
}
}
payLoad设备参考链接。
3、属性上报情况查看
4、通过物联网数据分析中的二维数据可视化功能,接入设备位置到地图
5、物联网数据分析通过SQL将数据下发至设备
- 5.1 查询数据
- 5.2 使用SQL下发数据
insert into ${pk.a1kVH.device1} select 53.3 as CurrentHumidity; -- 导入数据到表,下发数据到设备
- 5.3 设备端订阅情况
上报属性值
Sub message
Topic : /sys/a1kVH/device1/thing/service/property/set
{"method":"thing.service.property.set","id":"419651605","params":{"CurrentHumidity":53.3},"version":"1.0.0"}