5.10 综合案例2.0-GPS定位系统(2.2版本接口有更新)

最新案例教程点击下方链接跳转,CSDN已停止更新

点击跳转HaaS506官方最新案例







简介

GPS为GlobalPositioningSystem(全球定位系统 )的缩写。实际上 ,这是一种全球性无线电卫星导航系统 ,由 2 4个人造卫星星座及其地面接收站组成。GPS就是利用人造卫星这类“人造星体”作为参考点来确定一个物体的位置 ,其精确程度达几米到几十米。

准备

本案例需要的硬件

器材数量
HaaS506开发板1
中科微-ATGM336H-5N系列模块1
SIM卡1
杜邦线若干

硬件连接图

在这里插入图片描述

代码流程

1、连接阿里云平台。
2、读取GPS位置信息,上传经纬度上阿里云。
3、阿里云‘Web应用’显示位置信息。

功能实现

1、物联网平台开发

第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。

1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT

2、创建产品属性(添加物模型)

  • 选择产品功能定义编辑草稿
    在这里插入图片描述
  • 添加自定义功能
    设置标识符数据类型读写类型参数,标识符要与代码保持一致。点击确定
    发布上线,点击确定
    在这里插入图片描述
    在这里插入图片描述
    3、产品发布,动态注册一定要打开。
    在这里插入图片描述
  • 全部打钩,点击发布
    在这里插入图片描述

2、设备端开发

  • 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。

  • 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。
    在这里插入图片描述

  • oled屏幕显示gps数据使用案例参考

  • 使用先使用TTL口下载程序,下载完了之后TTL口连接GPS模块。

  • 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)

# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...

  • main.py
# coding=utf-8

from driver import GPIO
from driver import UART
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import kv



 
#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):
    global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade
    print('***** connect lp succeed****')
    data_handle = {}
    data_handle['device_handle'] = device.getDeviceHandle()


#当连接断开时,触发'disconnect'事件
def on_disconnect():
    print('linkkit is disconnected')

#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
    print('clound req data is {}'.format(request))

#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):
    print('clound req id  is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):
    print('err msg is {} '.format(err))

#网络连接的回调函数
def on_4g_cb(args):
     global g_connect_status
     pdp = args[0]
     netwk_sta = args[1]
     if netwk_sta == 1:
         g_connect_status = True
     else:
         g_connect_status = False

#网络连接
def connect_network():
     global net,on_4g_cb,g_connect_status
     #NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.
     net = network.NetWorkClient()
     g_register_network = False
     if net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:
         g_register_network = True
     else:
         g_register_network = False
     if g_register_network:
    #注册网络连接的回调函数on(self,id,func);  1代表连接,func 回调函数  ;return 0 成功
         net.on(1,on_4g_cb)    
         net.connect(None)
     else:
         print('网络注册失败')
     while True:
         if g_connect_status:
             print('网络连接成功')
             break
         time.sleep_ms(20)

#动态注册回调函数
def on_dynreg_cb(data):
     global deviceSecret,device_dyn_resigter_succed
     deviceSecret = data
     device_dyn_resigter_succed = True


 # 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):
    global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succed
    key = '_amp_customer_devicesecret'
    deviceSecretdict = kv.get(key)
    print("deviceSecretdict:",deviceSecretdict)
    if isinstance(deviceSecretdict,str):    
        deviceSecret = deviceSecretdict 

    if deviceSecretdict is None or deviceSecret is None:
        key_info = {
            'productKey': productKey  ,
            'productSecret': productSecret ,
            'deviceName': deviceName
            }
        # 动态注册一个设备,获取设备的deviceSecret
        #下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,
        if not device_dyn_resigter_succed:
            device.register(key_info,on_dynreg_cb)   


#纬度
def latitude(d,h):
    if d=="":
        return 0
    hemi="" if h=="N" else "-"
    #度
    deg=int(d[0:2])
    #分
    min=str(float(d[2:])/60)[1:]
    return hemi +str(deg)+min


#经度
def  longitude(d,h):
    if d=="":
        return 0
    hemi="" if h=="E" else "-"
    #度
    deg=int(d[0:3])
    #分
    min=str(float(d[3:])/60)[1:]

    return hemi +str(deg)+min


def main():
    while True:
        #串口读
        size=gps_module.read(readBuf)
        data=readBuf
        #将字节数据转化成字符串数据
        data_str=data.decode()
        # 判断是否有数据 且数据中是否包含"$GNRMC"
        if size!=0 and "$GNRMC" in data_str  and "$GNVTG" in data_str:
            print(readBuf)
            print("------------0-----------------------")
            #删除"\r\n"后,字符串变为列表
            data_list=data_str.split('\r\n')
            print(data_list)     
            print("------------------1------------------")
            for i in range(len(data_list)):   
                if "$GNRMC" in data_list[i]:
                    print(data_list[i])
                    #删除","
                    result=data_list[i].split(',')
                    print(result)
                    #$GNRMC,075622.000,A,3116.56922,N,12044.12475,E,0.00,0.00,020422,,,A,V*01
                    #['$GNRMC', '075622.000', 'A', '3116.56922', 'N', '12044.12475', 'E', '0.00', '0.00', '020422', '', '', 'A', 'V*01']
                    # 在GNRMC中取数据
                    if len(result)==14:
                        lat=latitude(result[3],result[4])
                        long=longitude(result[5],result[6])
                        print("lat:",lat)
                        print("long:",long)
                        #数据上传
                        gbs_data["Longitude"]= float(long)
                        gbs_data["Latitude"]= float(lat)
                        gbs_data_str=ujson.dumps(gbs_data)
                        data={
                            'params':gbs_data_str
                            }      
                        device.postProps(data)
            print("---------------------2-------------------")
        time.sleep(1)    


if __name__ == '__main__':
    ICCID=None
    g_connect_status = False
    net = None
    device = None
    deviceSecret = None
    deviceName = None
    #替换以下产品信息
    ##################################
    productKey = "a1JuD7ay6Pj"
    productSecret = "yV68ScGy5DgEczVx"
    ##################################
    device_dyn_resigter_succed = False

    # 连接网络
    connect_network()
    # 获取设备的IMEI 作为deviceName 进行动态注册
    #2.2版本改为
    #deviceName = modem.info.getDevImei()
    deviceName = modem.getDevImei()
    #获取设备的ICCID
    ICCID=modem.sim.getIccid()
    #初始化物联网平台Device类,获取device实例
    device = Device()
    if deviceName is not None and len(deviceName) > 0 :
     #动态注册一个设备
        dyn_register_device(productKey,productSecret,deviceName)
    else:
        print("获取设备IMEI失败,无法进行动态注册")
    while deviceSecret is None:
        time.sleep(0.2)
    print('动态注册成功:' + deviceSecret)

    key_info = {
        'region' : 'cn-shanghai' ,
        'productKey': productKey ,
        'deviceName': deviceName ,
        'deviceSecret': deviceSecret ,
        'keepaliveSec': 60,
        }
    #打印设备信息
    print(key_info)

    #device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数
    device.on(device.ON_CONNECT,on_connect)
    device.on(device.ON_DISCONNECT,on_disconnect)
    device.on(device.ON_PROPS,on_props)
    device.on(device.ON_SERVICE,on_service)
    device.on(device.ON_ERROR,on_error)
    device.connect(key_info)

    #gbs操作
    gps_module=UART()               #创建一个串口实例
    gps_module.open("serial1")      #打开
    gps_module.setBaudRate(9600)    #gps模块的波特率是9600
    readBuf=bytearray(512)          #创建一个字节数组,用于接受串口数据
    #主函数
    gbs_data = {}
    main()



  • board.json
{
    "name": "haas506",
   "version": "2.0.0",
   "io": {     
    "OLED": {
      "type": "I2C",
      "port": 1,
      "addrWidth": 7,
      "freq": 400000,
      "mode": "master",
      "devAddr": 60
    },            
      "serial1":{
        "type":"UART",
        "port":0,
        "dataWidth":8,
        "baudRate":9600,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
      },
      "serial2":{
        "type":"UART",
        "port":1,
        "dataWidth":8,
        "baudRate":115200,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
      },
      "serial3":{
        "type":"UART",
        "port":2,
        "dataWidth":8,
        "baudRate":115200,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
      }
   },
   "debugLevel": "ERROR",
   "repl":"enable",
   "replPort":2
  
  }
   

3、调试

1、串口调试工具log,使用485读取log,传感器每秒钟打印GPS读取信息
在这里插入图片描述

4、Web应用

  • 使用阿里云IoTStudio实现设备位置在地图上实时显示。

新建‘普通项目’

  • 在项目管理新建空白项目
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

关联产品

  • 在项目控制台,点击左侧‘产品’点击‘关联物联网平台产品’。并勾选‘关联产品同时关联其下所有设备’,以便该项目可以访问到所有设备的定位信息。
    在这里插入图片描述
    在这里插入图片描述

创建‘Web应用’

  • 返回上一页,在项目控制台,在新项目的首页新建一个Web应用
    在这里插入图片描述
  • Web应用创建成功后自动跳转到应用界面设计页面。点击左侧栏‘组件’按钮图标,就可以看到可用的组件列表。各组件的说明请参考IoT Studio组件说明
  • 为了能够将设备显示在地图上,选用‘设备地图’组件。鼠标悬停在组件上可以查看详细信息。
    在这里插入图片描述
  • 将‘设备地图’组件拖拽至画布,并调整大小。点击右侧‘编辑设备地图’
    在这里插入图片描述
  • ‘选择产品’,添加产品,点击确定。
    在这里插入图片描述
  • 此时,地图上出现了定位点,点击产品,可以看到绑定的所有设备。点击对应设备可以在地图上定位到每个设备的具体位置。
    在这里插入图片描述
  • 点击产品上设置,‘配置属性’,勾选‘经度’、‘纬度’点击 确定。
    在这里插入图片描述
  • 点击保存
    在这里插入图片描述

发布上线

回到Web应用页面,可以看到地图上的设备定位已经正常显示,可以进行发布。在发布前可以点击上图的预览查看运行效果。
在这里插入图片描述
设备上显示出上传云端的经纬度。
在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值