OneNET作为中国移动通信集团推出的一个专业物联网开放云平台,提供了丰富的智能硬件开发工具和可靠的服务,助力各类终端设备迅速接入网络,实现数据传输、数据存储、数据管理等完整的交互流程。
支持公开协议包括EDP、MODBUS、MQTT以及HTTP等多种协议。详细资料参见:https://open.iot.10086.cn/doc
Luat封装了很多的实用API,所以在实现一些功能的时候就无需自己造轮子,直接调用其API即可
lbs
本例通过MQTT将Air800获取到的GPS坐标发送到OneNET平台并显示。
MQTT协议是一个面向物联网应用的即时通信协议,使用TCP/IP提供网络连接,能够对负载内容实现消息屏蔽传输,开销小,可以有效降低网络流量。OneNET平台采用的是标准MQTT协议,所以使用合宙提供的MQTT API就能很方便的连上。只需要在OneNET上生成一个应用方可得到MQTT鉴权
Q1:MQTT连接鉴权时,Payload中ClientIdentifier;UserName;UserPassword分别填写什么?
A: ClientIdentifier: 创建设备时得到的设备ID,为数字字串;
UserName: 注册产品时,平台分配的产品ID,为数字字串;
UserPassword: 为设备的鉴权信息(即唯一设备编号,SN),或者为apiKey,为字符串。
OneNET平台优势之一可以利用数据点快速生成应用
json格式如下
{
"datastreams": [
{
"id": "temperature", //数据流名称或数据流模板名称
"datapoints": [
{
"at": "2013-04-22T00:35:43", //上传数据点时间,可选。如果为空,则设备云会取当前时间。
//如果存在其格式必须为"YYYY-MM-DDThh:mm:ss"的形式(例如:2015-03-22T22:31:12)
"value": 42 //上传数据点值
},
{
"at": "2013-04-22T00:55:43",
"value": 84 //上传数据点值
}
]
},
{
"id": "key", //数据流名称或数据流模板名称
"datapoints": [
{
"at": "2013-04-22T00:35:43",//上传数据点时间,可选。
"value": {…}//上传数据点值
},
{
"at": "2013-04-22T00:35:43",
"value": {…}//上传数据点值
}
]
},
{…}
]
}
本例中的json格式为
{
"datastreams": [
{
"id": "gps",
"datapoints": [
{
"at": "",
"value": {
"lon": 106.584,
"lat": 29.5707,
"ele": 100
}
}
]
}
]
}
可以看到对应不同的数据点,只需要修改“id”和“datapoints”。
所以将GPS数据发送到OneNET平台上,最关键点将获取到的GPS数据打包为OneNET数据点格式
local function msgPack()
--打包json
local torigin =
{
datastreams =
{{
id = "gps",
datapoints =
{{
at = "",
value =
{
lon = bgps.returnBlng(), --得到获取到的经度
lat = bgps.returnBlat(), --得到获取到的纬度
ele = "100"
}
}}
}}
}
local msg = json.encode(torigin) --对json进行编码
local len = msg.len(msg)
buf = pack.pack("bbbA", 0x01,0x00,len,msg) --打包数据流字节头
end
GPS读取数据处理
--- 模块功能:GPS功能测试.
-- @author openLuat
-- @module gps.testGps
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.23
module(...,package.seeall)
require"gps"
require"agps"
require"lbsLoc"
require"common"
local Rlat = ""
local Rlng = ""
--[[
功能 :发送查询位置请求
参数 :无
返回值:无
]]
local function reqLbsLoc()
reqAddr = not reqAddr
lbsLoc.request(getLocCb,reqAddr)
end
--[[
功能 :获取基站对应的经纬度后的回调函数
参数 :
result:number类型,0表示成功,1表示网络环境尚未就绪,2表示连接服务器失败,3表示发送数据失败,4表示接收服务器应答超时,5表示服务器返回查询失败;为0时,后面的3个参数才有意义
lat:string类型,纬度,整数部分3位,小数部分7位,例如031.2425864
lng:string类型,经度,整数部分3位,小数部分7位,例如121.4736522
addr:string类型,UCS2大端编码的位置字符串。调用lbsLoc.request时传入的第二个参数为true时,才返回本参数
返回值:无
]]
function getLocCb(result,lat,lng,addr)
--log.info("testLbsLoc.getLocCb",result,lat,lng,result==0 and common.ucs2beToGb2312(addr) or "")
--获取经纬度成功
if result==0 then
Rlat = lat
Rlng = lng
log.info("testLbsLoc success",Rlat,Rlng)
else
Rlat = ""
Rlng = ""
end
end
function printGps()
if gps.isFix() then
local tLocation = gps.getLocation()
Rlat = tLocation.lat
Rlng = tLocation.lng
log.info("testGps.printGps success",
gps.isOpen(),gps.isFix(),
tLocation.lngType,tLocation.lng,tLocation.latType,tLocation.lat,
gps.getAltitude(),
speed,
gps.getCourse(),
gps.getViewedSateCnt(),
gps.getUsedSateCnt())
else
reqLbsLoc()
end
return Rlat,Rlng
end
local function test1Cb(tag)
log.info("testGps.test1Cb",tag)
--printGps()
end
--设置GPS+BD定位
--如果不调用此接口,默认也为GPS+BD定位
--gps.setAerialMode(1,1,0,0)
--设置仅gps.lua内部处理NEMA数据
--如果不调用此接口,默认也为仅gps.lua内部处理NEMA数据
--如果gps.lua内部不处理,把NMEA数据通过回调函数cb提供给外部程序处理,参数设置为1,nmeaCb
--如果gps.lua和外部程序都处理,参数设置为2,nmeaCb
-- gps.setNmeaMode(2,nmeaCb)
-- test(testIdx)
gps.open(gps.DEFAULT,{tag="TEST1",cb=test1Cb})
--sys.timerLoopStart(printGps,20000)
完整代码:https://github.com/lenghonglin/openLuat_Air800/tree/master/OneNet
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!