韩国电影《教室爱欲》,国产精品99久久久久久久女警,69国产成人精品午夜福中文,国产熟妇乱xxxxx大屁股网

您的位置:首頁   >  關于我們  >  新聞動態

大彩串口屏4G應用--MQTT連接阿里云

發布人:大彩科技發布日期:2021-03-25

演示視頻

一、適用范圍


本文檔適合大彩PM 4G系列串口屏產品使用。





二、開發環境版本


1. VisualTFT軟件版本:V3.0.1.1133及以上的版本。

版本查看:

1) 打開VisualTFT軟件啟動頁面如圖2-1軟件版本,右上角會顯示的軟件版本號;

2-1軟件版本


2) 打開VisualTFT,在軟件右下角可以查看軟件版本圖2-2軟件版本,最新版本可登錄http://www.bdklxf.com/進行下載。

2-2軟件版本


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

版本查看:

1) 查看屏幕背面版本號貼紙;

2) VisualTFT與屏幕聯機成功后,右下角顯示的版本號。





三、概述


阿里云IoT提供的一款針對生活領域的物聯網平臺,以解決家電設備快速智能化的問題。平臺針對家電智能化的設備連接、移動端控制、設備管理、數據統計等問題,提供了一整套配置化方案,大幅減低設備-云-APP的開發成本。了解阿里云平臺更多信息,詳細介紹請參考阿里云官網上《關于生活物聯網平臺》文檔。

本例程主要介紹,PW-4G系列如何用一機一密方式連接阿里云。以空調為例,對空調的溫度、開關機、模式、濾網時間等參數進行數據交互





四、參考資料


1. 《LUA 腳本API V1.4》可通過以下鏈接下載物聯型開發包獲取:

http:/www.bdklxf.com/index.php?s=/List/index/cid/19.html

2.《LUA基礎學習》可通過以下鏈接下載物聯型開發包獲取:

http:/www.bdklxf.com/index.php?s=/List/index/cid/19.html

3. LUA腳本初學者可以通過下面鏈接進行學習。

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





五、教程實現


本章節主要串口屏-阿里云-APP數據交互的配置流程,將分為以下3個階段講述教程DEMO是如何實現:

1. 準備工程素材;

2. 阿里云平臺配置;

3. 配置串口屏工程;






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.bdklxf.com/下載。如圖5-2所示;

5-2下載軟件






5.2

阿里云平臺配置

阿里云生活物聯網平臺配置流程主要包括以下7個步驟:

1. 注冊賬號

2. 創建工程

3. 創建產品

4. 功能定義

5. 設備調試

6. 人機交互

7. 批量投產

詳細到配置流程,可參考我司《WIFI-連接阿里云教程》相應阿里云平臺配置章節說明,或可參考直接登錄阿里云官網,文檔中心查閱更多內容。







5.3

配置串口屏工程

本文主要介紹以下2點:

(1) 畫面配置

(2) LUA編輯

5.3.1 準備工程素材

在畫面ID0中,信號運營商、APP QR Code、APP交互變量組成。

信號運營商:圖標件ID12表示信號等級、文本控件ID13表示運營商

APP QR Code:二維碼控件,使用手機云智能APP(阿里云公辦APP)掃碼,由于是一型一密,用戶掃碼需要開發者分享授權。

APP 交互的變量:控件ID1~ID10用于顯示、設置開/關機、濾網時間、溫度、設備模式等。畫面配置如圖5-3所示:

注意:其他非關鍵控件不在一一介紹,下文不在累述

圖5-3 畫面配置


5.3.2 LUA編輯 

本例程中,屏幕上電執行初始化操作,如加載4G AT 指令的庫、初始化和4G模塊的交互的函數、初始化4G模塊、開啟定時器獲取運營商和信號值。

4G模塊初始化完成后,提交阿里云認證,并設置mqtt相關參數、服務IP和端口等等,屏幕發出請求會話通知。一切就緒后,屏幕和云端可以進行數據交互。

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%15 == 0
        then
            --每15s調用一次,更新信號值
            at_cops_csq()
        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
     ......
     if key ~= nil
     then
         return              -- key為空時退出
     end

    ......
    --***************************************************************
    --條件:    4G初始化完成
    --功能:    使用使用AT指令獲取信號強度和運營商。
    --          使用 MQTT 提交三元組,阿里云認證。
    --調用函數:at_cops_csq()
    --函數功能:獲取信號強度和運營商
    --調用函數:aliyun_get_iot_token()
    --函數功能:提交阿里云認證
    --********************************************************************
    if string.find(key,'+SAPBR=1,1') ~= nil and string.find(value,'OK') ~= nil 
    then
        at_cops_csq()           --獲取信號強度
        aliyun_get_iot_token() –提交阿里云認證
    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模塊->屏幕,返回的數據

相關AT指令:
本例程中,初始化部分在on_air_resp_callback(key, value)回調函數中,需要判斷4G收發的相關AT指令,如下所示:

1) 獲取運營商:

    屏幕發送:AT+COPS?

    屏幕接收:OK


2) 獲取信號值AT:

    屏幕發送:AT+CSQ

    屏幕接收:OK


3) 網絡數據是否激活:

    屏幕發送:AT+SAPBR=1,1

    屏幕接收:OK


2. 提交阿里云認證

當4G初始化完成后,提交阿里云認證(三元組),代碼如程序清單 2所示:


程序清單 1初始化

--出廠工程測試使用的阿里云服務器的登錄id和三元組
local clientId      = '862991419835242'             --無限制
local productKey    = 'a1D2E9vaSuZ'                 --三元組的 productKey
local deviceName    = 'tuOVqg3nrVZnR2oMWwev'        --三元組的 deviceName
local deviceSecret = '36c51acc5e3a7e410fe55831fd5e899d'         --三元組的 deviceSecret 
--[[**********************************************************************
** Function name: aliyun_get_iot_token
** Descriptions : 連接Aliyun
** return         : nil,無返回值
**********************************************************************--]]
function aliyun_get_iot_token() 
    local msg  = 'clientId'..clientId..
                 'deviceName'..deviceName..
                 'productKey'..productKey
    local sign = md5_hmac(msg,deviceSecret)   --計算哈希值
    local http_data = 'productKey='..productKey..
                      '&sign='..sign..
                      '&clientId='..clientId..
                      '&deviceName='..deviceName
    --提交Aliyun認證
    air_http_post(
            'https://iot-auth.cn-shanghai.aliyuncs.com/auth/devicename',
            'application/x-www-form-urlencoded',
            http_data,
            on_aliyun_get_iot_token_cb
            )

    --設置二維碼
    qrstring = 
        'https://g.aliplus.com/ilop/static/download/ilopdownload.html?
         locale=zh-CN&pk='..productKey..'&dn='..deviceName
    set_text( screen_ac_control, 11, qrstring)
end

--[[*********************************************************************
** Function name:  on_aliyun_get_iot_token_cb
** Descriptions :  Aliyun認證回調函數
**                    成功時發送命令 AT+MCONFIG 和 AT+SSLMIPSTART
*********************************************************************--]]
function on_aliyun_get_iot_token_cb(key, value) 
    if key=='data' then
        local jsondata = cjson.decode(table2str(value)) --json解碼
        if jsondata ~= nil and jsondata['code'] == 200
        then
            iotId = jsondata['data']['iotId']
            iotToken = jsondata['data']['iotToken']

            mqtt_config(clientId,iotId,iotToken)
            mqtt_tcp_start(
                productKey .. '.iot-as-mqtt.cn-shanghai.aliyuncs.com',
                1883,
                True )
        end
    end
end

▲下滑查看


API函數

1) aliyun_get_iot_token()
提交阿里云認證(三元組)和設置二維碼。

2) air_http_post (url,content_type,post_data,callback)

HTTP POST操作,例程中次數用于提交阿里云認證(三元組)。

  • url:網頁URL
  • content_type:自定義,參數值
  • post_data:寫數據
  • callback:4G數據回調函數


3) on_aliyun_get_iot_token_cb(key, value)
Aliyun認證回調函數,當云端反饋正常認證后,調用系統4G AT 指令的庫

的mqtt_config()設置MTQQ參數、mqtt_tcp_start()設置服務器IP和端口。

  • key:云端恢復的類型
  • Value:云端恢復的數據


3. 設置云端IP和端口
當云端認證成功和設置mqtt相關參數后,調用mqtt_config() 、mqtt_tcp_start() 設置云端IP和端口,調用mqtt_connect() 與服務器建立會話連接 ,代碼如程序清單 3所示:

程序清單 3  設置云端IP和端口

--[[*********************************************************************
** Function name:  on_aliyun_get_iot_token_cb
** Descriptions :  Aliyun認證回調函數
**                 成功時發送命令 AT+MCONFIG 和 AT+SSLMIPSTART
*********************************************************************--]]
function on_aliyun_get_iot_token_cb(key, value)
    ......
    mqtt_config(clientId,iotId,iotToken)
    mqtt_tcp_start(productKey ..
                 '.iot-as-mqtt.cn-shanghai.aliyuncs.com', 1883, true)
    ......
end

--[[*********************************************************************
** Function name:  on_air_resp_callback
** Descriptions :  4G模塊-數據回調接口
** @key          :  屏幕->4G模塊的發送請求
** @value        :  4G模塊->返回的數據
*********************************************************************--]]
function on_air_resp_callback(key, value)  

    my_print('on_air_resp_callback()')
    ......
    --****************************************************************
    --條件:    連接Aliyun,AT+SSLMIPSTART 成功
    --功能:    發送AT+MCONNECT=...
    --********************************************************************
    if string.find(key, '+SSLMIPSTART') ~= nil and 
       string.find(value, 'CONNECT OK') ~= nil
    then
        my_print('mqtt_connect(1,600)')
        mqtt_connect(1,600)
    end
end

▲下滑查看


核心API函數
1) mqtt_config(clientid,username,password,will_qos,will_retain,will_topic,will_message)

設置 MQTT 相關參數,本例程,只需要填寫客戶身份、登陸服務器的用戶名以及密碼,其中這三個參數是有阿里云認證反饋回來的。

  • status:客戶身份
  • username:登錄服務器的用戶名
  • password:登錄服務器的密碼
  • will_qos:將要發送的信息的服務質量
  • will_retain:保留標志
  • will_topic:將要發送的消息的話題
  • will_message:將要發送的消息內容

 

2) mqtt_tcp_start(srvaddr,port,ssl)

設置服務器的IP、端口

  • srvad:服務器 IP 地址或 DNS 地址
  • port:服務器端口
  • ssl:設置為 true 時,使用SSL鏈接

 

3)  mqtt_connect()

客戶端向服務器請求會話連接

  • clean_session:會話狀態
  • keepalive    :保持時間

 

當屏幕向云端發送設置服務器IP、端口請求的時候,云端回應數據,觸發回調函數on_air_resp_callback(key, value),應答‘CONNECT OK’后,發起請求連接mqtt_connect(1,600)
 
4. 發起連接請求
當客戶端向服務器請求會話連接成功后,客戶端對服務器訂閱主題,代碼如程序清單 4所示:

程序清單 4  發起連接請求

--[[*********************************************************************
** Function name:  on_air_resp_callback
** Descriptions :  4G模塊-數據回調接口
** @key           :  屏幕->4G模塊的發送請求
** @value        :  4G模塊->返回的數據
*********************************************************************--]]
function on_air_resp_callback(key, value)  
    ......
    --********************************************************************
    --條件:     接收 Aliyun 發布消息
    --功能:     在 cloud_on_property_set(payload) 中對消息進行處理。
    --調用函數:cloud_on_property_set(payload)
    --*******************************************************************
    if string.find(key, '+MCONNECT') ~= nil 
        and string.find(value,'CONNACK OK')~=nil
   then
        mqtt_sub(
            '/sys/'..productKey..'/'..deviceName..'/thing/service/property/set',
            0 ) 
        mqtt_sub_bit = 'sub_OK'
    end
end

▲下滑查看


核心API函數
1) mqtt_sub(topic,qos)

本命令從客戶端到服務器,用于一個或多個訂閱主題,當向服務器請求

  • topic:應用程序消息的主題
  • qos:申請消息的服務質量


5. 接收云端信息
當用戶手機APP設置數據的時候,云端自動將數據下發給屏幕,代碼如程序清單 5所示:

程序清單 5  接收云端數據

--[[*********************************************************************
** 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

if key == nil
then
        return
end

    --********************************************************************
    --條件:     接收 Aliyun 發布消息
    --功能:     在 cloud_on_property_set(payload) 中對消息進行處理。
    --調用函數:cloud_on_property_set(payload)
    --********************************************************************
    if string.find(value,'+MSUB') ~= nil and key == nil
    then
        local index = string.find(value,'{')

        my_print('index: '..index)

        if index ~= nil
        then
            local payload = string.sub(value, index,-1)
            if payload ~= nil 
            then
                cloud_on_property_set(payload)
            end
        end
    end
end

--[[*********************************************************************
** Function name:  cloud_on_property_set
** Descriptions :  接收云端數據
** @payload      :  數據字符串,Json格式
*********************************************************************--]]
function cloud_on_property_set(payload)
    my_print('cloud_on_property_set')

    --payload = string.gsub(payload,'22','"');

    local data = cjson.decode(payload) --解析JSON數據

    if data == nil 
    then 
        return 
    end

    if data['params'] == nil 
    then 
        return 
    end

    --開關機按鈕
    local powerstate = tonumber(data['params']['powerstate'])
    if powerstate ~= nil
    then 
        set_value(screen_ac_control,1,powerstate)
    end

    --濾網時間進度條
    local filter_time = tonumber(data['params']['filter_time'])
    if filter_time ~= nil
    then 
        set_value(screen_ac_control,3,filter_time)
    end

    --溫度文本
    local targetTemperature = tonumber(data['params']['targetTemperature'])
    if targetTemperature ~= nil
    then 
        set_value(screen_ac_control,4,targetTemperature)
    end

    --模式選擇控件
    local mode = tonumber(data['params']['mode'])
    if mode ~= nil
    then 
        set_text(screen_ac_control,8,my_resp_mode[mode])
    end
end

▲下滑查看

核心API函數

1) cloud_on_property_set(payload)

接收云端的數據

  • payload:Json格式的字符串


本例程中,假設用戶通過APP設置設備的模式,下發Json格式的字符串,數據原型如下所示:
+MSUB:"/sys/a1D2E9vaSuZ/PlYPGnoYWeUJujy0li2a/thing/service/property/set",95 byte,{"method":"thing.service.property.set","id":"2032042748","params":{"mode":3},"version":"1.0.0"}
通過Json庫函數cjson.decode(payload)解壓數據,則data['params']['mode'] 為模式的值,在將值設置到對應的滑動選擇控件上:
set_text(screen_ac_control,8,my_resp_mode[mode])

6. 發送云端信息

當用戶觸碰控件修改值時候,屏幕會自動將數據打包成Json格式發給云端,代碼如程序清單 6所示。

程序清單 6  發送數據到云端

local params = {}
local property = {}
local post_id = 1               --屏發布的消息次數ID
--[[*********************************************************************
** Function name:  aliyun_pub
** Descriptions :  屏發布消息時,此函數處理消息內容,并發送
** @screen      : aliyun 畫面ID
** @control     : 控件ID
** @value       : 控件值
** @return      : nil,無返回值
*********************************************************************--]]
function aliyun_pub(screen, control, value) 
    params   = nil
    property = nil
    params   = {} 
    property = {}
    property['method'] = 'thing.event.property.post'
    property['id'] = ''..post_id
    property['version'] = '1.0'
    post_id = post_id + 1

    if screen == screen_ac_control
    then
        --按下開關按鈕
        if control == 1
        then
            local PowerSwitchName = 'powerstate'
            params[PowerSwitchName] = value --在表寫入按鈕數值
            property['params'] = params
            local jsonStr = cjson.encode(property)
            --發布消息
            mqtt_pub(
'/sys/'..productKey..'/'..deviceName..'/thing/event/property/post',
            0,
            0,
            jsonStr
            )
        end 
    end 
    if screen == screen_ac_control
    then
        --按下滑塊
        if control == 3
        then
            local PowerSwitchName = 'filter_time'
            params[PowerSwitchName] = value --在表寫入滑塊數值
            property['params'] = params
            local jsonStr = cjson.encode(property)
            --發布消息
            mqtt_pub(
'/sys/'..productKey..'/'..deviceName..'/thing/event/property/post',
            0,
            0,
            jsonStr
            )
        end 
    end 

    if screen == screen_ac_control
    then
        --按下溫度設置按鈕,溫度減
        if control == 6 and value == 1
        then
            temp_value = tonumber(get_text(screen_ac_control,4))
            temp_value = temp_value-1
            if temp_value<16 then
                temp_value = 16
            end
            set_text(screen_ac_control,4,temp_value)

        --按下溫度設置按鈕,溫度加
        elseif control == 7 and value == 1
        then
            temp_value = tonumber(get_text(screen_ac_control,4))
            temp_value = temp_value+1
            if temp_value>32 then
                temp_value = 32
            end
            set_text(screen_ac_control,4,temp_value)
        end
        local PowerSwitchName = 'targetTemperature'
        params[PowerSwitchName] = temp_value --在表寫入溫度數值
        property['params'] = params     
        local jsonStr = cjson.encode(property)
        --發布消息
        mqtt_pub(
'/sys/'..productKey..'/'..deviceName..'/thing/event/property/post',
        0,
        0,
        jsonStr
        )

    end 

    if screen == screen_ac_control
    then
        if control == 10
        then
            local PowerSwitchName = 'mode'
            params[PowerSwitchName] = value
            property['params'] = params     
            local jsonStr = cjson.encode(property)    
            mqtt_pub(
'/sys/'..productKey..'/'..deviceName..'/thing/event/property/post',
            0,
            0,
            jsonStr
            )
        end 
    end 
end


--[[**********************************************************************
** Function name : on_control_notify
** Descriptions  : 系統回調函數,用戶通過觸摸修改控件后,執行此回調函數。
**                 點擊按鈕控件,修改文本控件、修改滑動條都會觸發此事件。
** @return       : nil,無返回值
**********************************************************************--]]
function on_control_notify(screen,control,value)

    --********************************************************************
    --位置:    空調控制器
    --********************************************************************
    if screen == screen_ac_control 
    then
        if control == 1 or 
           control == 3 or
           control == 6 or
           control == 7 or 
           control == 10
        then
            --屏發布消息
            aliyun_pub(screen,control,value)
        end
    end
end

▲下滑查看


核心API函數

1) mqtt_pub (topic,qos,retain,message)

發送數據到云端,傳送應用消息

  • topic    :應用程序消息的主題
  • qos      :申請消息的服務質量
  • retain   :保留標志
  • message:消息內容

本例程中,假設用戶修改模式,則將數據Json格式上傳到云端,,數據原型如下所示:

AT+MPUB="/sys/a1D2E9vaSuZ/PlYPGnoYWeUJujy0li2a/thing/event/property/post",0,0,"{22version22:221.022,22params22:{22mode22:0,22targetTemperature22:27},22id22:226122,22method22:22thing.event.property.post22}"
通過Json庫函數jsonStr = cjson.encode(payload)打包成Json格式的數據,則jsonStr為上傳的數據。






5.4

下載工程

工程編譯成功后在輸出窗口會提示編譯成功,如5-4所示。編譯成功后點擊菜單欄中【工具】→【量產向導】,如5-5所示;

圖5-4編譯成功

圖5-5量產向導


在菜單欄中,文件→打開工程目錄,在‘dciot_build’目錄的‘private’文件夾拷貝到SD卡中,如圖5-6和圖5-7所示;把SD卡接上串口屏后重新上電,等到提示燒錄工程成功后,拔掉SD卡重新上電即可。

圖5-6量產向導


圖5-7拷貝到SD卡






主站蜘蛛池模板: 元谋县| 普兰店市| 洛川县| 广州市| 绥德县| 玉树县| 潼关县| 墨竹工卡县| 宕昌县| 朝阳县| 兴化市| 双柏县| 云龙县| 赤壁市| 浮梁县| 七台河市| 响水县| 白城市| 房产| 英超| 左贡县| 梁平县| 南阳市| 济南市| 阿城市| 绥中县| 呈贡县| 乐清市| 凉山| 九龙县| 绥芬河市| 仲巴县| 云霄县| 维西| 襄城县| 东丽区| 嘉义县| 安乡县| 临沧市| 新巴尔虎左旗| 古田县|