Air800(GPRS+GPS模块)连接OneNet平台

Air800(GPRS+GPS模块)连接OneNet平台

OneNet平台介绍

OneNET作为中国移动通信集团推出的一个专业物联网开放云平台,提供了丰富的智能硬件开发工具和可靠的服务,助力各类终端设备迅速接入网络,实现数据传输、数据存储、数据管理等完整的交互流程。

支持公开协议包括EDP、MODBUS、MQTT以及HTTP等多种协议。详细资料参见:https://open.iot.10086.cn/doc

所需API

Luat封装了很多的实用API,所以在实现一些功能的时候就无需自己造轮子,直接调用其API即可

mqtt

pack

gps

lbs

json

实现思路

本例通过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,为字符串。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

OneNET平台优势之一可以利用数据点快速生成应用



要想让数据在OneNET平台上以数据点形式展现出来就得按照OneNET协议上传数据,使用OneNET平台的mqtt协议调试工具可以看到payload以json格式发送,并在json前面加0x01,0x00,0x20(这个字节为json长度),payload格式发送。

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": {…}//上传数据点值
                }
            ]
        },
        {…}
    ]
}
  • 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
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

本例中的json格式为

{
    "datastreams": [
        {
            "id": "gps",
            "datapoints": [
                {
                    "at": "",
                    "value": {
                        "lon": 106.584,
                        "lat": 29.5707,
                        "ele": 100
                    }
                }
            ]
        }
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

可以看到对应不同的数据点,只需要修改“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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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)
  • 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
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38



完整代码:https://github.com/lenghonglin/openLuat_Air800/tree/master/OneNet

  • 发表于 2018-09-09 21:30
  • 阅读 ( 4713 )

你可能感兴趣的文章

相关问题

1 条评论

请先 登录 后评论
不写代码的码农
冷红林

5 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章