大彩串口屏4g应用-龙8客户端下载

http定位和获取天气演示


一、适合范围


本文档适合大彩pm 4g系列串口屏产品使用。




二、适合范围


1. visualtft软件版本:v3.0.1.1112及以上的版本。

版本查看:

1) 打开visualtft软件启动页面如图2-1软件版本,右上角会显示的软件版本号;

图片 

图2-1软件版本


2) 打开visualtft,在软件右下角可以查看软件版本图2-2软件版本,最新版本可登录http://www.gz-dc.com/进行下载。

图片

2-2软件版本


2. 串口屏硬件版本: m系列固件 >= v6.3.257.00。

版本查看:

1) 查看屏幕背面版本号贴纸;

2) visualtft与屏幕联机成功后,右下角显示的版本号。




三、概述


本例程中,通过获取天气、定位来介绍4g的http get的应用




四、参考资料


1



《lua 脚本api v1.4》可通过以下链接下载物联型开发包获取:

http:/www.gz-dc.com/index.php?s=/list/index/cid/19.html

2



《lua基础学习》可通过以下链接下载物联型开发包获取:

http:/www.gz-dc.com/index.php?s=/list/index/cid/19.html

3



lua脚本初学者可以通过下面链接进行学习。

http://www.runoob.com/lua/lua-arrays.html

4



at指令,可以通过下面子连接了解

http://www.openluat.com/product/file/asr1802/luat 4g模块at命令手册v4.2.8.pdf

5



百度地图api逆地址解析:

http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad

6



济南易客云网络科技提供http天气访问接口:

付费:https://www.tianqiapi.com/index/doc?version=v61

免费:https://www.tianqiapi.com/index/doc?version=v6




五、教程实现

本文主要将以下2点进行说明:

1. 准备工程素材;

2. 配置串口屏工程;







5.1 准备工程素材

5.1.1 准备工程素材

在实现例程前需要作以下3个准备:

1. 硬件平台;

2. 软件平台;

3. ui素材;

该例程使用大彩m系列7寸串口屏dc80480m070_1111_0t为验证开发平台。如图5-1所示;

图片

5-1  m系列7寸串口屏

其他尺寸的串口屏均可借鉴此教程。


5.1.2 软件平台

使用大彩自主研发的上位机软件visualtft配置工程,登录http://www.gz-dc.com/下载。如图5-2所示;

图片

图5-2下载软件







5.2 配置串口屏工程

本文主要介绍以下2点:

(1) 画面配置

(2) lua编辑

5.2.1 画面配置

在画面id0中,sim卡信息显示、地点、时间及天气4部分组成。

sim卡信息:图标件id1表示信号等级、文本控件id2表示运营商、文本控件id3用于显示sim卡id。

地点:文本控件id7于显示所在的城市。

时间日期:文本控件id5用于显示时间,文本控件id6用于显示日期。

温度天气:文本控件id8显示温度,文本控件id9用于用于显示天气描述(多云、晴等),图标控件id10显示多云等等的图标。

画面配置如图5-3所示:

注意:其他非关键控件不在一一介绍,下文不在累述

图片

图5-3 画面配置


5.2..2 lua编辑 

本例程中,屏幕上电执行初始化操作,如加载4g at 指令的库、初始化和4g模块的交互的函数、初始化4g模块、开启定时器获取运营商和信号值。

当4g模块初始化完成后,获取运营商/信号值以及获取经纬度。当4g模块返回对应经纬度后,根据经纬度得到所在城市,在根据城市获取该城市的气温以及天气状态。流程如下所示。

图片


1. 初始化

调用系统函数on_init()执行代码如程序清单 1所示:

程序清单 1初始化

--[[*********************************************************************
** function name:  on_init
** descriptions :  系统初始化时,执行此回调函数。
*********************************************************************--]]
function on_init()
    
    dofile(‘air724at.lua') --加载 http.lua 文件
    uart_set_baudrate3(115200) --设置与4g模块通讯的串口3的波特率为115200
    
    --设置4g库函数的命令发送函数,命令回调函数、调试信息打印函数
    air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)
    air_hw_int()     --4g模块初始化设置
    air_get_iccid()  –- 获取卡号
    --开启自动获取型号强度、时间、天气功能
    start_timer(timerid_sig_weather, 1000 , 0, 0)
end
--[[*********************************************************************
** function name:  on_timer
** descriptions :  定时器超时回到调函数。
** @ timer_id    :  定时器id
*********************************************************************--]]
function on_timer(timer_id)
    on_air_timer(timer_id) --4g库函数的定时处理
    
    --自动获取型号强度、时间、天气的定时处理
    if timer_id == timerid_sig_weather
    then
        --定时器计数,timer0_notify_cnt 每秒 1。计时长度30min
        timer0_notify_cnt = timer0_notify_cnt   1 
        if timer0_notify_cnt == 0
        then
            --每15s调用一次,更新信号值
            at_cops_csq()
            --如果天气图标没有更新,则此处在调用一次
            if get_value(screen_main,10) == 0
            then
                get_wea_and_time() 
            end                                             
        elseif timer0_notify_cnt > 1800                     
        then                                                
            --每30min调用一次,更新天气、时间、信号
            get_wea_and_time()
            --标志位清空,重新开始30min计时
            timer0_notify_cnt = 0 
        end
    end
end
--[[*********************************************************************
** function name : at_cops_csq
** descriptions  : 获取运营商信息、信号强度
** @return       : nil,无返回值
*********************************************************************--]]
function at_cops_csq()
    air_cmd_add('at cops?','ok',1000) –获取运营商
    air_cmd_add('at csq'  ,'ok',1000) –获取信号
end
--[[*********************************************************************
** function name:  on_air_resp_callback
** descriptions :  4g模块-数据回调接口
** @key         :  屏幕->4g模块的发送请求
** @value       :  4g模块->返回的数据
*********************************************************************--]]
function on_air_resp_callback(key, value)  
    
    if value == nil
    then 
        return              --value为空时退出
    end
    
    --********************************************************************
    --功能:    判断 key
    --          如果 key 为空,则退出函数。
    --          因为 key 为空时,下方 string.find( key , ‘’) 是不正确的使用。
    --          以下key的处理必须不为空,
    --********************************************************************
    if key == nil 
    then
        return
    end
    
    --********************************************************************
    --条件:    4g初始化完成
    --功能:    使用使用at指令获取信号强度和运营商。
    --          使用 http get 请求天气、北京时间。
    --调用函数:at_cops_csq()
    --函数功能:获取信号强度和运营商
    --调用函数:get_wea_and_time()
    --函数功能:请求天气、北京时间
    --********************************************************************
    if string.find(key,' sapbr=1,1') ~= nil and string.find(value,'ok') ~= nil 
    then
        set_text(screen_main, 16, '')
        at_cops_csq()
        get_wea_and_time()
    end
    
    --********************************************************************
    --条件:    4g模块返回卡号
    --功能:    获取卡号并显示
    --********************************************************************
    if string.find(key,' iccid') ~= nil and string.find(value,' iccid') ~= nil 
    then
        --****************************************************************
        --value:             iccid: 89860117831003134201
        --要提取的值:       89860117831003134201
        --正则表达式:       ' iccid: (%d*)' 
        --****************************************************************
        local regular_e = ' iccid: (%d*)' --正则表达式
        local my_iccid = string.match( value, regular_e) --获取的值赋给 my_iccid
        set_text( screen_main, 3, 'sim卡号iccid:'..my_iccid)
    end
    
    --********************************************************************
    --条件:    4g模块返回运营商信息
    --功能:    设置串口波特率为 115200 
    --********************************************************************
    if string.find(key,' cops')~=nil and string.find(value,' cops')~=nil
    then
        --****************************************************************
        --value:             cops: 0,2,"46000",7
        --要提取的值:       46000
        --正则表达式:       ' cops:.*,.*,"(%d*)"' 
        --****************************************************************
        local regular_e = ' cops:.*,.*,"(%d*)"' --正则表达式
        --获取的值赋给 my_mobile_mccmnc
        local my_mobile_mccmnc = string.match( value, regular_e ) 
        set_text( screen_main, 2, mobile_mccmnc[my_mobile_mccmnc] )
    end
    
    --*******************************************************************
    --条件:    4g模块返回信号强度信息
    --功能:    设置串口波特率为 115200 
    --*******************************************************************
    if string.find(key,' csq')~=nil and string.find(value,' csq')~=nil
    then
        --***************************************************************
        --value:             csq: 15,99
        --要提取的值:       15
        --正则表达式:       ' csq: (.*),.*' 
        --***************************************************************
        local regular_e = ' csq: (.*),.*' --正则表达式
         --获取的值赋给 my_csq 
         local my_csq = tonumber(string.match(value,regular_e))
        if my_csq<=11
        then
            set_value( screen_main, 1, 1) --设置信号图标显示第1帧
        elseif my_csq>=12 and my_csq<=13 
        then
            set_value( screen_main, 1, 2) --设置信号图标显示第2帧
        elseif my_csq>=14 and my_csq<=15 
        then
            set_value( screen_main, 1, 3) --设置信号图标显示第3帧
        elseif my_csq>=16 
        then
            set_value( screen_main, 1, 4) --设置信号图标显示第4帧
        end
    end
    ......
end
--[[**********************************************************************
** function name: on_uart_recv_data3
** descriptions : 接收串口3数据回调函数,连接4g模块。
**********************************************************************--]]
function on_uart_recv_data3(packet)
    --4g at指令库api
    on_air_recv_data(packet)
end

▲下滑查看

核心api函数

1) dofile (filename)

    加载文件:本例程中加载4g at 指令的库

  • filename -文件名

2) uart_set_baudrate3(speed)

    设置串口3的波特率:串口3为屏幕和4g模块通讯的串口

  • speed –通讯的波特率

 

3) on_air_recv_data(packet)

    串口接收4g模块的返回数据的回调。

  • packet:形参为表,字节数据。

 

4) air_set_callback (on_air_send_cb,on_air_resp_callback,on_air_log_cb)

    设置4g库函数的回调。形参类型为函数,参数依次为命令发送函数,命令回调函数、调试信息打印函数,可自定义函数名。

  • on_air_send_cb:屏幕向4g模块发送回调函数
  • on_air_resp_callback:4g向屏幕返回数据回调函数
  • on_air_log_cb:用户调试信息回调函数调试


5) at_cops_csq()

    自定义封装函数,获取运行商和信号值

 

6) air_cmd_add(sendstr,ackstr,timeout,retry,callback)

    屏幕向4g模块发送at指令

  • sendstr:屏幕向4g模块发送at指令
  • ackstr  :4g模块应答屏幕的请求
  • timeou :应答超时
  • retry   :超时重发次数,可选
  • callback:应答回调函数,可选

注:如果没有设置超时重发次数,则超时时直接发送队列中的下一条指令。

 

7) on_air_resp_callback(key, value)

    4g应答屏幕回调函数:屏幕发送at指令,4g应答后均会回调该函数,本函数如air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)函数设置。

  • key    :屏幕->4g模块,发送请求的at指令
  • value  :4g模块->屏幕,返回的数据


2. 获取经纬度

当4g初始化完成后,获取经纬度,代码如程序清单 2所示:


程序清单 2  获取经纬度

--[[*********************************************************************
** function name:  on_air_resp_callback
** descriptions :  4g模块-数据回调接口
** @key           :  屏幕->4g模块的发送请求
** @value         :  4g模块->返回的数据
*********************************************************************--]]
function on_air_resp_callback(key, value)  
    
    ......
    --********************************************************************
    --条件:    4g初始化完成
    --功能:    使用使用at指令获取信号强度和运营商。
    --          使用 http get 请求天气、北京时间。
    --调用函数:at_cops_csq()
    --函数功能:获取信号强度和运营商
    --调用函数:get_wea_and_time()
    --函数功能:请求天气、北京时间
    --********************************************************************
    if string.find(key,' sapbr=1,1') ~= nil and string.find(value,'ok') ~= nil 
    then
        set_text(screen_main, 16, '')
        at_cops_csq()
        get_wea_and_time()
    end
    
    ......
    --*******************************************************************
    --条件                   :    获取经纬度成功
    --功能                   :    订阅主题
--@local_longitude   :    经度
   --@local_latitude    :    纬度
    --********************************************************************
    if string.find(key,' cipgsmloc') ~= nil and
        string.find(value,' cipgsmloc') ~= nil
    then
        --**************************************************************
        --value: cipgsmloc: 0,31.241045,121.472313,18/11/08,15:37:30
        --要提取的值:       31.241045
        --                   121.472313
        --正则表达式:       ' cipgsmloc: %d ,([0-9.]*),([0-9.]*),' 
        --***************************************************************
        local local_latitude=''
        local local_longitude=''
        local regular_e = ' cipgsmloc: %d ,([0-9.]*),([0-9.]*),' --正则表达式
        local local_latitude,local_longitude = string.match(value,regular_e) 
        --****************************************************************
        --条件:    提取经纬度成功
        --功能:    通过 baidu api 获取当前经纬度的地点
        --****************************************************************
        if local_latitude ~= nil and local_longitude ~= nil
        then
            --获取经纬度所表示的地点名称
            baiduapi_get_local(local_latitude,local_longitude) 
        end
    end
end
--[[*********************************************************************
** function name: get_local_latitude_longitude
** descriptions : 获取当地经纬
** @return      : nil,无返回值
*********************************************************************--]]
function get_local_latitude_longitude()
    
    air_cmd_add('at cipgsmloc=1,1', 'ok', 5000)
end

▲下滑查看

核心api函数

1) get_local_latitude_longitude()

    获取经纬度。屏幕向4g模块发送获取经纬度的at指令’at cipgsmloc=1,1’,在on_air_resp_callback回调函数解析返回的数据。

 

3. 获取城市名

当获取经纬度后,根据经纬度,获取所在的城市,代码如程序清单 3所示:


程序清单 3  获取所在城市

--[[*********************************************************************
** function name:  on_air_resp_callback
** descriptions :  4g模块-数据回调接口
** @key         :  屏幕->4g模块的发送请求
** @value       :  4g模块->返回的数据
*********************************************************************--]]
function on_air_resp_callback(key, value)  
    
    ......
    --********************************************************************
    --条件:    4g初始化完成
    --功能:    使用使用at指令获取信号强度和运营商。
    --          使用 http get 请求天气、北京时间。
    --调用函数:at_cops_csq()
    --函数功能:获取信号强度和运营商
    --调用函数:get_wea_and_time()
    --函数功能:请求天气、北京时间
    --********************************************************************
    if string.find(key,' sapbr=1,1') ~= nil and string.find(value,'ok') ~= nil 
    then
        set_text(screen_main, 16, '')
        at_cops_csq()
        get_wea_and_time()
    end
    
    ......
    - 
            baiduapi_get_local(local_latitude,local_longitude) 
    ......
    end
end
--[[*********************************************************************
** function name   : baiduapi_get_local
** descriptions    : 通过baiduapi转换经纬度为具体地点
** local_latitude  : 经度
** local_longitude : 纬度
** @return          : nil,无返回值
** 注意               : 本例程中使用的百度api的key/ak可能失效,
**                      请自行在百度地图api上注册可靠的key/ak,
**                      测试时,在key/ak属性中,设置ip白名单为0.0.0.0,即可使用
** 推荐的地图api     : 百度地图api逆地址解析:
http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
*********************************************************************--]]
function baiduapi_get_local(local_latitude,local_longitude)
--本例程中使用的百度api的key/ak可能失效,请自行在百度地图api上注册可靠的key/ak
    air_http_get(
'http://api.map.baidu.com/reverse_geocoding/v3/?ak=isoa0q3napehtpcojvh5k4ghnkkhhqt0&output=json&coordtype=wgs84ll&location='..local_latitude..','..local_longitude,
        baiduapi_get_local_cb)
end
--[[*********************************************************************
** function name : my_find_chinashi
** descriptions  : 转换城市名(utf-8),如’广州市‘转换为’广州
** cityaddr       : 城市名称
** @return        : nil,无返回值
*********************************************************************--]]
function my_get_newcity(cityaddr)
   
    local strlen = string.len(cityaddr)
    local find_data  = 0
    local new_cityaddr = cityaddr
    
    for i = (strlen - 3), strlen
    do
        --转换城市名字符串为16进制数
        find_data = (find_data << 8) | string.byte(cityaddr, i, i)   
    end
    
    if (find_data & 0xffffff) == 0xe5b882
    then
        --转换城市名
        new_cityaddr = string.sub(cityaddr, 1, (strlen - 3))
    end
    
    return new_cityaddr
end
--[[*********************************************************************
** function name:  baiduapi_get_local_cb
** descriptions:   baiduapi请求的回调函数
*********************************************************************--]]
function baiduapi_get_local_cb(key,value)
    local string_time_ball=''
    
    if key=='data' then
        string_time_ball = table2str(value)  --表转换为字符串
        local jsondata=cjson.decode(string_time_ball) --json解析
        --提取表里的城市名(utf-8)
        local local_city = jsondata['result']['addresscomponent']["city"]
        local_city = my_get_newcity i(local_city) --转换城市名
        http_get_wea_and_time(local_city)     --获取指定城市的天气和北京时间
    end
end

▲下滑查看


核心api函数

1) baiduapi_get_local ()

函数内部封装4g at指令集http get资源请求函数air_http_get(),本例程中根据百度提供的资源接口,拼接经纬度发送请求。若百度响应改请求,则触发回到平baiduapi_get_local_cb()函数。

 

4. 获取时间/天气

当获取经中文城市名称后,获取所在的该城市的温度和天气,代码程序清单 4所示:


程序清单 4  获取天气

--[[*******************************************************************
--本例程中使用的天气api的key可能失效,请自行搜索可靠的天气api
--推荐在网络上购买付费的天气api,如济南易客云网络科技提供http天气访问接口
--如 https://www.tianqiapi.com/index/doc?version=v61
--免费天气api,如 https://www.tianqiapi.com/index/doc?version=v6
--xue、lei、shachen、wu、bingbao、yun、yu、yin、qing
*******************************************************************--]]
local wea = { ['unknow']=0,['xue']=1, ['lei']=2,['shachen']=3, 
                 ['wu']=4,['bingbao']=5,['yun']=6,['yu']=7,['yin']=8,
                 ['qing']=9, ['yunnight']=10, ['qingnight']=11}
local wea_chinese = { ['unknow']='未知',['xue']='雪',['lei']='雷',
                     ['shachen']='沙尘暴',['wu']='有雾',['bingbao']='冰雹', 
                     ['yun']='多云', ['yu']='下雨', ['yin']='阴天',
                     ['qing']='晴天',['yunnight']='多云',['qingnight']='晴天' }
                  
--[[*********************************************************************
** function name:  on_get_wea_cb
** descriptions:   获取指定城市的天气和北京时间的回调函数
*********************************************************************--]]
function on_get_wea_cb(key,value)
    local jsonstring_wea_ball=''
    local jsondata_string = ''
    local city,wea_img,tem = 0,0,0
    
    if key=='data' then
        jsonstring_wea_ball = table2str(value) --表转换为字符串
        local jsondata = cjson.decode(jsonstring_wea_ball) --解析json数据
        city = jsondata.city --获取城市,utf8编码
        wea_img = jsondata.wea_img --获取天气
        tem = jsondata.tem --获取温度
        set_text(screen_main,7,city) --显示城市名(utf-8)
        set_value(screen_main,10,wea[wea_img]) --设置天气图标
        ---获取当前时间用于显示晚上的图标
        yearwea,monwea,daywea,hourwea,minwea,secwea,weekwea=
                get_date_time()
        if wea_img == 'yun' or wea_img == 'qing' 
        then
            if hourwea <= 6 and hourwea >= 19 
            then
                if wea_img == 'yun' 
                then
                    --显示晚上多云的图标
                    set_value(screen_main,10,wea['yunnight'])
                end
                if wea_img == 'qing' 
                then
                    --显示晚上晴的图标
                    set_value(screen_main,10,wea['qingnight']) 
                end
            end
        end
        --设置天气中文名称
        set_text(screen_main,9,wea_chinese[wea_img])
        set_text(screen_main,8,tem) --设置温度
        set_text(screen_main,16,'')
        set_visiable(screen_main, 16, 0)
    end
end
--[[*****************************************************************
** function name:  on_get_time_cb
** descriptions :  获取时间回调函数
** @key         :  屏幕->4g模块的发送请求
** @value       :  4g模块->返回的数据
** @return      :  nil,无返回值
*****************************************************************--]]
function on_get_time_cb(key, value)
    --*****************************************************************
    --value:         
{"systime2":"2020-08-15 14:52:12","systime1":"20200815145212"}
    --要提取的值:      2020-08-15 14:52:12
    --对应正则表达式:  '"systime2":"(%d*)-(%d*)-(%d*) (%d*):(%d*):(%d*)"' 
    --*****************************************************************
    local string_time_ball=''
    local get_year, get_mon, get_day, get_hour, get_min, get_sec = 0
    local regular_e = '"systime2":"(%d*)-(%d*)-(%d*) (%d*):(%d*):(%d*)"'                    --正则表达式
    
    if key=='data' 
	then
       --表转换为字符串
        string_time_ball = table2str(value) 
        get_year, get_mon, get_day, get_hour, get_min, get_sec = string.match( string_time_ball, regular_e)--获取字符串中的时间
        set_date_time(get_year, get_mon, get_day, get_hour, get_min, get_sec)
    end
end
--[[*****************************************************************
** function name: http_get_time
** descriptions : 获取时间
** @return       : nil,无返回值
** 注意            : 本例程中使用的获取时间的连接,可能会失效,请自行搜索可靠连接
**                   可以使用 'at cipgsmloc=1,1' 指令获取大致的北京时间,此方法得到的时间有可能有误差
*****************************************************************--]]
function http_get_time()
    --本例程中使用的获取时间的连接,可能会失效,请自行搜索可靠连接
    air_http_get(
        'http://quan.suning.com/getsystime.do',
        on_get_time_cb)
end
--[[*********************************************************************
** function name:  http_get_wea_and_time
** descriptions:   获取指定城市的天气和北京时间
** 本例程中使用的天气api的key可能失效,请自行搜索可靠的天气api
** 推荐在网络上购买付费的天气api,如济南易客云网络科技提供http天气访问接口
** 如 https://www.tianqiapi.com/index/doc?version=v61
** 免费天气api,如 https://www.tianqiapi.com/index/doc?version=v6
*********************************************************************--]] 
function http_get_wea_and_time(local_city)
    if local_city~=nil 
    then
        set_text(screen_main,16,'正在获取天气...')
        http_get_time()
--本例程中使用的天气api可能失效,请自行搜索可靠的天气api
        air_http_get(
'https://tianqiapi.com/api?version=v61&appid=37231943&appsecret=2bj3teqj&city='..local_city,
            on_get_wea_cb,
            'user_defined',
            'ntent-type: application/x-www-form-urlencoded'
            )  
    end
end

▲下滑查看

核心api函数

1) http_get_wea_and_tim e()

函数内部封装4g at指令集http get资源请求函数air_http_get(),本例程中根据济南易客云网络科技提供付费和免费的资源接口。其中免费的访问获取次数是200次/天,付费的是5000次/天。该服务器响应请求自动回调on_get_wea_cb处理响应的信息。同理,获取同步云端时间调用http_get_time()即可。







5.3 下载工程

在菜单栏中,文件打开工程目录,在dciot_build’目录的‘private’文件夹拷贝到sd卡中,5-45-5所示;把sd卡接上串口屏后重新上电,等到提示烧录工程成功后,拔掉sd卡重新上电即可。

图5-4下载文件

 

图5-5拷贝到sd卡