文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

【Tutorial】用群登LoRa智慧積木自建LoRaWAN網路

作者:柯大

本文將為大家介紹如何用群登科技(Acsip)的LoRa開發套件來自建LoRaWAN網路,這個開發套件是LoRa Smart Blocks Development Kit ,含LoRa智慧型積木組件及正文 Gemtek Indoor Gateway。

群登這套LoRa智慧型積木組件採用通過LoRa Alliance、CLAA、Actility等多重認證的S76S/S78S LoRa模組,透過感測板(Sensor Board)、LoRa板(LoRa Board)及電池板(Battery Board)來組合成一積木式套件,一舉滿足LoRa物聯網應用開發的三大重點:主控板、LoRaWAN及電源需求,進一步降低進入物聯網領域的門檻,協助Maker們快速熟悉LoRa Smart Blocks,輕鬆利用這些軟硬體智慧積木,組合搭配出各式各樣的物聯網應用,讓Maker輕易完成概念性驗證(Proof of Concept),加速物聯網產品上市時程。

LoRa開發套件(圖片來源:群登Acsip)

LoRa開發套件應用(圖片來源:群登Acsip)

LoRa Smart Blocks方案的感測板採用使用者最為熟悉,且軟、硬體整合功能強大的Arduino開發板,讓使用者得以在此開發平台上輕易地與各種Sensor進行整合。LoRa 板則是採用群登號稱全球體積最小的S76S LoRa通訊模組,透過UART介面將感測板的Sensor訊號由LoRa模組傳送至Gateway及雲端平台。積木式套件另提供電池板,可使LoRa開發板自備電源,使得供電方式更為彈性,方便戶外測試更為便利。

LoRa Smart Blocks 套件主要積木組件規格如下:

1.LoRa Board :S76S SemtechSX1276

圖片來源:群登Acsip官網

2. Sensor Board (compliant Arduino UNO)

  • MCU: ATmega328P ,提供GPIO/I2C/ADC/UART
  • 開發環境: Arduino
  • 感測器:內建SHT30高精度溫溼度感測、MC3630 mCube 3軸加速器,二種感測器均為I2C介面,Address分別為0x45、0x6C
  • 程式燒錄:AVR ISP(透過ICSP 連接Arduino UNO SPI介面,Arduino as ISP方式燒錄)

圖片來源:群登Acsip官網

3. Battery Board:Lithium/ 3.7V /300mAh

4. Gemtek LoRa Indoor Gateway Unit:Gemtek indoor 16 channel LoRaWAN Gateway

圖片來源:正文Gemtek官網

LoRa Smart Blocks Development Kit ,主要智慧型積木組件接腳圖如下:

圖片來源:群登Acsip

程式燒錄透過Sensor Board ICSP 連接Arduino UNO SPI介面,以Arduino as ISP方式燒錄。

Arduino UNO與Sensor Board接腳連接方式如下,詳細燒錄步驟請參考群登科技所提供的文件及範例。

  1. UNO D13 ←→ ICSP SCK (pin 3)    UNO D12 ←→  ICSP MISO (pin 1)
  2. UNO D11 ←→ ICSP MOSI (pin 4)   UNO D10 ←→  ICSP REST (pin 5)
  3. UNO 5V ←→  ICSP +5V (pin 2)    UNO GND ←→  ICSP GND (pin 6)

圖片來源:群登Acsip

LoRa Smart Blocks的S76S LoRa通訊模組同時支援Node to Node 的P2P自建LoRa網及LoRaWAN 1.0.2協議LoRa網路架構。Smart Blocks的LoRa Board S76S LoRa Command 指令集類型分為:SIP commands指令集、MAC commands指令集、RF commands指令集等3種指令類型,並依模組的運作模式分為:LoRaWAN 模式指令、Node to Node 模式指令。

UART 連線預設參數為:115200,N,8,1,可利用Serial port control software 來測試。

UART 連線(圖片來源:群登 Acsip)

SIP commands:LoRa晶片模組內部指令集

指令集

  1. sip factory_reset :恢復參數為出廠設定值
  2. sip get_ver : 讀取firmware version.
  3. sip get_hw_deveui :讀取Get hardware EUI
  4. sip reset :重置模組
  5. sip get_hw_model : 讀取hardware model & firmware version
  6. sip set_echo <Status>:Enable or disable UART echo mode;<Status>: on or off
  7. sip set_log <Log_Level> :<Log_Level> debug: show all logs, info ,顯示log
  8. sip sleep <Time> <Interruptible> :<Time>:設定 sleep time in seconds,2-65536.;<Interruptible> 當sleep mode時可否由UART叫醒,uart_on/uart_off;Example: sip sleep 100 uart_on
  9. sip set_baudrate <baudrate> <password> :<baudrate>:9600,19200, 57600 and 115200.;<password>:password baudrate protection;Example: sip set_baudrate 9600 12345678
  10. sip_get_hw_model_ver:讀取hardware model  

MAC commands:LoRa MAC協議指令集

設定頻段之各Channel頻段預設如下:可用mac set_ch_freq指令更改各Channel頻段

Channel頻段預設(圖片來源:柯大提供)

LoRa MAC協議指令集

  1. mac set_band <FreqBand>:設定頻段 <FreqBand>: 470, 868, 902, 915, 923, 922,924.  Example: mac set_band 923
  2. mac tx <Type> <PortNum> <Data> : 傳送資料 <Type>:transmitting message  cnf (confirmed) or ucnf(unconfirmed).;<PortNum>:port number for transmission, 1~223.;<Data>:hexadecimal string data to be transmitted. (e.g. 98ba34fd means “0x98, 0xba, 0x34, 0xfd 4bytes would be sent out”);Example: mac tx ucnf 15 98ba34fd
  3. mac join <Mode> :設定加入LoRaWAN 方式。 <Mode>:LoRaWAN join mode:otaa (over‐the‐air activation) or abp(activation by personalization)
  4. mac save :儲存LoRaWAN 參數值.
  5. mac get_join_status :讀取 LoRaWAN join status
  6. mac set_deveui <DevEUI>:設定Device EU。<DevEUI>:8‐byte hexadecimal Device EUI for LoRaWAN.
  7. mac set_appeui <AppEUI>:設定 Application EUI 。<AppEUI>:8‐byte hexadecimal Application EUI for LoRaWAN.
  8. mac set_appkey <AppKey>:設定 Application Key 。<AppKey>:16‐byte hexadecimal Application Key for LoRaWAN.
  9. mac set_devaddr <DevAddr> :設定Device Address。<DevAddr>:4‐byte hexadecimal Device Address for LoRaWAN.
  10. mac set_nwkskey <NwkSessionKey>:設定Network Session Key。<NwkSessionKey>:16‐byte hexadecimal Network Session Key for LoRaWAN.
  11. mac set_appskey <AppSessionKey>:設定Application Session Key。<AppSessionKey>:16‐byte hexadecimal Application Session Key for LoRaWAN.
  12. mac set_power <Power>:設定transmitting power in dBm。<Power>:non‐915 band:2, 5, 8, 11, 14, 20;915 band:30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10;470 band:17, 16, 14, 12, 10, 7, 5, 2
  13. mac set_dr <Datarate>:設定 data rate。<DataRate>:0 ~ 6
  14. mac set_txretry <RetryCount>:設定重傳次數。<RetryCount>:0 ~255
  15. mac set_rxdelay1 <Delay> :設定接收窗RX#1 間隔時間,<Delay>:0 ~65535 ms. 接收窗RX#2 將被設定 <Delay>+1
  16. mac set_rx2 <DataRate> <Frequency> : 設定接收窗RX#2接收rate及頻段;<DataRate>:868band:0 ~ 7 , 470 band: 0 ~ 5 , 902‐924 band: 0 ~ 15;<Frequency>:862000000 ~  932000000 Hz
  17. mac set_ch_freq <ChannelId> <Frequency>:設定指定Channel 頻段;<ChannelId>:EU868: 0 ~ 15; US902: 0~71;<Frequency>:902‐924 band: 902000000~932000000;470 band : 470000000 ~510000000;other bands :433000000 ~ 932000000
  18. mac set_ch_dr_range <ChannelId> <MinDR> <MaxDR;<ChannelId>: EU868 range : 0 -15; US902: 0 – 71;<MinDR>: minimum data rate, 0 -6;<MaxDR>: maximum data rate, 0 – 6.;Example:mac set_ch_dr_range 0 0 6
  19. mac set_ch_status <ChannelId> <Status>;<ChannelId>: EU868 range : 0 -15; US902: 0 – 71;<Status>: on or off.;Example:mac set_ch_status 0 on
  20. mac get_dc_ctl <on /off> :讀取duty cycle status
  21. mac set_dc_ctl <on /off> :設定duty cycle status
  22. mac get_dc_band <BandID> :讀取<BandID> duty cycle
  23. mac set_upcnt:讀取Uplink計數值
  24. mac set_downcnt:讀取Downlink計數值
  25. mac get_class:讀取 LoRaWANTM class type
  26. mac get_devaddr:讀取devaddr值
  27. mac get_deveui:讀取deveui值
  28. mac get_appeui:讀取appeui值
  29. 29.mac get_nwkskey:讀取network session key值
  30. mac get_appskey:讀取application session key值
  31. mac get_appkey:讀取appkey值
  32. mac get_dr:讀取LoRaWANTM data rate值
  33. mac get_band:讀取頻段值
  34. mac get_power:讀取發射power值
  35. mac get_txretry:讀取重傳次數
  36. mac get_rxdelay:讀取接收窗RX#1 RX#2間隔時間
  37. mac get_rx2:讀取接收窗RX#2接收rate及頻段
  38. mac get_ch_para <ChannelId>:讀取 channel 設定的參數值
  39. mac get_ch_status <ChannelId>:讀取 channel on/off狀態  

RF commands:LoRa RF發射接收指令集

發射接收指令集

  1. rf tx <Data>:傳送資料<Data>: hexadecimal string
  2. rf rx <RxWindowTime> :等待接收資料(0-65535ms),0:等待至收到資料。
  3. rf set_freq <Frequency>:設定頻段:862000000 to 932000000 (868 to 924 bands);137000000 to 525000000 (433 or 470 band).
  4. rf set_pwr <Power>:設定發射功率:0-20dBm
  5. rf set_sf <SpreadingFactor>:設定SF值:7-12
  6. rf set_bw <BandWidth>:設定頻寛:125, 250, 500
  7. rf set_cr <CodingRate>:設定code rate:4/5, 4/6, 4/7, 4/8
  8. rf set_prlen <PreambleLength>:設定preamble length: 0 – 65535
  9. rf set_crc <State>:設定 CRC on/off
  10. rf save:Save p2p configuration parameters to EEPROM
  11. rf get_freq:讀取p2p頻段
  12. rf get_pwr:讀取power值
  13. rf get_sf:讀取SF值
  14. rf get_bw:讀取頻寛值  

LoRaWAN command測試

Join ABP mode

測試mode

 // Set channel frequency channel number and frequency depends on server configuration

mac set ch_freq 0 926500000

>> Ok

mac set ch_freq 1 926700000

>> Ok

mac set ch_freq 2 926900000

>> Ok

// Set following according to LoRaWAN configuration

mac set_devaddr 00220009

>> Ok

mac set_nwkskey 965F6942F29C9EBE5747E25F07DA5114

>> Ok

mac set_appskey A46847D184323C21C992D8F9EF4B7CE9

>> Ok

// Activation by Personalization

mac join abp

>> Ok

>> accepted

// Send unconfirmed uplink on port 15

mac tx ucnf 15 1234

>> Ok

>> tx_ok

Join OTAA mode

測試mode

 // Set channel frequency channel number and frequency depends on server configuration

mac set_ch_freq 0 926500000

>> Ok

mac set_ch_freq 1 926700000

>> Ok

mac set_ch_freq 2 926900000

>> Ok

// Set following according to LoRaWAN configuration

mac set_deveui 9c65f9fffeabcd12

>> Ok

mac set_appeui 70B3D57ED000059E

>> Ok

mac set_appkey C1FE94B0F5F6A50E83015B3C45C933A9

>> Ok

// Over‐the‐Air Activation

mac join otaa

>> Ok

>> accepted

// Send unconfirmed uplink on port 15

mac tx ucnf 15 1234

>> Ok

>> tx_ok  

Confirmed Uplink and Downlink

測試mode

 // Send confirmed uplink on port 15

mac tx cnf 15 1234 // Send 0x12, 0x34 to server

>> Ok

>> tx_ok

mac tx cnf 15 1234

>> Ok

>> err // Fail to get confirm from server

mac tx cnf 15 1234

>> Ok

>> rx 15 6432 // Receive downlink (0x64, 0x32) from server on port 15 

Node to Node command測試

測試mode

rf set_sync 12 // Set SyncWord to 0x12

>> Ok

rf set_freq 926500000 // Set frequency to 926500000Hz

>> Ok

rf set_sf 7 // Set spreading factor to 7

>> Ok

rf set_bw 125 // Set bandwidth to 125KHz

>> Ok

// Send LoRa packet

rf tx 1234567890

>> Ok

>> radio_tx_ok

// Receive LoRa packet

rf rx 10000 // Open an 10s receive window

>> Ok

>> radio_rx 1234567890 ‐90 7.2 // Received data, RSSI and SNR 

自組LoRaWAN實作介紹

可利用LoRa Smart Blocks套件所提供的積木式LoRa Node(結合了Arduino Sensor board內建的SHT30高精度溫溼度感測、MC3630 mCube 3軸加速器感測器),以Arduino 範例連接到Kit所提供的Gemtek Indoor LoRa Gateway 進行實作測試,步驟如下:

1.連線進入Gateway後台,設定LoRa Node 以OTAA方式Join LoRaWAN 之AppEUI、DevEUI、DevAddr、AppKey。

圖片來源:柯大提供

2.設定LoRa Node 以ABP方式Join LoRaWAN 之DevAddr、NwksKey、AppsKey。

圖片來源:柯大提供

3.設定Gemtek Indoor LoRa Gateway Network Server 以及MQTT forward LoRa 封包。

圖片來源:柯大提供

4.查看Gemtek Indoor LoRa Gateway WAN的MAC Address。

圖片來源:柯大提供

5.利用MQTTBox Client 接收LoRa Gateway Network Server forward 的LoRa 封包。

圖片來源:柯大提供

6.查看Gemtek Indoor LoRa Gateway LoRa Module 1,2各channal 設定的頻段

圖片來源:柯大提供

7.LoRa board (S76S) 端連接至LoRa Gateway LoRaWAN ABP方式:

(1)利用Serial port 連線軟體測試

範例程式

mac set_deveui FFFFFFFFFFFFFFFF

mac set_appkey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

mac set_devaddr FFFFFFFF

mac set_appskey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

mac join abp

mac get_deveui

mac get_devaddr

mac get_nwkskey

mac get_appskey

mac get_appkey

//啟動 Channel0-Channel15 配合 Gemtek Indoor 16Channel Gateway

mac set_join_ch 0 on

mac set_join_ch 1 on

mac set_join_ch 2 on

mac set_join_ch 3 on

mac set_join_ch 4 on

mac set_join_ch 5 on

mac set_join_ch 6 on

mac set_join_ch 7 on

mac set_join_ch 8 on

mac set_join_ch 9 on

mac set_join_ch 10 on

mac set_join_ch 11 on

mac set_join_ch 12 on

mac set_join_ch 13 on

mac set_join_ch 14 on

mac set_join_ch 15 on

//設定 Channel0-Channel15 頻段,配合 Gemtek Indoor 16Channel Gateway

mac set ch_freq 0 922625000

mac set ch_freq 1 922875000

mac set ch_freq 2 923125000

mac set ch_freq 3 923375000

mac set ch_freq 4 923625000

mac set ch_freq 5 923875000

mac set ch_freq 6 924125000

mac set ch_freq 7 924375000

mac set ch_freq 8 925125000

mac set ch_freq 9 925375000

mac set ch_freq 10 925625000

mac set ch_freq 11 925875000

mac set ch_freq 12 926125000

mac set ch_freq 13 926375000

mac set ch_freq 14 926625000

mac set ch_freq 15 926875000

mac set_ch_dr_range 0 0 3

mac set_ch_dr_range 1 0 3

mac set_ch_dr_range 2 0 3

mac set_ch_dr_range 3 0 3

mac set_ch_dr_range 4 0 3

mac set_ch_dr_range 5 0 3

mac set_ch_dr_range 6 0 3

mac set_ch_dr_range 7 0 3

mac set_ch_dr_range 8 0 3

mac set_ch_dr_range 9 0 3

mac set_ch_dr_range 10 0 3

mac set_ch_dr_range 11 0 3

mac set_ch_dr_range 12 0 3

mac set_ch_dr_range 13 0 3

mac set_ch_dr_range 14 0 3

mac set_ch_dr_range 15 0 3

mac set_dc_ctl on

mac save

// Test

mac tx ucnf 2 123456F1    //Hex value 

(2)利用Arduino 測試Sample

範例程式

#include <Wire.h>

#include <MC3630.h>

//20170818 By CM =================================

//1. Change LED driver pin to PIN 13 (From Pin 4)

//2. Fix Downlink Bug

#define VERSION    1.1.4

//=================================================

//CM, DL control

#define CMD_NONE 0

#define CMD_HIGH 1

#define CMD_LOW 2

#define CMD_TOGGLE 3

uint8_t     data[8], i;

uint8_t     LED_PIN = 13;   //CM, Change to LED driver PIN 13 (PB5)

uint8_t     gDL_return_val=0;

MC3630      MC3630_acc = MC3630();

void setup() {

MC3630_acc.start();

Wire.begin();

//pinMode(10, OUTPUT);  //PB2

pinMode(4, OUTPUT);   //PD4

pinMode(LED_PIN, OUTPUT);   //PB5

digitalWrite(LED_PIN, HIGH);

//digitalWrite(4, HIGH);

Serial.begin(115200);

delay(1000);

/*

* you can setting LoRaWAN parameter by Ardurion, or saving parameter into EEPROM first.

*/

//Serial.print(“mac set_deveui FFFFFFFFFFFFFFFF”);

delay(100);

//Serial.print(“mac set_appkey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”);

delay(100);

//Serial.print(“mac set_devaddr FFFFFFFF”);

delay(100);

//Serial.print(“mac set_nwkskey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”);

delay(100);

//Serial.print(“mac set_appskey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”);

delay(100);

/*

*  joining by otaa (or abp), you should be get a accepted message.

*/

Serial.print(“mac join abp”);

delay(5000);

}

/*

* Send a ASCII packet by command “mac tx”

*/

void LoRaPackageTx(String keyword, float data)

{

String  str1, str2;

char    test[64];

int   i;

str1 = keyword+ data;

for(i=0; i<str1.length(); i++)

{

test[(i<<1)] = str1[i]>>4;

test[(i<<1)+1] = str1[i]&0xF;

if(test[(i<<1)]<0xA)  test[(i<<1)] = test[(i<<1)] +0x30;

else                  test[(i<<1)] = test[(i<<1)] +0x57;

if(test[(i<<1)+1]<0xA)  test[(i<<1)+1] = test[(i<<1)+1] +0x30;

else                  test[(i<<1)+1] = test[(i<<1)+1] +0x57;

}

test[(i<<1)] =  0x00;

str2 = test;

str1 = “mac tx ucnf 2 ” + str2;

Serial.print(str1);

//digitalWrite(4, HIGH);  //CM, For Debug

//digitalWrite(13, HIGH);

return;

}

/*

* Wait for 10 seconds, Breaking when if got “tx_ok”

*/

void WaitTxAck()

{

uint8_t     test[64], len, count, i;

for(count=0; count<50; count++)

{

len = Serial.available();

if(len>0)

{

Serial.readBytes(test, len);

for(i=0; i<len; i++)

{

if (test[i]==’m’)

{

if((test[i+1]==’a’)&&(test[i+2]==’c’)&&(test[i+3]==’ ‘)&&(test[i+4]==’r’)&&(test[i+5]==’x’))

{

if(test[i+10]==’0′)

{

gDL_return_val = CMD_LOW;

}

else if(test[i+10]==’1′)

gDL_return_val = CMD_HIGH;

else

gDL_return_val = CMD_TOGGLE;

len = 0;

}

}

else if (test[i]==’t’)

{

if((test[i+1]==’x’)&&(test[i+2]==’_’)&&(test[i+3]==’o’)&&(test[i+4]==’k’))

{

len = 0;  //CM, Uplink done.

//digitalWrite(4, LOW);  //CM, Debug

}

}

}

if(len==0)

{

count = 51;

//digitalWrite(4, LOW);  //CM, test “tx_ok” receiving

}

}

delay(200);

}

}

uint8_t WaitRxAck()

{

uint8_t test[64], len, count, i;

for(count=0; count<20; count++)

{

len = Serial.available();

if(len>0)

{

Serial.readBytes(test, len);

for(i=0; i<len; i++)

{

if(test[i]==’m’)

{

if((test[i+1]==’a’)&&(test[i+2]==’c’)&&(test[i+3]==’ ‘)&&(test[i+4]==’r’)&&(test[i+5]==’x’))

{

if(test[i+10]==’0′)

return CMD_LOW;

else if(test[i+10]==’1′)

return CMD_HIGH;

else

return CMD_TOGGLE;

}

}

}

}

delay(200);

}

return false;

}

/*

* How to operate with Sensor SHT30

*/

#define SHT30_ADDRESS       0x44

#define SHT30_ORDER_CATCH   0x24

#define SHT30_ORDER_PARA    0x00

#define TEMPERATURE_PARA    374.49

#define TEMPERATURE_PARA2   45

#define HUMIDITY_PARA       655.35

void SensorSHT30()

{

float       temp_data, humi_data;

uint32_t    buff_data;

 

Wire.beginTransmission(SHT30_ADDRESS);

data[7] = Wire.endTransmission();

if(data[7]==0)

{

data[0] = SHT30_ORDER_CATCH;

data[1] = SHT30_ORDER_PARA;

Wire.beginTransmission(SHT30_ADDRESS);

Wire.write(data, 2);

Wire.endTransmission();

delay(100);           //catch sensor data need sometime.

Wire.requestFrom(SHT30_ADDRESS, 6);

while(Wire.available() == 0);

for(i=0; i<6; i++)  data[2+i] = Wire.read();

buff_data = ((data[2]<<8)|data[3])&0xFFFF;

temp_data = (buff_data/TEMPERATURE_PARA)-TEMPERATURE_PARA2;

LoRaPackageTx(“TP:”, temp_data);

WaitTxAck();

buff_data = ((data[5]<<8)|data[6])&0xFFFF;

humi_data = (buff_data/HUMIDITY_PARA);

LoRaPackageTx(“HU:”, humi_data);

WaitTxAck();

}

return;

}

/*

* How to operate with Sensor MC3630

*/

#define MC3630_ADDRESS      0x6C

void SensorMC3630()

{

Wire.beginTransmission(MC3630_ADDRESS);

data[7] = Wire.endTransmission();

if(data[7]==0)

{

MC3630_acc_t rawAccel = MC3630_acc.readRawAccel();

LoRaPackageTx(“GX:”, rawAccel.XAxis_g);

WaitTxAck();

LoRaPackageTx(“GY:”, rawAccel.YAxis_g);

WaitTxAck();

LoRaPackageTx(“GZ:”, rawAccel.ZAxis_g);

WaitTxAck();

}

return;

}

void loop() {

static bool pin_status = false;

SensorSHT30();

SensorMC3630();

switch(gDL_return_val)

{

case CMD_HIGH:

pin_status=true;

digitalWrite(LED_PIN, HIGH);

break;

case CMD_LOW:

pin_status=false;

digitalWrite(LED_PIN, LOW);

break;

case CMD_TOGGLE:

{

if(pin_status)

digitalWrite(LED_PIN, LOW);

else

digitalWrite(LED_PIN, HIGH);

pin_status=!pin_status;

break;

}

default: break;

}

8.MQTTbox 接收Gateway轉送資訊封包:

圖片來源:柯大提供

圖片來源:柯大提供

(責任編輯:葉于甄)


 

柯大

柯大

現為MakerPRO技術顧問,有近30年資訊電子產業研發經驗,關心最新技術,並投入不綴。亦熱心指導新興團隊參與技術創意競賽,獲獎無數。
專長包括物聯網軟硬體整合規劃設計、資訊服務系統整合規劃。熟悉各種物聯網開發板,包括Arduino、Edison、Linkit one、Ameba…...等。
柯大

上一篇: | 下一篇:

468 ad

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

成城共創股份有限公司版權所有、轉載必究.Copyright(c) 2017 MakerPRO