美文网首页
Air800(GPRS+GPS模块)连接OneNet平台上传GP

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

作者: Luat物联网通信模块 | 来源:发表于2018-03-23 12:56 被阅读473次

    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,为字符串。
    

    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": {…}//上传数据点值
                    }
                ]
            },
            {…}
        ]
    }
    

    本例中的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读取数据处理

    --[[
      字符串分割函数,和其他语言的split使用方式类似
      参数:
        s:待分割的字符串
        sp:分割标识符
      返回值:分割得到的字符串,类型为table
      例子:temp = split("a,b,c,d",",")
           temp = {"a","b","c","d"}
    ]]
    function split(s, sp)  
        local res = {} 
        local temp = s  
        local len = 0  
        while true do  
            len = string.find(temp, sp)  
            if len ~= nil then  
                local result = string.sub(temp, 1, len-1)  
                temp = string.sub(temp, len+1)  
                table.insert(res, result)  
            else  
                table.insert(res, temp)  
                break  
            end  
        end  
        return res  
    end 
    
    local function gpsGet()
      if gps.isfix() == true then           --gps定位成功
         local gpsStr = gps.getgpslocation()   --返回值为E,121.5259850,N,31.2356616格式 所以需要分割
         local temp = split(gpsStr,",")
         blng = temp[2]
         blat = temp[4]
      end
      if gps.isfix() == false then      --gps定位失败  用基站定位
        sys.timer_start(qrygps,100)
      end
    end
    

    相关文章

      网友评论

          本文标题:Air800(GPRS+GPS模块)连接OneNet平台上传GP

          本文链接:https://www.haomeiwen.com/subject/ghtxcftx.html